Skip to content
MCP Shelf

Excalidraw MCP

View on GitHub

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)
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.

ToolWhat it is for
align_elementsLines elements up on one edge or centre.
batch_create_elementsAdds many elements in one call, with custom IDs so arrows can refer to them.
clear_canvasDeletes everything on the canvas.
create_elementAdds one shape, text or arrow. Arrows can be bound to two shapes.
create_from_mermaidConverts Mermaid text into Excalidraw elements. Needs the canvas open in a browser.
delete_elementRemoves an element.
distribute_elementsSpaces elements evenly.
duplicate_elementsCopies elements with an offset.
export_sceneSaves the canvas as .excalidraw JSON, or as an Obsidian Excalidraw note.
export_to_excalidraw_urlUploads an encrypted copy and returns a shareable excalidraw.com link.
export_to_imageExports the canvas as PNG or SVG.
group_elementsGroups elements together.
import_sceneLoads a .excalidraw or .excalidraw.md file, or raw JSON.
lock_elementsLocks elements so they cannot be moved.
restore_snapshotRestores a named snapshot.
set_viewportZooms and scrolls the canvas view. Needs the canvas open in a browser.
ungroup_elementsBreaks a group apart.
unlock_elementsUnlocks them again.
update_elementChanges an element's position, size, colours or text.

Only reads7 tools · Looks things up and changes nothing.

ToolWhat it is for
describe_sceneDescribes everything on the canvas in text: shapes, positions, labels and connections.
get_canvas_screenshotRenders the canvas to an image so the model can see its work.
get_elementReturns one element by ID.
get_resourceReads a canvas resource, such as the scene or the library.
query_elementsFinds elements by type, property or area of the canvas.
read_diagram_guideHands the model a guide to colours, sizes and layouts for clean diagrams.
snapshot_sceneSaves 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)

Claude Desktop
{
  "mcpServers": {
    "excalidraw": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-excalidraw-server"
      ]
    }
  }
}

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.

SettingWhat it does
EXPRESS_SERVER_URLEnvironment variableWhere the canvas server runs.http://127.0.0.1:3000
EXCALIDRAW_NO_AUTOSTARTEnvironment variableSet to 1 to stop the server from starting the canvas itself.1
EXCALIDRAW_EXPORT_DIREnvironment variableThe folder exports may be written to. Defaults to the working directory.
EXCALIDRAW_DATA_DIREnvironment variableA private folder that keeps the canvas, images and snapshots across restarts. Without it the canvas lives in memory.
PORT / HOSTEnvironment variableWhere the canvas server listens. Defaults to 3000 on 127.0.0.1.3000
EXCALIDRAW_SHARE_UPLOAD_URLEnvironment variableSends 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.

ServerToolsRuns onLicenceStars
Excalidraw MCP26Your computerMIT2.6K
Blender MCP9Your computerMIT32.4K
Framelink Figma MCP2Your computerMIT16.1K
Talk to Figma40Your computer–7.1K
Godot MCP14Your computerMIT6.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.

Full docs on GitHubyctimlin/mcp_excalidraw

Something wrong on this page? Tell us.

More in Design, 3D and games