Skip to main content
Glama

Draw.io MCP Server

by Noacodenoobe
README.md11.9 kB
# Draw.io MCP Server A Model Context Protocol (MCP) server that provides programmatic tools for creating and managing draw.io diagrams using mxgraph. Generate architecture diagrams, flowcharts, and other visualizations through a clean API that works with Claude Desktop and other MCP-compatible clients. ## Overview This server enables you to build diagrams incrementally by providing stateless tools that operate on `.drawio.svg` files. Each operation specifies the target file, making it compatible with VSCode's draw.io extension while maintaining a clean separation between diagram state and server operations. ### Key Features - **Stateless API**: Each tool call specifies the target file path - **VSCode Compatible**: Generates `.drawio.svg` files that work seamlessly with VSCode draw.io extension - **Rich Node Types**: Support for rectangles, ellipses, cylinders, clouds, actors, and more - **Connection Management**: Create labeled connections with various styling options - **Batch Operations**: Create, update, and link multiple nodes in a single MCP call for efficient diagram building - **Flexible Positioning**: Precise control over node placement and sizing - **MCP Integration**: Works with Claude Desktop and other MCP-compatible applications - **TypeScript**: Full type safety and IntelliSense support ## Demo ![Demo](presentation.gif) ## Installation ### Prerequisites - Node.js 18.0.0 or higher - npm or yarn ## Configuration ### MCP Client Setup Add this configuration to your MCP client (e.g., Claude Desktop, Cursor): ```json { "mcpServers": { "drawio-diagrams": { "command": "npx", "args": ["drawio-mcp"] } } } ``` ### File Paths The server supports both absolute and relative file paths: - **Absolute**: `/Users/username/project/diagrams/architecture.drawio.svg` - **Relative**: `./diagrams/architecture.drawio.svg` (when cwd is configured) All diagram files should use the `.drawio.svg` extension for proper VSCode integration. ## Tools Reference ### Batch Operations All primary tools support batch operations, allowing you to perform multiple actions in a single MCP call for improved efficiency: - **`add_nodes`**: Create multiple nodes simultaneously - **`edit_nodes`**: Update multiple nodes/edges simultaneously - **`link_nodes`**: Create multiple connections simultaneously - **`remove_nodes`**: Remove multiple nodes simultaneously This approach reduces network overhead and provides atomic operations - either all changes succeed or none are applied. --- ### new_diagram Create a new empty diagram file. **Parameters:** - `file_path` (string, required): Path for the new diagram file **Example:** ```json { "file_path": "./diagrams/system-architecture.drawio.svg" } ``` ### add_nodes Add one or more nodes to an existing diagram in a single operation. Optionally run an automatic layout after insertion. **Parameters:** - `file_path` (string, required): Path to the diagram file - `layout` (object, optional): Automatic layout configuration - `algorithm` (string, required if `layout` is provided): One of `hierarchical`, `circle`, `organic`, `compact-tree`, `radial-tree`, `partition`, `stack` - `options` (object, optional): Algorithm-specific options - For `hierarchical` only: `direction` ∈ `"top-down" | "left-right"` (default: `"top-down"`) - `nodes` (array, required): Array of node objects to add, each containing: - `id` (string, required): Unique identifier for the node - `title` (string, required): Display label (supports newlines with `\n`) - `x` (number, required): X coordinate position - `y` (number, required): Y coordinate position - `kind` (string, required): Node shape type - `parent` (string, optional): Parent node ID (default: "root") - `width` (number, optional): Custom width - `height` (number, optional): Custom height - `corner_radius` (integer, optional): Corner radius in pixels (≥ 1). Only applies to `RoundedRectangle`. Default is 12 when `kind` is `RoundedRectangle` and `corner_radius` is omitted. The effective visual radius is capped by draw.io/mxGraph to at most half of the shorter side of the node. **Available Node Types:** - `Rectangle`: Standard rectangular node - `Ellipse`: Oval-shaped node - `Cylinder`: Database/storage representation - `Cloud`: Cloud service representation - `Square`: Square with fixed aspect ratio - `Circle`: Circular node - `Step`: Process step shape - `Actor`: UML actor (stick figure) - `Text`: Text-only node - `RoundedRectangle`: Rectangle with rounded corners (supports `corner_radius` in pixels) **Example (Single Node):** ```json { "file_path": "./diagrams/system-architecture.drawio.svg", "nodes": [ { "id": "user-service", "title": "User Service\nAPI Layer", "kind": "Rectangle", "x": 100, "y": 150, "width": 120, "height": 80 } ] } ``` **Example (Multiple Nodes):** ```json { "file_path": "./diagrams/system-architecture.drawio.svg", "nodes": [ { "id": "user-service", "title": "User Service", "kind": "Rectangle", "x": 100, "y": 150 }, { "id": "database", "title": "Primary DB", "kind": "Cylinder", "x": 300, "y": 150 }, { "id": "cache", "title": "Redis Cache", "kind": "Cylinder", "x": 200, "y": 300 } ] } ``` **Example (With Layout):** ```json { "file_path": "./diagrams/system-architecture.drawio.svg", "layout": { "algorithm": "hierarchical", "options": { "direction": "left-right" } }, "nodes": [ { "id": "api", "title": "API", "kind": "Rectangle", "x": 40, "y": 40 }, { "id": "service", "title": "Service", "kind": "Rectangle", "x": 200, "y": 40 }, { "id": "db", "title": "DB", "kind": "Cylinder", "x": 360, "y": 40 } ] } ``` Note: The layout runs once after all insertions and considers existing edges in the diagram file. For best results when edges are created or modified later, a dedicated `layout_diagram` tool is recommended (to be added). ### link_nodes Create one or more connections between existing nodes in a single operation. **Parameters:** - `file_path` (string, required): Path to the diagram file - `edges` (array, required): Array of edge objects to create, each containing: - `from` (string, required): Source node ID - `to` (string, required): Target node ID - `title` (string, optional): Connection label - `dashed` (boolean, optional): Whether to use dashed line style - `reverse` (boolean, optional): Whether to reverse arrow direction - `undirected` (boolean, optional): Create an undirected edge (no arrows). Overrides `reverse`. **Example (Single Connection):** ```json { "file_path": "./diagrams/system-architecture.drawio.svg", "edges": [ { "from": "user-service", "to": "database", "title": "queries", "dashed": true } ] } ``` **Example (Multiple Connections):** ```json { "file_path": "./diagrams/system-architecture.drawio.svg", "edges": [ { "from": "user-service", "to": "database", "title": "queries" }, { "from": "user-service", "to": "cache", "title": "cache lookup", "dashed": true }, { "from": "database", "to": "cache", "title": "invalidate", "reverse": true } ] } ``` **Example (Undirected Connection):** ```json { "file_path": "./diagrams/system-architecture.drawio.svg", "edges": [ { "from": "service-a", "to": "service-b", "title": "peering", "undirected": true } ] } ``` Notes on undirected behavior: - When `undirected` is true, the edge is rendered without arrowheads (no arrow at either end). The `reverse` parameter is ignored; `dashed` is still respected. - Undirected edges use a canonical ID format of `${min(from,to)}-2-${max(from,to)}` when a new edge is created. - If an edge between the two nodes already exists (in either direction or with the canonical ID), calling `link_nodes` again will update that existing edge’s label and style rather than creating a duplicate. The existing edge ID is preserved (no renaming). ### edit_nodes Modify properties of one or more existing nodes or edges in a single operation. **Parameters:** - `file_path` (string, required): Path to the diagram file - `nodes` (array, required): Array of node/edge objects to update, each containing: - `id` (string, required): Node or edge ID to update - `title` (string, optional): New display label - `kind` (string, optional): New shape type (nodes only) - `x` (number, optional): New X coordinate (nodes only) - `y` (number, optional): New Y coordinate (nodes only) - `width` (number, optional): New width (nodes only) - `height` (number, optional): New height (nodes only) - `corner_radius` (integer, optional): Corner radius in pixels (≥ 1). Applies when the node is `RoundedRectangle`. If switching kind to `RoundedRectangle` and omitted, default 12 is applied. Ignored for other kinds. **Example (Single Node):** ```json { "file_path": "./diagrams/system-architecture.drawio.svg", "nodes": [ { "id": "user-service", "title": "Updated User Service", "x": 200, "y": 100 } ] } ``` **Example (Multiple Nodes):** ```json { "file_path": "./diagrams/system-architecture.drawio.svg", "nodes": [ { "id": "user-service", "title": "Auth Service", "kind": "Rectangle", "x": 200, "y": 100 }, { "id": "database", "title": "Updated Database", "x": 400, "y": 200 }, { "id": "connection-1", "title": "secure connection" } ] } ``` ### remove_nodes Remove one or more nodes from a diagram. **Parameters:** - `file_path` (string, required): Path to the diagram file - `ids` (array, required): Array of node IDs to remove **Example:** ```json { "file_path": "./diagrams/system-architecture.drawio.svg", "ids": ["old-service", "deprecated-db"] } ``` ### get_diagram_info Retrieve information about a diagram including nodes and connections. **Parameters:** - `file_path` (string, required): Path to the diagram file **Example:** ```json { "file_path": "./diagrams/system-architecture.drawio.svg" } ``` ## Output Format Diagrams are saved as `.drawio.svg` files with embedded metadata: - **SVG Format**: Clean vector graphics suitable for web and print - **Draw.io Metadata**: Full diagram data embedded in SVG for editing - **VSCode Compatible**: Open directly in VSCode with draw.io extension - **Self-contained**: No external dependencies or additional files needed ## Development ### Project Structure ``` src/ ├── Graph.ts # Core graph data structure ├── GraphFileManager.ts # File I/O operations ├── Logger.ts # Logging utilities ├── index.ts # MCP server entry point ├── mcp/ # MCP tool implementations │ ├── McpServer.ts # Server framework │ ├── NewDiagramTool.ts │ ├── AddNodeTool.ts # Supports batch operations (add_nodes) │ ├── LinkNodesTools.ts # Supports batch operations (link_nodes) │ ├── EditNodeTool.ts # Supports batch operations (edit_nodes) │ ├── RemoveNodesTool.ts # Supports batch operations (remove_nodes) │ └── GetDiagramInfoTool.ts └── mxgraph/ # mxgraph integration ├── index.ts └── jsdom.ts ``` ### Building From Source ```bash # Install dependencies npm install # Run TypeScript compilation npm run build # Start development server npm start # Run linting npm run lint ``` ## Support - Create an issue on GitHub for bugs and feature requests - Check existing issues before creating new ones - Provide detailed reproduction steps for bug reports

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Noacodenoobe/drawioMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server