excalidrop 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +411 -0
- package/dist/cli.d.ts +24 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +533 -0
- package/dist/cli.js.map +1 -0
- package/dist/frontend/assets/Assistant-Bold-gm-uSS1B.woff2 +0 -0
- package/dist/frontend/assets/Assistant-Medium-DrcxCXg3.woff2 +0 -0
- package/dist/frontend/assets/Assistant-Regular-DVxZuzxb.woff2 +0 -0
- package/dist/frontend/assets/Assistant-SemiBold-SCI4bEL9.woff2 +0 -0
- package/dist/frontend/assets/Tableau10-B-NsZVaP.js +1 -0
- package/dist/frontend/assets/_commonjs-dynamic-modules-TDtrdbi3.js +1 -0
- package/dist/frontend/assets/advancedFormat-bKUmsig-.js +1 -0
- package/dist/frontend/assets/ar-SA-G6X2FPQ2-C7K_UR3P.js +10 -0
- package/dist/frontend/assets/arc-BI_FJWE7.js +1 -0
- package/dist/frontend/assets/array-BKyUJesY.js +1 -0
- package/dist/frontend/assets/az-AZ-76LH7QW2-PkhuRuSr.js +1 -0
- package/dist/frontend/assets/band-dPffDWoQ.js +1 -0
- package/dist/frontend/assets/bg-BG-XCXSNQG7-CgLRSYTl.js +5 -0
- package/dist/frontend/assets/blockDiagram-38ab4fdb-BFdBRYSn.js +118 -0
- package/dist/frontend/assets/blockDiagram-68f4deed-Ynbqr7bQ.js +118 -0
- package/dist/frontend/assets/bn-BD-2XOGV67Q-CEvkU0mz.js +5 -0
- package/dist/frontend/assets/c4Diagram-15b5d702-Dm7F1Pn_.js +10 -0
- package/dist/frontend/assets/c4Diagram-3d4e48cf-COkK-e67.js +10 -0
- package/dist/frontend/assets/ca-ES-6MX7JW3Y-DzP6q9bE.js +8 -0
- package/dist/frontend/assets/channel-BqCiG5n3.js +1 -0
- package/dist/frontend/assets/classDiagram-70f12bd4-CRzulwvH.js +2 -0
- package/dist/frontend/assets/classDiagram-d40c83e7-DNbA-n-a.js +2 -0
- package/dist/frontend/assets/classDiagram-v2-d5a6b087-l-GglywH.js +2 -0
- package/dist/frontend/assets/classDiagram-v2-f2320105-B_TY1zoc.js +2 -0
- package/dist/frontend/assets/clone-B6Jqcrku.js +1 -0
- package/dist/frontend/assets/createText-2e5e7dd3-DB_k52Pn.js +5 -0
- package/dist/frontend/assets/createText-d213de94-D-G49giw.js +5 -0
- package/dist/frontend/assets/cs-CZ-2BRQDIVT-Bf4TOzpR.js +11 -0
- package/dist/frontend/assets/cytoscape-cose-bilkent-DQYypj0P.js +331 -0
- package/dist/frontend/assets/da-DK-5WZEPLOC-jO-5kyXb.js +5 -0
- package/dist/frontend/assets/de-DE-XR44H4JA-BkNXWOVh.js +8 -0
- package/dist/frontend/assets/directory-open-01563666-DWU9wJ6I.js +1 -0
- package/dist/frontend/assets/directory-open-4ed118d0-BzWybGaI.js +1 -0
- package/dist/frontend/assets/edges-332bd1c7-CVvMtkTa.js +4 -0
- package/dist/frontend/assets/edges-e0da2a9e-DQBAvC8-.js +4 -0
- package/dist/frontend/assets/el-GR-BZB4AONW-Dv7Y9hMk.js +10 -0
- package/dist/frontend/assets/elk.bundled-YVS3PsMH.js +26 -0
- package/dist/frontend/assets/erDiagram-880f2ed8-BjBeR38f.js +51 -0
- package/dist/frontend/assets/erDiagram-9861fffd-B2Bi3R45.js +51 -0
- package/dist/frontend/assets/es-ES-U4NZUMDT-CWhs0SQY.js +9 -0
- package/dist/frontend/assets/eu-ES-A7QVB2H4-BfkFwc3e.js +11 -0
- package/dist/frontend/assets/fa-IR-HGAKTJCU-BgWzSj46.js +8 -0
- package/dist/frontend/assets/fi-FI-Z5N7JZ37-CUyvkum-.js +6 -0
- package/dist/frontend/assets/file-open-002ab408-DIuFHtCF.js +1 -0
- package/dist/frontend/assets/file-open-7c801643-684qeFg4.js +1 -0
- package/dist/frontend/assets/file-save-3189631c-x92wctJd.js +1 -0
- package/dist/frontend/assets/file-save-745eba88-Bb9F9Kg7.js +1 -0
- package/dist/frontend/assets/flowDb-7c981674-BSZyyVBf.js +10 -0
- package/dist/frontend/assets/flowDb-956e92f1-BC3-CLkF.js +10 -0
- package/dist/frontend/assets/flowDiagram-66a62f08-H57DAvmM.js +4 -0
- package/dist/frontend/assets/flowDiagram-cbd28bf7-Bw4Z2nBD.js +4 -0
- package/dist/frontend/assets/flowDiagram-v2-96b9c2cf-CBjbm_oB.js +1 -0
- package/dist/frontend/assets/flowDiagram-v2-ffc7f31a-CoQufPp2.js +1 -0
- package/dist/frontend/assets/flowchart-elk-definition-36e2d292-1kZNdf3X.js +114 -0
- package/dist/frontend/assets/flowchart-elk-definition-4a651766-DDhG2Esi.js +114 -0
- package/dist/frontend/assets/fr-FR-RHASNOE6-7xzoRwbd.js +9 -0
- package/dist/frontend/assets/ganttDiagram-04f9e578-CtUSsXCz.js +257 -0
- package/dist/frontend/assets/ganttDiagram-c361ad54-K42AklFY.js +257 -0
- package/dist/frontend/assets/gitGraphDiagram-21fc4d3e-uW6XA6Y6.js +70 -0
- package/dist/frontend/assets/gitGraphDiagram-72cf32ee-CCNbhnBg.js +70 -0
- package/dist/frontend/assets/gl-ES-HMX3MZ6V-CXuDDwNP.js +10 -0
- package/dist/frontend/assets/graph-CYOmcSYN.js +1 -0
- package/dist/frontend/assets/graph-o42dOfI7.js +1 -0
- package/dist/frontend/assets/he-IL-6SHJWFNN-O9dzh9EM.js +10 -0
- package/dist/frontend/assets/hi-IN-IWLTKZ5I-DlrOXhWs.js +4 -0
- package/dist/frontend/assets/hu-HU-A5ZG7DT2-C3eNg-uI.js +7 -0
- package/dist/frontend/assets/id-ID-SAP4L64H-6iM4pI5c.js +10 -0
- package/dist/frontend/assets/image-blob-reduce.esm-B6b2_-a4.js +7 -0
- package/dist/frontend/assets/index-3862675e-DrvLhypC.js +1 -0
- package/dist/frontend/assets/index-6079d271-BgVTRqg2.js +1 -0
- package/dist/frontend/assets/index-BRA5OktX.css +1 -0
- package/dist/frontend/assets/index-D-cr7jpJ.js +349 -0
- package/dist/frontend/assets/index-DGmpr33w.js +3 -0
- package/dist/frontend/assets/index-HkUXslJy.js +87 -0
- package/dist/frontend/assets/infoDiagram-4a4f5b27-ZxmAcaW1.js +7 -0
- package/dist/frontend/assets/infoDiagram-f8f76790-Bn-PhiFG.js +7 -0
- package/dist/frontend/assets/init-Gi6I4Gst.js +1 -0
- package/dist/frontend/assets/it-IT-JPQ66NNP-B26NQzGp.js +11 -0
- package/dist/frontend/assets/ja-JP-DBVTYXUO-CB0fvnYJ.js +8 -0
- package/dist/frontend/assets/journeyDiagram-29694f62-ggDKs06f.js +139 -0
- package/dist/frontend/assets/journeyDiagram-49397b02-pdDS-n-z.js +139 -0
- package/dist/frontend/assets/kaa-6HZHGXH3-YNdBdcwJ.js +1 -0
- package/dist/frontend/assets/kab-KAB-ZGHBKWFO-D86pwZO0.js +8 -0
- package/dist/frontend/assets/katex-ChWnQ-fc.js +261 -0
- package/dist/frontend/assets/kk-KZ-P5N5QNE5-CpG5oheM.js +1 -0
- package/dist/frontend/assets/km-KH-HSX4SM5Z-DYOZ3Azw.js +11 -0
- package/dist/frontend/assets/ko-KR-MTYHY66A-BHorm6lC.js +9 -0
- package/dist/frontend/assets/ku-TR-6OUDTVRD-CM9RgEHv.js +9 -0
- package/dist/frontend/assets/layout-CCtkxrAf.js +1 -0
- package/dist/frontend/assets/layout-DW9Qf-At.js +1 -0
- package/dist/frontend/assets/line-DvZfgg9P.js +1 -0
- package/dist/frontend/assets/linear-FwFrGRfa.js +1 -0
- package/dist/frontend/assets/lt-LT-XHIRWOB4-DvriKXBj.js +3 -0
- package/dist/frontend/assets/lv-LV-5QDEKY6T-DzQpwk87.js +7 -0
- package/dist/frontend/assets/mindmap-definition-ac74a2e8-DsRo8f2w.js +95 -0
- package/dist/frontend/assets/mindmap-definition-fc14e90a-dQ9reluI.js +95 -0
- package/dist/frontend/assets/mr-IN-CRQNXWMA-C7RzxxP5.js +13 -0
- package/dist/frontend/assets/my-MM-5M5IBNSE-B-RRuy29.js +1 -0
- package/dist/frontend/assets/nb-NO-T6EIAALU-B47x16Ik.js +10 -0
- package/dist/frontend/assets/nl-NL-IS3SIHDZ-BxAKoQne.js +8 -0
- package/dist/frontend/assets/nn-NO-6E72VCQL-dfpbEDSZ.js +8 -0
- package/dist/frontend/assets/oc-FR-POXYY2M6-gv6geBjV.js +8 -0
- package/dist/frontend/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist/frontend/assets/pa-IN-N4M65BXN-CY30-qH7.js +4 -0
- package/dist/frontend/assets/path-CbwjOpE9.js +1 -0
- package/dist/frontend/assets/pica-DWYGHLQV.js +7 -0
- package/dist/frontend/assets/pie-CDiWh1rj.js +1 -0
- package/dist/frontend/assets/pieDiagram-421022e6-Bgy-duyf.js +35 -0
- package/dist/frontend/assets/pieDiagram-8a3498a8-DH7FsbPK.js +35 -0
- package/dist/frontend/assets/pl-PL-T2D74RX3-TrHugsIA.js +9 -0
- package/dist/frontend/assets/pt-BR-5N22H2LF-CJxdFp9c.js +9 -0
- package/dist/frontend/assets/pt-PT-UZXXM6DQ-CB-1q6YJ.js +9 -0
- package/dist/frontend/assets/quadrantDiagram-0957ecba-DcwYI1oi.js +7 -0
- package/dist/frontend/assets/quadrantDiagram-120e2f19-CvHU5a9v.js +7 -0
- package/dist/frontend/assets/requirementDiagram-23d650b8-tdagN8HP.js +52 -0
- package/dist/frontend/assets/requirementDiagram-deff3bca-BMGM-fSI.js +52 -0
- package/dist/frontend/assets/ro-RO-JPDTUUEW-DQq9DBOd.js +11 -0
- package/dist/frontend/assets/roundRect-0PYZxl1G.js +1 -0
- package/dist/frontend/assets/ru-RU-B4JR7IUQ-CWX32rfh.js +9 -0
- package/dist/frontend/assets/sankeyDiagram-04a897e0-3i6zWpY2.js +8 -0
- package/dist/frontend/assets/sankeyDiagram-23345273-ncj1Ol7S.js +8 -0
- package/dist/frontend/assets/sankeyLinkHorizontal-DgqkLiUE.js +1 -0
- package/dist/frontend/assets/selectAll-DJwesbwT.js +1 -0
- package/dist/frontend/assets/sequenceDiagram-17ac3bff-ChyKKRZA.js +122 -0
- package/dist/frontend/assets/sequenceDiagram-704730f1-D57_wP9k.js +122 -0
- package/dist/frontend/assets/si-LK-N5RQ5JYF-Lkc5ZxyG.js +1 -0
- package/dist/frontend/assets/sk-SK-C5VTKIMK-DyvYXjqZ.js +6 -0
- package/dist/frontend/assets/sl-SI-NN7IZMDC-D_MvP9Rh.js +6 -0
- package/dist/frontend/assets/stateDiagram-587899a1-OjFTnFLS.js +1 -0
- package/dist/frontend/assets/stateDiagram-9c5f0230-BzU36S5C.js +1 -0
- package/dist/frontend/assets/stateDiagram-v2-51a3dcff-CfX1qo7U.js +1 -0
- package/dist/frontend/assets/stateDiagram-v2-d93cdb3a-BH7Ud4sU.js +1 -0
- package/dist/frontend/assets/styles-2ab5d517-CA8x9Nh5.js +116 -0
- package/dist/frontend/assets/styles-5f03d8d2-BnO2pLhV.js +160 -0
- package/dist/frontend/assets/styles-6aaf32cf-COnot1ea.js +207 -0
- package/dist/frontend/assets/styles-9a916d00-C3QkBgTF.js +160 -0
- package/dist/frontend/assets/styles-c10674c1-CPAG2_rr.js +116 -0
- package/dist/frontend/assets/styles-edf9a4b0-B8Q9fyu0.js +207 -0
- package/dist/frontend/assets/subset-shared.chunk.js +84 -0
- package/dist/frontend/assets/subset-worker.chunk.js +1 -0
- package/dist/frontend/assets/sv-SE-XGPEYMSR-t6voGQSI.js +10 -0
- package/dist/frontend/assets/svgDrawCommon-08f97a94-CdT21LWf.js +1 -0
- package/dist/frontend/assets/svgDrawCommon-3ba9043b-D1MU7jAE.js +1 -0
- package/dist/frontend/assets/ta-IN-2NMHFXQM-7VmfDDyV.js +9 -0
- package/dist/frontend/assets/th-TH-HPSO5L25-B5rLEY9P.js +2 -0
- package/dist/frontend/assets/timeline-definition-7e6b55e7-BIcL44O_.js +61 -0
- package/dist/frontend/assets/timeline-definition-85554ec2-TgrYYwpU.js +61 -0
- package/dist/frontend/assets/tr-TR-DEFEU3FU-0CgOHXTn.js +7 -0
- package/dist/frontend/assets/uk-UA-QMV73CPH-CzSFsIsx.js +6 -0
- package/dist/frontend/assets/union-CnQAJu0l.js +1 -0
- package/dist/frontend/assets/vi-VN-M7AON7JQ-Bhx3rYU9.js +5 -0
- package/dist/frontend/assets/xml-BOsq7VnW.js +1 -0
- package/dist/frontend/assets/xychartDiagram-b6496bcd-BMKDop6v.js +7 -0
- package/dist/frontend/assets/xychartDiagram-e933f94c-DAWithrN.js +7 -0
- package/dist/frontend/assets/zh-CN-LNUGB5OW-Br52_wH4.js +10 -0
- package/dist/frontend/assets/zh-HK-E62DVLB3-Cj6mnIQ9.js +1 -0
- package/dist/frontend/assets/zh-TW-RAJ6MFWO-yLEsVBbC.js +9 -0
- package/dist/frontend/assets/zipObject-BeXj5PVd.js +1 -0
- package/dist/frontend/index.html +339 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2305 -0
- package/dist/index.js.map +1 -0
- package/dist/remote.d.ts +4 -0
- package/dist/remote.d.ts.map +1 -0
- package/dist/remote.js +133 -0
- package/dist/remote.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1217 -0
- package/dist/server.js.map +1 -0
- package/dist/target.d.ts +41 -0
- package/dist/target.d.ts.map +1 -0
- package/dist/target.js +244 -0
- package/dist/target.js.map +1 -0
- package/dist/types.d.ts +228 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +53 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/auth.d.ts +15 -0
- package/dist/utils/auth.d.ts.map +1 -0
- package/dist/utils/auth.js +68 -0
- package/dist/utils/auth.js.map +1 -0
- package/dist/utils/github.d.ts +26 -0
- package/dist/utils/github.d.ts.map +1 -0
- package/dist/utils/github.js +111 -0
- package/dist/utils/github.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +25 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/r2store.d.ts +19 -0
- package/dist/utils/r2store.d.ts.map +1 -0
- package/dist/utils/r2store.js +75 -0
- package/dist/utils/r2store.js.map +1 -0
- package/frontend/index.html +338 -0
- package/frontend/src/App.tsx +1091 -0
- package/frontend/src/main.tsx +15 -0
- package/frontend/src/utils/ghSync.ts +171 -0
- package/frontend/src/utils/mermaidConverter.ts +49 -0
- package/frontend/src/utils/webmcp.ts +285 -0
- package/package.json +101 -0
- package/scripts/check-local-bind.mjs +164 -0
- package/scripts/postinstall.mjs +23 -0
- package/scripts/publish-pages.sh +39 -0
- package/scripts/seed-r2.mjs +9 -0
- package/skills/excalidraw-skill/SKILL.md +303 -0
- package/skills/excalidraw-skill/evals/evals.json +23 -0
- package/skills/excalidraw-skill/references/cheatsheet.md +142 -0
- package/skills/excalidraw-skill/scripts/clear-canvas.cjs +38 -0
- package/skills/excalidraw-skill/scripts/create-element.cjs +68 -0
- package/skills/excalidraw-skill/scripts/delete-element.cjs +48 -0
- package/skills/excalidraw-skill/scripts/export-elements.cjs +53 -0
- package/skills/excalidraw-skill/scripts/healthcheck.cjs +35 -0
- package/skills/excalidraw-skill/scripts/import-elements.cjs +81 -0
- package/skills/excalidraw-skill/scripts/update-element.cjs +70 -0
- package/src/cli.ts +559 -0
- package/src/index.ts +2557 -0
- package/src/remote.ts +96 -0
- package/src/server.ts +1349 -0
- package/src/target.ts +208 -0
- package/src/types.ts +338 -0
- package/src/utils/auth.ts +61 -0
- package/src/utils/github.ts +93 -0
- package/src/utils/logger.ts +35 -0
- package/src/utils/r2store.ts +76 -0
- package/tsconfig.json +50 -0
- package/vite.config.js +37 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 MCP Excalidraw Server
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
# Excalidraw MCP Server & Agent Skill
|
|
2
|
+
|
|
3
|
+
[](https://github.com/wtf403/excalidrop/actions/workflows/ci.yml)
|
|
4
|
+
[](https://www.npmjs.com/package/excalidrop)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
7
|
+
Run a live Excalidraw canvas and control it from AI agents. This repo provides:
|
|
8
|
+
|
|
9
|
+
- **MCP Server**: Connect via Model Context Protocol (Claude Desktop, Cursor, Codex CLI, etc.)
|
|
10
|
+
- **Agent Skill**: Portable skill for Claude Code, Codex CLI, and other skill-enabled agents
|
|
11
|
+
|
|
12
|
+
Keywords: Excalidraw agent skill, Excalidraw MCP server, AI diagramming, Claude Code skill, Codex CLI skill, Claude Desktop MCP, Cursor MCP, Mermaid to Excalidraw.
|
|
13
|
+
|
|
14
|
+
## Demo
|
|
15
|
+
|
|
16
|
+

|
|
17
|
+
|
|
18
|
+
## Table of Contents
|
|
19
|
+
|
|
20
|
+
- [Demo](#demo)
|
|
21
|
+
- [What It Is](#what-it-is)
|
|
22
|
+
- [How We Differ from the Official Excalidraw MCP](#how-we-differ-from-the-official-excalidraw-mcp)
|
|
23
|
+
- [What's New](#whats-new)
|
|
24
|
+
- [Quick Start (Local)](#quick-start-local)
|
|
25
|
+
- [Configure MCP Clients](#configure-mcp-clients)
|
|
26
|
+
- [Claude Desktop](#claude-desktop)
|
|
27
|
+
- [Claude Code](#claude-code)
|
|
28
|
+
- [Cursor](#cursor)
|
|
29
|
+
- [Codex CLI](#codex-cli)
|
|
30
|
+
- [OpenCode](#opencode)
|
|
31
|
+
- [Antigravity (Google)](#antigravity-google)
|
|
32
|
+
- [Agent Skill (Optional)](#agent-skill-optional)
|
|
33
|
+
- [MCP Tools (26 Total)](#mcp-tools-26-total)
|
|
34
|
+
- [Testing](#testing)
|
|
35
|
+
- [Troubleshooting](#troubleshooting)
|
|
36
|
+
- [Known Issues / TODO](#known-issues--todo)
|
|
37
|
+
- [Development](#development)
|
|
38
|
+
|
|
39
|
+
## What It Is
|
|
40
|
+
|
|
41
|
+
This repo contains two separate processes:
|
|
42
|
+
|
|
43
|
+
- Canvas server: web UI + REST API + WebSocket updates (default `http://127.0.0.1:3000`)
|
|
44
|
+
- MCP server: exposes MCP tools over stdio; syncs to the canvas via `EXPRESS_SERVER_URL`
|
|
45
|
+
|
|
46
|
+
## How We Differ from the Official Excalidraw MCP
|
|
47
|
+
|
|
48
|
+
Excalidraw now has an [official MCP](https://github.com/excalidraw/excalidraw-mcp) — it's great for quick, prompt-to-diagram generation rendered inline in chat. We solve a different problem.
|
|
49
|
+
|
|
50
|
+
| | Official Excalidraw MCP | This Project |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| **Approach** | Prompt in, diagram out (one-shot) | Programmatic element-level control (26 tools) |
|
|
53
|
+
| **State** | Stateless — each call is independent | Persistent live canvas with real-time sync |
|
|
54
|
+
| **Element CRUD** | No | Full create / read / update / delete per element |
|
|
55
|
+
| **AI sees the canvas** | No | `describe_scene` (structured text) + `get_canvas_screenshot` (image) |
|
|
56
|
+
| **Iterative refinement** | No — regenerate the whole diagram | Draw → look → adjust → look again, element by element |
|
|
57
|
+
| **Layout tools** | No | `align_elements`, `distribute_elements`, `group / ungroup` |
|
|
58
|
+
| **File I/O** | No | `export_scene` / `import_scene` (.excalidraw JSON) |
|
|
59
|
+
| **Snapshot & rollback** | No | `snapshot_scene` / `restore_snapshot` |
|
|
60
|
+
| **Mermaid conversion** | No | `create_from_mermaid` |
|
|
61
|
+
| **Shareable URLs** | Yes | Yes — `export_to_excalidraw_url` |
|
|
62
|
+
| **Design guide** | `read_me` cheat sheet | `read_diagram_guide` (colors, sizing, layout, anti-patterns) |
|
|
63
|
+
| **Viewport control** | Camera animations | `set_viewport` (zoom-to-fit, center on element, manual zoom) |
|
|
64
|
+
| **Live canvas UI** | Rendered inline in chat | Standalone Excalidraw app synced via WebSocket |
|
|
65
|
+
| **Multi-agent** | Single user | Multiple agents can draw on the same canvas concurrently |
|
|
66
|
+
| **Works without MCP** | No | Yes — REST API fallback via agent skill |
|
|
67
|
+
|
|
68
|
+
**TL;DR** — The official MCP generates diagrams. We give AI agents a full canvas toolkit to build, inspect, and iteratively refine diagrams — including the ability to see what they drew.
|
|
69
|
+
|
|
70
|
+
## Quick Start
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
npm i -D excalidrop
|
|
74
|
+
npx excalidrop setup # gh auth check → publishes viewer to gh-pages → app-install link → verifies live
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`setup` walks you through the whole flow on **any repo you own or can access**:
|
|
78
|
+
|
|
79
|
+
1. **Checks `gh auth`** (log in with `gh auth login` first — 2FA via GitHub).
|
|
80
|
+
2. **Publishes an empty canvas** to your repo's `gh-pages` branch and enables Pages.
|
|
81
|
+
3. **Prints the one-time app-install link** (`github.com/apps/<app>/installations/new`) — installing the GitHub App on the repo is what grants canvas access. Repo access == canvas access: collaborators with write can edit, readers get view-only, everyone else gets a login wall.
|
|
82
|
+
4. **Verifies** the viewer + scene are actually serving.
|
|
83
|
+
5. Prints your canvas URL. In your agent, run `switch_remote { target: "<that URL>" }` once — it's remembered per-project in `.excalidrop.json`, so subsequent sessions skip it and draw directly. Commits land on GitHub; the viewer updates itself. Human edits in the browser autosync every 10s with a force-save on close.
|
|
84
|
+
|
|
85
|
+
Prefer local-only? `npx excalidrop init` (free port + agent install prompt) then `npx excalidrop up`.
|
|
86
|
+
|
|
87
|
+
Each project gets its own port (scanned free from 3030), so several checkouts run concurrently. Agent config needs no hardcoded port — same pattern as `chrome-devtools-mcp`:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
claude mcp add excalidrop --scope project -- npx -y excalidrop mcp
|
|
91
|
+
codex mcp add excalidrop -- npx -y excalidrop mcp
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Quick Start (Local)
|
|
95
|
+
|
|
96
|
+
Prereqs: Node >= 18, npm
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
npm ci
|
|
100
|
+
npm run build
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Terminal 1: start the canvas
|
|
104
|
+
```bash
|
|
105
|
+
PORT=3000 npm run canvas
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
> **Security note:** The server defaults to binding on `127.0.0.1` only. If you need to expose it on a network interface (e.g. Docker, remote access), set `HOST=0.0.0.0` — but ensure you have network-level access controls in place, as the API has no built-in authentication.
|
|
109
|
+
|
|
110
|
+
Open `http://127.0.0.1:3000`.
|
|
111
|
+
|
|
112
|
+
Terminal 2: run the MCP server (stdio)
|
|
113
|
+
```bash
|
|
114
|
+
EXPRESS_SERVER_URL=http://127.0.0.1:3000 node dist/index.js
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Configure MCP Clients
|
|
118
|
+
|
|
119
|
+
The MCP server runs over stdio and can be configured with any MCP-compatible client. The recommended path is `npm i -D excalidrop && npx excalidrop init` (per-project canvas + generated `.mcp.json`), which replaces the manual setups below.
|
|
120
|
+
|
|
121
|
+
### Environment Variables
|
|
122
|
+
|
|
123
|
+
| Variable | Description | Default |
|
|
124
|
+
|----------|-------------|---------|
|
|
125
|
+
| `EXPRESS_SERVER_URL` | URL of the canvas server | `http://127.0.0.1:3000` |
|
|
126
|
+
| `ENABLE_CANVAS_SYNC` | Enable real-time canvas sync | `true` |
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
### Claude Desktop
|
|
131
|
+
|
|
132
|
+
Config location:
|
|
133
|
+
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
134
|
+
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
|
|
135
|
+
- Linux: `~/.config/Claude/claude_desktop_config.json`
|
|
136
|
+
|
|
137
|
+
**Local (node)**
|
|
138
|
+
```json
|
|
139
|
+
{
|
|
140
|
+
"mcpServers": {
|
|
141
|
+
"excalidraw": {
|
|
142
|
+
"command": "node",
|
|
143
|
+
"args": ["/absolute/path/to/mcp_excalidraw/dist/index.js"],
|
|
144
|
+
"env": {
|
|
145
|
+
"EXPRESS_SERVER_URL": "http://127.0.0.1:3000",
|
|
146
|
+
"ENABLE_CANVAS_SYNC": "true"
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
### Claude Code
|
|
156
|
+
|
|
157
|
+
Use the `claude mcp add` command to register the MCP server.
|
|
158
|
+
|
|
159
|
+
**Local (node)** - User-level (available across all projects):
|
|
160
|
+
```bash
|
|
161
|
+
claude mcp add excalidraw --scope user \
|
|
162
|
+
-e EXPRESS_SERVER_URL=http://127.0.0.1:3000 \
|
|
163
|
+
-e ENABLE_CANVAS_SYNC=true \
|
|
164
|
+
-- node /absolute/path/to/mcp_excalidraw/dist/index.js
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Local (node)** - Project-level (shared via `.mcp.json`):
|
|
168
|
+
```bash
|
|
169
|
+
claude mcp add excalidraw --scope project \
|
|
170
|
+
-e EXPRESS_SERVER_URL=http://127.0.0.1:3000 \
|
|
171
|
+
-e ENABLE_CANVAS_SYNC=true \
|
|
172
|
+
-- node /absolute/path/to/mcp_excalidraw/dist/index.js
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**Manage servers:**
|
|
176
|
+
```bash
|
|
177
|
+
claude mcp list # List configured servers
|
|
178
|
+
claude mcp remove excalidraw # Remove a server
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
### Cursor
|
|
184
|
+
|
|
185
|
+
Config location: `.cursor/mcp.json` in your project root (or `~/.cursor/mcp.json` for global config)
|
|
186
|
+
|
|
187
|
+
**Local (node)**
|
|
188
|
+
```json
|
|
189
|
+
{
|
|
190
|
+
"mcpServers": {
|
|
191
|
+
"excalidraw": {
|
|
192
|
+
"command": "node",
|
|
193
|
+
"args": ["/absolute/path/to/mcp_excalidraw/dist/index.js"],
|
|
194
|
+
"env": {
|
|
195
|
+
"EXPRESS_SERVER_URL": "http://127.0.0.1:3000",
|
|
196
|
+
"ENABLE_CANVAS_SYNC": "true"
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
### Codex CLI
|
|
206
|
+
|
|
207
|
+
Use the `codex mcp add` command to register the MCP server.
|
|
208
|
+
|
|
209
|
+
**Local (node)**
|
|
210
|
+
```bash
|
|
211
|
+
codex mcp add excalidraw \
|
|
212
|
+
--env EXPRESS_SERVER_URL=http://127.0.0.1:3000 \
|
|
213
|
+
--env ENABLE_CANVAS_SYNC=true \
|
|
214
|
+
-- node /absolute/path/to/mcp_excalidraw/dist/index.js
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
**Manage servers:**
|
|
218
|
+
```bash
|
|
219
|
+
codex mcp list # List configured servers
|
|
220
|
+
codex mcp remove excalidraw # Remove a server
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
### OpenCode
|
|
226
|
+
|
|
227
|
+
Config location: `~/.config/opencode/opencode.json` or project-level `opencode.json`
|
|
228
|
+
|
|
229
|
+
**Local (node)**
|
|
230
|
+
```json
|
|
231
|
+
{
|
|
232
|
+
"$schema": "https://opencode.ai/config.json",
|
|
233
|
+
"mcp": {
|
|
234
|
+
"excalidraw": {
|
|
235
|
+
"type": "local",
|
|
236
|
+
"command": ["node", "/absolute/path/to/mcp_excalidraw/dist/index.js"],
|
|
237
|
+
"enabled": true,
|
|
238
|
+
"environment": {
|
|
239
|
+
"EXPRESS_SERVER_URL": "http://127.0.0.1:3000",
|
|
240
|
+
"ENABLE_CANVAS_SYNC": "true"
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
### Antigravity (Google)
|
|
250
|
+
|
|
251
|
+
Config location: `~/.gemini/antigravity/mcp_config.json`
|
|
252
|
+
|
|
253
|
+
**Local (node)**
|
|
254
|
+
```json
|
|
255
|
+
{
|
|
256
|
+
"mcpServers": {
|
|
257
|
+
"excalidraw": {
|
|
258
|
+
"command": "node",
|
|
259
|
+
"args": ["/absolute/path/to/mcp_excalidraw/dist/index.js"],
|
|
260
|
+
"env": {
|
|
261
|
+
"EXPRESS_SERVER_URL": "http://127.0.0.1:3000",
|
|
262
|
+
"ENABLE_CANVAS_SYNC": "true"
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
### Notes
|
|
272
|
+
|
|
273
|
+
- **Canvas server**: Must be running before the MCP server connects. Start it with `npx excalidrop up`.
|
|
274
|
+
- **Absolute paths**: When using local node setup, replace `/absolute/path/to/mcp_excalidraw` with the actual path where you cloned and built the repo.
|
|
275
|
+
- **In-memory storage**: The canvas server stores elements in memory. Restarting the server will clear all elements. Use the export/import scripts if you need persistence.
|
|
276
|
+
|
|
277
|
+
## Agent Skill (Optional)
|
|
278
|
+
|
|
279
|
+
This repo includes a skill at `skills/excalidraw-skill/` that provides:
|
|
280
|
+
|
|
281
|
+
- **Workflow playbook** (`SKILL.md`): step-by-step guidance for drawing, refining, and exporting diagrams
|
|
282
|
+
- **Cheatsheet** (`references/cheatsheet.md`): MCP tool and REST API reference
|
|
283
|
+
- **Helper scripts** (`scripts/*.cjs`): export, import, clear, healthcheck, CRUD operations
|
|
284
|
+
|
|
285
|
+
The skill complements the MCP server by giving your AI agent structured workflows to follow.
|
|
286
|
+
|
|
287
|
+
### Install The Skill (Codex CLI example)
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
mkdir -p ~/.codex/skills
|
|
291
|
+
cp -R skills/excalidraw-skill ~/.codex/skills/excalidraw-skill
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
To update an existing installation, remove the old folder first (`rm -rf ~/.codex/skills/excalidraw-skill`) then re-copy.
|
|
295
|
+
|
|
296
|
+
### Install The Skill (Claude Code)
|
|
297
|
+
|
|
298
|
+
**User-level** (available across all your projects):
|
|
299
|
+
```bash
|
|
300
|
+
mkdir -p ~/.claude/skills
|
|
301
|
+
cp -R skills/excalidraw-skill ~/.claude/skills/excalidraw-skill
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
**Project-level** (scoped to a specific project, can be committed to the repo):
|
|
305
|
+
```bash
|
|
306
|
+
mkdir -p /path/to/your/project/.claude/skills
|
|
307
|
+
cp -R skills/excalidraw-skill /path/to/your/project/.claude/skills/excalidraw-skill
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
Then invoke the skill in Claude Code with `/excalidraw-skill`.
|
|
311
|
+
|
|
312
|
+
To update an existing installation, remove the old folder first then re-copy.
|
|
313
|
+
|
|
314
|
+
### Use The Skill Scripts
|
|
315
|
+
|
|
316
|
+
All scripts respect `EXPRESS_SERVER_URL` (default `http://127.0.0.1:3000`) or accept `--url`.
|
|
317
|
+
|
|
318
|
+
```bash
|
|
319
|
+
EXPRESS_SERVER_URL=http://127.0.0.1:3000 node skills/excalidraw-skill/scripts/healthcheck.cjs
|
|
320
|
+
EXPRESS_SERVER_URL=http://127.0.0.1:3000 node skills/excalidraw-skill/scripts/export-elements.cjs --out diagram.elements.json
|
|
321
|
+
EXPRESS_SERVER_URL=http://127.0.0.1:3000 node skills/excalidraw-skill/scripts/import-elements.cjs --in diagram.elements.json --mode batch
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### When The Skill Is Useful
|
|
325
|
+
|
|
326
|
+
- Repository workflow: export elements as JSON, commit it, and re-import later.
|
|
327
|
+
- Reliable refactors: clear + re-import in `sync` mode to make canvas match a file.
|
|
328
|
+
- Automated smoke tests: create/update/delete a known element to validate a deployment.
|
|
329
|
+
- Repeatable diagrams: keep a library of element JSON snippets and import them.
|
|
330
|
+
|
|
331
|
+
See `skills/excalidraw-skill/SKILL.md` and `skills/excalidraw-skill/references/cheatsheet.md`.
|
|
332
|
+
|
|
333
|
+
## MCP Tools (26 Total)
|
|
334
|
+
|
|
335
|
+
| Category | Tools |
|
|
336
|
+
|---|---|
|
|
337
|
+
| **Element CRUD** | `create_element`, `get_element`, `update_element`, `delete_element`, `query_elements`, `batch_create_elements`, `duplicate_elements` |
|
|
338
|
+
| **Layout** | `align_elements`, `distribute_elements`, `group_elements`, `ungroup_elements`, `lock_elements`, `unlock_elements` |
|
|
339
|
+
| **Scene Awareness** | `describe_scene`, `get_canvas_screenshot` |
|
|
340
|
+
| **File I/O** | `export_scene`, `import_scene`, `export_to_image`, `export_to_excalidraw_url`, `create_from_mermaid` |
|
|
341
|
+
| **State Management** | `clear_canvas`, `snapshot_scene`, `restore_snapshot` |
|
|
342
|
+
| **Viewport** | `set_viewport` |
|
|
343
|
+
| **Design Guide** | `read_diagram_guide` |
|
|
344
|
+
| **Resources** | `get_resource` |
|
|
345
|
+
|
|
346
|
+
Full schemas are discoverable via `tools/list` or in `skills/excalidraw-skill/references/cheatsheet.md`.
|
|
347
|
+
|
|
348
|
+
## Testing
|
|
349
|
+
|
|
350
|
+
### Canvas Smoke Test (HTTP)
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
curl http://127.0.0.1:3000/health
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### Local Bind Regression Test
|
|
357
|
+
|
|
358
|
+
```bash
|
|
359
|
+
npm run test:bind
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
### MCP Smoke Test (MCP Inspector)
|
|
363
|
+
|
|
364
|
+
List tools:
|
|
365
|
+
```bash
|
|
366
|
+
npx @modelcontextprotocol/inspector --cli \
|
|
367
|
+
-e EXPRESS_SERVER_URL=http://127.0.0.1:3000 \
|
|
368
|
+
-e ENABLE_CANVAS_SYNC=true -- \
|
|
369
|
+
node dist/index.js --method tools/list
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
Create a rectangle:
|
|
373
|
+
```bash
|
|
374
|
+
npx @modelcontextprotocol/inspector --cli \
|
|
375
|
+
-e EXPRESS_SERVER_URL=http://127.0.0.1:3000 \
|
|
376
|
+
-e ENABLE_CANVAS_SYNC=true -- \
|
|
377
|
+
node dist/index.js --method tools/call --tool-name create_element \
|
|
378
|
+
--tool-arg type=rectangle --tool-arg x=100 --tool-arg y=100 \
|
|
379
|
+
--tool-arg width=300 --tool-arg height=200
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### Frontend Screenshots (agent-browser)
|
|
383
|
+
|
|
384
|
+
If you use `agent-browser` for UI checks:
|
|
385
|
+
```bash
|
|
386
|
+
agent-browser install
|
|
387
|
+
agent-browser open http://127.0.0.1:3000
|
|
388
|
+
agent-browser wait --load networkidle
|
|
389
|
+
agent-browser screenshot /tmp/canvas.png
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
## Troubleshooting
|
|
393
|
+
|
|
394
|
+
- Canvas not updating: confirm `EXPRESS_SERVER_URL` points at the running canvas server.
|
|
395
|
+
- Updates/deletes fail after batch creation: ensure you are on a build that includes the batch id preservation fix (merged via PR #34).
|
|
396
|
+
|
|
397
|
+
## Known Issues / TODO
|
|
398
|
+
|
|
399
|
+
All previously listed bugs have been fixed in v2.0. Remaining items:
|
|
400
|
+
|
|
401
|
+
- [ ] **Persistent storage**: Elements are stored in-memory — restarting the server clears everything. Use `export_scene` / snapshots as a workaround.
|
|
402
|
+
- [ ] **Image export requires a browser**: `export_to_image` and `get_canvas_screenshot` rely on the frontend doing the actual rendering. The canvas UI must be open in a browser.
|
|
403
|
+
|
|
404
|
+
Contributions welcome!
|
|
405
|
+
|
|
406
|
+
## Development
|
|
407
|
+
|
|
408
|
+
```bash
|
|
409
|
+
npm run type-check
|
|
410
|
+
npm run build
|
|
411
|
+
```
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* excalidrop — per-project Excalidraw canvas + MCP server setup.
|
|
4
|
+
*
|
|
5
|
+
* Modelled on the `chrome-devtools-mcp` install pattern (`npx -y <pkg>` +
|
|
6
|
+
* `mcpServers` JSON), with one addition: per-project dynamic port selection
|
|
7
|
+
* so multiple checkouts can run their own canvas concurrently.
|
|
8
|
+
*
|
|
9
|
+
* How the dynamic port works:
|
|
10
|
+
* - `excalidrop init` picks a free port (default scan from 3030) and writes
|
|
11
|
+
* it to `.excalidrop.json` in the project root.
|
|
12
|
+
* - `excalidrop mcp` (what the AI agent runs via stdio) resolves that same
|
|
13
|
+
* file by walking up from cwd, so each project transparently gets its own
|
|
14
|
+
* canvas URL with nothing hardcoded in the agent config.
|
|
15
|
+
*
|
|
16
|
+
* Commands:
|
|
17
|
+
* init pick a port, write .excalidrop.json + .mcp.json, offer agent install
|
|
18
|
+
* up start the canvas server on this project's port
|
|
19
|
+
* mcp run the MCP stdio server pointed at this project's canvas (for agents)
|
|
20
|
+
* status show resolved port + canvas health
|
|
21
|
+
* add print / run AI-agent install commands
|
|
22
|
+
*/
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;GAoBG"}
|