Excalidraw MCP Server
A Model Context Protocol server that enables LLMs to create, modify, and manipulate Excalidraw diagrams through a structured API.
README Documentation
MCP Excalidraw Server: Advanced Live Visual Diagramming with AI Integration
A comprehensive TypeScript-based system that combines Excalidraw's powerful drawing capabilities with Model Context Protocol (MCP) integration, enabling AI agents to create and manipulate diagrams in real-time on a live canvas.
š¦ Current Status & Version Information
š Choose Your Installation Method
| Component | Local | Docker | Status |
|---|---|---|---|
| Canvas Server | ā Fully Working | ā Fully Working | Production Ready |
| MCP Server | ā Fully Working | ā Fully Working | Production Ready |
| NPM Published | š§ In Progress | N/A | Development testing |
Important: Canvas and MCP Server Run Separately
This system consists of two independent components:
- Canvas Server - Runs the live Excalidraw canvas (web interface)
- MCP Server - Connects to Claude Desktop/Claude Code/Cursor IDE
You can choose any combination:
- Canvas: Local OR Docker
- MCP Server: Local OR Docker
Both local and Docker setups are fully working and production-ready!
š What This System Does
- šØ Live Canvas: Real-time Excalidraw canvas accessible via web browser
- š¤ AI Integration: MCP server allows AI agents (like Claude) to create visual diagrams
- ā” Real-time Sync: Elements created via MCP API appear instantly on the canvas
- š WebSocket Updates: Live synchronization across multiple connected clients
- šļø Production Ready: Clean, minimal UI suitable for end users
š„ Demo Video
See MCP Excalidraw in Action!
Watch how AI agents create and manipulate diagrams in real-time on the live canvas
šļø Architecture Overview
Two Independent Components
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Component 1 ā
ā šØ CANVAS SERVER ā
ā (Runs Independently) ā
ā ā
ā āāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāā ā
ā ā Canvas Server āāāāāāāāāā¶ā Frontend ā ā
ā ā (src/server.js) ā ā (React + WS) ā ā
ā ā Port 3000 ā ā Excalidraw UI ā ā
ā āāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāā ā
ā ā
ā š Start: npm run canvas OR docker run (canvas) ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā²
ā HTTP API
ā (Optional)
ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
ā Component 2 ā
ā š¤ MCP SERVER ā
ā (Runs Independently) ā
ā ā
ā āāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāā ā
ā ā AI Agent āāāāāāāāāā¶ā MCP Server ā ā
ā ā (Claude) ā ā (src/index.js) ā ā
ā ā Desktop/Code ā stdio ā MCP Protocol ā ā
ā āāāāāāāāāāāāāāāāāāā āāāāāāāāāāāāāāāāāāā ā
ā ā
ā š Configure in: claude_desktop_config.json OR .mcp.json ā
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
šÆ Key Points:
⢠Canvas and MCP server are SEPARATE processes
⢠Canvas can run locally OR in Docker
⢠MCP server can run locally OR in Docker
⢠Canvas provides the visual interface (optional)
⢠MCP server connects Claude to the canvas (via HTTP API)
š Key Features
Modern TypeScript Architecture
- Full TypeScript Migration: Complete type safety for backend and frontend
- Comprehensive Type Definitions: Excalidraw elements, API responses, WebSocket messages
- Strict Type Checking: Enhanced development experience and compile-time error detection
- Type-Safe React Components: TSX components with proper props typing
šØ Mermaid Diagram Support (NEW!)
- Mermaid to Excalidraw: Convert Mermaid diagrams directly to Excalidraw elements
- MCP Tool Integration: Use
create_from_mermaidtool from Claude - Browser-based Conversion: Leverages DOM access in the frontend for accurate rendering
- Multiple Diagram Types: Supports flowcharts, sequence diagrams, class diagrams, and more
- Test Button: Quick test functionality directly from the canvas UI
Real-time Canvas Integration
- Elements created via MCP appear instantly on the live canvas
- WebSocket-based real-time synchronization
- Multi-client support with live updates
Production-Ready Interface
- Clean, minimal UI with connection status
- Simple "Clear Canvas" functionality
- No development clutter or debug information
Comprehensive MCP API
- Element Creation: rectangles, ellipses, diamonds, arrows, text, lines
- Element Management: update, delete, query with filters
- Batch Operations: create multiple elements in one call
- Advanced Features: grouping, alignment, distribution, locking
Robust Architecture
- TypeScript-based Express.js backend with REST API + WebSocket
- React frontend with official Excalidraw package and TypeScript
- Dual-path element loading for reliability
- Auto-reconnection and error handling
š¦ Installation & Setup
Step 1: Choose Your Canvas Server Setup
The canvas server provides the live Excalidraw interface.
Option A: Local Canvas Server
- Clone and Install
git clone https://github.com/yctimlin/mcp_excalidraw.git
cd mcp_excalidraw
npm install
- Build the Project
npm run build
- Start Canvas Server
# Production mode (recommended)
npm run canvas
- Access the Canvas
http://localhost:3000
Option B: Docker Canvas Server
Option B1: Use Pre-built Image from GHCR (Recommended)
docker pull ghcr.io/yctimlin/mcp_excalidraw-canvas:latest
docker run -d -p 3000:3000 --name mcp-excalidraw-canvas ghcr.io/yctimlin/mcp_excalidraw-canvas:latest
Option B2: Build Locally
git clone https://github.com/yctimlin/mcp_excalidraw.git
cd mcp_excalidraw
docker build -f Dockerfile.canvas -t mcp-excalidraw-canvas .
docker run -d -p 3000:3000 --name mcp-excalidraw-canvas mcp-excalidraw-canvas
- Access the Canvas
http://localhost:3000
Step 2: Configure MCP Server in Your IDE
The MCP server connects your AI assistant (Claude) to the canvas. Choose local OR Docker format based on your preference.
Setup Combinations
You can mix and match any combination:
| Canvas Server | MCP Server | Status |
|---|---|---|
| ā Local | ā Local | Recommended |
| ā Local | ā Docker | Fully Working |
| ā Docker | ā Local | Fully Working |
| ā Docker | ā Docker | Fully Working |
Configuration examples are provided in the next section for:
- Claude Desktop
- Claude Code
- Cursor IDE
š§ Available Scripts
| Script | Description |
|---|---|
npm start | Build and start MCP server (dist/index.js) |
npm run canvas | Build and start canvas server (dist/server.js) |
npm run build | Build both frontend and TypeScript backend |
npm run build:frontend | Build React frontend only |
npm run build:server | Compile TypeScript backend to JavaScript |
npm run dev | Start TypeScript watch mode + Vite dev server |
npm run type-check | Run TypeScript type checking without compilation |
npm run production | Build + start in production mode |
šÆ Usage Guide
For End Users
- Open the canvas at
http://localhost:3000 - Check connection status (should show "Connected")
- AI agents can now create diagrams that appear in real-time
- Use "Clear Canvas" to remove all elements
For AI Agents (via MCP)
The MCP server provides these tools for creating visual diagrams:
Basic Element Creation
// Create a rectangle
{
"type": "rectangle",
"x": 100,
"y": 100,
"width": 200,
"height": 100,
"backgroundColor": "#e3f2fd",
"strokeColor": "#1976d2",
"strokeWidth": 2
}
Create Text Elements
{
"type": "text",
"x": 150,
"y": 125,
"text": "Process Step",
"fontSize": 16,
"strokeColor": "#333333"
}
Create Arrows & Lines
{
"type": "arrow",
"x": 300,
"y": 130,
"width": 100,
"height": 0,
"strokeColor": "#666666",
"strokeWidth": 2
}
Batch Creation for Complex Diagrams
{
"elements": [
{
"type": "rectangle",
"x": 100,
"y": 100,
"width": 120,
"height": 60,
"backgroundColor": "#fff3e0",
"strokeColor": "#ff9800"
},
{
"type": "text",
"x": 130,
"y": 125,
"text": "Start",
"fontSize": 16
}
]
}
š MCP Server Configuration for IDEs
Prerequisites
ā Ensure your canvas server is running (from Step 1):
- Local:
npm run canvas - Docker:
docker run -d -p 3000:3000 mcp-excalidraw-canvas
Canvas should be accessible at http://localhost:3000
Quick Reference
Choose your configuration based on IDE and preference:
| IDE | Config File | Format Options |
|---|---|---|
| Claude Desktop | claude_desktop_config.json | Local ā / Docker ā |
| Claude Code | .mcp.json (project root) | Local ā / Docker ā |
| Cursor | .cursor/mcp.json | Local ā / Docker ā |
ā = Recommended | ā = Fully Working
Configuration for Claude Desktop
Edit your claude_desktop_config.json file:
Format 1: Local MCP Server ā Recommended
{
"mcpServers": {
"excalidraw": {
"command": "node",
"args": ["/absolute/path/to/mcp_excalidraw/dist/index.js"],
"env": {
"EXPRESS_SERVER_URL": "http://localhost:3000",
"ENABLE_CANVAS_SYNC": "true"
}
}
}
}
Important: Replace /absolute/path/to/mcp_excalidraw with your actual installation path.
Format 2: Docker MCP Server ā Fully Working
Using Pre-built Image from GHCR (Recommended):
{
"mcpServers": {
"excalidraw": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--network", "host",
"-e", "EXPRESS_SERVER_URL=http://localhost:3000",
"-e", "ENABLE_CANVAS_SYNC=true",
"ghcr.io/yctimlin/mcp_excalidraw:latest"
]
}
}
}
OR Build Locally:
cd mcp_excalidraw
docker build -f Dockerfile -t mcp-excalidraw .
Then use mcp-excalidraw as the image name in the configuration above.
Configuration for Claude Code
Create or edit .mcp.json in your project root:
Format 1: Local MCP Server ā Recommended
{
"mcpServers": {
"excalidraw": {
"command": "node",
"args": ["/absolute/path/to/mcp_excalidraw/dist/index.js"],
"env": {
"EXPRESS_SERVER_URL": "http://localhost:3000",
"ENABLE_CANVAS_SYNC": "true"
}
}
}
}
Important: Replace /absolute/path/to/mcp_excalidraw with your actual installation path.
Format 2: Docker MCP Server ā Fully Working
Using Pre-built Image from GHCR (Recommended):
{
"mcpServers": {
"excalidraw": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--network", "host",
"-e", "EXPRESS_SERVER_URL=http://localhost:3000",
"-e", "ENABLE_CANVAS_SYNC=true",
"ghcr.io/yctimlin/mcp_excalidraw:latest"
]
}
}
}
OR Build Locally:
cd mcp_excalidraw
docker build -f Dockerfile -t mcp-excalidraw .
Then use mcp-excalidraw as the image name in the configuration above.
Alternative: Using Claude CLI
# Project-scoped (recommended)
claude mcp add --scope project --transport stdio excalidraw \
-- docker run -i --rm --network host \
-e EXPRESS_SERVER_URL=http://localhost:3000 \
-e ENABLE_CANVAS_SYNC=true \
mcp-excalidraw
# User-scoped (available across all projects)
claude mcp add --scope user --transport stdio excalidraw \
-- docker run -i --rm --network host \
-e EXPRESS_SERVER_URL=http://localhost:3000 \
-e ENABLE_CANVAS_SYNC=true \
mcp-excalidraw
Configuration for Cursor IDE
Edit .cursor/mcp.json:
Format 1: Local MCP Server ā Recommended
{
"mcpServers": {
"excalidraw": {
"command": "node",
"args": ["/absolute/path/to/mcp_excalidraw/dist/index.js"],
"env": {
"EXPRESS_SERVER_URL": "http://localhost:3000",
"ENABLE_CANVAS_SYNC": "true"
}
}
}
}
Format 2: Docker MCP Server ā Fully Working
Using Pre-built Image from GHCR (Recommended):
{
"mcpServers": {
"excalidraw": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--network", "host",
"-e", "EXPRESS_SERVER_URL=http://localhost:3000",
"-e", "ENABLE_CANVAS_SYNC=true",
"ghcr.io/yctimlin/mcp_excalidraw:latest"
]
}
}
}
OR Build Locally:
cd mcp_excalidraw
docker build -f Dockerfile -t mcp-excalidraw .
Then use mcp-excalidraw as the image name in the configuration above.
Important Configuration Notes
| Setting | Purpose | Required |
|---|---|---|
EXPRESS_SERVER_URL | Canvas server URL | Yes (default: http://localhost:3000) |
ENABLE_CANVAS_SYNC | Enable real-time canvas sync | Yes (set to "true") |
--network host | Docker access to localhost | Required for Docker |
-i flag | Interactive stdin/stdout | Required for Docker |
Canvas is optional: The MCP server works without the canvas in API-only mode (for programmatic access only).
š ļø Environment Variables
| Variable | Default | Description |
|---|---|---|
EXPRESS_SERVER_URL | http://localhost:3000 | Canvas server URL for MCP sync |
ENABLE_CANVAS_SYNC | true | Enable/disable canvas synchronization |
LOG_FILE_PATH | excalidraw.log | Path to the log file |
DEBUG | false | Enable debug logging |
PORT | 3000 | Canvas server port |
HOST | localhost | Canvas server host |
š API Endpoints
The canvas server provides these REST endpoints:
| Method | Endpoint | Description |
|---|---|---|
GET | /api/elements | Get all elements |
POST | /api/elements | Create new element |
PUT | /api/elements/:id | Update element |
DELETE | /api/elements/:id | Delete element |
POST | /api/elements/batch | Create multiple elements |
GET | /health | Server health check |
šØ MCP Tools Available
Element Management
create_element- Create any type of Excalidraw elementupdate_element- Modify existing elementsdelete_element- Remove elementsquery_elements- Search elements with filters
Batch Operations
batch_create_elements- Create complex diagrams in one call
Element Organization
group_elements- Group multiple elementsungroup_elements- Ungroup element groupsalign_elements- Align elements (left, center, right, top, middle, bottom)distribute_elements- Distribute elements evenlylock_elements/unlock_elements- Lock/unlock elements
Resource Access
get_resource- Access scene, library, theme, or elements data
šļø Development Architecture
Frontend (frontend/src/)
- React + TypeScript: Modern TSX components with full type safety
- Vite Build System: Fast development and optimized production builds
- Official Excalidraw:
@excalidraw/excalidrawpackage with TypeScript types - WebSocket Client: Type-safe real-time element synchronization
- Clean UI: Production-ready interface with proper TypeScript typing
Canvas Server (src/server.ts ā dist/server.js)
- TypeScript + Express.js: Fully typed REST API + static file serving
- WebSocket: Type-safe real-time client communication
- Element Storage: In-memory with comprehensive type definitions
- CORS: Cross-origin support with proper typing
MCP Server (src/index.ts ā dist/index.js)
- TypeScript MCP Protocol: Type-safe Model Context Protocol implementation
- Canvas Sync: Strongly typed HTTP requests to canvas server
- Element Management: Full CRUD operations with comprehensive type checking
- Batch Support: Type-safe complex diagram creation
Type System (src/types.ts)
- Excalidraw Element Types: Complete type definitions for all element types
- API Response Types: Strongly typed REST API interfaces
- WebSocket Message Types: Type-safe real-time communication
- Server Element Types: Enhanced element types with metadata
š Troubleshooting
Canvas Not Loading
- Ensure
npm run buildcompleted successfully - Check that
dist/index.htmlanddist/frontend/directory exist - Verify canvas server is running on port 3000
- Check if port 3000 is already in use:
lsof -i :3000(macOS/Linux) ornetstat -ano | findstr :3000(Windows)
Elements Not Syncing
- Confirm canvas server is running and accessible at http://localhost:3000
- Check
ENABLE_CANVAS_SYNC=truein MCP server environment configuration - Verify
EXPRESS_SERVER_URLpoints to correct canvas server URL - Check browser console for WebSocket connection errors
- For Docker: Ensure
--network hostflag is used
WebSocket Connection Issues
- Check browser console for WebSocket errors (F12 ā Console tab)
- Ensure no firewall blocking WebSocket connections on port 3000
- Try refreshing the browser page
- Verify canvas server is running:
curl http://localhost:3000/health
Docker Issues
Canvas Container:
- Check if container is running:
docker ps | grep canvas - View logs:
docker logs mcp-excalidraw-canvas - Ensure port 3000 is not already in use
MCP Container:
- For Docker MCP server, ensure
--network hostis used (required to access localhost:3000) - Verify
-iflag is present (required for MCP stdin/stdout protocol) - Check environment variables are properly set
Build Errors
- Delete
node_modulesanddist/directories, then runnpm install && npm run build - Check Node.js version (requires 16+):
node --version - Run
npm run type-checkto identify TypeScript issues - Verify
dist/directory contains bothindex.js,server.js, andfrontend/after build
NPM Package Issues
- Status: NPM package is under development
- Recommendation: Use local or Docker installation methods for production use
š Project Structure
mcp_excalidraw/
āāā frontend/
ā āāā src/
ā ā āāā App.tsx # Main React component (TypeScript)
ā ā āāā main.tsx # React entry point (TypeScript)
ā āāā index.html # HTML template
āāā src/ (TypeScript Source)
ā āāā index.ts # MCP server (TypeScript)
ā āāā server.ts # Canvas server (Express + WebSocket, TypeScript)
ā āāā types.ts # Comprehensive type definitions
ā āāā utils/
ā āāā logger.ts # Logging utility (TypeScript)
āāā dist/ (Compiled Output)
ā āāā index.js # Compiled MCP server
ā āāā server.js # Compiled Canvas server
ā āāā types.js # Compiled type definitions
ā āāā utils/
ā ā āāā logger.js # Compiled logging utility
ā āāā frontend/ # Built React frontend
āāā tsconfig.json # TypeScript configuration
āāā vite.config.js # Vite build configuration
āāā package.json # Dependencies and scripts
āāā README.md # This file
š® Development Roadmap
- ā TypeScript Migration: Complete type safety for enhanced development experience
- ā Docker Deployment: Both Canvas and MCP server fully working in Docker
- š§ NPM Package: Resolving MCP tool registration issues
- šÆ Enhanced Features: Additional MCP tools and capabilities
- šÆ Performance Optimization: Real-time sync improvements
- šÆ Advanced TypeScript Features: Stricter type checking and advanced type utilities
- šÆ Container Registry: Publishing to GitHub Container Registry (GHCR)
š¤ Contributing
We welcome contributions! If you're experiencing issues with the NPM package or Docker version, please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
š License
This project is licensed under the MIT License - see the LICENSE file for details.
š Acknowledgments
- Excalidraw Team - For the amazing drawing library
- MCP Community - For the Model Context Protocol specification
