{"_id":"mcp-excalidraw-server","_rev":"9-e10aa2e6c0cb0b59e8abfbf87d6aabbd","name":"mcp-excalidraw-server","dist-tags":{"latest":"1.1.0"},"versions":{"1.0.0":{"name":"mcp-excalidraw-server","version":"1.0.0","keywords":["mcp","mcp-server","excalidraw","model-context-protocol","ai","drawing","diagrams","canvas","real-time","websocket","visualization","claude","ai-tools"],"author":{"name":"yctimlin","email":"c22647809@gmail.com"},"license":"MIT","_id":"mcp-excalidraw-server@1.0.0","maintainers":[{"name":"yctimlin","email":"c22647809@gmail.com"}],"homepage":"https://github.com/yctimlin/mcp_excalidraw#readme","bugs":{"url":"https://github.com/yctimlin/mcp_excalidraw/issues"},"bin":{"mcp-excalidraw-server":"src/index.js"},"dist":{"shasum":"16f71646d7c1470751706db27d57ee16cc051159","tarball":"https://registry.npmjs.org/mcp-excalidraw-server/-/mcp-excalidraw-server-1.0.0.tgz","fileCount":123,"integrity":"sha512-3pkhF1nBlizEpRsVzYmSX3p97m+IluQkiYvHpu9BlpD1WVoP8jZUt4eZMM8YU6ccK221j6pnBfG2CT3cpeD7/w==","signatures":[{"sig":"MEUCIQDsnDsI2ripYjBhlHV42RPOStM4SOE8SSFBuNWFHgh8pQIgfowRs1a8DtGhecK1lkihtovjAg1xfwKGwXXSkO5FPuU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8003946},"main":"src/index.js","type":"module","engines":{"node":">=16.0.0"},"gitHead":"cb743c6a1ebc8242ef0dd52417bd0321748b46a1","scripts":{"dev":"concurrently \"npm run canvas\" \"vite\"","build":"vite build","start":"node src/index.js","canvas":"node src/server.js","production":"npm run build && npm run canvas","prepublishOnly":"npm run build"},"_npmUser":{"name":"yctimlin","email":"c22647809@gmail.com"},"repository":{"url":"git+https://github.com/yctimlin/mcp_excalidraw.git","type":"git"},"_npmVersion":"11.4.2","description":"Advanced MCP server for Excalidraw with real-time canvas, WebSocket sync, and comprehensive diagram management","directories":{},"_nodeVersion":"20.17.0","dependencies":{"ws":"^8.14.2","zod":"^3.22.4","cors":"^2.8.5","react":"^18.3.1","dotenv":"^16.3.1","express":"^4.18.2","winston":"^3.11.0","react-dom":"^18.3.1","node-fetch":"^3.3.2","zod-to-json-schema":"^3.22.3","@excalidraw/excalidraw":"^0.18.0","@modelcontextprotocol/sdk":"latest"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.3.5","concurrently":"^9.2.0","@vitejs/plugin-react":"^4.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-excalidraw-server_1.0.0_1752295379860_0.1894111974724937","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"mcp-excalidraw-server","version":"1.0.1","keywords":["mcp","mcp-server","excalidraw","model-context-protocol","ai","drawing","diagrams","canvas","real-time","websocket","visualization","claude","ai-tools"],"author":{"name":"yctimlin","email":"c22647809@gmail.com"},"license":"MIT","_id":"mcp-excalidraw-server@1.0.1","maintainers":[{"name":"yctimlin","email":"c22647809@gmail.com"}],"homepage":"https://github.com/yctimlin/mcp_excalidraw#readme","bugs":{"url":"https://github.com/yctimlin/mcp_excalidraw/issues"},"bin":{"mcp-excalidraw-server":"src/index.js"},"dist":{"shasum":"0f7ba297a83844de3caf30ed8fb767fbf6b37953","tarball":"https://registry.npmjs.org/mcp-excalidraw-server/-/mcp-excalidraw-server-1.0.1.tgz","fileCount":131,"integrity":"sha512-MKOiy0Ffjk0Lzwjh5MSWJ4BcLx36uDhFYQDswtZluaIwi7dq/yrZca3lH4myquf+mSkUgasw9LOqsztQrZbZ3g==","signatures":[{"sig":"MEUCIBCPuwEeCrQAQW/CUaooCWaYDC9Zqpr8L6yiZAVPVgcjAiEAjiq/U9QC5EwaAaPCj6rrRdRtoXM52fzBkY2cxCspG5M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8005653},"main":"src/index.js","type":"module","engines":{"node":">=16.0.0"},"gitHead":"4f9546de76e66f6e3e3a71b9b6066e929aa3ae6d","scripts":{"dev":"concurrently \"npm run canvas\" \"vite\"","build":"npm run build:frontend && npm run build:types","start":"node src/index.js","canvas":"node src/server.js","production":"npm run build && npm run canvas","build:types":"npx tsc --emitDeclarationOnly","build:server":"npx tsc","build:frontend":"vite build","prepublishOnly":"npm run build"},"_npmUser":{"name":"yctimlin","email":"c22647809@gmail.com"},"repository":{"url":"git+https://github.com/yctimlin/mcp_excalidraw.git","type":"git"},"_npmVersion":"11.4.2","description":"Advanced MCP server for Excalidraw with real-time canvas, WebSocket sync, and comprehensive diagram management","directories":{},"_nodeVersion":"20.17.0","dependencies":{"ws":"^8.14.2","zod":"^3.22.4","cors":"^2.8.5","react":"^18.3.1","dotenv":"^16.3.1","express":"^4.18.2","winston":"^3.11.0","react-dom":"^18.3.1","node-fetch":"^3.3.2","zod-to-json-schema":"^3.22.3","@excalidraw/excalidraw":"^0.18.0","@modelcontextprotocol/sdk":"latest"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.3.5","typescript":"^5.8.3","@types/node":"^20.19.7","concurrently":"^9.2.0","@vitejs/plugin-react":"^4.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-excalidraw-server_1.0.1_1752298807342_0.9405233934704507","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"mcp-excalidraw-server","version":"1.0.2","keywords":["mcp","mcp-server","excalidraw","model-context-protocol","ai","drawing","diagrams","canvas","real-time","websocket","visualization","claude","ai-tools"],"author":{"name":"yctimlin","email":"c22647809@gmail.com"},"license":"MIT","_id":"mcp-excalidraw-server@1.0.2","maintainers":[{"name":"yctimlin","email":"c22647809@gmail.com"}],"homepage":"https://github.com/yctimlin/mcp_excalidraw#readme","bugs":{"url":"https://github.com/yctimlin/mcp_excalidraw/issues"},"bin":{"mcp-excalidraw-server":"src/index.js"},"dist":{"shasum":"49b8c050a2ad5bfbf7d2ce7f335daef17ea1dc05","tarball":"https://registry.npmjs.org/mcp-excalidraw-server/-/mcp-excalidraw-server-1.0.2.tgz","fileCount":131,"integrity":"sha512-ZbxrzvV4U7ntFnpWbg/w+YPIEsJahH+CUBv80Pt2Le0uxmjQ0R1GdCFRtWvVZC9TeD1tTJFqNvw5bHaNsLSGEw==","signatures":[{"sig":"MEQCIHZMgfTFEYd4jtvQWFYIFSjSv5c67CfyHI8gh0Ixo9LBAiBwpjW5YjZxcjMYgwBgDgeBkbEVpBgsOWXfiQiwAtrozg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8005684},"main":"src/index.js","type":"module","engines":{"node":">=16.0.0"},"gitHead":"4f9546de76e66f6e3e3a71b9b6066e929aa3ae6d","scripts":{"dev":"concurrently \"npm run canvas\" \"vite\"","build":"npm run build:frontend && npm run build:types","start":"node src/index.js","canvas":"node src/server.js","production":"npm run build && npm run canvas","build:types":"npx tsc --emitDeclarationOnly","build:server":"npx tsc","build:frontend":"vite build","prepublishOnly":"npm run build"},"_npmUser":{"name":"yctimlin","email":"c22647809@gmail.com"},"repository":{"url":"git+https://github.com/yctimlin/mcp_excalidraw.git","type":"git"},"_npmVersion":"11.4.2","description":"Advanced MCP server for Excalidraw with real-time canvas, WebSocket sync, and comprehensive diagram management","directories":{},"_nodeVersion":"20.17.0","dependencies":{"ws":"^8.14.2","zod":"^3.22.4","cors":"^2.8.5","react":"^18.3.1","dotenv":"^16.3.1","express":"^4.18.2","winston":"^3.11.0","react-dom":"^18.3.1","node-fetch":"^3.3.2","zod-to-json-schema":"^3.22.3","@excalidraw/excalidraw":"^0.18.0","@modelcontextprotocol/sdk":"latest"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.3.5","typescript":"^5.8.3","@types/node":"^20.19.7","concurrently":"^9.2.0","@vitejs/plugin-react":"^4.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-excalidraw-server_1.0.2_1752299264466_0.9059422824370094","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"mcp-excalidraw-server","version":"1.0.3","keywords":["mcp","mcp-server","excalidraw","model-context-protocol","ai","drawing","diagrams","canvas","real-time","websocket","visualization","claude","ai-tools"],"author":{"name":"yctimlin","email":"c22647809@gmail.com"},"license":"MIT","_id":"mcp-excalidraw-server@1.0.3","maintainers":[{"name":"yctimlin","email":"c22647809@gmail.com"}],"homepage":"https://github.com/yctimlin/mcp_excalidraw#readme","bugs":{"url":"https://github.com/yctimlin/mcp_excalidraw/issues"},"bin":{"mcp-excalidraw-server":"src/index.js"},"dist":{"shasum":"bd13aab58f91e3fd26fd959335ac5a61f01727e0","tarball":"https://registry.npmjs.org/mcp-excalidraw-server/-/mcp-excalidraw-server-1.0.3.tgz","fileCount":131,"integrity":"sha512-bV497RKiiMImSSF4h8m2YtnC7CJ2qMAy/rfyxoBAb29rZlQJBnT3SCWMI341qT4b7l7oovUN9g9VCB7QgvuSAg==","signatures":[{"sig":"MEYCIQDEitPKTzPhSdPWi6y42IDef+/siIIVytDQLRt8YyvGtQIhAJ4rUCAQIQInbPCBk9j/fEdYv0GrJqAOgEQmyIo40F0B","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8008424},"main":"src/index.js","type":"module","engines":{"node":">=16.0.0"},"gitHead":"661d343b18bc74e11f0fe7227e85f55beecf2e89","scripts":{"dev":"concurrently \"npm run canvas\" \"vite\"","build":"npm run build:frontend && npm run build:types","start":"node src/index.js","canvas":"node src/server.js","production":"npm run build && npm run canvas","build:types":"npx tsc --emitDeclarationOnly","build:server":"npx tsc","build:frontend":"vite build","prepublishOnly":"npm run build"},"_npmUser":{"name":"yctimlin","email":"c22647809@gmail.com"},"repository":{"url":"git+https://github.com/yctimlin/mcp_excalidraw.git","type":"git"},"_npmVersion":"11.4.2","description":"Advanced MCP server for Excalidraw with real-time canvas, WebSocket sync, and comprehensive diagram management","directories":{},"_nodeVersion":"20.17.0","dependencies":{"ws":"^8.14.2","zod":"^3.22.4","cors":"^2.8.5","react":"^18.3.1","dotenv":"^16.3.1","express":"^4.18.2","winston":"^3.11.0","react-dom":"^18.3.1","node-fetch":"^3.3.2","zod-to-json-schema":"^3.22.3","@excalidraw/excalidraw":"^0.18.0","@modelcontextprotocol/sdk":"latest"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.3.5","typescript":"^5.8.3","@types/node":"^20.19.7","concurrently":"^9.2.0","@vitejs/plugin-react":"^4.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-excalidraw-server_1.0.3_1752344457523_0.8975327774689998","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"mcp-excalidraw-server","version":"1.0.4","keywords":["mcp","mcp-server","excalidraw","model-context-protocol","ai","drawing","diagrams","canvas","real-time","websocket","visualization","claude","ai-tools"],"author":{"name":"yctimlin","email":"c22647809@gmail.com"},"license":"MIT","_id":"mcp-excalidraw-server@1.0.4","maintainers":[{"name":"yctimlin","email":"c22647809@gmail.com"}],"homepage":"https://github.com/yctimlin/mcp_excalidraw#readme","bugs":{"url":"https://github.com/yctimlin/mcp_excalidraw/issues"},"bin":{"mcp-excalidraw-server":"src/index.js"},"dist":{"shasum":"8b8a7bc2e84edd22f294d4acb35f976f6125811e","tarball":"https://registry.npmjs.org/mcp-excalidraw-server/-/mcp-excalidraw-server-1.0.4.tgz","fileCount":131,"integrity":"sha512-b5yVUxXBBGkoFrr9tFcn90Jhaj9fGGgshw5vHoZ242Ai+dtZ2CciC927F/AmYC0lno8l0Euk1myS7SPcHhiThw==","signatures":[{"sig":"MEUCIGixcWPy+Po55Nd2vCMIaQ3KBrG0UapUL7f0eEBHkJfgAiEAwLOvuQ9pcCOH+H81yz5s+vwPuH5eMtOHY40sge2RP7o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8008460},"main":"src/index.js","type":"module","engines":{"node":">=16.0.0"},"gitHead":"661d343b18bc74e11f0fe7227e85f55beecf2e89","scripts":{"dev":"concurrently \"npm run canvas\" \"vite\"","build":"npm run build:frontend && npm run build:types","start":"node src/index.js","canvas":"node src/server.js","production":"npm run build && npm run canvas","build:types":"npx tsc --emitDeclarationOnly","build:server":"npx tsc","build:frontend":"vite build","prepublishOnly":"npm run build"},"_npmUser":{"name":"yctimlin","email":"c22647809@gmail.com"},"repository":{"url":"git+https://github.com/yctimlin/mcp_excalidraw.git","type":"git"},"_npmVersion":"11.4.2","description":"Advanced MCP server for Excalidraw with real-time canvas, WebSocket sync, and comprehensive diagram management","directories":{},"_nodeVersion":"20.17.0","dependencies":{"ws":"^8.14.2","zod":"^3.22.4","cors":"^2.8.5","react":"^18.3.1","dotenv":"^16.3.1","express":"^4.18.2","winston":"^3.11.0","react-dom":"^18.3.1","node-fetch":"^3.3.2","zod-to-json-schema":"^3.22.3","@excalidraw/excalidraw":"^0.18.0","@modelcontextprotocol/sdk":"latest"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.3.5","typescript":"^5.8.3","@types/node":"^20.19.7","concurrently":"^9.2.0","@vitejs/plugin-react":"^4.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-excalidraw-server_1.0.4_1752345528985_0.06496277346155188","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"mcp-excalidraw-server","version":"1.0.5","keywords":["mcp","mcp-server","excalidraw","model-context-protocol","ai","drawing","diagrams"],"author":{"name":"yctimlin","email":"c22647809@gmail.com"},"license":"MIT","_id":"mcp-excalidraw-server@1.0.5","maintainers":[{"name":"yctimlin","email":"c22647809@gmail.com"}],"homepage":"https://github.com/yctimlin/mcp_excalidraw#readme","bugs":{"url":"https://github.com/yctimlin/mcp_excalidraw/issues"},"bin":{"mcp-excalidraw-server":"src/index.js"},"dist":{"shasum":"17b8721926a2c0f85e4623e38730b4bb46fa5bd0","tarball":"https://registry.npmjs.org/mcp-excalidraw-server/-/mcp-excalidraw-server-1.0.5.tgz","fileCount":6,"integrity":"sha512-hoCPS6KdS/pKEmZ+bIyCURHxd+7AHSBnpySNjRqclV/WpaMnOzQcIl4Uqf/kkrjzW90dMW/i5HJm3BzPwKNX+Q==","signatures":[{"sig":"MEYCIQDQ8ySIyPJR+pNv6yEmz4+jyTyhmW539WdueFSETvW3ZAIhAOL/hhUWHojmMHHLON4EQTFS6ro4gq2FWxAehcxbRW9w","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49888},"main":"src/index.js","type":"module","engines":{"node":">=16.0.0"},"gitHead":"661d343b18bc74e11f0fe7227e85f55beecf2e89","scripts":{"test":"echo \"Error: no test specified\" && exit 1","start":"node src/index.js"},"_npmUser":{"name":"yctimlin","email":"c22647809@gmail.com"},"repository":{"url":"git+https://github.com/yctimlin/mcp_excalidraw.git","type":"git"},"_npmVersion":"11.4.2","description":"MCP server for Excalidraw - creates and manages diagram elements with optional canvas sync","directories":{},"_nodeVersion":"20.17.0","dependencies":{"zod":"^3.22.4","dotenv":"^16.3.1","winston":"^3.11.0","node-fetch":"^3.3.2","@modelcontextprotocol/sdk":"latest"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^20.19.7"},"_npmOperationalInternal":{"tmp":"tmp/mcp-excalidraw-server_1.0.5_1752507820737_0.9031328040722351","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"mcp-excalidraw-server","version":"1.0.6","keywords":["mcp","mcp-server","excalidraw","model-context-protocol","ai","drawing","diagrams","canvas","real-time","websocket","visualization","claude","ai-tools"],"author":{"name":"yctimlin","email":"c22647809@gmail.com"},"license":"MIT","_id":"mcp-excalidraw-server@1.0.6","maintainers":[{"name":"yctimlin","email":"c22647809@gmail.com"}],"homepage":"https://github.com/yctimlin/mcp_excalidraw#readme","bugs":{"url":"https://github.com/yctimlin/mcp_excalidraw/issues"},"bin":{"mcp-excalidraw-server":"dist/index.js"},"dist":{"shasum":"82f4efa76e8a279ea80bc47ef829ff1c6cd3798d","tarball":"https://registry.npmjs.org/mcp-excalidraw-server/-/mcp-excalidraw-server-1.0.6.tgz","fileCount":182,"integrity":"sha512-B/+A//ZSMcXzxxTDQSV2cTc33tG4DPyyETY2hgbf5MKYBw/m2y4QHIVf3RbXFsuBMCLME0CuTuA0+MP5GJ1/Ow==","signatures":[{"sig":"MEYCIQDQL0WmiMu42xLBcvLA/cI4HH5xsEBz5ImKLsooZFPEmgIhAL2IXlYFLLpqQzWjFyXloBWQpaPupdn0eOzflCBpkNEy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9319261},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"ec609277683d83da32bdcdf7ea7611fe87240be5","scripts":{"dev":"concurrently \"npm run dev:server\" \"vite\"","build":"npm run build:frontend && npm run build:server","start":"npm run build:server && node dist/index.js","canvas":"npm run build:server && node dist/server.js","dev:server":"npx tsc --watch","production":"npm run build && npm run canvas","type-check":"npx tsc --noEmit","build:types":"npx tsc --emitDeclarationOnly","build:server":"npx tsc","build:frontend":"vite build","prepublishOnly":"npm run build"},"_npmUser":{"name":"yctimlin","email":"c22647809@gmail.com"},"repository":{"url":"git+https://github.com/yctimlin/mcp_excalidraw.git","type":"git"},"_npmVersion":"11.6.2","description":"Advanced MCP server for Excalidraw with real-time canvas, WebSocket sync, and comprehensive diagram management","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ws":"^8.14.2","zod":"^3.22.4","cors":"^2.8.5","react":"^18.3.1","dotenv":"^16.3.1","express":"^4.18.2","mermaid":"^11.12.1","winston":"^3.11.0","react-dom":"^18.3.1","node-fetch":"^3.3.2","zod-to-json-schema":"^3.22.3","@excalidraw/excalidraw":"^0.18.0","@modelcontextprotocol/sdk":"latest","@excalidraw/mermaid-to-excalidraw":"^1.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.3.5","@types/ws":"^8.5.10","typescript":"^5.8.3","@types/cors":"^2.8.17","@types/node":"^20.19.7","@types/react":"^18.3.3","concurrently":"^9.2.0","@types/express":"^4.17.21","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-excalidraw-server_1.0.6_1775317283937_0.584845326121392","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"mcp-excalidraw-server","version":"1.0.7","keywords":["mcp","mcp-server","excalidraw","model-context-protocol","ai","drawing","diagrams","canvas","real-time","websocket","visualization","claude","ai-tools"],"author":{"name":"yctimlin","email":"c22647809@gmail.com"},"license":"MIT","_id":"mcp-excalidraw-server@1.0.7","maintainers":[{"name":"yctimlin","email":"c22647809@gmail.com"}],"homepage":"https://github.com/yctimlin/mcp_excalidraw#readme","bugs":{"url":"https://github.com/yctimlin/mcp_excalidraw/issues"},"bin":{"mcp-excalidraw-server":"dist/index.js"},"dist":{"shasum":"83d0d01e0246f6272cc8169bff79b3767b747401","tarball":"https://registry.npmjs.org/mcp-excalidraw-server/-/mcp-excalidraw-server-1.0.7.tgz","fileCount":182,"integrity":"sha512-yrolaHLaWf7/6gasI/kXbac8Dpt1zkIT5eVZ7RljUvRqLOKkkcHS5MuGsQeQEeTPOChKpomKQ0DCdZio+uemnA==","signatures":[{"sig":"MEQCIF/OrP6BY4LeF6pksqSMd4vzb4V1Nzv91A227nT8ynXyAiAB6ywiIk9LZaQkBXXeYam4OHff+GRu3lsdRMPP6RoFyw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9333602},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"f1a4446a1e744a9c3764e938025f3d5760276fd3","scripts":{"dev":"concurrently \"npm run dev:server\" \"vite\"","build":"npm run build:frontend && npm run build:server","start":"npm run build:server && node dist/index.js","canvas":"npm run build:server && node dist/server.js","test:bind":"npm run build:server && node scripts/check-local-bind.mjs","dev:server":"npx tsc --watch","production":"npm run build && npm run canvas","type-check":"npx tsc --noEmit","build:types":"npx tsc --emitDeclarationOnly","build:server":"npx tsc","build:frontend":"vite build","prepublishOnly":"npm run build"},"_npmUser":{"name":"yctimlin","email":"c22647809@gmail.com"},"repository":{"url":"git+https://github.com/yctimlin/mcp_excalidraw.git","type":"git"},"_npmVersion":"11.6.2","description":"Advanced MCP server for Excalidraw with real-time canvas, WebSocket sync, and comprehensive diagram management","directories":{},"_nodeVersion":"25.2.1","dependencies":{"ws":"^8.14.2","zod":"^3.22.4","cors":"^2.8.5","react":"^18.3.1","dotenv":"^16.3.1","express":"^4.18.2","mermaid":"^11.12.1","winston":"^3.11.0","react-dom":"^18.3.1","node-fetch":"^3.3.2","zod-to-json-schema":"^3.22.3","@excalidraw/excalidraw":"^0.18.0","@modelcontextprotocol/sdk":"latest","@excalidraw/mermaid-to-excalidraw":"^1.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.3.5","@types/ws":"^8.5.10","typescript":"^5.8.3","@types/cors":"^2.8.17","@types/node":"^20.19.7","@types/react":"^18.3.3","concurrently":"^9.2.0","@types/express":"^4.17.21","@types/react-dom":"^18.3.0","@vitejs/plugin-react":"^4.6.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-excalidraw-server_1.0.7_1777614731524_0.38930291613248325","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"mcp-excalidraw-server","version":"1.1.0","description":"Excalidraw toolkit for AI coding agents — agent skill, CLI, and MCP server with a live canvas","main":"dist/index.js","type":"module","bin":{"mcp-excalidraw-server":"dist/bin.js","excalidraw-canvas":"dist/bin.js"},"scripts":{"start":"npm run build:server && node dist/index.js","cli":"node dist/bin.js","canvas":"npm run build:server && node dist/server.js","build":"npm run build:frontend && npm run build:server","build:frontend":"vite build","build:server":"npx tsc","build:types":"npx tsc --emitDeclarationOnly","dev":"concurrently \"npm run dev:server\" \"vite\"","dev:server":"npx tsc --watch","production":"npm run build && npm run canvas","prepublishOnly":"npm run build","sync:skills":"node scripts/sync-skills.mjs","test:bind":"npm run build:server && node scripts/check-local-bind.mjs","type-check":"npx tsc --noEmit"},"dependencies":{"@excalidraw/excalidraw":"^0.18.0","@excalidraw/mermaid-to-excalidraw":"^1.1.3","@modelcontextprotocol/sdk":"latest","cors":"^2.8.5","dotenv":"^16.3.1","express":"^4.18.2","mermaid":"^11.12.1","react":"^18.3.1","react-dom":"^18.3.1","winston":"^3.11.0","ws":"^8.14.2","zod":"^3.22.4","zod-to-json-schema":"^3.22.3"},"devDependencies":{"@types/cors":"^2.8.17","@types/express":"^4.17.21","@types/node":"^20.19.7","@types/react":"^18.3.3","@types/react-dom":"^18.3.0","@types/ws":"^8.5.10","@vitejs/plugin-react":"^4.6.0","concurrently":"^9.2.0","typescript":"^5.8.3","vite":"^6.3.5"},"keywords":["mcp","mcp-server","excalidraw","model-context-protocol","ai","drawing","diagrams","canvas","real-time","websocket","visualization","claude","ai-tools","claude-skill","agent-skills","cli","ai-agents"],"author":{"name":"yctimlin","email":"c22647809@gmail.com"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/yctimlin/mcp_excalidraw.git"},"homepage":"https://github.com/yctimlin/mcp_excalidraw#readme","bugs":{"url":"https://github.com/yctimlin/mcp_excalidraw/issues"},"engines":{"node":">=18.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"gitHead":"e7a48eb587c9a6b7c8abb1711ad18b87787476c0","types":"./dist/index.d.ts","_id":"mcp-excalidraw-server@1.1.0","_nodeVersion":"25.2.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-ZT2gkP05KJd/9uLoP4GPX6Hy7vFbh+zU9G5Wn8FUTZvJuXsdC0nBHfWA39QQ8yza1T+mb/cfk3jRxF5V+VMyQA==","shasum":"98d02e3bbd89165b2797870821d0b5e4edae8b5c","tarball":"https://registry.npmjs.org/mcp-excalidraw-server/-/mcp-excalidraw-server-1.1.0.tgz","fileCount":295,"unpackedSize":9557433,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDMgdR4SxN9rgQE54szT7GW18RmDSw/BqUBmzqNp98qfAiBrIowddSS5yAShr6/4rngzzW8Cj1EGeiwN/csRNwUkxw=="}]},"_npmUser":{"name":"yctimlin","email":"c22647809@gmail.com"},"directories":{},"maintainers":[{"name":"yctimlin","email":"c22647809@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-excalidraw-server_1.1.0_1783348313311_0.02053205822645765"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-12T04:42:59.785Z","modified":"2026-07-06T14:31:53.707Z","1.0.0":"2025-07-12T04:43:00.064Z","1.0.1":"2025-07-12T05:40:07.629Z","1.0.2":"2025-07-12T05:47:44.768Z","1.0.3":"2025-07-12T18:20:57.731Z","1.0.4":"2025-07-12T18:38:49.195Z","1.0.5":"2025-07-14T15:43:40.922Z","1.0.6":"2026-04-04T15:41:24.240Z","1.0.7":"2026-05-01T05:52:11.836Z","1.1.0":"2026-07-06T14:31:53.586Z"},"bugs":{"url":"https://github.com/yctimlin/mcp_excalidraw/issues"},"author":{"name":"yctimlin","email":"c22647809@gmail.com"},"license":"MIT","homepage":"https://github.com/yctimlin/mcp_excalidraw#readme","keywords":["mcp","mcp-server","excalidraw","model-context-protocol","ai","drawing","diagrams","canvas","real-time","websocket","visualization","claude","ai-tools","claude-skill","agent-skills","cli","ai-agents"],"repository":{"type":"git","url":"git+https://github.com/yctimlin/mcp_excalidraw.git"},"description":"Excalidraw toolkit for AI coding agents — agent skill, CLI, and MCP server with a live canvas","maintainers":[{"name":"yctimlin","email":"c22647809@gmail.com"}],"readme":"# Excalidraw MCP Server, CLI & Agent Skill\n\n[![CI](https://github.com/yctimlin/mcp_excalidraw/actions/workflows/ci.yml/badge.svg)](https://github.com/yctimlin/mcp_excalidraw/actions/workflows/ci.yml)\n[![Docker Build & Push](https://github.com/yctimlin/mcp_excalidraw/actions/workflows/docker.yml/badge.svg)](https://github.com/yctimlin/mcp_excalidraw/actions/workflows/docker.yml)\n[![NPM Version](https://img.shields.io/npm/v/mcp-excalidraw-server)](https://www.npmjs.com/package/mcp-excalidraw-server)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\n**mcp-excalidraw-server** gives AI agents a live [Excalidraw](https://excalidraw.com) canvas they can draw on, look at, refine, and save into your repo. Your agent creates architecture diagrams and flowcharts programmatically, **sees its own work via screenshots**, fixes layout problems, and exports `.excalidraw` files you can commit next to your code.\n\nOne canvas, three ways to drive it:\n\n- **Agent Skill + CLI** — recommended for coding agents (Claude Code, Codex CLI, Cursor, OpenCode): `npx -y mcp-excalidraw-server <command>`. Zero config, auto-starts the canvas, composable JSON in/out.\n- **MCP Server** — 26 tools over stdio for any Model Context Protocol client (Claude Desktop, Cursor, Codex CLI, Antigravity, ...).\n- **REST API** — plain HTTP for LangChain and custom frameworks.\n\nCore drawing runs fully local (Node ≥ 18, MIT licensed) — no API keys. Mermaid conversion runs in the local browser canvas; `share` is optional and uploads an encrypted scene to excalidraw.com.\n\n## Demo\n\n![AI agent drawing an architecture diagram on a live Excalidraw canvas via MCP](demo.gif)\n\n*AI agent creates a complete architecture diagram from a single prompt (4x speed). [Watch full video on YouTube](https://youtu.be/ufW78Amq5qA)*\n\n## Table of Contents\n\n- [Demo](#demo)\n- [What It Is](#what-it-is)\n- [How We Differ from the Official Excalidraw MCP](#how-we-differ-from-the-official-excalidraw-mcp)\n- [What's New](#whats-new)\n- [Installation](#installation)\n- [Agent Skill](#agent-skill)\n- [CLI Reference](#cli-reference)\n- [Configure MCP Clients](#configure-mcp-clients)\n  - [Claude Desktop](#claude-desktop)\n  - [Claude Code](#claude-code)\n  - [Cursor](#cursor)\n  - [Codex CLI](#codex-cli)\n  - [OpenCode](#opencode)\n  - [Antigravity (Google)](#antigravity-google)\n- [MCP Tools (26 Total)](#mcp-tools-26-total)\n- [Quick Start (From Source / Docker)](#quick-start-from-source--docker)\n- [Testing](#testing)\n- [FAQ](#faq)\n- [Troubleshooting](#troubleshooting)\n- [Known Issues / TODO](#known-issues--todo)\n- [Development](#development)\n- [License](#license)\n\n## What It Is\n\nAsk your agent to *\"draw the architecture of this service\"* and it produces a real, editable Excalidraw diagram — not a one-shot image. Because the agent can query, screenshot, and update individual elements, it iterates until labels fit, nothing overlaps, and arrows route cleanly; then it exports the result as a `.excalidraw` file that lives in your repo and gets updated when the code changes.\n\nUnder the hood there are two processes, one product:\n\n- **Canvas server**: Excalidraw web UI + REST API + WebSocket real-time sync (default `http://127.0.0.1:3000`)\n- **A thin front-end of your choice**: the CLI, the MCP stdio server, or raw HTTP — all drive the same canvas\n\nSince v1.1 the canvas server starts itself: canvas-driving CLI commands (and the MCP server on launch) auto-spawn it if nothing is listening. `status` only inspects the current server state. Set `EXCALIDRAW_NO_AUTOSTART=1` to opt out.\n\n## How We Differ from the Official Excalidraw MCP\n\nExcalidraw has an [official MCP](https://github.com/excalidraw/excalidraw-mcp) — a chat widget that streams a diagram inline from a single prompt (the model gets two tools: a format reference and `create_view`). It's great for \"draw me a cat\" in Claude or ChatGPT. We solve a different problem: giving *coding agents* a persistent canvas workbench.\n\n| | Official Excalidraw MCP | This Project |\n|---|---|---|\n| **Approach** | Prompt in, diagram out (one-shot widget) | Programmatic element-level control (CLI + 26 MCP tools) |\n| **State** | Checkpoints inside the chat widget | Persistent live canvas with real-time sync |\n| **Element CRUD** | Declarative re-send with delete markers | Full create / read / update / delete per element |\n| **AI sees the canvas** | No | `describe` (structured text) + `screenshot` (image) |\n| **Iterative refinement** | Regenerate from checkpoint | Draw → look → adjust → look again, element by element |\n| **Layout tools** | No | align, distribute, group / ungroup, lock, duplicate |\n| **File I/O** | No model-facing export | `.excalidraw` export/import — diagrams as repo artifacts |\n| **Snapshot & rollback** | Widget-side checkpoints | Named server-side snapshots |\n| **Mermaid conversion** | No | `mermaid` / `create_from_mermaid` |\n| **Shareable URLs** | Widget-only | `share` / `export_to_excalidraw_url` |\n| **Works without MCP** | No | Yes — CLI + agent skill + REST API |\n| **Multi-agent** | Single chat | Multiple agents on the same canvas concurrently |\n\n**TL;DR** — The official MCP shows Excalidraw diagrams in your chat. This project gives your coding agent a full Excalidraw workbench: a canvas it can draw on, inspect, refine, and commit to your repo.\n\n## What's New\n\nCurrent package version: **1.1.0**. The current release line is **v1.1 — CLI-First**.\n\n### v1.1 — CLI-First\n\n- **First-class CLI**: every capability is now a composable command — `npx -y mcp-excalidraw-server add|query|describe|screenshot|export|import|mermaid|snapshot|arrange|share|...` — JSON on stdout, meaningful exit codes. Also installed as the `excalidraw-canvas` alias.\n- **Zero-setup**: canvas-driving CLI commands and the MCP server **auto-start the canvas server** if it isn't running (closes #66). Opt out with `EXCALIDRAW_NO_AUTOSTART=1`.\n- **`apply`**: multi-op patches (`{\"create\":[...],\"update\":[{\"id\":\"a\",\"set\":{...}}],\"delete\":[...]}`) in a single invocation.\n- **`install-skill`**: `npx -y mcp-excalidraw-server install-skill --dir <skills-root>` copies the portable agent skill into the directory your agent chooses (project or global), cleanly replacing older versions.\n- **Skill is now CLI-first** and no longer needs a cloned repo or configured MCP server to work.\n- **Typed queries**: `query --filter locked=true --filter label.text=API` — booleans, numbers, and nested keys work.\n- **Internals**: shared core library (`src/core/`) behind both the CLI and MCP server; canvas `groupIds` are the source of truth for grouping (ungroup now works across restarts); `node-fetch` dropped; MCP version metadata derived from `package.json`; canvas server writes a pidfile and shuts down cleanly.\n\n## Installation\n\nThe only prerequisite is **Node.js ≥ 18**.\n\n### Easiest: let your agent install it\n\nCopy this into your coding agent — it installs the portable skill into the project/global skill directory that agent already knows how to use, then verifies it by drawing a test diagram:\n\n```text\nInstall the Excalidraw canvas toolkit so you can draw diagrams for me:\n\n1. Choose the right skill directory for this agent and scope (project or global).\n2. Run: npx -y mcp-excalidraw-server install-skill --dir <that-skills-directory>\n3. Read the installed excalidraw-skill/SKILL.md so you know the drawing workflow.\n4. Start the canvas with: npx -y mcp-excalidraw-server start\n   then tell me to open http://127.0.0.1:3000 in my browser (screenshots need an open tab).\n5. Draw a small test diagram — two labeled boxes connected by an arrow — take a\n   screenshot, and show me the result to confirm everything works.\n```\n\n### Manual install\n\n| You are... | Install with | Then |\n|---|---|---|\n| **Modern coding agent** | `npx -y mcp-excalidraw-server install-skill --dir <skills-root>` | Let the agent choose project/global scope and its skill root |\n| **Claude Code shortcut** | `npx -y mcp-excalidraw-server install-skill` | Installs to `~/.claude/skills` for backward compatibility |\n| **Codex shortcut** | `npx -y mcp-excalidraw-server install-skill --target codex` | Installs to `~/.codex/skills` for backward compatibility |\n| **MCP client user** (Claude Desktop, Cursor, ...) | Add the npx config below | See [Configure MCP Clients](#configure-mcp-clients) |\n| **CLI user / scripting** | Nothing — `npx -y mcp-excalidraw-server <command>` | See [CLI Reference](#cli-reference) |\n| **Contributor / from source** | `git clone` + `npm ci` + `npm run build` | See [Quick Start (From Source / Docker)](#quick-start-from-source--docker) |\n\nThere is no separate server setup: any drawing command auto-starts the local canvas server on `http://127.0.0.1:3000`.\n\n### 60-Second Quick Start (CLI)\n\nNo clone, no config:\n\n```bash\n# start the canvas (drawing commands auto-start it too) and open it\nnpx -y mcp-excalidraw-server start\nopen http://127.0.0.1:3000   # browser tab enables screenshots & mermaid\n\n# draw something\necho '[\n  {\"id\":\"api\",\"type\":\"rectangle\",\"x\":100,\"y\":100,\"width\":160,\"height\":80,\"text\":\"API Server\",\"backgroundColor\":\"#a5d8ff\"},\n  {\"id\":\"db\",\"type\":\"rectangle\",\"x\":400,\"y\":100,\"width\":160,\"height\":80,\"text\":\"Database\",\"backgroundColor\":\"#99e9f2\"},\n  {\"type\":\"arrow\",\"x\":0,\"y\":0,\"startElementId\":\"api\",\"endElementId\":\"db\",\"text\":\"SQL\"}\n]' | npx -y mcp-excalidraw-server add\n\n# let your agent see its work\nnpx -y mcp-excalidraw-server describe\nnpx -y mcp-excalidraw-server screenshot --out diagram.png\n\n# diagrams as repo artifacts\nmkdir -p docs\nnpx -y mcp-excalidraw-server export --out docs/architecture.excalidraw\n```\n\nGive your agent the full playbook:\n\n```bash\nnpx -y mcp-excalidraw-server install-skill --dir <skills-root>\nnpx -y mcp-excalidraw-server install-skill --print-source  # inspect bundled source path\n```\n\n> **Security note:** The canvas server binds `127.0.0.1` only by default. If you expose it on a network interface (`HOST=0.0.0.0`), put network-level access controls in front — the API has no built-in authentication.\n\n## Agent Skill\n\nThe skill at `skills/excalidraw-skill/` teaches agents the full workflow — layout planning, the screenshot-verify-fix quality loop, arrow routing, anti-patterns, snapshots, and file I/O. It works through the CLI (preferred, zero setup), MCP tools (if configured), or raw REST — in that order.\n\n```bash\nnpx -y mcp-excalidraw-server install-skill --dir <skills-root>\n```\n\nThe command copies the bundled `excalidraw-skill/` directory into `<skills-root>/excalidraw-skill`. Let your agent choose whether that root should be project-level or global. Re-running `install-skill` upgrades in place — it replaces the target directory, so files removed upstream don't linger.\n\nWhere the skill shines:\n\n- **Diagrams as code artifacts**: export `.excalidraw` files into the repo, commit them, re-import + refine when the architecture changes.\n- **Self-verifying diagrams**: the agent screenshots its own work and fixes truncation/overlap before calling it done.\n- **No-MCP environments**: CI jobs, plain shells, and frameworks get the same capabilities through the CLI.\n\n## CLI Reference\n\n`npx -y mcp-excalidraw-server <command>` or (after `npm i -g mcp-excalidraw-server`) `excalidraw-canvas <command>`.\n\nConventions: JSON results on stdout — except `describe` (plain text by design) and raw-content output when `--out` is omitted (`export` prints the scene JSON, `screenshot --format svg` prints SVG). Diagnostics on stderr. Exit codes: `0` ok, `1` error, `2` usage, `3` canvas unreachable, `4` browser tab required. Canvas URL from `EXPRESS_SERVER_URL` or `--url`. Canvas-driving commands auto-start the server; `status` only reports current state. Explicit `start` overrides the `EXCALIDRAW_NO_AUTOSTART=1` opt-out (it's user intent, not auto-start).\n\n| Command | Description |\n|---------|-------------|\n| `start` / `stop` / `status` | Manage the canvas server (detached; `stop` identity-checks the live server via `/health` before signaling) |\n| `add [file\\|-]` | Batch-create elements from a JSON array (file or stdin); `--one '{...}'` for a single element |\n| `apply [file\\|-]` | One-call multi-op patch: `{\"create\":[...],\"update\":[{\"id\":\"a\",\"set\":{...}}],\"delete\":[\"id\"]}` |\n| `get <id>` / `delete <id...>` | Read / remove elements |\n| `update <id> --set '{...}'` | Update an element |\n| `query` | `--type`, `--bbox x0,y0,x1,y1`, `--filter k=v` (typed, nested keys), `--filter-json '{...}'` |\n| `describe` | AI-readable scene summary (plain text) |\n| `screenshot` | `--out f.png`, `--format png\\|svg`, `--no-background` (browser tab required) |\n| `export [--out f.excalidraw]` / `import [file\\|-] [--replace]` | Scene file I/O |\n| `mermaid [file\\|-]` | Mermaid → canvas (browser tab required) |\n| `snapshot save\\|list\\|restore <name>` | Named snapshots |\n| `arrange align\\|distribute\\|group\\|ungroup\\|lock\\|unlock\\|duplicate` | Layout ops (`--ids a,b,c`, `--to left\\|horizontal\\|...`) |\n| `share` | Encrypted upload → shareable excalidraw.com URL |\n| `clear --yes` | Wipe the canvas |\n| `install-skill [--dir <skills-root>]` | Install the portable agent skill |\n\nLabels and arrow bindings use the agent-friendly format everywhere in the CLI: `\"text\"` on any shape, `\"startElementId\"`/`\"endElementId\"` on arrows — normalization is automatic.\n\n## Configure MCP Clients\n\nThe MCP server runs over stdio. Since v1.1 the simplest config is `npx` — no clone, no absolute paths, and the canvas auto-starts:\n\n### Environment Variables\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `EXPRESS_SERVER_URL` | URL of the canvas server | `http://127.0.0.1:3000` |\n| `ENABLE_CANVAS_SYNC` | Enable real-time canvas sync | `true` |\n| `EXCALIDRAW_NO_AUTOSTART` | Set `1` to disable canvas auto-start | (unset) |\n| `EXCALIDRAW_EXPORT_DIR` | Base directory MCP file exports may write to | current working dir |\n| `PORT` / `HOST` | Canvas server bind address | `3000` / `127.0.0.1` |\n\n---\n\n### Claude Desktop\n\nConfig location:\n- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`\n- Windows: `%APPDATA%\\Claude\\claude_desktop_config.json`\n- Linux: `~/.config/Claude/claude_desktop_config.json`\n\n**npx (recommended)**\n```json\n{\n  \"mcpServers\": {\n    \"excalidraw\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-excalidraw-server\"]\n    }\n  }\n}\n```\n\n**Local (node)**\n```json\n{\n  \"mcpServers\": {\n    \"excalidraw\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/mcp_excalidraw/dist/index.js\"],\n      \"env\": {\n        \"EXPRESS_SERVER_URL\": \"http://127.0.0.1:3000\",\n        \"ENABLE_CANVAS_SYNC\": \"true\"\n      }\n    }\n  }\n}\n```\n\n**Docker**\n```json\n{\n  \"mcpServers\": {\n    \"excalidraw\": {\n      \"command\": \"docker\",\n      \"args\": [\n        \"run\", \"-i\", \"--rm\",\n        \"-e\", \"EXPRESS_SERVER_URL=http://host.docker.internal:3000\",\n        \"-e\", \"ENABLE_CANVAS_SYNC=true\",\n        \"ghcr.io/yctimlin/mcp_excalidraw:latest\"\n      ]\n    }\n  }\n}\n```\n\n---\n\n### Claude Code\n\n**npx (recommended)**\n```bash\nclaude mcp add excalidraw --scope user -- npx -y mcp-excalidraw-server\n```\n\n> Tip: for coding agents, the skill + CLI often beats MCP config entirely — let the agent pick its skill root, then run `npx -y mcp-excalidraw-server install-skill --dir <skills-root>`.\n\n**Local (node)** - User-level (available across all projects):\n```bash\nclaude mcp add excalidraw --scope user \\\n  -e EXPRESS_SERVER_URL=http://127.0.0.1:3000 \\\n  -e ENABLE_CANVAS_SYNC=true \\\n  -- node /absolute/path/to/mcp_excalidraw/dist/index.js\n```\n\n**Docker**\n```bash\nclaude mcp add excalidraw --scope user \\\n  -- docker run -i --rm \\\n  -e EXPRESS_SERVER_URL=http://host.docker.internal:3000 \\\n  -e ENABLE_CANVAS_SYNC=true \\\n  ghcr.io/yctimlin/mcp_excalidraw:latest\n```\n\n**Manage servers:**\n```bash\nclaude mcp list              # List configured servers\nclaude mcp remove excalidraw # Remove a server\n```\n\n---\n\n### Cursor\n\nConfig location: `.cursor/mcp.json` in your project root (or `~/.cursor/mcp.json` for global config)\n\n**npx (recommended)**\n```json\n{\n  \"mcpServers\": {\n    \"excalidraw\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-excalidraw-server\"]\n    }\n  }\n}\n```\n\n**Docker**\n```json\n{\n  \"mcpServers\": {\n    \"excalidraw\": {\n      \"command\": \"docker\",\n      \"args\": [\n        \"run\", \"-i\", \"--rm\",\n        \"-e\", \"EXPRESS_SERVER_URL=http://host.docker.internal:3000\",\n        \"-e\", \"ENABLE_CANVAS_SYNC=true\",\n        \"ghcr.io/yctimlin/mcp_excalidraw:latest\"\n      ]\n    }\n  }\n}\n```\n\n---\n\n### Codex CLI\n\n**npx (recommended)**\n```bash\ncodex mcp add excalidraw -- npx -y mcp-excalidraw-server\n```\n\n**Docker**\n```bash\ncodex mcp add excalidraw \\\n  -- docker run -i --rm \\\n  -e EXPRESS_SERVER_URL=http://host.docker.internal:3000 \\\n  -e ENABLE_CANVAS_SYNC=true \\\n  ghcr.io/yctimlin/mcp_excalidraw:latest\n```\n\n**Manage servers:**\n```bash\ncodex mcp list              # List configured servers\ncodex mcp remove excalidraw # Remove a server\n```\n\n---\n\n### OpenCode\n\nConfig location: `~/.config/opencode/opencode.json` or project-level `opencode.json`\n\n```json\n{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"mcp\": {\n    \"excalidraw\": {\n      \"type\": \"local\",\n      \"command\": [\"npx\", \"-y\", \"mcp-excalidraw-server\"],\n      \"enabled\": true\n    }\n  }\n}\n```\n\n---\n\n### Antigravity (Google)\n\nConfig location: `~/.gemini/antigravity/mcp_config.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"excalidraw\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-excalidraw-server\"]\n    }\n  }\n}\n```\n\n---\n\n### Notes\n\n- **Docker networking**: Use `host.docker.internal` to reach the canvas server running on your host machine. On Linux, you may need `--add-host=host.docker.internal:host-gateway` or use `172.17.0.1`. The Docker MCP image sets `EXCALIDRAW_NO_AUTOSTART=1` (it has no frontend build) — run the canvas as its own container.\n- **In-memory storage**: The canvas server stores elements in memory. Restarting the server clears all elements — use `export` / `snapshot` for persistence.\n\n## MCP Tools (26 Total)\n\n| Category | Tools |\n|---|---|\n| **Element CRUD** | `create_element`, `get_element`, `update_element`, `delete_element`, `query_elements`, `batch_create_elements`, `duplicate_elements` |\n| **Layout** | `align_elements`, `distribute_elements`, `group_elements`, `ungroup_elements`, `lock_elements`, `unlock_elements` |\n| **Scene Awareness** | `describe_scene`, `get_canvas_screenshot` |\n| **File I/O** | `export_scene`, `import_scene`, `export_to_image`, `export_to_excalidraw_url`, `create_from_mermaid` |\n| **State Management** | `clear_canvas`, `snapshot_scene`, `restore_snapshot` |\n| **Viewport** | `set_viewport` |\n| **Design Guide** | `read_diagram_guide` |\n| **Resources** | `get_resource` |\n\nFull schemas are discoverable via `tools/list` or in `skills/excalidraw-skill/references/cheatsheet.md`.\n\n## Quick Start (From Source / Docker)\n\nFrom source (Node >= 18):\n\n```bash\nnpm ci\nnpm run build\nPORT=3000 npm run canvas          # canvas server (terminal 1)\nnode dist/index.js                # MCP server over stdio (terminal 2, usually launched by your MCP client)\nnode dist/bin.js status           # or drive the CLI straight from the build\n```\n\nDocker canvas server:\n```bash\ndocker run -d -p 3000:3000 --name mcp-excalidraw-canvas ghcr.io/yctimlin/mcp_excalidraw-canvas:latest\n```\n\nMCP server image: `ghcr.io/yctimlin/mcp_excalidraw:latest` (stdio; point `EXPRESS_SERVER_URL` at the canvas container).\n\n## Testing\n\n### CLI Smoke Test\n\n```bash\nnpx -y mcp-excalidraw-server start\nnpx -y mcp-excalidraw-server status\nnpx -y mcp-excalidraw-server add --one '{\"type\":\"rectangle\",\"x\":100,\"y\":100,\"width\":300,\"height\":200}'\nnpx -y mcp-excalidraw-server describe\n```\n\n### Canvas Smoke Test (HTTP)\n\n```bash\ncurl http://127.0.0.1:3000/health\n```\n\n### Local Bind Regression Test\n\n```bash\nnpm run test:bind\n```\n\n### MCP Smoke Test (MCP Inspector)\n\nList tools:\n```bash\nnpx @modelcontextprotocol/inspector --cli \\\n  -e EXPRESS_SERVER_URL=http://127.0.0.1:3000 \\\n  -e ENABLE_CANVAS_SYNC=true -- \\\n  node dist/index.js --method tools/list\n```\n\nCreate a rectangle:\n```bash\nnpx @modelcontextprotocol/inspector --cli \\\n  -e EXPRESS_SERVER_URL=http://127.0.0.1:3000 \\\n  -e ENABLE_CANVAS_SYNC=true -- \\\n  node dist/index.js --method tools/call --tool-name create_element \\\n  --tool-arg type=rectangle --tool-arg x=100 --tool-arg y=100 \\\n  --tool-arg width=300 --tool-arg height=200\n```\n\n### Frontend Screenshots (agent-browser)\n\nIf you use `agent-browser` for UI checks:\n```bash\nagent-browser install\nagent-browser open http://127.0.0.1:3000\nagent-browser wait --load networkidle\nagent-browser screenshot /tmp/canvas.png\n```\n\n## FAQ\n\n### How is this different from the official Excalidraw MCP?\n\nThe [official Excalidraw MCP](https://github.com/excalidraw/excalidraw-mcp) is a chat widget: you prompt, it streams a diagram into the conversation (the model gets two tools). This project is a **workbench for coding agents**: a persistent local canvas with element-level create/read/update/delete, layout tools, screenshots the model can see, snapshots, and `.excalidraw` file I/O — driveable via CLI, MCP, or REST. See the [full comparison table](#how-we-differ-from-the-official-excalidraw-mcp).\n\n### Which AI tools does it work with?\n\nClaude Code, Claude Desktop, Cursor, Codex CLI, OpenCode, and Google Antigravity are documented below — but any agent that can run shell commands can use the CLI, any MCP client can use the MCP server, and anything else (LangChain, custom apps) can use the REST API.\n\n### Can the AI actually see the diagram it drew?\n\nYes — that's the core feature. `describe` returns a structured text summary (ids, positions, labels, connections) and `screenshot` returns a rendered PNG. Agents use both to catch truncated labels, overlaps, and bad arrow routing, then fix them element by element.\n\n### Do I need a browser open?\n\nOnly for rendering-dependent features: screenshots, PNG/SVG export, viewport control, and Mermaid conversion (they render in the Excalidraw frontend). Creating, querying, updating elements and exporting `.excalidraw` JSON all work headless. The CLI exits with code `4` and tells you when a browser tab is needed.\n\n### Are my diagrams persistent?\n\nThe canvas is in-memory by design (restart = blank canvas). Persist by exporting `.excalidraw` files into your repo (`export --out docs/architecture.excalidraw`) or with named `snapshot`s while working. Re-`import` a file to keep refining it later.\n\n### Are excalidraw.com share links private?\n\n`share` encrypts the scene locally with AES-GCM before uploading; the decryption key is only in the URL fragment, which excalidraw.com's server never sees. Anyone you give the full link to can view the diagram.\n\n### Does it need an API key or cloud service?\n\nNo API key is required. Core drawing runs locally under MIT license. The only outbound call is the optional `share` upload to excalidraw.com.\n\n### Can I use it without configuring MCP?\n\nYes — that's the recommended path for coding agents: `npx -y mcp-excalidraw-server install-skill --dir <skills-root>` and the agent drives everything through the CLI. MCP configuration is only needed for chat clients like Claude Desktop.\n\n## Troubleshooting\n\n- **CLI exit code 3** (canvas unreachable): the server is not running for an inspecting command such as `status`, auto-start is disabled (`EXCALIDRAW_NO_AUTOSTART=1`), or `EXPRESS_SERVER_URL` points at a non-loopback host. Run `start` explicitly or fix the env.\n- **CLI exit code 4** (browser required): screenshots, image export, viewport, and mermaid conversion render in the frontend — open `http://127.0.0.1:3000` in a browser and retry.\n- **Canvas not updating**: confirm `EXPRESS_SERVER_URL` points at the running canvas server (`status` shows the URL in use).\n- **Updates/deletes fail after batch creation**: ensure you are on a build that includes the batch id preservation fix (merged via PR #34).\n\n## Known Issues / TODO\n\n- [ ] **Persistent storage**: Elements are stored in-memory — restarting the server clears everything. Use `export` / snapshots as a workaround.\n- [ ] **Image export requires a browser**: screenshots and image export rely on the frontend doing the actual rendering. A headless rendering mode is planned.\n\nContributions welcome!\n\n## Development\n\n```bash\nnpm run type-check\nnpm run build\nnpm run cli -- status      # run the CLI from the local build\nnpm run sync:skills        # after editing skills/excalidraw-skill, sync the repo-local agent copy\n```\n\nBug reports and pull requests are welcome on [GitHub issues](https://github.com/yctimlin/mcp_excalidraw/issues). If this project helps you, a ⭐ helps others find it.\n\n## License\n\n[MIT](LICENSE) © [yctimlin](https://github.com/yctimlin) — not affiliated with the Excalidraw team. [Excalidraw](https://github.com/excalidraw/excalidraw) is its own MIT-licensed project; this toolkit builds on it with love.\n\n**Links:** [npm package](https://www.npmjs.com/package/mcp-excalidraw-server) · [GitHub](https://github.com/yctimlin/mcp_excalidraw) · [Issues](https://github.com/yctimlin/mcp_excalidraw/issues) · [Demo video](https://youtu.be/ufW78Amq5qA)\n","readmeFilename":"README.md"}