@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.
- package/README.md +295 -180
- package/dist/db.d.ts +2 -0
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +16 -0
- package/dist/db.js.map +1 -1
- package/dist/frontend/assets/{advancedFormat-BvOvfnfC.js → advancedFormat-DP1XBx2w.js} +1 -1
- package/dist/frontend/assets/{ar-SA-G6X2FPQ2-75HMOOy8.js → ar-SA-G6X2FPQ2-DasSWqvJ.js} +1 -1
- package/dist/frontend/assets/{arc-D-322MQz.js → arc-CHlP0j9L.js} +1 -1
- package/dist/frontend/assets/az-AZ-76LH7QW2-DIx7sIgC.js +1 -0
- package/dist/frontend/assets/{bg-BG-XCXSNQG7-DrFYc9eo.js → bg-BG-XCXSNQG7-DyAdeT49.js} +1 -1
- package/dist/frontend/assets/{blockDiagram-38ab4fdb-Ch8bwO7g.js → blockDiagram-38ab4fdb-BnnH4P-k.js} +2 -2
- package/dist/frontend/assets/{blockDiagram-68f4deed-BVqzkDiu.js → blockDiagram-68f4deed-Cmi5SZZO.js} +2 -2
- package/dist/frontend/assets/{bn-BD-2XOGV67Q-B1Y75Cvj.js → bn-BD-2XOGV67Q-BDbQgRY3.js} +1 -1
- package/dist/frontend/assets/{c4Diagram-15b5d702-D5U2mSdf.js → c4Diagram-15b5d702-CEXzoyqN.js} +2 -2
- package/dist/frontend/assets/{c4Diagram-3d4e48cf-eT2EEN_c.js → c4Diagram-3d4e48cf-DV-rxD8H.js} +2 -2
- package/dist/frontend/assets/{ca-ES-6MX7JW3Y-00BTiK3Z.js → ca-ES-6MX7JW3Y-DK5i6AgQ.js} +1 -1
- package/dist/frontend/assets/channel-D6upxKro.js +1 -0
- package/dist/frontend/assets/classDiagram-70f12bd4-DWp7zwVc.js +2 -0
- package/dist/frontend/assets/classDiagram-d40c83e7-DAQ5Wdh8.js +2 -0
- package/dist/frontend/assets/classDiagram-v2-d5a6b087-B-4Zr3gZ.js +2 -0
- package/dist/frontend/assets/classDiagram-v2-f2320105-BqpiKtCm.js +2 -0
- package/dist/frontend/assets/clone-CgoLu_Rz.js +1 -0
- package/dist/frontend/assets/{createText-2e5e7dd3-Bpmkp1eZ.js → createText-2e5e7dd3-CSgkWMBd.js} +1 -1
- package/dist/frontend/assets/{createText-d213de94-3MLB4fd8.js → createText-d213de94-CjS9lbOa.js} +1 -1
- package/dist/frontend/assets/{cs-CZ-2BRQDIVT-R7SCWLLF.js → cs-CZ-2BRQDIVT-CM3dLaz_.js} +1 -1
- package/dist/frontend/assets/{cytoscape-cose-bilkent-CoIxD6ON.js → cytoscape-cose-bilkent-3nhDREcJ.js} +1 -1
- package/dist/frontend/assets/{da-DK-5WZEPLOC-Db1yebad.js → da-DK-5WZEPLOC-COjC4AU9.js} +1 -1
- package/dist/frontend/assets/{de-DE-XR44H4JA-HRE-6fuh.js → de-DE-XR44H4JA-iTJ8Fn8A.js} +1 -1
- package/dist/frontend/assets/{edges-332bd1c7-DZAOA9uP.js → edges-332bd1c7-DEUresxo.js} +1 -1
- package/dist/frontend/assets/{edges-e0da2a9e-CP-XTLb4.js → edges-e0da2a9e-jMWX2XC6.js} +1 -1
- package/dist/frontend/assets/{el-GR-BZB4AONW-CfNczSdx.js → el-GR-BZB4AONW-CwvvXspa.js} +1 -1
- package/dist/frontend/assets/{elk.bundled-BZDcWavb.js → elk.bundled-DPPV-x3s.js} +1 -1
- package/dist/frontend/assets/{erDiagram-880f2ed8-Bk96tDga.js → erDiagram-880f2ed8-BSBXXBVr.js} +2 -2
- package/dist/frontend/assets/{erDiagram-9861fffd-BvkEkcRK.js → erDiagram-9861fffd-ZPrBZaDE.js} +2 -2
- package/dist/frontend/assets/{es-ES-U4NZUMDT-BBJZ1_wD.js → es-ES-U4NZUMDT-yCi10KLl.js} +1 -1
- package/dist/frontend/assets/{eu-ES-A7QVB2H4-CCLNmdnk.js → eu-ES-A7QVB2H4-Lj-2pkXa.js} +1 -1
- package/dist/frontend/assets/{fa-IR-HGAKTJCU-BtKS5FOW.js → fa-IR-HGAKTJCU-CapZnae9.js} +1 -1
- package/dist/frontend/assets/{fi-FI-Z5N7JZ37-DEQi6vbL.js → fi-FI-Z5N7JZ37-D4DF8Oy2.js} +1 -1
- package/dist/frontend/assets/{flowDb-7c981674-JJMg1ttK.js → flowDb-7c981674-CHEQPxe1.js} +1 -1
- package/dist/frontend/assets/{flowDb-956e92f1-CVVUllPW.js → flowDb-956e92f1-DSoZvO8S.js} +1 -1
- package/dist/frontend/assets/{flowDiagram-66a62f08-wGFuUp6y.js → flowDiagram-66a62f08-Dg-9Q3Mr.js} +2 -2
- package/dist/frontend/assets/{flowDiagram-cbd28bf7-CXKT_tHC.js → flowDiagram-cbd28bf7-B7uGcbav.js} +2 -2
- package/dist/frontend/assets/flowDiagram-v2-96b9c2cf-BOeLi4Bh.js +1 -0
- package/dist/frontend/assets/flowDiagram-v2-ffc7f31a-BVZzJdEz.js +1 -0
- package/dist/frontend/assets/{flowchart-elk-definition-36e2d292-Cam5JBwn.js → flowchart-elk-definition-36e2d292-C9hm9QMF.js} +2 -2
- package/dist/frontend/assets/{flowchart-elk-definition-4a651766-BoyD4myW.js → flowchart-elk-definition-4a651766-n8MmIJTe.js} +2 -2
- package/dist/frontend/assets/{fr-FR-RHASNOE6-_AQjPuKS.js → fr-FR-RHASNOE6-Fm5lOJQP.js} +1 -1
- package/dist/frontend/assets/{ganttDiagram-04f9e578-DrDI9_oS.js → ganttDiagram-04f9e578-CeTT1DKi.js} +2 -2
- package/dist/frontend/assets/{ganttDiagram-c361ad54-CKSyNc2k.js → ganttDiagram-c361ad54-DnJqKl4Y.js} +2 -2
- package/dist/frontend/assets/{gitGraphDiagram-21fc4d3e-BHBdnwSb.js → gitGraphDiagram-21fc4d3e-DVq05Sx7.js} +2 -2
- package/dist/frontend/assets/{gitGraphDiagram-72cf32ee-BHN9qiXg.js → gitGraphDiagram-72cf32ee-CkrvO3n5.js} +2 -2
- package/dist/frontend/assets/{gl-ES-HMX3MZ6V-Bp2h6sBC.js → gl-ES-HMX3MZ6V-BnAC1k53.js} +1 -1
- package/dist/frontend/assets/{graph-CRb9j7zI.js → graph-CGc2F9EK.js} +1 -1
- package/dist/frontend/assets/{graph-EK5j_nPe.js → graph-Cuq08VGx.js} +1 -1
- package/dist/frontend/assets/{he-IL-6SHJWFNN-hsaAKZ5K.js → he-IL-6SHJWFNN-it0Mh2UM.js} +1 -1
- package/dist/frontend/assets/{hi-IN-IWLTKZ5I-sgYSNzoz.js → hi-IN-IWLTKZ5I-BrQyHtsW.js} +1 -1
- package/dist/frontend/assets/{hu-HU-A5ZG7DT2-DxYZr0yq.js → hu-HU-A5ZG7DT2-D4Kvezza.js} +1 -1
- package/dist/frontend/assets/{id-ID-SAP4L64H-z0RzSKPQ.js → id-ID-SAP4L64H-yc1wTiX2.js} +1 -1
- package/dist/frontend/assets/{index-3862675e-CQPsxwvk.js → index-3862675e-Cd6WiSra.js} +1 -1
- package/dist/frontend/assets/{index-6079d271-pTR-OMc-.js → index-6079d271-DJOPyLe9.js} +1 -1
- package/dist/frontend/assets/{index-BcHA28Dx.js → index-C6oTBvAJ.js} +4 -4
- package/dist/frontend/assets/index-o_UMzp_N.js +343 -0
- package/dist/frontend/assets/{infoDiagram-4a4f5b27-OIxyK2_N.js → infoDiagram-4a4f5b27-DmiDxHA0.js} +2 -2
- package/dist/frontend/assets/{infoDiagram-f8f76790-BTkoanKB.js → infoDiagram-f8f76790-Du4PRSh6.js} +2 -2
- package/dist/frontend/assets/{it-IT-JPQ66NNP-Cu6RM7DP.js → it-IT-JPQ66NNP-C4S6o7j_.js} +1 -1
- package/dist/frontend/assets/{ja-JP-DBVTYXUO-lD7U4Zkf.js → ja-JP-DBVTYXUO-BucbBMf9.js} +1 -1
- package/dist/frontend/assets/{journeyDiagram-49397b02-BbBAwEfu.js → journeyDiagram-29694f62-UCd7F1Cn.js} +1 -1
- package/dist/frontend/assets/{journeyDiagram-29694f62-BS4Xl0A-.js → journeyDiagram-49397b02-GRSsD4Rn.js} +2 -2
- package/dist/frontend/assets/kaa-6HZHGXH3-CgtQtqft.js +1 -0
- package/dist/frontend/assets/{kab-KAB-ZGHBKWFO-BAojmp2_.js → kab-KAB-ZGHBKWFO-DDU8hEtC.js} +1 -1
- package/dist/frontend/assets/kk-KZ-P5N5QNE5-6W_m7WPZ.js +1 -0
- package/dist/frontend/assets/{km-KH-HSX4SM5Z-BzYGKbAg.js → km-KH-HSX4SM5Z-DaSmiDrj.js} +1 -1
- package/dist/frontend/assets/{ko-KR-MTYHY66A-DOvEMk4H.js → ko-KR-MTYHY66A-BnfvEfaC.js} +1 -1
- package/dist/frontend/assets/{ku-TR-6OUDTVRD-B6l-ghqp.js → ku-TR-6OUDTVRD-C__2gsVI.js} +1 -1
- package/dist/frontend/assets/{layout-DbdMIGYe.js → layout-BEiCz13F.js} +1 -1
- package/dist/frontend/assets/{layout-CGydnLJa.js → layout-Dfvk-fjv.js} +1 -1
- package/dist/frontend/assets/{line-CbImtxDK.js → line-BXvkepTW.js} +1 -1
- package/dist/frontend/assets/{linear-DvIsU3aM.js → linear-D-e1r1xo.js} +1 -1
- package/dist/frontend/assets/{lt-LT-XHIRWOB4-BYcRk8Uj.js → lt-LT-XHIRWOB4-sy2dgt54.js} +1 -1
- package/dist/frontend/assets/{lv-LV-5QDEKY6T-DS3krNIe.js → lv-LV-5QDEKY6T-APNbUhKX.js} +1 -1
- package/dist/frontend/assets/{mindmap-definition-ac74a2e8-C0Sp7ICZ.js → mindmap-definition-ac74a2e8-CBjTBbjm.js} +2 -2
- package/dist/frontend/assets/{mindmap-definition-fc14e90a-BZrjRbkr.js → mindmap-definition-fc14e90a-iQ1gp7ab.js} +2 -2
- package/dist/frontend/assets/{mr-IN-CRQNXWMA-BfxQL7Vh.js → mr-IN-CRQNXWMA-Dc11z8_3.js} +1 -1
- package/dist/frontend/assets/my-MM-5M5IBNSE-DDK8gVnZ.js +1 -0
- package/dist/frontend/assets/{nb-NO-T6EIAALU-BIbPZokm.js → nb-NO-T6EIAALU-DKoHiM5M.js} +1 -1
- package/dist/frontend/assets/{nl-NL-IS3SIHDZ-BqQloGBT.js → nl-NL-IS3SIHDZ-BiHnoSws.js} +1 -1
- package/dist/frontend/assets/{nn-NO-6E72VCQL-zGR8NYQf.js → nn-NO-6E72VCQL-DMeZaMaA.js} +1 -1
- package/dist/frontend/assets/{oc-FR-POXYY2M6-B8-HsJFE.js → oc-FR-POXYY2M6-TCVmFDBJ.js} +1 -1
- package/dist/frontend/assets/{pa-IN-N4M65BXN-B2Ta58Tu.js → pa-IN-N4M65BXN-D3CRD3-a.js} +1 -1
- package/dist/frontend/assets/{pica-DSD-O3at.js → pica-CjnEaUNS.js} +1 -1
- package/dist/frontend/assets/{pie-Dk_pQnuO.js → pie-BL7A9rNp.js} +1 -1
- package/dist/frontend/assets/{pieDiagram-421022e6-9oAq5fk_.js → pieDiagram-421022e6-BjD1C6Sc.js} +2 -2
- package/dist/frontend/assets/{pieDiagram-8a3498a8-B5SMrdDh.js → pieDiagram-8a3498a8-CQbNnx4A.js} +2 -2
- package/dist/frontend/assets/{pl-PL-T2D74RX3-rZKvQ0zQ.js → pl-PL-T2D74RX3-CEkVUJTc.js} +1 -1
- package/dist/frontend/assets/{pt-BR-5N22H2LF-ij6wtU6I.js → pt-BR-5N22H2LF-BeqCronj.js} +1 -1
- package/dist/frontend/assets/{pt-PT-UZXXM6DQ-BIgtUnbW.js → pt-PT-UZXXM6DQ-DRwQVz4M.js} +1 -1
- package/dist/frontend/assets/{quadrantDiagram-0957ecba-Cr3mj6c1.js → quadrantDiagram-0957ecba-BI9AZI22.js} +2 -2
- package/dist/frontend/assets/{quadrantDiagram-120e2f19-CQnc4s0f.js → quadrantDiagram-120e2f19-Dl6CtJLW.js} +2 -2
- package/dist/frontend/assets/{requirementDiagram-deff3bca-G5e-Qxao.js → requirementDiagram-23d650b8-Z3i3040p.js} +1 -1
- package/dist/frontend/assets/{requirementDiagram-23d650b8-Bs7pP1vJ.js → requirementDiagram-deff3bca-CJmKNaP4.js} +2 -2
- package/dist/frontend/assets/{ro-RO-JPDTUUEW-DPj_79nt.js → ro-RO-JPDTUUEW-CYFau-A6.js} +1 -1
- package/dist/frontend/assets/{ru-RU-B4JR7IUQ-fdYiaqbX.js → ru-RU-B4JR7IUQ-D3h9RDjd.js} +1 -1
- package/dist/frontend/assets/{sankeyDiagram-04a897e0-CJogadkF.js → sankeyDiagram-04a897e0-D8FszeKB.js} +2 -2
- package/dist/frontend/assets/{sankeyDiagram-23345273-DKUWMCrX.js → sankeyDiagram-23345273-plJZ4Q2w.js} +2 -2
- package/dist/frontend/assets/{selectAll-tNeSnQY6.js → selectAll-ClF87C0p.js} +1 -1
- package/dist/frontend/assets/{sequenceDiagram-17ac3bff-DCw9xUbw.js → sequenceDiagram-17ac3bff-DjTmXy_n.js} +2 -2
- package/dist/frontend/assets/{sequenceDiagram-704730f1-BgClSrOI.js → sequenceDiagram-704730f1-CuIFXxtR.js} +2 -2
- package/dist/frontend/assets/si-LK-N5RQ5JYF-BipWhoYB.js +1 -0
- package/dist/frontend/assets/{sk-SK-C5VTKIMK-Cbj4yoD_.js → sk-SK-C5VTKIMK-PwBZdDF1.js} +1 -1
- package/dist/frontend/assets/{sl-SI-NN7IZMDC-C_rL7eDE.js → sl-SI-NN7IZMDC-Ch2Z7Hrb.js} +1 -1
- package/dist/frontend/assets/stateDiagram-587899a1-C0X52fNc.js +1 -0
- package/dist/frontend/assets/stateDiagram-9c5f0230-DGtO9otR.js +1 -0
- package/dist/frontend/assets/stateDiagram-v2-51a3dcff-DYpiPK3W.js +1 -0
- package/dist/frontend/assets/stateDiagram-v2-d93cdb3a-CS-Fisfs.js +1 -0
- package/dist/frontend/assets/{styles-2ab5d517-Dxg7wKah.js → styles-2ab5d517-LYh74XJL.js} +1 -1
- package/dist/frontend/assets/{styles-5f03d8d2-DD32XMGL.js → styles-5f03d8d2-Cicwooy5.js} +1 -1
- package/dist/frontend/assets/{styles-6aaf32cf-B5DxK_RW.js → styles-6aaf32cf-DtBZgBCn.js} +1 -1
- package/dist/frontend/assets/{styles-9a916d00-C6L6Mj2P.js → styles-9a916d00-Cvxhh64P.js} +1 -1
- package/dist/frontend/assets/{styles-c10674c1-BPM_bB3H.js → styles-c10674c1-U3bK_YY4.js} +1 -1
- package/dist/frontend/assets/{styles-edf9a4b0-CbQDxrwP.js → styles-edf9a4b0-ihVg8xSf.js} +1 -1
- package/dist/frontend/assets/{subset-shared.chunk-B_DQsaBC.js → subset-shared.chunk-rVDsBRzy.js} +18 -12
- package/dist/frontend/assets/subset-worker.chunk-Qc3pK9xs.js +1 -0
- package/dist/frontend/assets/{sv-SE-XGPEYMSR-BmmcOaVK.js → sv-SE-XGPEYMSR-DnsP8fpO.js} +1 -1
- package/dist/frontend/assets/{svgDrawCommon-08f97a94-aUx8qfJx.js → svgDrawCommon-08f97a94-C9kK8NA4.js} +1 -1
- package/dist/frontend/assets/{svgDrawCommon-3ba9043b-1JM8RiLc.js → svgDrawCommon-3ba9043b-B8spdxcs.js} +1 -1
- package/dist/frontend/assets/{ta-IN-2NMHFXQM-Kxnb_Mwk.js → ta-IN-2NMHFXQM-ywacH2SS.js} +1 -1
- package/dist/frontend/assets/th-TH-HPSO5L25-DWCnubPy.js +2 -0
- package/dist/frontend/assets/{timeline-definition-7e6b55e7-BbFhIPTl.js → timeline-definition-7e6b55e7-B4BSgVgG.js} +2 -2
- package/dist/frontend/assets/{timeline-definition-85554ec2-C1G9H6m5.js → timeline-definition-85554ec2-BXHiqlKy.js} +5 -5
- package/dist/frontend/assets/{tr-TR-DEFEU3FU-DhlYP6tL.js → tr-TR-DEFEU3FU-lNxOg1K5.js} +1 -1
- package/dist/frontend/assets/{uk-UA-QMV73CPH-pMrN1qBS.js → uk-UA-QMV73CPH-DavpGbzZ.js} +1 -1
- package/dist/frontend/assets/{union-Cu1rbD_D.js → union-DEhYLH1O.js} +1 -1
- package/dist/frontend/assets/{vi-VN-M7AON7JQ-BPMcH84R.js → vi-VN-M7AON7JQ-CGV8RvGM.js} +1 -1
- package/dist/frontend/assets/{xychartDiagram-b6496bcd-BDm9pYtk.js → xychartDiagram-b6496bcd-C4hInaC9.js} +3 -3
- package/dist/frontend/assets/{xychartDiagram-e933f94c-BlrTBDHC.js → xychartDiagram-e933f94c-BRIGbNCw.js} +3 -3
- package/dist/frontend/assets/{zh-CN-LNUGB5OW-B8kYYibM.js → zh-CN-LNUGB5OW-D9ClIhqj.js} +1 -1
- package/dist/frontend/assets/zh-HK-E62DVLB3-Lcmr7mSD.js +1 -0
- package/dist/frontend/assets/{zh-TW-RAJ6MFWO-DKCVg17j.js → zh-TW-RAJ6MFWO-BNek22mD.js} +1 -1
- package/dist/frontend/assets/{zipObject-iRVIFf6r.js → zipObject-D8riifuA.js} +1 -1
- package/dist/frontend/index.html +47 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +208 -41
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +158 -13
- package/dist/server.js.map +1 -1
- package/dist/setup.d.ts +10 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +321 -0
- package/dist/setup.js.map +1 -0
- package/dist/types.d.ts +17 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +33 -1
- package/dist/types.js.map +1 -1
- package/package.json +18 -4
- package/skills/excalidraw-skill/SKILL.md +45 -1
- package/dist/frontend/assets/az-AZ-76LH7QW2-DPDwkDvh.js +0 -1
- package/dist/frontend/assets/channel-CudwHHli.js +0 -1
- package/dist/frontend/assets/classDiagram-70f12bd4-CcNOdQHv.js +0 -2
- package/dist/frontend/assets/classDiagram-d40c83e7-nRIgRTMT.js +0 -2
- package/dist/frontend/assets/classDiagram-v2-d5a6b087-Cfbvao44.js +0 -2
- package/dist/frontend/assets/classDiagram-v2-f2320105-1Sjp5Uqh.js +0 -2
- package/dist/frontend/assets/clone-D_tGm99B.js +0 -1
- package/dist/frontend/assets/flowDiagram-v2-96b9c2cf-CN4ht1EM.js +0 -1
- package/dist/frontend/assets/flowDiagram-v2-ffc7f31a-CFiBItzu.js +0 -1
- package/dist/frontend/assets/index-DPgZw9ew.js +0 -349
- package/dist/frontend/assets/kaa-6HZHGXH3-DM9LwXUP.js +0 -1
- package/dist/frontend/assets/kk-KZ-P5N5QNE5-Dp0K1W81.js +0 -1
- package/dist/frontend/assets/my-MM-5M5IBNSE-C3EfnOvD.js +0 -1
- package/dist/frontend/assets/si-LK-N5RQ5JYF-DfPBk-rU.js +0 -1
- package/dist/frontend/assets/stateDiagram-587899a1-DuFGG-SI.js +0 -1
- package/dist/frontend/assets/stateDiagram-9c5f0230-Bwj38hfH.js +0 -1
- package/dist/frontend/assets/stateDiagram-v2-51a3dcff-3c0yKNdL.js +0 -1
- package/dist/frontend/assets/stateDiagram-v2-d93cdb3a-CAaqB4wm.js +0 -1
- package/dist/frontend/assets/subset-worker.chunk-DL6tLP7M.js +0 -1
- package/dist/frontend/assets/th-TH-HPSO5L25-BqTLgxJz.js +0 -2
- 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
|
-
- [
|
|
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
|
-
##
|
|
57
|
+
## Prerequisites
|
|
59
58
|
|
|
60
|
-
|
|
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
|
-
|
|
65
|
+
### C++ build tools by platform
|
|
63
66
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
-
|
|
67
|
+
**macOS:**
|
|
68
|
+
```bash
|
|
69
|
+
xcode-select --install
|
|
70
|
+
```
|
|
67
71
|
|
|
68
|
-
|
|
72
|
+
**Ubuntu / Debian:**
|
|
73
|
+
```bash
|
|
74
|
+
sudo apt install build-essential python3
|
|
75
|
+
```
|
|
69
76
|
|
|
70
|
-
|
|
77
|
+
**Windows:**
|
|
78
|
+
```bash
|
|
79
|
+
npm install --global windows-build-tools
|
|
80
|
+
```
|
|
71
81
|
|
|
72
|
-
|
|
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
|
-
|
|
84
|
+
## Quick Start
|
|
93
85
|
|
|
94
|
-
|
|
86
|
+
### Path A: Interactive Setup (recommended for first-time users)
|
|
95
87
|
|
|
96
|
-
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
94
|
+
<details>
|
|
95
|
+
<summary>Example session</summary>
|
|
113
96
|
|
|
114
|
-
|
|
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
|
-
|
|
100
|
+
Excalidraw MCP — Setup
|
|
155
101
|
|
|
156
|
-
|
|
102
|
+
[1/3] Environment
|
|
103
|
+
✔ Node.js v22.12.0 .................. OK
|
|
104
|
+
✔ better-sqlite3 bindings ........... OK
|
|
105
|
+
✔ Frontend build .................... OK
|
|
157
106
|
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
110
|
+
Detected agents:
|
|
111
|
+
[1] Cursor (~/.cursor)
|
|
112
|
+
[2] Claude Code (~/.claude)
|
|
163
113
|
|
|
164
|
-
|
|
114
|
+
Which agents? (comma-separated, 'all', or 'skip'): all
|
|
165
115
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
```
|
|
116
|
+
Cursor — scope? [G]lobal / [l]ocal: G
|
|
117
|
+
✔ Installed to ~/.cursor/skills/excalidraw-skill/
|
|
169
118
|
|
|
170
|
-
|
|
119
|
+
Claude Code — scope? [G]lobal / [l]ocal: G
|
|
120
|
+
✔ Installed to ~/.claude/skills/excalidraw-skill/
|
|
171
121
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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
|
-
|
|
135
|
+
> **The setup is fully optional.** If you prefer to configure everything manually, skip to Path B or C below.
|
|
178
136
|
|
|
179
|
-
|
|
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
|
-
|
|
186
|
-
|
|
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
|
-
|
|
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
|
-
|
|
154
|
+
Open `http://localhost:3000` in your browser.
|
|
200
155
|
|
|
201
|
-
|
|
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
|
|
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
|
|
183
|
+
This is a standard MCP server communicating over **stdio**. It works with any MCP-compatible client.
|
|
184
|
+
|
|
185
|
+
### Cursor
|
|
213
186
|
|
|
214
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
###
|
|
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
|
-
--
|
|
242
|
+
-- npx -y @sanjibdevnath/mcp-excalidraw-local
|
|
241
243
|
```
|
|
242
244
|
|
|
243
|
-
###
|
|
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": "
|
|
250
|
-
"args": [
|
|
251
|
-
|
|
252
|
-
"
|
|
253
|
-
|
|
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
|
+

|
|
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
|
-
|
|
364
|
+
### Install via Setup Wizard
|
|
301
365
|
|
|
302
|
-
|
|
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
|
-
|
|
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
|
-
|
|
372
|
+
The wizard detects your installed agents and lets you choose which ones get the skill.
|
|
324
373
|
|
|
325
|
-
###
|
|
374
|
+
### Install Manually
|
|
326
375
|
|
|
327
|
-
|
|
376
|
+
Copy the skill folder to your agent's skill directory:
|
|
328
377
|
|
|
329
378
|
```bash
|
|
330
|
-
|
|
331
|
-
|
|
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
|
-
|
|
338
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
473
|
+
**Symptom:** Browser shows "Frontend not found" or blank page at `http://localhost:3000`
|
|
474
|
+
|
|
475
|
+
**Fix:**
|
|
391
476
|
```bash
|
|
392
|
-
#
|
|
393
|
-
|
|
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
|
-
|
|
481
|
+
### NVM / path issues with npx
|
|
398
482
|
|
|
399
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
531
|
+
npm run type-check
|
|
420
532
|
|
|
421
533
|
# Full build (frontend + server)
|
|
422
|
-
|
|
534
|
+
npm run build
|
|
423
535
|
|
|
424
536
|
# Dev mode (watch)
|
|
425
|
-
|
|
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":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1C,UAAU,EAAE,MAAM,CAAC;CACpB;AAaD,wBAAgB,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|