README.md•11.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

## 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