Excalidraw logo

Excalidraw

Security-hardened Excalidraw MCP server with auth, rate limiting, and 14 tools

Install Excalidraw

Pick your client, then add it in one click or paste the config.

STDIONode.js
~/Library/Application Support/Claude/claude_desktop_config.json
claude_desktop_config.json
{
  "mcpServers": {
    "excalidraw": {
      "command": "npx",
      "args": [
        "excalidraw-mcp-server"
      ]
    }
  }
}

Settings → Developer → Edit Config, merge this into mcpServers, then fully quit and reopen Claude Desktop.

We couldn’t confirm it starts correctly

We ran the install command but it didn't respond within our test window — this can mean a slow first-time install rather than a real problem.

npx excalidraw-mcp-server

No response to initialize.

This is an experimental automated check and can have false negatives — missing environment variables, a slow cold install, etc. It doesn’t necessarily mean something’s wrong. Last checked 7d ago.

Overview

Tools16

What Excalidraw lets your agent do. Expand a tool for its parameters.

Self-reported~236 tokens of context

Security & health

What it can reach and how reliably it runs — from our own checks, not the maintainer’s claims.

ActiveLast checked 1d ago

Recent health check succeeded.

9/9 checks healthy over the last 46d

Supply-chain signal

No high-severity advisories surfaced by our automated scan.

Critical 0High 0Medium 0Low 0

Scanned 5d ago via OSV.dev · excalidraw-mcp-server (npm)

Adoption & maintenance

Factual signals from GitHub, npm, and our automated checks — not a rating.

GitHub stars4Stargazers on the source repository.
npm downloads3kPackage downloads in the last 30 days.
Last commit8mo agoMost recent push to the default branch.
Install checkInconclusiveDidn't respond in our test window — often a slow first install.
Tools exposed16Callable tools this server registers over MCP.
Directory activity5 viewsConfig copies, upvotes, and views on AllMCPs.

From the project README

excalidraw-mcp-server

The only Excalidraw MCP server with security hardening, inline diagram rendering, and real-time canvas sync.

CI npm npm downloads License: MIT Node

Demo: architecture diagram being drawn element-by-element in real-time through WebSocket sync

What it does

Ask your AI to draw a diagram, and it appears right inside the chat. The MCP server gives Claude Desktop, ChatGPT, VS Code, and Cursor a full set of drawing tools backed by the Excalidraw format -- with API authentication, rate limiting, and input validation on every operation.

v2.0 adds MCP Apps support: diagrams stream inline as interactive SVG widgets with draw-on animations, and you can export any diagram to excalidraw.com with one click.

Two modes, zero config

Standalone mode (default) -- just install and go. The server runs with an in-process element store. No canvas server, no API keys, no setup. Your MCP client calls the tools, and diagrams render inline.

Connected mode -- start the optional canvas server for real-time browser sync. Multiple clients can collaborate on the same canvas through authenticated WebSocket connections. File persistence keeps state across restarts.

The server auto-detects which mode to use: if a canvas server is reachable, it connects to it. Otherwise it falls back to standalone.

Architecture

Architecture: MCP clients connect via stdio to the server, which operates in standalone mode with an in-process store and inline widget, or in connected mode with a canvas server, WebSocket browser frontend, and file persistence

Diagram created with excalidraw-mcp-server -- edit in Excalidraw

Features

MCP Apps (v2.0)

  • Inline diagram rendering in Claude Desktop, ChatGPT, and VS Code
  • Streaming SVG with draw-on animations as elements arrive
  • Export to excalidraw.com with one click
  • Element reference cheatsheet via read_me tool

16 MCP tools

  • Create, update, delete, and query elements (rectangle, ellipse, diamond, arrow, text, line, freedraw)
  • Batch create up to 100 elements at once
  • Group, ungroup, align, distribute, lock, unlock
  • Mermaid diagram conversion
  • SVG and PNG export

Security

  • API key authentication with constant-time comparison
  • Origin-restricted CORS (no wildcards)
  • WebSocket auth with token and origin validation
  • Standard and strict rate limiting tiers
  • Bounded Zod schemas with .strict() on every endpoint
  • Helmet.js security headers with CSP

Infrastructure

  • Real-time WebSocket sync across browser clients
  • Optional atomic-write file persistence
  • Structured pino audit logging

Install

Terminal
npm install -g excalidraw-mcp-server

Or run directly:

Terminal
npx excalidraw-mcp-server

Quick start

Standalone (recommended for most users)

Just point your MCP client at the server. No canvas server needed.

config.json
{
  "mcpServers": {
    "excalidraw": {
      "command": "npx",
      "args": ["excalidraw-mcp-server"]
    }
  }
}

Then ask your AI: "Draw an architecture diagram showing a load balancer, three app servers, and a database"

Connected mode (real-time browser sync)

bash
# Generate an API key
node scripts/generate-api-key.cjs

# Start the canvas server
EXCALIDRAW_API_KEY=<your-key> npm run canvas

# Open http://localhost:3000 to see the live canvas

Point your MCP client at the server with the same API key:

config.json
{
  "mcpServers": {
    "excalidraw": {
      "command": "npx",
      "args": ["excalidraw-mcp-server"],
      "env": {
        "EXCALIDRAW_API_KEY": "<your-key>",
        "CANVAS_SERVER_URL": "http://127.0.0.1:3000"
      }
    }
  }
}

MCP tools

ToolDescription
create_viewRender elements as an inline SVG widget with streaming animations (MCP Apps)
read_meGet the element reference cheatsheet (types, colors, sizing tips)
create_elementCreate a single element (rectangle, ellipse, diamond, arrow, text, line, freedraw)
update_elementUpdate an existing element by ID
delete_elementDelete an element by ID
query_elementsSearch elements by type, locked status, or group ID
get_resourceGet scene state, all elements, theme, or library
batch_create_elementsCreate up to 100 elements in one call
group_elementsGroup multiple elements together
ungroup_elementsRemove elements from a group
align_elementsAlign elements (left, center, right, top, middle, bottom)
distribute_elementsDistribute elements evenly (horizontal or vertical)
lock_elementsLock elements to prevent modification
unlock_elementsUnlock elements
create_from_mermaidConvert a Mermaid diagram to Excalidraw elements
export_sceneExport the canvas as SVG or PNG

Security comparison

FeatureTypical MCP serversexcalidraw-mcp-server
AuthenticationNoneAPI key (constant-time compare)
CORS* wildcardOrigin allowlist
WebSocket authNoneToken + origin validation
Rate limitingNoneStandard + strict tiers
Input validationMinimalBounded Zod with .strict()
Security headersNoneHelmet.js + CSP
Request size limitNone512KB body, 1MB WebSocket
Audit loggingNoneStructured pino logs

Configuration

All settings via environment variables. Copy .env.example to .env and adjust as needed.

VariableDefaultDescription
STANDALONE_MODEtrueUse in-process store (no canvas server needed)
CANVAS_HOST127.0.0.1Canvas server bind address
CANVAS_PORT3000Canvas server port
EXCALIDRAW_API_KEYAuto-generatedAPI key for auth (min 32 chars)
CORS_ALLOWED_ORIGINShttp://localhost:3000,http://127.0.0.1:3000Comma-separated origin allowlist
RATE_LIMIT_WINDOW_MS60000Rate limit window in milliseconds
RATE_LIMIT_MAX_REQUESTS100Max requests per window (standard tier)
PERSISTENCE_ENABLEDfalseEnable file-based persistence
PERSISTENCE_DIR./dataDirectory for persistent storage
CANVAS_SERVER_URLhttp://127.0.0.1:3000URL the MCP server uses to reach the canvas
LOG_LEVELinfoLog level: debug, info, warn, error
AUDIT_LOG_ENABLEDtrueEnable audit logging
MAX_ELEMENTS10000Maximum elements on canvas
MAX_BATCH_SIZE100Maximum elements per batch create

MCP client configuration

Claude Desktop

Add to claude_desktop_config.json:

config.json
{
  "mcpServers": {
    "excalidraw": {
      "command": "npx",
      "args": ["excalidraw-mcp-server"]
    }
  }
}

Cursor

Add to .cursor/mcp.json in your project root:

config.json
{
  "mcpServers": {
    "excalidraw": {
      "command": "npx",
      "args": ["excalidraw-mcp-server"]
    }
  }
}

VS Code

Add to your MCP settings:

config.json
{
  "mcpServers": {
    "excalidraw": {
      "command": "npx",
      "args": ["excalidraw-mcp-server"]
    }
  }
}

For connected mode, add "env": { "EXCALIDRAW_API_KEY": "<key>", "CANVAS_SERVER_URL": "http://127.0.0.1:3000" } to the config above. Replace <key> with the key from node scripts/generate-api-key.cjs.

Development

bash
# Install dependencies
npm ci

# Run in development mode (watch + Vite dev server)
npm run dev

# Run tests
npm test

# Run tests with coverage
npm run test:coverage

# Lint
npm run lint

# Type check
npm run type-check

# Build (server + widget + frontend)
npm run build

Project structure

Code
src/
  mcp/              MCP server (stdio transport)
    tools/          16 tool implementations
    apps/           MCP Apps wiring, standalone store, cheatsheet
    schemas/        Zod schemas and input limits
    canvas-client.ts  HTTP client for canvas server
    index.ts        MCP server entry point
  canvas/           Canvas server (Express + WebSocket)
    middleware/      Auth, CORS, rate limiting, audit, security headers
    routes/         REST API routes + SVG export
    ws/             WebSocket handler and protocol
    store/          Element storage (memory + file)
    index.ts        Canvas server entry point
  shared/           Shared config, types, logging
widget/             MCP Apps inline widget (Vite + singlefile build)
frontend/           Excalidraw React frontend (browser)
test/               Unit and integration tests (290 tests)

Migrating from v1.x

Zero-config upgrade. All 14 original tools work identically -- create_view and read_me are additive. The canvas server is now optional (standalone mode activates automatically).

Terminal
npm install -g excalidraw-mcp-server@2

Existing MCP client configs (stdio transport, tool names) continue to work without changes.

License

MIT

Reviews

No reviews yet — be the first to share how it worked for you.

Frequently Asked Questions about Excalidraw

excalidraw is an MCP server that lets AI clients create, edit, organize, render, and export Excalidraw diagrams. It supports standalone operation with an in-process element store, or connected operation with optional real-time browser synchronization, persistence, and authenticated WebSocket access. Security features include authentication, rate limiting, validation, and restricted CORS.

Install it globally with npm using `npm install -g excalidraw-mcp-server`, or run it directly with `npx excalidraw-mcp-server`. For an MCP client, configure the server with the `npx` command and `excalidraw-mcp-server` argument.

No, the server does not require a canvas server in standalone mode. It uses an in-process element store and can render diagrams inline. If an optional canvas server is reachable, it automatically uses connected mode for real-time browser synchronization, authenticated WebSocket connections, and file persistence.

The server can create, update, delete, and query Excalidraw elements, including shapes, arrows, text, lines, and freedraw content. It also supports batch creation, grouping, alignment, distribution, locking, Mermaid conversion, SVG and PNG export, inline SVG rendering, and export to excalidraw.com.

Related MCP servers

Add a badge to your READMEShow it’s listed — live SVG, Markdown or HTML.

AllMCPs Directory Badge

Full Badge Customizer

Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.

Badge Style:
Live Dynamic SVG PreviewExcalidraw AllMCPs Directory Badge
Markdown (GitHub README)
[![AllMCPs](https://allmcps.com/api/badge/excalidraw?style=directory)](https://allmcps.com/mcp/excalidraw)
HTML Embed
<a href="https://allmcps.com/mcp/excalidraw"><img src="https://allmcps.com/api/badge/excalidraw?style=directory" alt="Excalidraw on AllMCPs" /></a>