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.
Files changed (234) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +411 -0
  3. package/dist/cli.d.ts +24 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +533 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/frontend/assets/Assistant-Bold-gm-uSS1B.woff2 +0 -0
  8. package/dist/frontend/assets/Assistant-Medium-DrcxCXg3.woff2 +0 -0
  9. package/dist/frontend/assets/Assistant-Regular-DVxZuzxb.woff2 +0 -0
  10. package/dist/frontend/assets/Assistant-SemiBold-SCI4bEL9.woff2 +0 -0
  11. package/dist/frontend/assets/Tableau10-B-NsZVaP.js +1 -0
  12. package/dist/frontend/assets/_commonjs-dynamic-modules-TDtrdbi3.js +1 -0
  13. package/dist/frontend/assets/advancedFormat-bKUmsig-.js +1 -0
  14. package/dist/frontend/assets/ar-SA-G6X2FPQ2-C7K_UR3P.js +10 -0
  15. package/dist/frontend/assets/arc-BI_FJWE7.js +1 -0
  16. package/dist/frontend/assets/array-BKyUJesY.js +1 -0
  17. package/dist/frontend/assets/az-AZ-76LH7QW2-PkhuRuSr.js +1 -0
  18. package/dist/frontend/assets/band-dPffDWoQ.js +1 -0
  19. package/dist/frontend/assets/bg-BG-XCXSNQG7-CgLRSYTl.js +5 -0
  20. package/dist/frontend/assets/blockDiagram-38ab4fdb-BFdBRYSn.js +118 -0
  21. package/dist/frontend/assets/blockDiagram-68f4deed-Ynbqr7bQ.js +118 -0
  22. package/dist/frontend/assets/bn-BD-2XOGV67Q-CEvkU0mz.js +5 -0
  23. package/dist/frontend/assets/c4Diagram-15b5d702-Dm7F1Pn_.js +10 -0
  24. package/dist/frontend/assets/c4Diagram-3d4e48cf-COkK-e67.js +10 -0
  25. package/dist/frontend/assets/ca-ES-6MX7JW3Y-DzP6q9bE.js +8 -0
  26. package/dist/frontend/assets/channel-BqCiG5n3.js +1 -0
  27. package/dist/frontend/assets/classDiagram-70f12bd4-CRzulwvH.js +2 -0
  28. package/dist/frontend/assets/classDiagram-d40c83e7-DNbA-n-a.js +2 -0
  29. package/dist/frontend/assets/classDiagram-v2-d5a6b087-l-GglywH.js +2 -0
  30. package/dist/frontend/assets/classDiagram-v2-f2320105-B_TY1zoc.js +2 -0
  31. package/dist/frontend/assets/clone-B6Jqcrku.js +1 -0
  32. package/dist/frontend/assets/createText-2e5e7dd3-DB_k52Pn.js +5 -0
  33. package/dist/frontend/assets/createText-d213de94-D-G49giw.js +5 -0
  34. package/dist/frontend/assets/cs-CZ-2BRQDIVT-Bf4TOzpR.js +11 -0
  35. package/dist/frontend/assets/cytoscape-cose-bilkent-DQYypj0P.js +331 -0
  36. package/dist/frontend/assets/da-DK-5WZEPLOC-jO-5kyXb.js +5 -0
  37. package/dist/frontend/assets/de-DE-XR44H4JA-BkNXWOVh.js +8 -0
  38. package/dist/frontend/assets/directory-open-01563666-DWU9wJ6I.js +1 -0
  39. package/dist/frontend/assets/directory-open-4ed118d0-BzWybGaI.js +1 -0
  40. package/dist/frontend/assets/edges-332bd1c7-CVvMtkTa.js +4 -0
  41. package/dist/frontend/assets/edges-e0da2a9e-DQBAvC8-.js +4 -0
  42. package/dist/frontend/assets/el-GR-BZB4AONW-Dv7Y9hMk.js +10 -0
  43. package/dist/frontend/assets/elk.bundled-YVS3PsMH.js +26 -0
  44. package/dist/frontend/assets/erDiagram-880f2ed8-BjBeR38f.js +51 -0
  45. package/dist/frontend/assets/erDiagram-9861fffd-B2Bi3R45.js +51 -0
  46. package/dist/frontend/assets/es-ES-U4NZUMDT-CWhs0SQY.js +9 -0
  47. package/dist/frontend/assets/eu-ES-A7QVB2H4-BfkFwc3e.js +11 -0
  48. package/dist/frontend/assets/fa-IR-HGAKTJCU-BgWzSj46.js +8 -0
  49. package/dist/frontend/assets/fi-FI-Z5N7JZ37-CUyvkum-.js +6 -0
  50. package/dist/frontend/assets/file-open-002ab408-DIuFHtCF.js +1 -0
  51. package/dist/frontend/assets/file-open-7c801643-684qeFg4.js +1 -0
  52. package/dist/frontend/assets/file-save-3189631c-x92wctJd.js +1 -0
  53. package/dist/frontend/assets/file-save-745eba88-Bb9F9Kg7.js +1 -0
  54. package/dist/frontend/assets/flowDb-7c981674-BSZyyVBf.js +10 -0
  55. package/dist/frontend/assets/flowDb-956e92f1-BC3-CLkF.js +10 -0
  56. package/dist/frontend/assets/flowDiagram-66a62f08-H57DAvmM.js +4 -0
  57. package/dist/frontend/assets/flowDiagram-cbd28bf7-Bw4Z2nBD.js +4 -0
  58. package/dist/frontend/assets/flowDiagram-v2-96b9c2cf-CBjbm_oB.js +1 -0
  59. package/dist/frontend/assets/flowDiagram-v2-ffc7f31a-CoQufPp2.js +1 -0
  60. package/dist/frontend/assets/flowchart-elk-definition-36e2d292-1kZNdf3X.js +114 -0
  61. package/dist/frontend/assets/flowchart-elk-definition-4a651766-DDhG2Esi.js +114 -0
  62. package/dist/frontend/assets/fr-FR-RHASNOE6-7xzoRwbd.js +9 -0
  63. package/dist/frontend/assets/ganttDiagram-04f9e578-CtUSsXCz.js +257 -0
  64. package/dist/frontend/assets/ganttDiagram-c361ad54-K42AklFY.js +257 -0
  65. package/dist/frontend/assets/gitGraphDiagram-21fc4d3e-uW6XA6Y6.js +70 -0
  66. package/dist/frontend/assets/gitGraphDiagram-72cf32ee-CCNbhnBg.js +70 -0
  67. package/dist/frontend/assets/gl-ES-HMX3MZ6V-CXuDDwNP.js +10 -0
  68. package/dist/frontend/assets/graph-CYOmcSYN.js +1 -0
  69. package/dist/frontend/assets/graph-o42dOfI7.js +1 -0
  70. package/dist/frontend/assets/he-IL-6SHJWFNN-O9dzh9EM.js +10 -0
  71. package/dist/frontend/assets/hi-IN-IWLTKZ5I-DlrOXhWs.js +4 -0
  72. package/dist/frontend/assets/hu-HU-A5ZG7DT2-C3eNg-uI.js +7 -0
  73. package/dist/frontend/assets/id-ID-SAP4L64H-6iM4pI5c.js +10 -0
  74. package/dist/frontend/assets/image-blob-reduce.esm-B6b2_-a4.js +7 -0
  75. package/dist/frontend/assets/index-3862675e-DrvLhypC.js +1 -0
  76. package/dist/frontend/assets/index-6079d271-BgVTRqg2.js +1 -0
  77. package/dist/frontend/assets/index-BRA5OktX.css +1 -0
  78. package/dist/frontend/assets/index-D-cr7jpJ.js +349 -0
  79. package/dist/frontend/assets/index-DGmpr33w.js +3 -0
  80. package/dist/frontend/assets/index-HkUXslJy.js +87 -0
  81. package/dist/frontend/assets/infoDiagram-4a4f5b27-ZxmAcaW1.js +7 -0
  82. package/dist/frontend/assets/infoDiagram-f8f76790-Bn-PhiFG.js +7 -0
  83. package/dist/frontend/assets/init-Gi6I4Gst.js +1 -0
  84. package/dist/frontend/assets/it-IT-JPQ66NNP-B26NQzGp.js +11 -0
  85. package/dist/frontend/assets/ja-JP-DBVTYXUO-CB0fvnYJ.js +8 -0
  86. package/dist/frontend/assets/journeyDiagram-29694f62-ggDKs06f.js +139 -0
  87. package/dist/frontend/assets/journeyDiagram-49397b02-pdDS-n-z.js +139 -0
  88. package/dist/frontend/assets/kaa-6HZHGXH3-YNdBdcwJ.js +1 -0
  89. package/dist/frontend/assets/kab-KAB-ZGHBKWFO-D86pwZO0.js +8 -0
  90. package/dist/frontend/assets/katex-ChWnQ-fc.js +261 -0
  91. package/dist/frontend/assets/kk-KZ-P5N5QNE5-CpG5oheM.js +1 -0
  92. package/dist/frontend/assets/km-KH-HSX4SM5Z-DYOZ3Azw.js +11 -0
  93. package/dist/frontend/assets/ko-KR-MTYHY66A-BHorm6lC.js +9 -0
  94. package/dist/frontend/assets/ku-TR-6OUDTVRD-CM9RgEHv.js +9 -0
  95. package/dist/frontend/assets/layout-CCtkxrAf.js +1 -0
  96. package/dist/frontend/assets/layout-DW9Qf-At.js +1 -0
  97. package/dist/frontend/assets/line-DvZfgg9P.js +1 -0
  98. package/dist/frontend/assets/linear-FwFrGRfa.js +1 -0
  99. package/dist/frontend/assets/lt-LT-XHIRWOB4-DvriKXBj.js +3 -0
  100. package/dist/frontend/assets/lv-LV-5QDEKY6T-DzQpwk87.js +7 -0
  101. package/dist/frontend/assets/mindmap-definition-ac74a2e8-DsRo8f2w.js +95 -0
  102. package/dist/frontend/assets/mindmap-definition-fc14e90a-dQ9reluI.js +95 -0
  103. package/dist/frontend/assets/mr-IN-CRQNXWMA-C7RzxxP5.js +13 -0
  104. package/dist/frontend/assets/my-MM-5M5IBNSE-B-RRuy29.js +1 -0
  105. package/dist/frontend/assets/nb-NO-T6EIAALU-B47x16Ik.js +10 -0
  106. package/dist/frontend/assets/nl-NL-IS3SIHDZ-BxAKoQne.js +8 -0
  107. package/dist/frontend/assets/nn-NO-6E72VCQL-dfpbEDSZ.js +8 -0
  108. package/dist/frontend/assets/oc-FR-POXYY2M6-gv6geBjV.js +8 -0
  109. package/dist/frontend/assets/ordinal-Cboi1Yqb.js +1 -0
  110. package/dist/frontend/assets/pa-IN-N4M65BXN-CY30-qH7.js +4 -0
  111. package/dist/frontend/assets/path-CbwjOpE9.js +1 -0
  112. package/dist/frontend/assets/pica-DWYGHLQV.js +7 -0
  113. package/dist/frontend/assets/pie-CDiWh1rj.js +1 -0
  114. package/dist/frontend/assets/pieDiagram-421022e6-Bgy-duyf.js +35 -0
  115. package/dist/frontend/assets/pieDiagram-8a3498a8-DH7FsbPK.js +35 -0
  116. package/dist/frontend/assets/pl-PL-T2D74RX3-TrHugsIA.js +9 -0
  117. package/dist/frontend/assets/pt-BR-5N22H2LF-CJxdFp9c.js +9 -0
  118. package/dist/frontend/assets/pt-PT-UZXXM6DQ-CB-1q6YJ.js +9 -0
  119. package/dist/frontend/assets/quadrantDiagram-0957ecba-DcwYI1oi.js +7 -0
  120. package/dist/frontend/assets/quadrantDiagram-120e2f19-CvHU5a9v.js +7 -0
  121. package/dist/frontend/assets/requirementDiagram-23d650b8-tdagN8HP.js +52 -0
  122. package/dist/frontend/assets/requirementDiagram-deff3bca-BMGM-fSI.js +52 -0
  123. package/dist/frontend/assets/ro-RO-JPDTUUEW-DQq9DBOd.js +11 -0
  124. package/dist/frontend/assets/roundRect-0PYZxl1G.js +1 -0
  125. package/dist/frontend/assets/ru-RU-B4JR7IUQ-CWX32rfh.js +9 -0
  126. package/dist/frontend/assets/sankeyDiagram-04a897e0-3i6zWpY2.js +8 -0
  127. package/dist/frontend/assets/sankeyDiagram-23345273-ncj1Ol7S.js +8 -0
  128. package/dist/frontend/assets/sankeyLinkHorizontal-DgqkLiUE.js +1 -0
  129. package/dist/frontend/assets/selectAll-DJwesbwT.js +1 -0
  130. package/dist/frontend/assets/sequenceDiagram-17ac3bff-ChyKKRZA.js +122 -0
  131. package/dist/frontend/assets/sequenceDiagram-704730f1-D57_wP9k.js +122 -0
  132. package/dist/frontend/assets/si-LK-N5RQ5JYF-Lkc5ZxyG.js +1 -0
  133. package/dist/frontend/assets/sk-SK-C5VTKIMK-DyvYXjqZ.js +6 -0
  134. package/dist/frontend/assets/sl-SI-NN7IZMDC-D_MvP9Rh.js +6 -0
  135. package/dist/frontend/assets/stateDiagram-587899a1-OjFTnFLS.js +1 -0
  136. package/dist/frontend/assets/stateDiagram-9c5f0230-BzU36S5C.js +1 -0
  137. package/dist/frontend/assets/stateDiagram-v2-51a3dcff-CfX1qo7U.js +1 -0
  138. package/dist/frontend/assets/stateDiagram-v2-d93cdb3a-BH7Ud4sU.js +1 -0
  139. package/dist/frontend/assets/styles-2ab5d517-CA8x9Nh5.js +116 -0
  140. package/dist/frontend/assets/styles-5f03d8d2-BnO2pLhV.js +160 -0
  141. package/dist/frontend/assets/styles-6aaf32cf-COnot1ea.js +207 -0
  142. package/dist/frontend/assets/styles-9a916d00-C3QkBgTF.js +160 -0
  143. package/dist/frontend/assets/styles-c10674c1-CPAG2_rr.js +116 -0
  144. package/dist/frontend/assets/styles-edf9a4b0-B8Q9fyu0.js +207 -0
  145. package/dist/frontend/assets/subset-shared.chunk.js +84 -0
  146. package/dist/frontend/assets/subset-worker.chunk.js +1 -0
  147. package/dist/frontend/assets/sv-SE-XGPEYMSR-t6voGQSI.js +10 -0
  148. package/dist/frontend/assets/svgDrawCommon-08f97a94-CdT21LWf.js +1 -0
  149. package/dist/frontend/assets/svgDrawCommon-3ba9043b-D1MU7jAE.js +1 -0
  150. package/dist/frontend/assets/ta-IN-2NMHFXQM-7VmfDDyV.js +9 -0
  151. package/dist/frontend/assets/th-TH-HPSO5L25-B5rLEY9P.js +2 -0
  152. package/dist/frontend/assets/timeline-definition-7e6b55e7-BIcL44O_.js +61 -0
  153. package/dist/frontend/assets/timeline-definition-85554ec2-TgrYYwpU.js +61 -0
  154. package/dist/frontend/assets/tr-TR-DEFEU3FU-0CgOHXTn.js +7 -0
  155. package/dist/frontend/assets/uk-UA-QMV73CPH-CzSFsIsx.js +6 -0
  156. package/dist/frontend/assets/union-CnQAJu0l.js +1 -0
  157. package/dist/frontend/assets/vi-VN-M7AON7JQ-Bhx3rYU9.js +5 -0
  158. package/dist/frontend/assets/xml-BOsq7VnW.js +1 -0
  159. package/dist/frontend/assets/xychartDiagram-b6496bcd-BMKDop6v.js +7 -0
  160. package/dist/frontend/assets/xychartDiagram-e933f94c-DAWithrN.js +7 -0
  161. package/dist/frontend/assets/zh-CN-LNUGB5OW-Br52_wH4.js +10 -0
  162. package/dist/frontend/assets/zh-HK-E62DVLB3-Cj6mnIQ9.js +1 -0
  163. package/dist/frontend/assets/zh-TW-RAJ6MFWO-yLEsVBbC.js +9 -0
  164. package/dist/frontend/assets/zipObject-BeXj5PVd.js +1 -0
  165. package/dist/frontend/index.html +339 -0
  166. package/dist/index.d.ts +4 -0
  167. package/dist/index.d.ts.map +1 -0
  168. package/dist/index.js +2305 -0
  169. package/dist/index.js.map +1 -0
  170. package/dist/remote.d.ts +4 -0
  171. package/dist/remote.d.ts.map +1 -0
  172. package/dist/remote.js +133 -0
  173. package/dist/remote.js.map +1 -0
  174. package/dist/server.d.ts +4 -0
  175. package/dist/server.d.ts.map +1 -0
  176. package/dist/server.js +1217 -0
  177. package/dist/server.js.map +1 -0
  178. package/dist/target.d.ts +41 -0
  179. package/dist/target.d.ts.map +1 -0
  180. package/dist/target.js +244 -0
  181. package/dist/target.js.map +1 -0
  182. package/dist/types.d.ts +228 -0
  183. package/dist/types.d.ts.map +1 -0
  184. package/dist/types.js +53 -0
  185. package/dist/types.js.map +1 -0
  186. package/dist/utils/auth.d.ts +15 -0
  187. package/dist/utils/auth.d.ts.map +1 -0
  188. package/dist/utils/auth.js +68 -0
  189. package/dist/utils/auth.js.map +1 -0
  190. package/dist/utils/github.d.ts +26 -0
  191. package/dist/utils/github.d.ts.map +1 -0
  192. package/dist/utils/github.js +111 -0
  193. package/dist/utils/github.js.map +1 -0
  194. package/dist/utils/logger.d.ts +4 -0
  195. package/dist/utils/logger.d.ts.map +1 -0
  196. package/dist/utils/logger.js +25 -0
  197. package/dist/utils/logger.js.map +1 -0
  198. package/dist/utils/r2store.d.ts +19 -0
  199. package/dist/utils/r2store.d.ts.map +1 -0
  200. package/dist/utils/r2store.js +75 -0
  201. package/dist/utils/r2store.js.map +1 -0
  202. package/frontend/index.html +338 -0
  203. package/frontend/src/App.tsx +1091 -0
  204. package/frontend/src/main.tsx +15 -0
  205. package/frontend/src/utils/ghSync.ts +171 -0
  206. package/frontend/src/utils/mermaidConverter.ts +49 -0
  207. package/frontend/src/utils/webmcp.ts +285 -0
  208. package/package.json +101 -0
  209. package/scripts/check-local-bind.mjs +164 -0
  210. package/scripts/postinstall.mjs +23 -0
  211. package/scripts/publish-pages.sh +39 -0
  212. package/scripts/seed-r2.mjs +9 -0
  213. package/skills/excalidraw-skill/SKILL.md +303 -0
  214. package/skills/excalidraw-skill/evals/evals.json +23 -0
  215. package/skills/excalidraw-skill/references/cheatsheet.md +142 -0
  216. package/skills/excalidraw-skill/scripts/clear-canvas.cjs +38 -0
  217. package/skills/excalidraw-skill/scripts/create-element.cjs +68 -0
  218. package/skills/excalidraw-skill/scripts/delete-element.cjs +48 -0
  219. package/skills/excalidraw-skill/scripts/export-elements.cjs +53 -0
  220. package/skills/excalidraw-skill/scripts/healthcheck.cjs +35 -0
  221. package/skills/excalidraw-skill/scripts/import-elements.cjs +81 -0
  222. package/skills/excalidraw-skill/scripts/update-element.cjs +70 -0
  223. package/src/cli.ts +559 -0
  224. package/src/index.ts +2557 -0
  225. package/src/remote.ts +96 -0
  226. package/src/server.ts +1349 -0
  227. package/src/target.ts +208 -0
  228. package/src/types.ts +338 -0
  229. package/src/utils/auth.ts +61 -0
  230. package/src/utils/github.ts +93 -0
  231. package/src/utils/logger.ts +35 -0
  232. package/src/utils/r2store.ts +76 -0
  233. package/tsconfig.json +50 -0
  234. 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
+ [![CI](https://github.com/wtf403/excalidrop/actions/workflows/ci.yml/badge.svg)](https://github.com/wtf403/excalidrop/actions/workflows/ci.yml)
4
+ [![NPM Version](https://img.shields.io/npm/v/excalidrop)](https://www.npmjs.com/package/excalidrop)
5
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](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
+ ![MCP Excalidraw Demo](docs/demo.gif)
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"}