mcp-excalidraw-server
Excalidraw toolkit for AI coding agents — agent skill, CLI, and MCP server with a live canvas
npm · fingerprint 6de5299d819a4af9b4240af8 · repository · RSS
26tools
2recorded versions
45dtracked
unchanged 12d
What changed
Changed between 4 September 2026 and 5 October 2026 (first seen 2026-10-05 14:19 UTC)
2 descriptions rewritten, 4 schema or annotation changes with the description left byte-identical.
--- pinned/batch_create_elements +++ observed/batch_create_elements { "description": "Create multiple Excalidraw elements at once. For arrows, use startElementId/endElementId to bind arrows to shapes — Excalidraw auto-routes to element edges. Assign custom id to shapes so arrows can reference them.", "inputSchema": { - "image" + "image", + "frame" ], "type": "string" },
--- pinned/create_element +++ observed/create_element { "description": "Create a new Excalidraw element. For arrows, use startElementId/endElementId to bind to shapes (auto-routes to edges).", "inputSchema": { - "image" + "image", + "frame" ], "type": "string" },
--- pinned/export_to_image +++ observed/export_to_image { - "description": "Export the current canvas to PNG or SVG image. Requires the canvas frontend to be open in a browser.", + "description": "Export the current canvas to a PNG or SVG image. Renders headless in the canvas server (no browser tab needed); SVGs embed the fonts they use.", "inputSchema": { "properties": { "background": { - "description": "Include background in export (default: true)", + "description": "Include the background (default: true)", "type": "boolean" }, + "dark": { + "description": "Render in dark mode (default: false)", + "type": "boolean" + }, + "elementIds": { + "description": "Render only these elements (their bound labels are included)", + "items": { + "type": "string" + }, + "type": "array" + }, "filePath": { "description": "Optional file path to save the image", "type": "string" + }, + "frameId": { + "description": "Render a single frame, clipped to its bounds", + "type": "string" + }, + "padding": { + "description": "Padding around the drawing in px (default: 10)", + "type": "number" + }, + "renderer": { + "description": "\"auto\" (default) renders headless in the canvas server, no browser needed. \"browser\" asks an open canvas tab to render with Excalidraw itself (reference rendering, slower).", + "enum": [ + "auto", + "node", + "browser" + ], + "type": "string" + }, + "scale": { + "description": "PNG pixel scale from 1 to 4 (default: 1)", + "type": "number" } }, "required": [
--- pinned/get_canvas_screenshot +++ observed/get_canvas_screenshot { - "description": "Take a screenshot of the current canvas and return it as an image. Requires the canvas frontend to be open in a browser. Use this to visually verify what the diagram looks like.", + "description": "Render the current canvas to a PNG and return it as an image. Renders headless in the canvas server (no browser tab needed). Use this to visually verify what the diagram looks like.", "inputSchema": { "properties": { "background": { - "description": "Include background in screenshot (default: true)", + "description": "Include the background (default: true)", "type": "boolean" + }, + "dark": { + "description": "Render in dark mode (default: false)", + "type": "boolean" + }, + "elementIds": { + "description": "Render only these elements (their bound labels are included)", + "items": { + "type": "string" + }, + "type": "array" + }, + "frameId": { + "description": "Render a single frame, clipped to its bounds", + "type": "string" + }, + "padding": { + "description": "Padding around the drawing in px (default: 10)", + "type": "number" + }, + "renderer": { + "description": "\"auto\" (default) renders headless in the canvas server, no browser needed. \"browser\" asks an open canvas tab to render with Excalidraw itself (reference rendering, slower).", + "enum": [ + "auto", + "node", + "browser" + ], + "type": "string" + }, + "scale": { + "description": "PNG pixel scale from 1 to 4 (default: 1)", + "type": "number" } }, "type": "object"
--- pinned/query_elements +++ observed/query_elements { "description": "Query Excalidraw elements with optional filters", "inputSchema": { - "image" + "image", + "frame" ], "type": "string" }
--- pinned/update_element +++ observed/update_element { "description": "Update an existing Excalidraw element", "inputSchema": { - "image" + "image", + "frame" ], "type": "string" },
Current tools
Show all 26 tool fingerprints
align_elements
batch_create_elements
clear_canvas
create_element
create_from_mermaid
delete_element
describe_scene
distribute_elements
duplicate_elements
export_scene
export_to_excalidraw_url
export_to_image
get_canvas_screenshot
get_element
get_resource
group_elements
import_scene
lock_elements
query_elements
read_diagram_guide
restore_snapshot
set_viewport
snapshot_scene
ungroup_elements
unlock_elements
update_element
Watch this server yourself
If you run this server, put the proxy in front of it. It pins these exact fingerprints on first connect and stops the session if they move.
npx -y mcp-pin@0.2.3 -- <your mcp-excalidraw-server command>
Or subscribe to this page's RSS feed to be told when it changes.
Badge
The badge states one fact about time and nothing else. It never claims a server is safe.
[](https://mcp-pin.gautamkhosla.com/servers/b03e25ef3c137277.html)