2.0.0npm · mcp-excalidraw-server · current release
Observed 2026-08-19T17:02:22.392Z using mcpSecurity-inventory. Status: succeeded. Negotiated protocol: 2025-06-18.
{
"tools": {
"listChanged": true
}
}| Tool | Category | Annotations | Risk |
|---|---|---|---|
align_elementsAlign elements to a specific positionInput schema{
"type": "object",
"properties": {
"elementIds": {
"type": "array",
"items": {
"type": "string"
}
},
"alignment": {
"type": "string",
"enum": [
"left",
"center",
"right",
"top",
"middle",
"bottom"
]
}
},
"required": [
"elementIds",
"alignment"
]
} | — | — · — | — |
batch_create_elementsCreate 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.Input schema{
"type": "object",
"properties": {
"elements": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Custom element ID. Arrows can reference this via startElementId/endElementId."
},
"type": {
"type": "string",
"enum": [
"rectangle",
"ellipse",
"diamond",
"arrow",
"text",
"freedraw",
"line",
"image"
]
},
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"width": {
"type": "number"
},
"height": {
"type": "number"
},
"backgroundColor": {
"type": "string"
},
"strokeColor": {
"type": "string"
},
"strokeWidth": {
"type": "number"
},
"strokeStyle": {
"type": "string",
"description": "Stroke style: solid, dashed, dotted"
},
"roughness": {
"type": "number"
},
"opacity": {
"type": "number"
},
"text": {
"type": "string"
},
"fontSize": {
"type": "number"
},
"fontFamily": {
"type": [
"string",
"number"
],
"description": "Font family: virgil/hand/handwritten (1), helvetica/sans/sans-serif (2), cascadia/mono/monospace (3), excalifont (5), nunito (6), lilita/lilita one (7), comic shanns/comic (8), or numeric ID"
},
"startElementId": {
"type": "string",
"description": "For arrows: ID of element to bind arrow start to"
},
"endElementId": {
"type": "string",
"description": "For arrows: ID of element to bind arrow end to"
},
"endArrowhead": {
"type": "string",
"description": "Arrowhead style at end: arrow, bar, dot, triangle, or null"
},
"startArrowhead": {
"type": "string",
"description": "Arrowhead style at start: arrow, bar, dot, triangle, or null"
}
},
"required": [
"type",
"x",
"y"
]
}
}
},
"required": [
"elements"
]
} | — | — · — | — |
clear_canvasClear all elements from the canvasInput schema{
"type": "object",
"properties": {}
} | — | — · — | — |
create_elementCreate a new Excalidraw element. For arrows, use startElementId/endElementId to bind to shapes (auto-routes to edges).Input schema{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Custom element ID (optional, auto-generated if omitted). Use with startElementId/endElementId in batch_create_elements."
},
"type": {
"type": "string",
"enum": [
"rectangle",
"ellipse",
"diamond",
"arrow",
"text",
"freedraw",
"line",
"image"
]
},
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"width": {
"type": "number"
},
"height": {
"type": "number"
},
"backgroundColor": {
"type": "string"
},
"strokeColor": {
"type": "string"
},
"strokeWidth": {
"type": "number"
},
"strokeStyle": {
"type": "string",
"description": "Stroke style: solid, dashed, dotted"
},
"roughness": {
"type": "number"
},
"opacity": {
"type": "number"
},
"text": {
"type": "string"
},
"fontSize": {
"type": "number"
},
"fontFamily": {
"type": [
"string",
"number"
],
"description": "Font family: virgil/hand/handwritten (1), helvetica/sans/sans-serif (2), cascadia/mono/monospace (3), excalifont (5), nunito (6), lilita/lilita one (7), comic shanns/comic (8), or numeric ID"
},
"startElementId": {
"type": "string",
"description": "For arrows: ID of the element to bind the arrow start to. Arrow auto-routes to element edge."
},
"endElementId": {
"type": "string",
"description": "For arrows: ID of the element to bind the arrow end to. Arrow auto-routes to element edge."
},
"endArrowhead": {
"type": "string",
"description": "Arrowhead style at end: arrow, bar, dot, triangle, or null"
},
"startArrowhead": {
"type": "string",
"description": "Arrowhead style at start: arrow, bar, dot, triangle, or null"
}
},
"required": [
"type",
"x",
"y"
]
} | — | — · — | — |
create_from_mermaidConvert a Mermaid diagram to Excalidraw elements and render them on the canvasInput schema{
"type": "object",
"properties": {
"mermaidDiagram": {
"type": "string",
"description": "The Mermaid diagram definition (e.g., \"graph TD; A-->B; B-->C;\")"
},
"config": {
"type": "object",
"description": "Optional Mermaid configuration",
"properties": {
"startOnLoad": {
"type": "boolean"
},
"flowchart": {
"type": "object",
"properties": {
"curve": {
"type": "string",
"enum": [
"linear",
"basis"
]
}
}
},
"themeVariables": {
"type": "object",
"properties": {
"fontSize": {
"type": "string"
}
}
},
"maxEdges": {
"type": "number"
},
"maxTextSize": {
"type": "number"
}
}
}
},
"required": [
"mermaidDiagram"
]
} | — | — · — | — |
delete_elementDelete an Excalidraw elementInput schema{
"type": "object",
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
]
} | — | — · — | — |
describe_sceneGet an AI-readable description of the current canvas: element types, positions, connections, labels, spatial layout, and bounding box. Use this to understand what is on the canvas before making changes.Input schema{
"type": "object",
"properties": {}
} | — | — · — | — |
distribute_elementsDistribute elements evenlyInput schema{
"type": "object",
"properties": {
"elementIds": {
"type": "array",
"items": {
"type": "string"
}
},
"direction": {
"type": "string",
"enum": [
"horizontal",
"vertical"
]
}
},
"required": [
"elementIds",
"direction"
]
} | — | — · — | — |
duplicate_elementsDuplicate elements with a configurable offsetInput schema{
"type": "object",
"properties": {
"elementIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "IDs of elements to duplicate"
},
"offsetX": {
"type": "number",
"description": "Horizontal offset (default: 20)"
},
"offsetY": {
"type": "number",
"description": "Vertical offset (default: 20)"
}
},
"required": [
"elementIds"
]
} | — | — · — | — |
export_sceneExport the current canvas to .excalidraw JSON format. Optionally write to a file; a path ending in .md is written in the Obsidian Excalidraw plugin format (.excalidraw.md).Input schema{
"type": "object",
"properties": {
"filePath": {
"type": "string",
"description": "Optional file path to write the scene to (.excalidraw for raw JSON, .excalidraw.md for the Obsidian Excalidraw plugin format)"
}
}
} | — | — · — | — |
export_to_excalidraw_urlExport the current canvas to a shareable excalidraw.com URL. The diagram is encrypted and uploaded; anyone with the URL can view it. Returns the shareable link.Input schema{
"type": "object",
"properties": {}
} | — | — · — | — |
export_to_imageExport the current canvas to PNG or SVG image. Requires the canvas frontend to be open in a browser.Input schema{
"type": "object",
"properties": {
"format": {
"type": "string",
"enum": [
"png",
"svg"
],
"description": "Image format"
},
"filePath": {
"type": "string",
"description": "Optional file path to save the image"
},
"background": {
"type": "boolean",
"description": "Include background in export (default: true)"
}
},
"required": [
"format"
]
} | — | — · — | — |
get_canvas_screenshotTake 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.Input schema{
"type": "object",
"properties": {
"background": {
"type": "boolean",
"description": "Include background in screenshot (default: true)"
}
}
} | — | — · — | — |
get_elementGet a single Excalidraw element by IDInput schema{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The element ID"
}
},
"required": [
"id"
]
} | — | — · — | — |
get_resourceGet an Excalidraw resourceInput schema{
"type": "object",
"properties": {
"resource": {
"type": "string",
"enum": [
"scene",
"library",
"theme",
"elements"
]
}
},
"required": [
"resource"
]
} | — | — · — | — |
group_elementsGroup multiple elements togetherInput schema{
"type": "object",
"properties": {
"elementIds": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"elementIds"
]
} | — | — · — | — |
import_sceneImport elements from a .excalidraw JSON file, an Obsidian .excalidraw.md file, or raw JSON dataInput schema{
"type": "object",
"properties": {
"filePath": {
"type": "string",
"description": "Path to a .excalidraw JSON or Obsidian .excalidraw.md file"
},
"data": {
"type": "string",
"description": "Raw .excalidraw JSON string (alternative to filePath)"
},
"mode": {
"type": "string",
"enum": [
"replace",
"merge"
],
"description": "\"replace\" clears canvas first, \"merge\" appends to existing elements"
}
},
"required": [
"mode"
]
} | — | — · — | — |
lock_elementsLock elements to prevent modificationInput schema{
"type": "object",
"properties": {
"elementIds": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"elementIds"
]
} | — | — · — | — |
query_elementsQuery Excalidraw elements with optional filtersInput schema{
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"rectangle",
"ellipse",
"diamond",
"arrow",
"text",
"freedraw",
"line",
"image"
]
},
"filter": {
"type": "object",
"additionalProperties": true
},
"bbox": {
"type": "object",
"description": "Bounding box filter — only return elements whose origin (x, y) falls within the given coordinate range",
"properties": {
"x_min": {
"type": "number"
},
"x_max": {
"type": "number"
},
"y_min": {
"type": "number"
},
"y_max": {
"type": "number"
}
}
}
}
} | — | — · — | — |
read_diagram_guideReturns a comprehensive design guide for creating beautiful Excalidraw diagrams: color palette, sizing rules, layout patterns, arrow binding best practices, diagram templates, and anti-patterns. Call this before creating diagrams to produce professional results.Input schema{
"type": "object",
"properties": {}
} | — | — · — | — |
restore_snapshotRestore the canvas from a previously saved named snapshotInput schema{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name of the snapshot to restore"
}
},
"required": [
"name"
]
} | — | — · — | — |
set_viewportControl the canvas viewport (camera). Auto-fit all elements, zoom-to-fit a subset of elements, center on a specific element, or set zoom/scroll directly. Requires the canvas frontend open in a browser.Input schema{
"type": "object",
"properties": {
"scrollToContent": {
"type": "boolean",
"description": "Auto-fit all elements in view (zoom-to-fit)"
},
"scrollToElementIds": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "Zoom-to-fit the bounding box of one or more elements by ID; every ID must exist"
},
"viewportZoomFactor": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 1,
"description": "Optional fit-to-viewport zoom factor in the range (0, 1] for scrollToContent or scrollToElementIds; lower values leave more padding"
},
"scrollToElementId": {
"type": "string",
"description": "Center the view on a specific element by ID"
},
"zoom": {
"type": "number",
"description": "Zoom level (0.1–10, where 1 = 100%)"
},
"offsetX": {
"type": "number",
"description": "Horizontal scroll offset"
},
"offsetY": {
"type": "number",
"description": "Vertical scroll offset"
}
}
} | — | — · — | — |
snapshot_sceneSave a named snapshot of the current canvas state for later restorationInput schema{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name for this snapshot"
}
},
"required": [
"name"
]
} | — | — · — | — |
ungroup_elementsUngroup a group of elementsInput schema{
"type": "object",
"properties": {
"groupId": {
"type": "string"
}
},
"required": [
"groupId"
]
} | — | — · — | — |
unlock_elementsUnlock elements to allow modificationInput schema{
"type": "object",
"properties": {
"elementIds": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"elementIds"
]
} | — | — · — | — |
update_elementUpdate an existing Excalidraw elementInput schema{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"rectangle",
"ellipse",
"diamond",
"arrow",
"text",
"freedraw",
"line",
"image"
]
},
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"width": {
"type": "number"
},
"height": {
"type": "number"
},
"backgroundColor": {
"type": "string"
},
"strokeColor": {
"type": "string"
},
"strokeWidth": {
"type": "number"
},
"strokeStyle": {
"type": "string"
},
"roughness": {
"type": "number"
},
"opacity": {
"type": "number"
},
"text": {
"type": "string"
},
"fontSize": {
"type": "number"
},
"fontFamily": {
"type": [
"string",
"number"
],
"description": "Font family: virgil/hand/handwritten (1), helvetica/sans/sans-serif (2), cascadia/mono/monospace (3), excalifont (5), nunito (6), lilita/lilita one (7), comic shanns/comic (8), or numeric ID"
}
},
"required": [
"id"
]
} | — | — · — | — |