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>
This commit is contained in:
Sanjib Devnath
2026-02-19 10:17:29 +05:30
committed by GitHub
co-authored by Cursor
parent 9883dce220
commit 7143b5e41e
23 changed files with 8278 additions and 923 deletions
+28 -13
View File
@@ -1,11 +1,11 @@
{
"name": "mcp-excalidraw-server",
"version": "1.0.2",
"description": "Advanced MCP server for Excalidraw with real-time canvas, WebSocket sync, and comprehensive diagram management",
"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-server": "dist/index.js"
"mcp-excalidraw-local": "dist/index.js"
},
"scripts": {
"start": "npm run build:server && node dist/index.js",
@@ -24,6 +24,7 @@
"@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",
@@ -37,6 +38,7 @@
"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",
@@ -60,21 +62,35 @@
"real-time",
"websocket",
"visualization",
"claude",
"ai-tools"
"sqlite",
"multi-tenancy",
"self-hosted",
"local"
],
"author": {
"name": "yctimlin",
"email": "c22647809@gmail.com"
"name": "sanjibdevnathlabs"
},
"contributors": [
{
"name": "yctimlin",
"email": "c22647809@gmail.com",
"url": "https://github.com/yctimlin"
}
],
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/yctimlin/mcp_excalidraw.git"
"url": "https://github.com/sanjibdevnathlabs/mcp-excalidraw-local.git"
},
"homepage": "https://github.com/yctimlin/mcp_excalidraw#readme",
"homepage": "https://github.com/sanjibdevnathlabs/mcp-excalidraw-local#readme",
"bugs": {
"url": "https://github.com/yctimlin/mcp_excalidraw/issues"
"url": "https://github.com/sanjibdevnathlabs/mcp-excalidraw-local/issues"
},
"pnpm": {
"onlyBuiltDependencies": [
"better-sqlite3",
"esbuild"
]
},
"engines": {
"node": ">=18.0.0"
@@ -84,9 +100,8 @@
"registry": "https://registry.npmjs.org/"
},
"files": [
"src/**/*",
"dist/**/*",
"*.d.ts",
"skills/**/*",
"README.md",
"LICENSE"
]