← Excalidraw MCP Server

Excalidraw MCP Server 2.0.0

npm · mcp-excalidraw-server · current release

26
Tools
0
Resources
0
Templates
0
Prompts

Observation

Observed 2026-08-19T17:02:22.392Z using mcpSecurity-inventory. Status: succeeded. Negotiated protocol: 2025-06-18.

Server capabilities
{
  "tools": {
    "listChanged": true
  }
}

Tools 26

ToolCategoryAnnotationsRisk
align_elementsAlign elements to a specific position
Input 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 canvas
Input 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 canvas
Input 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 element
Input 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 evenly
Input 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 offset
Input 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 ID
Input schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The element ID"
    }
  },
  "required": [
    "id"
  ]
}
— · —
get_resourceGet an Excalidraw resource
Input schema
{
  "type": "object",
  "properties": {
    "resource": {
      "type": "string",
      "enum": [
        "scene",
        "library",
        "theme",
        "elements"
      ]
    }
  },
  "required": [
    "resource"
  ]
}
— · —
group_elementsGroup multiple elements together
Input 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 data
Input 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 modification
Input schema
{
  "type": "object",
  "properties": {
    "elementIds": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "elementIds"
  ]
}
— · —
query_elementsQuery Excalidraw elements with optional filters
Input 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 snapshot
Input 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 restoration
Input schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Name for this snapshot"
    }
  },
  "required": [
    "name"
  ]
}
— · —
ungroup_elementsUngroup a group of elements
Input schema
{
  "type": "object",
  "properties": {
    "groupId": {
      "type": "string"
    }
  },
  "required": [
    "groupId"
  ]
}
— · —
unlock_elementsUnlock elements to allow modification
Input schema
{
  "type": "object",
  "properties": {
    "elementIds": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "elementIds"
  ]
}
— · —
update_elementUpdate an existing Excalidraw element
Input 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"
  ]
}
— · —

Resources 0

Resource templates 0

Prompts 0

Let’s talk about MCP security.

Share your details and our security team will contact you.