Files
excalidraw-mcp-sentinel/package.json
T
7143b5e41e feat: add SQLite persistence, multi-tenancy, auto-sync, and CI/Docker improvements (#1)
Replace in-memory storage with SQLite (WAL mode), add workspace-based
multi-tenancy with auto-detection via server.listRoots(), and embed the
canvas server into the MCP process for single-process operation.

🔧 Core enhancements:
- SQLite persistence with versioning, element history, and search
- Multi-tenancy: isolated canvases per workspace (SHA-256 tenant IDs)
- Embedded canvas lifecycle (single node process starts MCP + canvas)
- Auto-sync with 3s debounce and manual override toggle
- Configurable canvas port via CANVAS_PORT env var
- 6 new MCP tools (search, history, tenants, projects)
- Workspace switcher UI with dropdown search
- Sync normalization to prevent bound-text breakage on reload

🐳 Docker & CI improvements:
- BuildKit cache mounts for faster npm installs across builds
- Skip native compilation in frontend-builder stage (--ignore-scripts)
- Build only linux/amd64 on PRs, multi-arch on push to main
- Docker Hub registry with proper build tools for better-sqlite3
- CI and Docker status check gates (github/ci-status-check, github/docker-build-check)

📦 Package & publishing:
- Renamed to @sanjibdevnath/mcp-excalidraw-local (v3.0.0)
- Updated npm-publish workflow for scoped package
- Updated bin entry, keywords, and files list

📝 Documentation:
- README with UI screenshots, architecture diagram, and full feature docs
- Updated agent skill with 32-tool cheatsheet and workflow playbooks
- Fork attribution and upstream comparison table

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-19 10:17:29 +05:30

109 lines
2.8 KiB
JSON

{
"name": "@sanjibdevnath/mcp-excalidraw-local",
"version": "3.0.0",
"description": "Fully local MCP server for Excalidraw with SQLite persistence, multi-tenancy, auto-sync, real-time canvas, and 32 tools",
"main": "dist/index.js",
"type": "module",
"bin": {
"mcp-excalidraw-local": "dist/index.js"
},
"scripts": {
"start": "npm run build:server && node dist/index.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",
"type-check": "npx tsc --noEmit"
},
"dependencies": {
"@excalidraw/excalidraw": "^0.18.0",
"@excalidraw/mermaid-to-excalidraw": "^1.1.3",
"@modelcontextprotocol/sdk": "latest",
"better-sqlite3": "^12.6.2",
"cors": "^2.8.5",
"dotenv": "^16.3.1",
"express": "^4.18.2",
"mermaid": "^11.12.1",
"node-fetch": "^3.3.2",
"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/better-sqlite3": "^7.6.13",
"@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",
"sqlite",
"multi-tenancy",
"self-hosted",
"local"
],
"author": {
"name": "sanjibdevnathlabs"
},
"contributors": [
{
"name": "yctimlin",
"email": "c22647809@gmail.com",
"url": "https://github.com/yctimlin"
}
],
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/sanjibdevnathlabs/mcp-excalidraw-local.git"
},
"homepage": "https://github.com/sanjibdevnathlabs/mcp-excalidraw-local#readme",
"bugs": {
"url": "https://github.com/sanjibdevnathlabs/mcp-excalidraw-local/issues"
},
"pnpm": {
"onlyBuiltDependencies": [
"better-sqlite3",
"esbuild"
]
},
"engines": {
"node": ">=18.0.0"
},
"publishConfig": {
"access": "public",
"registry": "https://registry.npmjs.org/"
},
"files": [
"dist/**/*",
"skills/**/*",
"README.md",
"LICENSE"
]
}