@sanjibdevnath/mcp-excalidraw-local 1.0.0 → 1.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 (178) hide show
  1. package/README.md +295 -180
  2. package/dist/db.d.ts +2 -0
  3. package/dist/db.d.ts.map +1 -1
  4. package/dist/db.js +16 -0
  5. package/dist/db.js.map +1 -1
  6. package/dist/frontend/assets/{advancedFormat-BvOvfnfC.js → advancedFormat-DP1XBx2w.js} +1 -1
  7. package/dist/frontend/assets/{ar-SA-G6X2FPQ2-75HMOOy8.js → ar-SA-G6X2FPQ2-DasSWqvJ.js} +1 -1
  8. package/dist/frontend/assets/{arc-D-322MQz.js → arc-CHlP0j9L.js} +1 -1
  9. package/dist/frontend/assets/az-AZ-76LH7QW2-DIx7sIgC.js +1 -0
  10. package/dist/frontend/assets/{bg-BG-XCXSNQG7-DrFYc9eo.js → bg-BG-XCXSNQG7-DyAdeT49.js} +1 -1
  11. package/dist/frontend/assets/{blockDiagram-38ab4fdb-Ch8bwO7g.js → blockDiagram-38ab4fdb-BnnH4P-k.js} +2 -2
  12. package/dist/frontend/assets/{blockDiagram-68f4deed-BVqzkDiu.js → blockDiagram-68f4deed-Cmi5SZZO.js} +2 -2
  13. package/dist/frontend/assets/{bn-BD-2XOGV67Q-B1Y75Cvj.js → bn-BD-2XOGV67Q-BDbQgRY3.js} +1 -1
  14. package/dist/frontend/assets/{c4Diagram-15b5d702-D5U2mSdf.js → c4Diagram-15b5d702-CEXzoyqN.js} +2 -2
  15. package/dist/frontend/assets/{c4Diagram-3d4e48cf-eT2EEN_c.js → c4Diagram-3d4e48cf-DV-rxD8H.js} +2 -2
  16. package/dist/frontend/assets/{ca-ES-6MX7JW3Y-00BTiK3Z.js → ca-ES-6MX7JW3Y-DK5i6AgQ.js} +1 -1
  17. package/dist/frontend/assets/channel-D6upxKro.js +1 -0
  18. package/dist/frontend/assets/classDiagram-70f12bd4-DWp7zwVc.js +2 -0
  19. package/dist/frontend/assets/classDiagram-d40c83e7-DAQ5Wdh8.js +2 -0
  20. package/dist/frontend/assets/classDiagram-v2-d5a6b087-B-4Zr3gZ.js +2 -0
  21. package/dist/frontend/assets/classDiagram-v2-f2320105-BqpiKtCm.js +2 -0
  22. package/dist/frontend/assets/clone-CgoLu_Rz.js +1 -0
  23. package/dist/frontend/assets/{createText-2e5e7dd3-Bpmkp1eZ.js → createText-2e5e7dd3-CSgkWMBd.js} +1 -1
  24. package/dist/frontend/assets/{createText-d213de94-3MLB4fd8.js → createText-d213de94-CjS9lbOa.js} +1 -1
  25. package/dist/frontend/assets/{cs-CZ-2BRQDIVT-R7SCWLLF.js → cs-CZ-2BRQDIVT-CM3dLaz_.js} +1 -1
  26. package/dist/frontend/assets/{cytoscape-cose-bilkent-CoIxD6ON.js → cytoscape-cose-bilkent-3nhDREcJ.js} +1 -1
  27. package/dist/frontend/assets/{da-DK-5WZEPLOC-Db1yebad.js → da-DK-5WZEPLOC-COjC4AU9.js} +1 -1
  28. package/dist/frontend/assets/{de-DE-XR44H4JA-HRE-6fuh.js → de-DE-XR44H4JA-iTJ8Fn8A.js} +1 -1
  29. package/dist/frontend/assets/{edges-332bd1c7-DZAOA9uP.js → edges-332bd1c7-DEUresxo.js} +1 -1
  30. package/dist/frontend/assets/{edges-e0da2a9e-CP-XTLb4.js → edges-e0da2a9e-jMWX2XC6.js} +1 -1
  31. package/dist/frontend/assets/{el-GR-BZB4AONW-CfNczSdx.js → el-GR-BZB4AONW-CwvvXspa.js} +1 -1
  32. package/dist/frontend/assets/{elk.bundled-BZDcWavb.js → elk.bundled-DPPV-x3s.js} +1 -1
  33. package/dist/frontend/assets/{erDiagram-880f2ed8-Bk96tDga.js → erDiagram-880f2ed8-BSBXXBVr.js} +2 -2
  34. package/dist/frontend/assets/{erDiagram-9861fffd-BvkEkcRK.js → erDiagram-9861fffd-ZPrBZaDE.js} +2 -2
  35. package/dist/frontend/assets/{es-ES-U4NZUMDT-BBJZ1_wD.js → es-ES-U4NZUMDT-yCi10KLl.js} +1 -1
  36. package/dist/frontend/assets/{eu-ES-A7QVB2H4-CCLNmdnk.js → eu-ES-A7QVB2H4-Lj-2pkXa.js} +1 -1
  37. package/dist/frontend/assets/{fa-IR-HGAKTJCU-BtKS5FOW.js → fa-IR-HGAKTJCU-CapZnae9.js} +1 -1
  38. package/dist/frontend/assets/{fi-FI-Z5N7JZ37-DEQi6vbL.js → fi-FI-Z5N7JZ37-D4DF8Oy2.js} +1 -1
  39. package/dist/frontend/assets/{flowDb-7c981674-JJMg1ttK.js → flowDb-7c981674-CHEQPxe1.js} +1 -1
  40. package/dist/frontend/assets/{flowDb-956e92f1-CVVUllPW.js → flowDb-956e92f1-DSoZvO8S.js} +1 -1
  41. package/dist/frontend/assets/{flowDiagram-66a62f08-wGFuUp6y.js → flowDiagram-66a62f08-Dg-9Q3Mr.js} +2 -2
  42. package/dist/frontend/assets/{flowDiagram-cbd28bf7-CXKT_tHC.js → flowDiagram-cbd28bf7-B7uGcbav.js} +2 -2
  43. package/dist/frontend/assets/flowDiagram-v2-96b9c2cf-BOeLi4Bh.js +1 -0
  44. package/dist/frontend/assets/flowDiagram-v2-ffc7f31a-BVZzJdEz.js +1 -0
  45. package/dist/frontend/assets/{flowchart-elk-definition-36e2d292-Cam5JBwn.js → flowchart-elk-definition-36e2d292-C9hm9QMF.js} +2 -2
  46. package/dist/frontend/assets/{flowchart-elk-definition-4a651766-BoyD4myW.js → flowchart-elk-definition-4a651766-n8MmIJTe.js} +2 -2
  47. package/dist/frontend/assets/{fr-FR-RHASNOE6-_AQjPuKS.js → fr-FR-RHASNOE6-Fm5lOJQP.js} +1 -1
  48. package/dist/frontend/assets/{ganttDiagram-04f9e578-DrDI9_oS.js → ganttDiagram-04f9e578-CeTT1DKi.js} +2 -2
  49. package/dist/frontend/assets/{ganttDiagram-c361ad54-CKSyNc2k.js → ganttDiagram-c361ad54-DnJqKl4Y.js} +2 -2
  50. package/dist/frontend/assets/{gitGraphDiagram-21fc4d3e-BHBdnwSb.js → gitGraphDiagram-21fc4d3e-DVq05Sx7.js} +2 -2
  51. package/dist/frontend/assets/{gitGraphDiagram-72cf32ee-BHN9qiXg.js → gitGraphDiagram-72cf32ee-CkrvO3n5.js} +2 -2
  52. package/dist/frontend/assets/{gl-ES-HMX3MZ6V-Bp2h6sBC.js → gl-ES-HMX3MZ6V-BnAC1k53.js} +1 -1
  53. package/dist/frontend/assets/{graph-CRb9j7zI.js → graph-CGc2F9EK.js} +1 -1
  54. package/dist/frontend/assets/{graph-EK5j_nPe.js → graph-Cuq08VGx.js} +1 -1
  55. package/dist/frontend/assets/{he-IL-6SHJWFNN-hsaAKZ5K.js → he-IL-6SHJWFNN-it0Mh2UM.js} +1 -1
  56. package/dist/frontend/assets/{hi-IN-IWLTKZ5I-sgYSNzoz.js → hi-IN-IWLTKZ5I-BrQyHtsW.js} +1 -1
  57. package/dist/frontend/assets/{hu-HU-A5ZG7DT2-DxYZr0yq.js → hu-HU-A5ZG7DT2-D4Kvezza.js} +1 -1
  58. package/dist/frontend/assets/{id-ID-SAP4L64H-z0RzSKPQ.js → id-ID-SAP4L64H-yc1wTiX2.js} +1 -1
  59. package/dist/frontend/assets/{index-3862675e-CQPsxwvk.js → index-3862675e-Cd6WiSra.js} +1 -1
  60. package/dist/frontend/assets/{index-6079d271-pTR-OMc-.js → index-6079d271-DJOPyLe9.js} +1 -1
  61. package/dist/frontend/assets/{index-BcHA28Dx.js → index-C6oTBvAJ.js} +4 -4
  62. package/dist/frontend/assets/index-o_UMzp_N.js +343 -0
  63. package/dist/frontend/assets/{infoDiagram-4a4f5b27-OIxyK2_N.js → infoDiagram-4a4f5b27-DmiDxHA0.js} +2 -2
  64. package/dist/frontend/assets/{infoDiagram-f8f76790-BTkoanKB.js → infoDiagram-f8f76790-Du4PRSh6.js} +2 -2
  65. package/dist/frontend/assets/{it-IT-JPQ66NNP-Cu6RM7DP.js → it-IT-JPQ66NNP-C4S6o7j_.js} +1 -1
  66. package/dist/frontend/assets/{ja-JP-DBVTYXUO-lD7U4Zkf.js → ja-JP-DBVTYXUO-BucbBMf9.js} +1 -1
  67. package/dist/frontend/assets/{journeyDiagram-49397b02-BbBAwEfu.js → journeyDiagram-29694f62-UCd7F1Cn.js} +1 -1
  68. package/dist/frontend/assets/{journeyDiagram-29694f62-BS4Xl0A-.js → journeyDiagram-49397b02-GRSsD4Rn.js} +2 -2
  69. package/dist/frontend/assets/kaa-6HZHGXH3-CgtQtqft.js +1 -0
  70. package/dist/frontend/assets/{kab-KAB-ZGHBKWFO-BAojmp2_.js → kab-KAB-ZGHBKWFO-DDU8hEtC.js} +1 -1
  71. package/dist/frontend/assets/kk-KZ-P5N5QNE5-6W_m7WPZ.js +1 -0
  72. package/dist/frontend/assets/{km-KH-HSX4SM5Z-BzYGKbAg.js → km-KH-HSX4SM5Z-DaSmiDrj.js} +1 -1
  73. package/dist/frontend/assets/{ko-KR-MTYHY66A-DOvEMk4H.js → ko-KR-MTYHY66A-BnfvEfaC.js} +1 -1
  74. package/dist/frontend/assets/{ku-TR-6OUDTVRD-B6l-ghqp.js → ku-TR-6OUDTVRD-C__2gsVI.js} +1 -1
  75. package/dist/frontend/assets/{layout-DbdMIGYe.js → layout-BEiCz13F.js} +1 -1
  76. package/dist/frontend/assets/{layout-CGydnLJa.js → layout-Dfvk-fjv.js} +1 -1
  77. package/dist/frontend/assets/{line-CbImtxDK.js → line-BXvkepTW.js} +1 -1
  78. package/dist/frontend/assets/{linear-DvIsU3aM.js → linear-D-e1r1xo.js} +1 -1
  79. package/dist/frontend/assets/{lt-LT-XHIRWOB4-BYcRk8Uj.js → lt-LT-XHIRWOB4-sy2dgt54.js} +1 -1
  80. package/dist/frontend/assets/{lv-LV-5QDEKY6T-DS3krNIe.js → lv-LV-5QDEKY6T-APNbUhKX.js} +1 -1
  81. package/dist/frontend/assets/{mindmap-definition-ac74a2e8-C0Sp7ICZ.js → mindmap-definition-ac74a2e8-CBjTBbjm.js} +2 -2
  82. package/dist/frontend/assets/{mindmap-definition-fc14e90a-BZrjRbkr.js → mindmap-definition-fc14e90a-iQ1gp7ab.js} +2 -2
  83. package/dist/frontend/assets/{mr-IN-CRQNXWMA-BfxQL7Vh.js → mr-IN-CRQNXWMA-Dc11z8_3.js} +1 -1
  84. package/dist/frontend/assets/my-MM-5M5IBNSE-DDK8gVnZ.js +1 -0
  85. package/dist/frontend/assets/{nb-NO-T6EIAALU-BIbPZokm.js → nb-NO-T6EIAALU-DKoHiM5M.js} +1 -1
  86. package/dist/frontend/assets/{nl-NL-IS3SIHDZ-BqQloGBT.js → nl-NL-IS3SIHDZ-BiHnoSws.js} +1 -1
  87. package/dist/frontend/assets/{nn-NO-6E72VCQL-zGR8NYQf.js → nn-NO-6E72VCQL-DMeZaMaA.js} +1 -1
  88. package/dist/frontend/assets/{oc-FR-POXYY2M6-B8-HsJFE.js → oc-FR-POXYY2M6-TCVmFDBJ.js} +1 -1
  89. package/dist/frontend/assets/{pa-IN-N4M65BXN-B2Ta58Tu.js → pa-IN-N4M65BXN-D3CRD3-a.js} +1 -1
  90. package/dist/frontend/assets/{pica-DSD-O3at.js → pica-CjnEaUNS.js} +1 -1
  91. package/dist/frontend/assets/{pie-Dk_pQnuO.js → pie-BL7A9rNp.js} +1 -1
  92. package/dist/frontend/assets/{pieDiagram-421022e6-9oAq5fk_.js → pieDiagram-421022e6-BjD1C6Sc.js} +2 -2
  93. package/dist/frontend/assets/{pieDiagram-8a3498a8-B5SMrdDh.js → pieDiagram-8a3498a8-CQbNnx4A.js} +2 -2
  94. package/dist/frontend/assets/{pl-PL-T2D74RX3-rZKvQ0zQ.js → pl-PL-T2D74RX3-CEkVUJTc.js} +1 -1
  95. package/dist/frontend/assets/{pt-BR-5N22H2LF-ij6wtU6I.js → pt-BR-5N22H2LF-BeqCronj.js} +1 -1
  96. package/dist/frontend/assets/{pt-PT-UZXXM6DQ-BIgtUnbW.js → pt-PT-UZXXM6DQ-DRwQVz4M.js} +1 -1
  97. package/dist/frontend/assets/{quadrantDiagram-0957ecba-Cr3mj6c1.js → quadrantDiagram-0957ecba-BI9AZI22.js} +2 -2
  98. package/dist/frontend/assets/{quadrantDiagram-120e2f19-CQnc4s0f.js → quadrantDiagram-120e2f19-Dl6CtJLW.js} +2 -2
  99. package/dist/frontend/assets/{requirementDiagram-deff3bca-G5e-Qxao.js → requirementDiagram-23d650b8-Z3i3040p.js} +1 -1
  100. package/dist/frontend/assets/{requirementDiagram-23d650b8-Bs7pP1vJ.js → requirementDiagram-deff3bca-CJmKNaP4.js} +2 -2
  101. package/dist/frontend/assets/{ro-RO-JPDTUUEW-DPj_79nt.js → ro-RO-JPDTUUEW-CYFau-A6.js} +1 -1
  102. package/dist/frontend/assets/{ru-RU-B4JR7IUQ-fdYiaqbX.js → ru-RU-B4JR7IUQ-D3h9RDjd.js} +1 -1
  103. package/dist/frontend/assets/{sankeyDiagram-04a897e0-CJogadkF.js → sankeyDiagram-04a897e0-D8FszeKB.js} +2 -2
  104. package/dist/frontend/assets/{sankeyDiagram-23345273-DKUWMCrX.js → sankeyDiagram-23345273-plJZ4Q2w.js} +2 -2
  105. package/dist/frontend/assets/{selectAll-tNeSnQY6.js → selectAll-ClF87C0p.js} +1 -1
  106. package/dist/frontend/assets/{sequenceDiagram-17ac3bff-DCw9xUbw.js → sequenceDiagram-17ac3bff-DjTmXy_n.js} +2 -2
  107. package/dist/frontend/assets/{sequenceDiagram-704730f1-BgClSrOI.js → sequenceDiagram-704730f1-CuIFXxtR.js} +2 -2
  108. package/dist/frontend/assets/si-LK-N5RQ5JYF-BipWhoYB.js +1 -0
  109. package/dist/frontend/assets/{sk-SK-C5VTKIMK-Cbj4yoD_.js → sk-SK-C5VTKIMK-PwBZdDF1.js} +1 -1
  110. package/dist/frontend/assets/{sl-SI-NN7IZMDC-C_rL7eDE.js → sl-SI-NN7IZMDC-Ch2Z7Hrb.js} +1 -1
  111. package/dist/frontend/assets/stateDiagram-587899a1-C0X52fNc.js +1 -0
  112. package/dist/frontend/assets/stateDiagram-9c5f0230-DGtO9otR.js +1 -0
  113. package/dist/frontend/assets/stateDiagram-v2-51a3dcff-DYpiPK3W.js +1 -0
  114. package/dist/frontend/assets/stateDiagram-v2-d93cdb3a-CS-Fisfs.js +1 -0
  115. package/dist/frontend/assets/{styles-2ab5d517-Dxg7wKah.js → styles-2ab5d517-LYh74XJL.js} +1 -1
  116. package/dist/frontend/assets/{styles-5f03d8d2-DD32XMGL.js → styles-5f03d8d2-Cicwooy5.js} +1 -1
  117. package/dist/frontend/assets/{styles-6aaf32cf-B5DxK_RW.js → styles-6aaf32cf-DtBZgBCn.js} +1 -1
  118. package/dist/frontend/assets/{styles-9a916d00-C6L6Mj2P.js → styles-9a916d00-Cvxhh64P.js} +1 -1
  119. package/dist/frontend/assets/{styles-c10674c1-BPM_bB3H.js → styles-c10674c1-U3bK_YY4.js} +1 -1
  120. package/dist/frontend/assets/{styles-edf9a4b0-CbQDxrwP.js → styles-edf9a4b0-ihVg8xSf.js} +1 -1
  121. package/dist/frontend/assets/{subset-shared.chunk-B_DQsaBC.js → subset-shared.chunk-rVDsBRzy.js} +18 -12
  122. package/dist/frontend/assets/subset-worker.chunk-Qc3pK9xs.js +1 -0
  123. package/dist/frontend/assets/{sv-SE-XGPEYMSR-BmmcOaVK.js → sv-SE-XGPEYMSR-DnsP8fpO.js} +1 -1
  124. package/dist/frontend/assets/{svgDrawCommon-08f97a94-aUx8qfJx.js → svgDrawCommon-08f97a94-C9kK8NA4.js} +1 -1
  125. package/dist/frontend/assets/{svgDrawCommon-3ba9043b-1JM8RiLc.js → svgDrawCommon-3ba9043b-B8spdxcs.js} +1 -1
  126. package/dist/frontend/assets/{ta-IN-2NMHFXQM-Kxnb_Mwk.js → ta-IN-2NMHFXQM-ywacH2SS.js} +1 -1
  127. package/dist/frontend/assets/th-TH-HPSO5L25-DWCnubPy.js +2 -0
  128. package/dist/frontend/assets/{timeline-definition-7e6b55e7-BbFhIPTl.js → timeline-definition-7e6b55e7-B4BSgVgG.js} +2 -2
  129. package/dist/frontend/assets/{timeline-definition-85554ec2-C1G9H6m5.js → timeline-definition-85554ec2-BXHiqlKy.js} +5 -5
  130. package/dist/frontend/assets/{tr-TR-DEFEU3FU-DhlYP6tL.js → tr-TR-DEFEU3FU-lNxOg1K5.js} +1 -1
  131. package/dist/frontend/assets/{uk-UA-QMV73CPH-pMrN1qBS.js → uk-UA-QMV73CPH-DavpGbzZ.js} +1 -1
  132. package/dist/frontend/assets/{union-Cu1rbD_D.js → union-DEhYLH1O.js} +1 -1
  133. package/dist/frontend/assets/{vi-VN-M7AON7JQ-BPMcH84R.js → vi-VN-M7AON7JQ-CGV8RvGM.js} +1 -1
  134. package/dist/frontend/assets/{xychartDiagram-b6496bcd-BDm9pYtk.js → xychartDiagram-b6496bcd-C4hInaC9.js} +3 -3
  135. package/dist/frontend/assets/{xychartDiagram-e933f94c-BlrTBDHC.js → xychartDiagram-e933f94c-BRIGbNCw.js} +3 -3
  136. package/dist/frontend/assets/{zh-CN-LNUGB5OW-B8kYYibM.js → zh-CN-LNUGB5OW-D9ClIhqj.js} +1 -1
  137. package/dist/frontend/assets/zh-HK-E62DVLB3-Lcmr7mSD.js +1 -0
  138. package/dist/frontend/assets/{zh-TW-RAJ6MFWO-DKCVg17j.js → zh-TW-RAJ6MFWO-BNek22mD.js} +1 -1
  139. package/dist/frontend/assets/{zipObject-iRVIFf6r.js → zipObject-D8riifuA.js} +1 -1
  140. package/dist/frontend/index.html +47 -1
  141. package/dist/index.d.ts.map +1 -1
  142. package/dist/index.js +208 -41
  143. package/dist/index.js.map +1 -1
  144. package/dist/server.d.ts +1 -0
  145. package/dist/server.d.ts.map +1 -1
  146. package/dist/server.js +158 -13
  147. package/dist/server.js.map +1 -1
  148. package/dist/setup.d.ts +10 -0
  149. package/dist/setup.d.ts.map +1 -0
  150. package/dist/setup.js +321 -0
  151. package/dist/setup.js.map +1 -0
  152. package/dist/types.d.ts +17 -2
  153. package/dist/types.d.ts.map +1 -1
  154. package/dist/types.js +33 -1
  155. package/dist/types.js.map +1 -1
  156. package/package.json +18 -4
  157. package/skills/excalidraw-skill/SKILL.md +45 -1
  158. package/dist/frontend/assets/az-AZ-76LH7QW2-DPDwkDvh.js +0 -1
  159. package/dist/frontend/assets/channel-CudwHHli.js +0 -1
  160. package/dist/frontend/assets/classDiagram-70f12bd4-CcNOdQHv.js +0 -2
  161. package/dist/frontend/assets/classDiagram-d40c83e7-nRIgRTMT.js +0 -2
  162. package/dist/frontend/assets/classDiagram-v2-d5a6b087-Cfbvao44.js +0 -2
  163. package/dist/frontend/assets/classDiagram-v2-f2320105-1Sjp5Uqh.js +0 -2
  164. package/dist/frontend/assets/clone-D_tGm99B.js +0 -1
  165. package/dist/frontend/assets/flowDiagram-v2-96b9c2cf-CN4ht1EM.js +0 -1
  166. package/dist/frontend/assets/flowDiagram-v2-ffc7f31a-CFiBItzu.js +0 -1
  167. package/dist/frontend/assets/index-DPgZw9ew.js +0 -349
  168. package/dist/frontend/assets/kaa-6HZHGXH3-DM9LwXUP.js +0 -1
  169. package/dist/frontend/assets/kk-KZ-P5N5QNE5-Dp0K1W81.js +0 -1
  170. package/dist/frontend/assets/my-MM-5M5IBNSE-C3EfnOvD.js +0 -1
  171. package/dist/frontend/assets/si-LK-N5RQ5JYF-DfPBk-rU.js +0 -1
  172. package/dist/frontend/assets/stateDiagram-587899a1-DuFGG-SI.js +0 -1
  173. package/dist/frontend/assets/stateDiagram-9c5f0230-Bwj38hfH.js +0 -1
  174. package/dist/frontend/assets/stateDiagram-v2-51a3dcff-3c0yKNdL.js +0 -1
  175. package/dist/frontend/assets/stateDiagram-v2-d93cdb3a-CAaqB4wm.js +0 -1
  176. package/dist/frontend/assets/subset-worker.chunk-DL6tLP7M.js +0 -1
  177. package/dist/frontend/assets/th-TH-HPSO5L25-BqTLgxJz.js +0 -2
  178. package/dist/frontend/assets/zh-HK-E62DVLB3-CaI0gehP.js +0 -1
package/README.md CHANGED
@@ -37,14 +37,13 @@ Click the workspace badge to switch between isolated canvases — each workspace
37
37
  ## Table of Contents
38
38
 
39
39
  - [Screenshots](#screenshots)
40
- - [What It Is](#what-it-is)
40
+ - [Prerequisites](#prerequisites)
41
+ - [Quick Start](#quick-start)
42
+ - [Configuration](#configuration)
43
+ - [Verify Installation](#verify-installation)
41
44
  - [How We Differ from the Official Excalidraw MCP](#how-we-differ-from-the-official-excalidraw-mcp)
42
45
  - [What Changed From Upstream](#what-changed-from-upstream)
43
- - [What's New](#whats-new)
44
46
  - [Architecture](#architecture)
45
- - [Quick Start](#quick-start)
46
- - [Quick Start (Docker)](#quick-start-docker)
47
- - [Configuration](#configuration)
48
47
  - [Environment Variables](#environment-variables)
49
48
  - [Multi-Tenancy (Workspaces)](#multi-tenancy-workspaces)
50
49
  - [Agent Skill (Optional)](#agent-skill-optional)
@@ -55,165 +54,153 @@ Click the workspace badge to switch between isolated canvases — each workspace
55
54
  - [Development](#development)
56
55
  - [Credits](#credits)
57
56
 
58
- ## What It Is
57
+ ## Prerequisites
59
58
 
60
- This MCP server gives AI agents a full canvas toolkit to build, inspect, and iteratively refine Excalidraw diagrams — including the ability to see what they drew.
59
+ | Requirement | Why | Check |
60
+ |---|---|---|
61
+ | **Node.js >= 18** (LTS 20 or 22 recommended) | Runtime | `node --version` |
62
+ | **C++ build tools** | `better-sqlite3` compiles native bindings | See below |
63
+ | **npm** (bundled with Node.js) | Package manager | `npm --version` |
61
64
 
62
- The repo contains a single Node.js process that runs:
65
+ ### C++ build tools by platform
63
66
 
64
- - **MCP server** (stdio): 32 tools for element CRUD, layout, scene awareness, file I/O, snapshots, search, multi-tenancy, and more
65
- - **Canvas server** (embedded): web UI + REST API + WebSocket updates at `http://localhost:<CANVAS_PORT>`
66
- - **SQLite database**: persistent storage at `~/.excalidraw-mcp/excalidraw.db`
67
+ **macOS:**
68
+ ```bash
69
+ xcode-select --install
70
+ ```
67
71
 
68
- ## How We Differ from the Official Excalidraw MCP
72
+ **Ubuntu / Debian:**
73
+ ```bash
74
+ sudo apt install build-essential python3
75
+ ```
69
76
 
70
- 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.
77
+ **Windows:**
78
+ ```bash
79
+ npm install --global windows-build-tools
80
+ ```
71
81
 
72
- | | Official Excalidraw MCP | This Project |
73
- |---|---|---|
74
- | **Approach** | Prompt in, diagram out (one-shot) | Programmatic element-level control (32 tools) |
75
- | **State** | Stateless — each call is independent | Persistent live canvas with real-time sync |
76
- | **Storage** | None | SQLite with WAL mode, versioning, element history |
77
- | **Multi-tenancy** | No | Workspace-based isolation, auto-detected |
78
- | **Element CRUD** | No | Full create / read / update / delete per element |
79
- | **AI sees the canvas** | No | `describe_scene` (structured text) + `get_canvas_screenshot` (image) |
80
- | **Iterative refinement** | No — regenerate the whole diagram | Draw → look → adjust → look again, element by element |
81
- | **Layout tools** | No | `align_elements`, `distribute_elements`, `group / ungroup` |
82
- | **File I/O** | No | `export_scene` / `import_scene` (.excalidraw JSON) |
83
- | **Snapshot & rollback** | No | `snapshot_scene` / `restore_snapshot` |
84
- | **Mermaid conversion** | No | `create_from_mermaid` |
85
- | **Search** | No | `search_elements` — full-text search across labels |
86
- | **Design guide** | `read_me` cheat sheet | `read_diagram_guide` (colors, sizing, layout, anti-patterns) |
87
- | **Viewport control** | Camera animations | `set_viewport` (zoom-to-fit, center on element, manual zoom) |
88
- | **Live canvas UI** | Rendered inline in chat | Standalone Excalidraw app synced via WebSocket |
89
- | **Multi-agent** | Single user | Multiple agents can draw on the same canvas concurrently |
90
- | **Works without MCP** | No | Yes — REST API fallback via agent skill |
82
+ > `better-sqlite3` ships prebuilt binaries for most Node LTS versions. The build tools are only needed when a prebuilt binary isn't available for your platform/Node combination.
91
83
 
92
- **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.
84
+ ## Quick Start
93
85
 
94
- ## What Changed From Upstream
86
+ ### Path A: Interactive Setup (recommended for first-time users)
95
87
 
96
- This fork extends [yctimlin/mcp_excalidraw](https://github.com/yctimlin/mcp_excalidraw) with the following enhancements:
88
+ The setup wizard checks your environment, optionally installs the agent skill, and configures MCP clients — all interactively. Every step is skippable.
97
89
 
98
- | Area | Upstream | This Fork |
99
- |---|---|---|
100
- | **Storage** | In-memory (lost on restart) | SQLite with WAL mode, versioning, element history |
101
- | **Multi-tenancy** | None | Workspace-based tenant isolation (auto-detected via `server.listRoots()`) |
102
- | **Canvas lifecycle** | Separate process (2 terminals) | Embedded in MCP process (single `node dist/index.js`) |
103
- | **Auto-sync** | Manual "Sync to Backend" button | Debounced auto-sync (3s idle) with manual override |
104
- | **Canvas port** | Hardcoded 3000 | Configurable via `CANVAS_PORT` env var |
105
- | **MCP tools** | 26 | 32 (added search, history, tenants, projects) |
106
- | **Workspace switcher** | None | Dropdown with search in canvas UI |
107
- | **Sync normalization** | Bound text breaks on reload | Elements normalized to MCP format before storage |
108
- | **Projects** | None | Multiple projects per tenant |
109
- | **Element history** | None | Full version history per element |
110
- | **Search** | None | Full-text search across elements |
90
+ ```bash
91
+ npx @sanjibdevnath/mcp-excalidraw-local setup
92
+ ```
111
93
 
112
- ### New MCP Tools (6 added)
94
+ <details>
95
+ <summary>Example session</summary>
113
96
 
114
- | Tool | Description |
115
- |---|---|
116
- | `search_elements` | Full-text search across element labels and text |
117
- | `element_history` | View version history for any element |
118
- | `list_projects` | List projects within the active tenant |
119
- | `switch_project` | Switch between projects |
120
- | `list_tenants` | List all workspace tenants |
121
- | `switch_tenant` | Switch the active workspace tenant |
122
-
123
- ## What's New
124
-
125
- ### v1.0 — This Fork (Persistence & Multi-Tenancy)
126
-
127
- - **SQLite persistence**: Elements, projects, tenants, snapshots, and element versions stored in `~/.excalidraw-mcp/excalidraw.db` with WAL mode and `busy_timeout` for multi-process safety
128
- - **Multi-tenancy**: Each workspace gets an isolated canvas. Tenant auto-detected from workspace path via `server.listRoots()`. UI dropdown with search for switching workspaces
129
- - **Embedded canvas**: Canvas server runs inside the MCP process — single `node dist/index.js` starts everything, stops together
130
- - **Auto-sync with debounce**: Canvas changes are automatically persisted after 3s of inactivity. Manual sync button as fallback. Toggle auto-sync on/off
131
- - **Configurable port**: `CANVAS_PORT` env var (default `3000`)
132
- - **Sync normalization**: Excalidraw's internal bound-text representation is normalized to MCP format before storage, preventing text overflow/detachment on reload
133
- - **6 new MCP tools**: `search_elements`, `element_history`, `list_projects`, `switch_project`, `list_tenants`, `switch_tenant`
134
- - **Updated agent skill**: Comprehensive workflow playbook with iterative write-check-review cycle, sizing rules, anti-patterns, and quality checklist
135
- - **Workspace switcher UI**: Click "Workspace: ..." badge to search and switch between workspaces
136
-
137
- ### v2.0 — Canvas Toolkit (upstream)
138
-
139
- - 13 new MCP tools (26 total): `get_element`, `clear_canvas`, `export_scene`, `import_scene`, `export_to_image`, `duplicate_elements`, `snapshot_scene`, `restore_snapshot`, `describe_scene`, `get_canvas_screenshot`, `read_diagram_guide`, `export_to_excalidraw_url`, `set_viewport`
140
- - **Closed feedback loop**: AI can now inspect the canvas (`describe_scene`) and see it (`get_canvas_screenshot` returns an image) — enabling iterative refinement
141
- - **Design guide**: `read_diagram_guide` returns best-practice color palettes, sizing rules, layout patterns, and anti-patterns
142
- - **Viewport control**: `set_viewport` with `scrollToContent`, `scrollToElementId`, or manual zoom/offset
143
- - **File I/O**: export/import full `.excalidraw` JSON files
144
- - **Snapshots**: save and restore named canvas states
145
- - **Skill fallback**: Agent skill auto-detects MCP vs REST API mode
146
- - Fixed all previously known issues: `align_elements` / `distribute_elements` fully implemented, points type normalization, removed invalid `label` type, `ungroup_elements` now errors on failure
147
-
148
- ### v1.x (upstream)
149
-
150
- - Agent skill: `skills/excalidraw-skill/` (portable instructions + helper scripts for export/import and repeatable CRUD)
151
- - Better testing loop: MCP Inspector CLI examples + browser screenshot checks
152
- - Bugfixes: batch create now preserves element ids (fixes update/delete after batch); frontend entrypoint fixed
97
+ ```
98
+ $ npx @sanjibdevnath/mcp-excalidraw-local setup
153
99
 
154
- ## Architecture
100
+ Excalidraw MCP — Setup
155
101
 
156
- ![Architecture](docs/screenshots/architecture.png)
102
+ [1/3] Environment
103
+ ✔ Node.js v22.12.0 .................. OK
104
+ ✔ better-sqlite3 bindings ........... OK
105
+ ✔ Frontend build .................... OK
157
106
 
158
- - **Single process**: The MCP server embeds the canvas server. Starting the MCP starts both; stopping it stops both.
159
- - **SQLite**: Stored at `~/.excalidraw-mcp/excalidraw.db` by default. WAL mode + `busy_timeout` for multi-process safety.
160
- - **Multi-tenancy**: Each workspace gets an isolated tenant (SHA-256 hash of workspace path). The UI shows a workspace switcher dropdown with search.
107
+ [2/3] Agent Skill
108
+ Install the Excalidraw agent skill? [Y/n]: Y
161
109
 
162
- ## Quick Start
110
+ Detected agents:
111
+ [1] Cursor (~/.cursor)
112
+ [2] Claude Code (~/.claude)
163
113
 
164
- ### Option A: NPM (recommended)
114
+ Which agents? (comma-separated, 'all', or 'skip'): all
165
115
 
166
- ```bash
167
- npx @sanjibdevnath/mcp-excalidraw-local
168
- ```
116
+ Cursor — scope? [G]lobal / [l]ocal: G
117
+ Installed to ~/.cursor/skills/excalidraw-skill/
169
118
 
170
- Or install globally:
119
+ Claude Code — scope? [G]lobal / [l]ocal: G
120
+ ✔ Installed to ~/.claude/skills/excalidraw-skill/
171
121
 
172
- ```bash
173
- npm install -g @sanjibdevnath/mcp-excalidraw-local
174
- mcp-excalidraw-local
122
+ [3/3] MCP Configuration
123
+ Add MCP server to agent configs automatically? [Y/n]: Y
124
+
125
+ Cursor — add to ~/.cursor/mcp.json? [Y/n]: Y
126
+ ✔ Added 'excalidraw-canvas' to ~/.cursor/mcp.json
127
+
128
+ Claude Code — register via CLI? [Y/n]: Y
129
+ ✔ Registered 'excalidraw-canvas' via Claude Code CLI
130
+
131
+ Done! Open http://localhost:3000 to verify the canvas.
175
132
  ```
133
+ </details>
176
134
 
177
- ### Option B: From source
135
+ > **The setup is fully optional.** If you prefer to configure everything manually, skip to Path B or C below.
178
136
 
179
- **Prerequisites:** Node >= 18, npm or pnpm
137
+ ### Path B: From Source
180
138
 
181
139
  ```bash
182
140
  git clone https://github.com/sanjibdevnathlabs/mcp-excalidraw-local.git
183
141
  cd mcp-excalidraw-local
184
142
 
185
- # Install dependencies (pnpm or npm)
186
- pnpm install
187
- pnpm rebuild better-sqlite3 esbuild
188
-
189
- # Build frontend + server
190
- pnpm run build
143
+ npm install
144
+ npm run build
191
145
  ```
192
146
 
193
- The MCP server is typically started by your MCP client — see [Configuration](#configuration). To run manually:
147
+ Then configure your MCP client — see [Configuration](#configuration).
194
148
 
149
+ To run manually (outside an MCP client):
195
150
  ```bash
196
151
  node dist/index.js
197
152
  ```
198
153
 
199
- This starts the MCP server (stdio) **and** the canvas server. Open `http://localhost:3000` in your browser.
154
+ Open `http://localhost:3000` in your browser.
200
155
 
201
- ## Quick Start (Docker)
156
+ ### Path C: Docker
202
157
 
203
158
  Canvas server:
204
159
  ```bash
205
160
  docker run -d -p 3000:3000 --name mcp-excalidraw-canvas sanjibdevnath/mcp-excalidraw-local-canvas:latest
206
161
  ```
207
162
 
208
- MCP server (stdio) is typically launched by your MCP client. If you want a local container, use `sanjibdevnath/mcp-excalidraw-local:latest`.
163
+ MCP server (stdio) is typically launched by your MCP client:
164
+ ```json
165
+ {
166
+ "mcpServers": {
167
+ "excalidraw-canvas": {
168
+ "command": "docker",
169
+ "args": [
170
+ "run", "-i", "--rm",
171
+ "-e", "CANVAS_PORT=3000",
172
+ "sanjibdevnath/mcp-excalidraw-local:latest"
173
+ ]
174
+ }
175
+ }
176
+ }
177
+ ```
178
+
179
+ > **Note:** For Docker on Linux, add `--add-host=host.docker.internal:host-gateway`.
209
180
 
210
181
  ## Configuration
211
182
 
212
- This is a standard MCP server communicating over **stdio**. It works with any MCP-compatible client (Cursor, Claude Desktop, Claude Code, Codex CLI, OpenCode, Gemini, or any other agent that supports the Model Context Protocol).
183
+ This is a standard MCP server communicating over **stdio**. It works with any MCP-compatible client.
184
+
185
+ ### Cursor
213
186
 
214
- ### JSON config (most clients)
187
+ Add to `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (per-project):
188
+
189
+ ```json
190
+ {
191
+ "mcpServers": {
192
+ "excalidraw-canvas": {
193
+ "command": "npx",
194
+ "args": ["-y", "@sanjibdevnath/mcp-excalidraw-local"],
195
+ "env": {
196
+ "CANVAS_PORT": "3000"
197
+ }
198
+ }
199
+ }
200
+ }
201
+ ```
215
202
 
216
- Add this to your client's MCP configuration file:
203
+ Or, if installed from source:
217
204
 
218
205
  ```json
219
206
  {
@@ -229,41 +216,119 @@ Add this to your client's MCP configuration file:
229
216
  }
230
217
  ```
231
218
 
232
- Replace `/absolute/path/to/mcp-excalidraw-local` with the actual path where you cloned and built the repo.
219
+ ### Claude Desktop
220
+
221
+ Add to `claude_desktop_config.json`:
222
+
223
+ ```json
224
+ {
225
+ "mcpServers": {
226
+ "excalidraw-canvas": {
227
+ "command": "npx",
228
+ "args": ["-y", "@sanjibdevnath/mcp-excalidraw-local"],
229
+ "env": {
230
+ "CANVAS_PORT": "3000"
231
+ }
232
+ }
233
+ }
234
+ }
235
+ ```
233
236
 
234
- ### CLI-based registration
237
+ ### Claude Code
235
238
 
236
239
  ```bash
237
- # Example for Claude Code
238
240
  claude mcp add excalidraw-canvas --scope user \
239
241
  -e CANVAS_PORT=3000 \
240
- -- node /absolute/path/to/mcp-excalidraw-local/dist/index.js
242
+ -- npx -y @sanjibdevnath/mcp-excalidraw-local
241
243
  ```
242
244
 
243
- ### Docker
245
+ ### Codex CLI
246
+
247
+ Add to `~/.codex/mcp.json`:
244
248
 
245
249
  ```json
246
250
  {
247
251
  "mcpServers": {
248
252
  "excalidraw-canvas": {
249
- "command": "docker",
250
- "args": [
251
- "run", "-i", "--rm",
252
- "-e", "CANVAS_PORT=3000",
253
- "sanjibdevnath/mcp-excalidraw-local:latest"
254
- ]
253
+ "command": "npx",
254
+ "args": ["-y", "@sanjibdevnath/mcp-excalidraw-local"],
255
+ "env": {
256
+ "CANVAS_PORT": "3000"
257
+ }
255
258
  }
256
259
  }
257
260
  }
258
261
  ```
259
262
 
260
- > **Note:** For Docker on Linux, you may need `--add-host=host.docker.internal:host-gateway`.
261
-
262
263
  ### Key points
263
264
 
264
265
  - **Single process** — The canvas server is embedded. No separate terminal or process needed.
265
266
  - **Browser required for screenshots** — `export_to_image` and `get_canvas_screenshot` rely on the frontend. Open `http://localhost:3000` in a browser.
266
267
 
268
+ ## Verify Installation
269
+
270
+ After configuring your MCP client, verify everything works:
271
+
272
+ ```bash
273
+ # 1. Check the canvas server is running
274
+ curl http://localhost:3000/health
275
+
276
+ # 2. Open the canvas in your browser
277
+ open http://localhost:3000
278
+
279
+ # 3. In your AI agent, ask it to:
280
+ # "Create a blue rectangle labeled 'Hello World' on the Excalidraw canvas"
281
+ ```
282
+
283
+ If the health check fails, see [Troubleshooting](#troubleshooting).
284
+
285
+ ## How We Differ from the Official Excalidraw MCP
286
+
287
+ 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.
288
+
289
+ | | Official Excalidraw MCP | This Project |
290
+ |---|---|---|
291
+ | **Approach** | Prompt in, diagram out (one-shot) | Programmatic element-level control (32 tools) |
292
+ | **State** | Stateless — each call is independent | Persistent live canvas with real-time sync |
293
+ | **Storage** | None | SQLite with WAL mode, versioning, element history |
294
+ | **Multi-tenancy** | No | Workspace-based isolation, auto-detected |
295
+ | **Element CRUD** | No | Full create / read / update / delete per element |
296
+ | **AI sees the canvas** | No | `describe_scene` (structured text) + `get_canvas_screenshot` (image) |
297
+ | **Iterative refinement** | No — regenerate the whole diagram | Draw → look → adjust → look again, element by element |
298
+ | **Layout tools** | No | `align_elements`, `distribute_elements`, `group / ungroup` |
299
+ | **File I/O** | No | `export_scene` / `import_scene` (.excalidraw JSON) |
300
+ | **Snapshot & rollback** | No | `snapshot_scene` / `restore_snapshot` |
301
+ | **Mermaid conversion** | No | `create_from_mermaid` |
302
+ | **Search** | No | `search_elements` — full-text search across labels |
303
+ | **Design guide** | `read_me` cheat sheet | `read_diagram_guide` (colors, sizing, layout, anti-patterns) |
304
+ | **Viewport control** | Camera animations | `set_viewport` (zoom-to-fit, center on element, manual zoom) |
305
+ | **Live canvas UI** | Rendered inline in chat | Standalone Excalidraw app synced via WebSocket |
306
+ | **Multi-agent** | Single user | Multiple agents can draw on the same canvas concurrently |
307
+ | **Works without MCP** | No | Yes — REST API fallback via agent skill |
308
+
309
+ ## What Changed From Upstream
310
+
311
+ This fork extends [yctimlin/mcp_excalidraw](https://github.com/yctimlin/mcp_excalidraw) with the following enhancements:
312
+
313
+ | Area | Upstream | This Fork |
314
+ |---|---|---|
315
+ | **Storage** | In-memory (lost on restart) | SQLite with WAL mode, versioning, element history |
316
+ | **Multi-tenancy** | None | Workspace-based tenant isolation (auto-detected via `server.listRoots()`) |
317
+ | **Canvas lifecycle** | Separate process (2 terminals) | Embedded in MCP process (single `node dist/index.js`) |
318
+ | **Auto-sync** | Manual "Sync to Backend" button | Debounced auto-sync (3s idle) with manual override |
319
+ | **Canvas port** | Hardcoded 3000 | Configurable via `CANVAS_PORT` env var |
320
+ | **MCP tools** | 26 | 32 (added search, history, tenants, projects) |
321
+ | **Workspace switcher** | None | Dropdown with search in canvas UI |
322
+ | **Sync normalization** | Bound text breaks on reload | Elements normalized to MCP format before storage |
323
+
324
+ ## Architecture
325
+
326
+ ![Architecture](docs/screenshots/architecture.png)
327
+
328
+ - **Single process**: The MCP server embeds the canvas server. Starting the MCP starts both; stopping it stops both.
329
+ - **SQLite**: Stored at `~/.excalidraw-mcp/excalidraw.db` by default. WAL mode + `busy_timeout` for multi-process safety.
330
+ - **Multi-tenancy**: Each workspace gets an isolated tenant (SHA-256 hash of workspace path). The UI shows a workspace switcher dropdown with search.
331
+
267
332
  ## Environment Variables
268
333
 
269
334
  | Variable | Description | Default |
@@ -272,7 +337,6 @@ claude mcp add excalidraw-canvas --scope user \
272
337
  | `EXCALIDRAW_DB_PATH` | Path to the SQLite database file | `~/.excalidraw-mcp/excalidraw.db` |
273
338
  | `EXCALIDRAW_EXPORT_DIR` | Allowed directory for file exports | `process.cwd()` |
274
339
  | `EXPRESS_SERVER_URL` | Canvas server URL (only if running canvas separately) | `http://localhost:3000` |
275
- | `ENABLE_CANVAS_SYNC` | Enable real-time canvas sync | `true` |
276
340
 
277
341
  ## Multi-Tenancy (Workspaces)
278
342
 
@@ -297,49 +361,30 @@ This repo includes a skill at `skills/excalidraw-skill/` that provides:
297
361
  - **Cheatsheet** (`references/cheatsheet.md`): MCP tool and REST API reference for all 32 tools
298
362
  - **Helper scripts** (`scripts/*.cjs`): export, import, clear, healthcheck, CRUD operations
299
363
 
300
- The skill complements the MCP server by giving your AI agent structured workflows to follow.
364
+ ### Install via Setup Wizard
301
365
 
302
- ### Install the Skill
303
-
304
- Copy the skill folder to your agent's skill directory:
366
+ The easiest way to install the skill:
305
367
 
306
368
  ```bash
307
- # Claude Code
308
- mkdir -p ~/.claude/skills
309
- cp -R skills/excalidraw-skill ~/.claude/skills/excalidraw-skill
310
-
311
- # Cursor
312
- mkdir -p ~/.cursor/skills
313
- cp -R skills/excalidraw-skill ~/.cursor/skills/excalidraw-skill
314
-
315
- # Codex CLI
316
- mkdir -p ~/.codex/skills
317
- cp -R skills/excalidraw-skill ~/.codex/skills/excalidraw-skill
318
-
319
- # Or any agent that supports a skills directory
320
- cp -R skills/excalidraw-skill /path/to/your/agent/skills/
369
+ npx @sanjibdevnath/mcp-excalidraw-local setup
321
370
  ```
322
371
 
323
- To update an existing installation, remove the old folder first then re-copy.
372
+ The wizard detects your installed agents and lets you choose which ones get the skill.
324
373
 
325
- ### Use the Skill Scripts
374
+ ### Install Manually
326
375
 
327
- All scripts respect `EXPRESS_SERVER_URL` (default `http://localhost:3000`) or accept `--url`.
376
+ Copy the skill folder to your agent's skill directory:
328
377
 
329
378
  ```bash
330
- EXPRESS_SERVER_URL=http://127.0.0.1:3000 node skills/excalidraw-skill/scripts/healthcheck.cjs
331
- EXPRESS_SERVER_URL=http://127.0.0.1:3000 node skills/excalidraw-skill/scripts/export-elements.cjs --out diagram.elements.json
332
- EXPRESS_SERVER_URL=http://127.0.0.1:3000 node skills/excalidraw-skill/scripts/import-elements.cjs --in diagram.elements.json --mode batch
333
- ```
334
-
335
- ### When the Skill Is Useful
379
+ # Cursor
380
+ cp -R skills/excalidraw-skill ~/.cursor/skills/excalidraw-skill
336
381
 
337
- - **Repository workflow**: export elements as JSON, commit it, and re-import later
338
- - **Reliable refactors**: clear + re-import in `sync` mode to make canvas match a file
339
- - **Automated smoke tests**: create/update/delete a known element to validate a deployment
340
- - **Repeatable diagrams**: keep a library of element JSON snippets and import them
382
+ # Claude Code
383
+ cp -R skills/excalidraw-skill ~/.claude/skills/excalidraw-skill
341
384
 
342
- See `skills/excalidraw-skill/SKILL.md` and `skills/excalidraw-skill/references/cheatsheet.md`.
385
+ # Codex CLI
386
+ cp -R skills/excalidraw-skill ~/.codex/skills/excalidraw-skill
387
+ ```
343
388
 
344
389
  ## MCP Tools (32 Total)
345
390
 
@@ -385,27 +430,94 @@ npx @modelcontextprotocol/inspector --cli \
385
430
  --tool-arg width=300 --tool-arg height=200
386
431
  ```
387
432
 
388
- ### Frontend Screenshots
433
+ ## Troubleshooting
434
+
435
+ ### `better-sqlite3` compilation failure
436
+
437
+ This is the most common installation issue. `better-sqlite3` is a native Node.js module that requires C++ build tools.
438
+
439
+ **Symptoms:**
440
+ - `npm install` fails with `gyp ERR!` or `prebuild-install` errors
441
+ - `npx` command fails during installation
442
+ - Error: `Cannot find module 'better-sqlite3'` at runtime
443
+
444
+ **Fix:**
445
+
446
+ 1. Install build tools for your platform (see [Prerequisites](#prerequisites))
447
+ 2. Rebuild the module:
448
+ ```bash
449
+ npm rebuild better-sqlite3
450
+ ```
451
+ 3. Or run the setup wizard which handles this automatically:
452
+ ```bash
453
+ npx @sanjibdevnath/mcp-excalidraw-local setup
454
+ ```
455
+
456
+ ### EADDRINUSE (port already in use)
457
+
458
+ **Symptom:** Error `listen EADDRINUSE: address already in use :::3000`
459
+
460
+ **Fix:**
461
+ ```bash
462
+ # Find what's using the port
463
+ lsof -i :3000
464
+
465
+ # Either kill the process or use a different port
466
+ CANVAS_PORT=3001 node dist/index.js
467
+ ```
468
+
469
+ > The MCP server automatically detects and reuses an existing healthy canvas server on the same port, so this error is rare.
470
+
471
+ ### Canvas not loading / "Frontend not found"
389
472
 
390
- If you use a browser automation tool for UI checks:
473
+ **Symptom:** Browser shows "Frontend not found" or blank page at `http://localhost:3000`
474
+
475
+ **Fix:**
391
476
  ```bash
392
- # Open the canvas and take a screenshot for verification
393
- open http://127.0.0.1:3000
394
- # Or use agent-browser, Playwright, Puppeteer, etc.
477
+ npm run build # builds both frontend and server
478
+ node dist/index.js # restart
395
479
  ```
396
480
 
397
- ## Troubleshooting
481
+ ### NVM / path issues with npx
398
482
 
399
- - **Canvas not loading**: Ensure `CANVAS_PORT` isn't occupied by another process. Check `lsof -i :3000`.
400
- - **Canvas not updating**: Confirm the MCP process is running and the browser is connected (check the status dot in the header).
401
- - **Wrong workspace shown**: The MCP uses `server.listRoots()` to detect the workspace. Restart your MCP client if the workspace changed.
402
- - **Elements missing after restart**: Check `~/.excalidraw-mcp/excalidraw.db` exists. If you previously ran the upstream (in-memory) version, data wasn't persisted.
403
- - **Port conflict with multiple instances**: Set different `CANVAS_PORT` values for each workspace, or rely on multi-tenancy (same port, different tenants).
404
- - **Updates/deletes fail after batch creation**: Ensure you are on a build that includes the batch id preservation fix.
483
+ **Symptom:** `npx @sanjibdevnath/mcp-excalidraw-local` hangs or uses the wrong Node version.
405
484
 
406
- ## Known Issues / TODO
485
+ **Fix:**
486
+ ```bash
487
+ # Ensure you're using a supported Node version
488
+ nvm use 20 # or 22
489
+
490
+ # Clear npm cache if npx is stale
491
+ npm cache clean --force
492
+
493
+ # Try with explicit node path in your MCP config
494
+ which node # copy this path
495
+ ```
407
496
 
408
- All previously listed bugs from the upstream have been fixed. Remaining items:
497
+ Then use the full path in your MCP config:
498
+ ```json
499
+ {
500
+ "mcpServers": {
501
+ "excalidraw-canvas": {
502
+ "command": "/Users/you/.nvm/versions/node/v22.12.0/bin/npx",
503
+ "args": ["-y", "@sanjibdevnath/mcp-excalidraw-local"],
504
+ "env": { "CANVAS_PORT": "3000" }
505
+ }
506
+ }
507
+ }
508
+ ```
509
+
510
+ ### Canvas not updating / elements not syncing
511
+
512
+ **Fix:**
513
+ - Confirm the MCP process is running and the browser is connected (check the green status dot in the header)
514
+ - Click the "Sync" button in the canvas header for a manual sync
515
+
516
+ ### Wrong workspace shown
517
+
518
+ The MCP uses `server.listRoots()` to detect the workspace. Restart your MCP client if the workspace changed.
519
+
520
+ ## Known Issues / TODO
409
521
 
410
522
  - [ ] **Image export requires a browser**: `export_to_image` and `get_canvas_screenshot` rely on the frontend rendering. The canvas UI must be open in a browser.
411
523
  - [ ] **`export_to_excalidraw_url` blocked**: Organizations that block `excalidraw.com` cannot use shareable URL export. Use `export_scene` for local `.excalidraw` files instead.
@@ -416,13 +528,13 @@ Contributions welcome!
416
528
 
417
529
  ```bash
418
530
  # Type check
419
- pnpm run type-check
531
+ npm run type-check
420
532
 
421
533
  # Full build (frontend + server)
422
- pnpm run build
534
+ npm run build
423
535
 
424
536
  # Dev mode (watch)
425
- pnpm run dev
537
+ npm run dev
426
538
  ```
427
539
 
428
540
  ### Database
@@ -442,10 +554,13 @@ The canvas server exposes a REST API alongside the WebSocket interface:
442
554
  | POST | `/api/elements` | Create an element |
443
555
  | PUT | `/api/elements/:id` | Update an element |
444
556
  | DELETE | `/api/elements/:id` | Delete an element |
557
+ | DELETE | `/api/elements/clear` | Clear all elements |
445
558
  | POST | `/api/elements/sync` | Sync all elements (bulk upsert) |
446
559
  | GET | `/api/tenants` | List all tenants |
447
560
  | GET | `/api/tenant/active` | Get the active tenant |
448
561
  | PUT | `/api/tenant/active` | Set the active tenant |
562
+ | GET | `/api/settings/:key` | Read a setting |
563
+ | PUT | `/api/settings/:key` | Write a setting |
449
564
 
450
565
  All endpoints accept an `X-Tenant-Id` header for per-request tenant scoping.
451
566
 
package/dist/db.d.ts CHANGED
@@ -54,5 +54,7 @@ export declare function setActiveProject(id: string): void;
54
54
  export declare function getActiveProject(): Project;
55
55
  export declare function getActiveProjectId(): string;
56
56
  export declare function bulkReplaceElements(elements: ServerElement[], projectId?: string): number;
57
+ export declare function getSetting(key: string): string | undefined;
58
+ export declare function setSetting(key: string, value: string): void;
57
59
  export declare function closeDb(): void;
58
60
  //# sourceMappingURL=db.d.ts.map
package/dist/db.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}