A live Excalidraw canvas that an agent draws on, looks at and tidies up.
- Started in our test
- ★ 2.6K GitHub stars
- Last commit 22 Oct 2026
At a glance
This community project by yctimlin runs a local Excalidraw canvas and gives the model fine control over it: create, change, group, align and delete individual shapes, then describe the scene or take a screenshot to see what it drew. That loop lets an agent fix overlapping boxes and clipped labels instead of handing you its first attempt.
Finished diagrams can be saved as .excalidraw files (or Obsidian Excalidraw notes) to commit with your code, exported as PNG or SVG, or shared as an encrypted excalidraw.com link. It needs no account or key. It is separate from the official Excalidraw MCP, which draws one diagram inside the chat.
- Made by
- yctimlin and contributors (community project)
- Licence
- MIT
- Latest version
- 2.1.2 (4 Oct 2026)
- npm package
- mcp-excalidraw-server
- GitHub stars
- 2.6K
- Last commit
- 22 Oct 2026
- Tools
- 26
- Runs on
- Your computer
Our check: We ran this exact config on 27 Oct 2026: it started and answered with 26 tools. The shared database added "start" to the command, which only starts the canvas server. The MCP server runs with no extra argument.
What's in the pod: its tools
We found 26 tools when we started it on 27 Oct 2026. 7 only read. The rest can change things, so keep your app's "ask before each tool call" setting on for them.
Changes things19 tools · Can create, edit, send or delete.
| Tool | What it is for |
|---|---|
align_elements | Lines elements up on one edge or centre. |
batch_create_elements | Adds many elements in one call, with custom IDs so arrows can refer to them. |
clear_canvas | Deletes everything on the canvas. |
create_element | Adds one shape, text or arrow. Arrows can be bound to two shapes. |
create_from_mermaid | Converts Mermaid text into Excalidraw elements. Needs the canvas open in a browser. |
delete_element | Removes an element. |
distribute_elements | Spaces elements evenly. |
duplicate_elements | Copies elements with an offset. |
export_scene | Saves the canvas as .excalidraw JSON, or as an Obsidian Excalidraw note. |
export_to_excalidraw_url | Uploads an encrypted copy and returns a shareable excalidraw.com link. |
export_to_image | Exports the canvas as PNG or SVG. |
group_elements | Groups elements together. |
import_scene | Loads a .excalidraw or .excalidraw.md file, or raw JSON. |
lock_elements | Locks elements so they cannot be moved. |
restore_snapshot | Restores a named snapshot. |
set_viewport | Zooms and scrolls the canvas view. Needs the canvas open in a browser. |
ungroup_elements | Breaks a group apart. |
unlock_elements | Unlocks them again. |
update_element | Changes an element's position, size, colours or text. |
Only reads7 tools · Looks things up and changes nothing.
| Tool | What it is for |
|---|---|
describe_scene | Describes everything on the canvas in text: shapes, positions, labels and connections. |
get_canvas_screenshot | Renders the canvas to an image so the model can see its work. |
get_element | Returns one element by ID. |
get_resource | Reads a canvas resource, such as the scene or the library. |
query_elements | Finds elements by type, property or area of the canvas. |
read_diagram_guide | Hands the model a guide to colours, sizes and layouts for clean diagrams. |
snapshot_scene | Saves a named snapshot of the canvas. |
Grouped and described by us. The README on GitHub lists the inputs each tool takes.
How clearly it describes its tools to your assistant
- Tools with a description
- 26 of 26
- Say if they change things
- 0 of 26
- Context it takes, at least
- ~1,300 tokens
No tool says whether it only reads or can change things, so your client treats them all alike: keep approvals on.
From the tool list it sent us. The token figure counts names, descriptions and input names; the full schemas your client loads add more.
Set it up
Pick your app for the exact snippet and where it goes.
Where it goes: claude_desktop_config.json (Settings → Developer → Edit Config)
{
"mcpServers": {
"excalidraw": {
"command": "npx",
"args": [
"-y",
"mcp-excalidraw-server"
]
}
}
}Where it goes: Your terminal, in the project folder
claude mcp add-json excalidraw '{"command":"npx","args":["-y","mcp-excalidraw-server"]}'Where it goes: ~/.cursor/mcp.json, or .cursor/mcp.json in a project
{
"mcpServers": {
"excalidraw": {
"command": "npx",
"args": [
"-y",
"mcp-excalidraw-server"
]
}
}
}Where it goes: .vscode/mcp.json in your project
{
"servers": {
"excalidraw": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"mcp-excalidraw-server"
]
}
}
}Where it goes: ~/.codeium/windsurf/mcp_config.json
{
"mcpServers": {
"excalidraw": {
"command": "npx",
"args": [
"-y",
"mcp-excalidraw-server"
]
}
}
}Where it goes: Not supported
ChatGPT only connects to remote servers by URL. This one runs on your computer, so use Claude, Cursor or VS Code.
The canvas starts on its own at http://127.0.0.1:3000; open it to watch. Set EXCALIDRAW_DATA_DIR in env to keep the canvas between restarts, and EXCALIDRAW_EXPORT_DIR to choose where files are written.
New to this? See the setup guides for Claude Code, Cursor, Claude Desktop and ChatGPT.
Settings
Names are exactly as the project spells them. Required ones are marked.
| Setting | What it does |
|---|---|
EXPRESS_SERVER_URLEnvironment variable | Where the canvas server runs.http://127.0.0.1:3000 |
EXCALIDRAW_NO_AUTOSTARTEnvironment variable | Set to 1 to stop the server from starting the canvas itself.1 |
EXCALIDRAW_EXPORT_DIREnvironment variable | The folder exports may be written to. Defaults to the working directory. |
EXCALIDRAW_DATA_DIREnvironment variable | A private folder that keeps the canvas, images and snapshots across restarts. Without it the canvas lives in memory. |
PORT / HOSTEnvironment variable | Where the canvas server listens. Defaults to 3000 on 127.0.0.1.3000 |
EXCALIDRAW_SHARE_UPLOAD_URLEnvironment variable | Sends share uploads to your own Excalidraw storage backend instead of excalidraw.com. Pair it with EXCALIDRAW_SHARE_BASE_URL. |
What it can touch
It can read
- The local canvas
- .excalidraw files you import
It can change
- The local canvas
- Files written under the export folder
- An encrypted upload to excalidraw.com, only when you share
Safer setup: Leave HOST at 127.0.0.1: the canvas API has no login, so anyone who can reach it can change the canvas.
Before you start
- Node.js 20 or newer
If it does not work
- Mermaid conversion or set_viewport fails
- Those two need the canvas page open. Open http://127.0.0.1:3000 in a browser and try again.
- The canvas is blank after a restart
- It lives in memory by default. Set EXCALIDRAW_DATA_DIR, or export to an .excalidraw file before stopping.
- Chinese, Japanese or emoji text shows as boxes in screenshots
- The bundled fonts only cover Latin scripts. Install a CJK font on the machine running the canvas.
- Nothing updates on the canvas
- Check that EXPRESS_SERVER_URL points at the running canvas and that nothing else is using port 3000.
Peas in a pod: similar servers
How Excalidraw MCP lines up against other design, 3d and games servers on the shelf.
| Server | Tools | Runs on | Licence | Stars |
|---|---|---|---|---|
| Excalidraw MCP | 26 | Your computer | MIT | 2.6K |
| Blender MCP | 9 | Your computer | MIT | 32.4K |
| Framelink Figma MCP | 2 | Your computer | MIT | 16.1K |
| Talk to Figma | 40 | Your computer | – | 7.1K |
| Godot MCP | 14 | Your computer | MIT | 6.4K |
Questions
Is this the official Excalidraw MCP?
No. Excalidraw's official server draws one diagram inside the chat. This one gives an agent a full local canvas to edit, inspect and export.
Does it need an account or key?
No. Everything runs locally; the canvas page loads its fonts from a CDN.
Are share links private?
The scene is encrypted before upload and the key stays in the link, so only people with the full link can open it.
Can it work without MCP?
Yes. The same package has a command line and a REST API, and an agent skill for coding agents.
Something wrong on this page? Tell us.
