A Go-based bridge to the Miro REST API that exposes 92 tools for controlling boards programmatically. You get full CRUD for sticky notes, shapes, frames, connectors, mindmaps, and tags, plus Mermaid diagram generation and PDF export on Enterprise plans. Ships as a single binary with stdio transport, runs on all platforms, and works with Claude Desktop, Cursor, and any MCP client. The essentials profile (15 tools plus on-demand discovery) cuts context overhead from 15.5K to 2.4K tokens when you need to stay lean. Same author maintains a companion CLI for shell scripting and a TypeScript MCP Apps server for rendering board data as interactive UI cards instead of JSON.
Public tool metadata for what this MCP can expose to an agent.
MIRO_CREATE_APP_CARD_ITEMTool to add an app card item to a board. Use when you need to push a rich preview card with custom fields into a Miro board (e.g., after assembling card data).6 paramsTool to add an app card item to a board. Use when you need to push a rich preview card with custom fields into a Miro board (e.g., after assembling card data).
dataobjectstyleobjectparentobjectboard_idstringgeometryobjectpositionobjectMIRO_CREATE_BOARDTool to create a new board. Use when you need to set up a board with a specific name, description, and policies. Example: "Create a new board named Project Plan".5 paramsTool to create a new board. Use when you need to set up a board with a specific name, description, and policies. Example: "Create a new board named Project Plan".
namestringpolicyobjectteamIdstringprojectIdstringdescriptionstringMIRO_DELETE_APP_CARD_ITEMTool to delete an app card item from a board. Use when you need to remove an app card item created by your app after it is no longer needed.2 paramsTool to delete an app card item from a board. Use when you need to remove an app card item created by your app after it is no longer needed.
item_idstringboard_idstringMIRO_DELETE_DOCUMENT_ITEMTool to delete a document item from a board. Use when you need to remove a document item (e.g., PDF or image) that is no longer relevant. Example: "Delete the document item with ID 'item456' from board 'board123'."2 paramsTool to delete a document item from a board. Use when you need to remove a document item (e.g., PDF or image) that is no longer relevant. Example: "Delete the document item with ID 'item456' from board 'board123'."
item_idstringboard_idstringMIRO_DELETE_ITEMTool to delete a specific item from a board. Use when you need to remove an item (e.g., shape, sticky note) after confirming its board and item IDs.2 paramsTool to delete a specific item from a board. Use when you need to remove an item (e.g., shape, sticky note) after confirming its board and item IDs.
item_idstringboard_idstringMIRO_GET_APP_CARD_ITEMTool to retrieve a specific app card item by its ID. Use when you need the details of an existing app card item.2 paramsTool to retrieve a specific app card item by its ID. Use when you need the details of an existing app card item.
item_idstringboard_idstringMIRO_GET_BOARDTool to retrieve details of a specific board. Use when you have a board ID and need to fetch its metadata.1 paramsTool to retrieve details of a specific board. Use when you have a board ID and need to fetch its metadata.
board_idstringMIRO_GET_BOARD_ITEMSTool to list items on a Miro board (shapes, stickies, cards, etc.) with pagination. Use when you need to page through board elements for analytics or reporting.4 paramsTool to list items on a Miro board (shapes, stickies, cards, etc.) with pagination. Use when you need to page through board elements for analytics or reporting.
typestringlimitintegercursorstringboard_idstringMIRO_GET_BOARD_MEMBERSTool to retrieve a list of members for a board. Use when you need to list all users with access to a board after confirming its ID.3 paramsTool to retrieve a list of members for a board. Use when you need to list all users with access to a board after confirming its ID.
limitintegercursorstringboard_idstringMIRO_GET_BOARDSTool to retrieve accessible boards with optional filters. Use when you need to list or search boards by team, project, owner, or keywords.7 paramsTool to retrieve accessible boards with optional filters. Use when you need to list or search boards by team, project, owner, or keywords.
sortstringdefault · last_created · last_opened · last_modified · alphabeticallylimitintegerownerstringquerystringoffsetintegerteam_idstringproject_idstringMIRO_GET_CONNECTORSTool to retrieve a list of connectors on a board. Use after confirming the board ID and when you need to page through connector items.3 paramsTool to retrieve a list of connectors on a board. Use after confirming the board ID and when you need to page through connector items.
limitintegercursorstringboard_idstringMIRO_GET_TAGTool to retrieve details of a specific tag on a board. Use when you have a board ID and tag ID and need its metadata.2 paramsTool to retrieve details of a specific tag on a board. Use when you have a board ID and tag ID and need its metadata.
tag_idstringboard_idstringMIRO_LIST_ORGANIZATIONSTool to retrieve list of organizations accessible to the user. Use when you need to view all available organizations.Tool to retrieve list of organizations accessible to the user. Use when you need to view all available organizations.
No parameter schema in public metadata yet.
MIRO_UPDATE_APP_CARD_ITEMTool to update an app card item on a board. Use when you need to modify properties of an existing app card item. Include only fields to change.7 paramsTool to update an app card item on a board. Use when you need to modify properties of an existing app card item. Include only fields to change.
dataobjectstyleobjectparentobjectitem_idstringboard_idstringgeometryobjectpositionobjectMIRO_UPDATE_BOARDTool to update properties of a specific board. Use when you have a board ID and need to modify its name, description, or permissions policy. Use after confirming the board exists.6 paramsTool to update properties of a specific board. Use when you have a board ID and need to modify its name, description, or permissions policy. Use after confirming the board exists.
namestringpolicyobjectteamIdstringboard_idstringprojectIdstringdescriptionstringRun your Miro workshops, retros, and planning sessions from the command line. Read boards, create stickies, organize frames, and generate diagrams through Claude, Cursor, or any MCP client.
Community project — Not officially affiliated with Miro. See official options below.
92 tools | Single binary | All platforms | All major AI tools
| Document | Description |
|---|---|
| QUICKSTART.md | Get running in 2 minutes |
| SETUP.md | Full setup for all AI tools |
| CONFIG.md | Configuration reference |
| PERFORMANCE.md | Optimization guide |
| CHANGELOG.md | Version history |
| ERRORS.md | Error handling & troubleshooting |
Homebrew (macOS/Linux):
brew tap olgasafonova/tap && brew install miro-mcp-server
One-liner (macOS/Linux):
curl -fsSL https://raw.githubusercontent.com/olgasafonova/miro-mcp-server/main/install.sh | sh
Docker:
docker pull ghcr.io/olgasafonova/miro-mcp-server:latest
Manual download: See SETUP.md for all platforms
boards:read and boards:write permissionsClaude Code:
claude mcp add miro -e MIRO_ACCESS_TOKEN=your-token -- miro-mcp-server
Claude Desktop / Cursor / VS Code: See SETUP.md
Cursor Marketplace:
/add-plugin miro
Not working? Tell us what made it hard — even one sentence helps.
| Category | Examples |
|---|---|
| Boards | Create, copy, delete, update, share, list members |
| Items | Sticky notes, shapes, text, cards, app cards, images, documents, frames, docs |
| Diagrams | Generate flowcharts and sequence diagrams from Mermaid |
| Docs | Create and manage Markdown documents on boards |
| Upload | Upload and replace local image and document files on boards |
| Tables | Discover and inspect tables on boards |
| Mindmaps | Create mindmap nodes with parent-child relationships |
| Bulk Ops | Create multiple items at once, sticky grids |
| Tags | Create, attach, update, and organize with tags |
| Groups | Group, list, and manage item groups |
| Connectors | Connect items with styled arrows |
| Export | Board thumbnails, PDF/SVG export (Enterprise) |
miro-workflowFor Claude clients that support skills (Claude Code, Claude Desktop), this repo includes a miro-workflow skill that describes how to assemble a few common board layouts from the atomic create-item tools.
Five layouts are covered:
| Workflow | Trigger phrase examples |
|---|---|
| Sprint Board | "set up a sprint board for sprint 42" |
| Retrospective | "create a retro board for our team" |
| Brainstorm | "brainstorm board for [topic]" |
| Story Map | "map the user journey for [product]" |
| Kanban | "kanban for our backlog" |
Each one specifies frame sizes, gap math, sticky placement, color conventions (the Miro API takes hex for frame fills and named values for stickies; two different vocabularies), and the tool-call order to follow. For single-tool calls ("add one sticky") or read-only inspection, the atomic tools are usually enough on their own.
The skill is new and likely needs adjustment as more layouts get exercised against real boards. Files live under skills/miro-workflow/. Claude Code auto-discovers skills from ~/Projects/claude-code-config/skills/; for other hosts, follow your client's skill installation docs.
The badge above is awarded by SkillCheck Pro; this skill currently scores 92/100 with zero Critical issues and zero Warnings. Skills in this repo earn the badge at ≥90/100 with zero Critical and zero Warnings; below that bar, the badge is dropped until the skill passes again.
miro-cliFor shell-first usage, this server has a sibling: miro-cli. Same author, same Miro API coverage, different runtime. One verb per endpoint, JSON in and out, plus a local SQLite mirror for offline search. Reach for it when you're scripting Miro in CI, bulk-migrating stickies between boards, or querying boards offline without burning API quota.
The MCP server and the CLI overlap deliberately. Use the MCP server when an agent runtime is in the loop (Claude Code, Claude Desktop, Cursor). Use the CLI when bash, Makefiles, or CI are. Use both if you want.
Install:
brew install olgasafonova/tap/miro-cli
# or
go install github.com/olgasafonova/miro-cli/cmd/miro-cli@latest
miro-mcp-appsIf you want Miro data to render as interactive UI in the chat (cards, tables, color clusters, SVG graphs) instead of streamed JSON, there's a TypeScript sibling: miro-mcp-apps. Six tools built on the MCP Apps extension (SEP-1865), reusing the same MIRO_ACCESS_TOKEN. The two servers run side-by-side: this one for the 92-tool CRUD surface, that one for visual at-a-glance views.
| You want… | Use |
|---|---|
| Programmatic control: create/update/move/connect items, generate diagrams | miro-mcp-server (this repo) |
| Visual board summaries, sticky color clusters, connector graphs rendered inline | miro-mcp-apps |
| Same in bash, CI, or a Makefile | miro-cli |
The MCP Apps pattern is TypeScript-only today (Go SDK has no ext-apps helpers), which is why this companion lives in a separate repo instead of bolting onto the Go server.
The full tool surface (92 tools) costs roughly 15.5K tokens of preload — about 7.8% of a 200K Claude context. For sessions where that footprint matters, set MIRO_TOOLS_PROFILE=essentials in your client config; the server then registers a curated 15-tool subset (boards, list/find/search, sticky/text/frame/connector creation, list/get/update/delete items) plus one discovery meta-tool. Agents reach the rest via miro_tool_search on demand.
| Profile | Tools | Preload tokens (est.) | % of 200K context |
|---|---|---|---|
full (default) | 92 | ~15,500 | 7.8% |
essentials | 15 | ~2,400 | 1.2% |
Savings: ~13,100 tokens (84.5% reduction) when you opt into essentials. Description tokens are exact (JSON-marshaled); schema cost is estimated at 200 bytes per tool. Reproduce locally with go run ./cmd/token-count/.
miro_tool_search(query?, category?, limit?) is registered in both profiles. It searches tool names, titles, descriptions, and categories with weighted keyword scoring (name 3×, title 2×, category 2.5×, description 1×), returns up to 50 matches, and never recommends itself. Use it when you don't know which tool to reach for, or to scope to a category before browsing. Empty query plus a category returns the category's tools alphabetically.
See CONFIG.md for the full env-var reference.
| Tool | Description |
|---|---|
miro_list_boards | List accessible boards |
miro_find_board | Find board by name |
miro_get_board | Get board details |
miro_get_board_summary | Get board stats and item counts |
miro_get_board_content | Get all board content for AI analysis |
miro_create_board | Create a new board |
miro_copy_board | Copy an existing board |
miro_update_board | Update board name/description |
miro_delete_board | Delete a board |
| Tool | Description |
|---|---|
miro_list_board_members | List users with access |
miro_get_board_member | Get member details |
miro_share_board | Share board via email (requires MIRO_SHARE_ALLOWED_DOMAINS; fail-closed by default) |
miro_update_board_member | Update member role (Destructive: prompts before role escalation) |
miro_remove_board_member | Remove member from board |
Sharing and role-change tools are guarded for prompt-injection safety. See
SECURITY.mdandCONFIG.md.
| Tool | Description |
|---|---|
miro_create_sticky | Create a sticky note |
miro_create_sticky_grid | Create stickies in a grid layout |
miro_create_shape | Create a shape (rectangle, circle, etc.) |
miro_create_flowchart_shape | Create flowchart shape (experimental API) |
miro_create_text | Create text element |
miro_create_frame | Create a frame container |
miro_create_card | Create a card with due date |
miro_create_app_card | Create app card with custom fields |
miro_create_image | Add image from URL |
miro_upload_image | Upload local image file |
miro_upload_document | Upload local document file (PDF, DOCX, etc.) |
miro_create_doc | Create Markdown document |
miro_create_document | Add document from URL |
miro_create_embed | Embed YouTube, Figma, etc. |
miro_create_connector | Connect two items with arrow |
miro_create_group | Group items together |
miro_create_mindmap_node | Create mindmap node |
miro_bulk_create | Create multiple items at once |
| Tool | Description |
|---|---|
miro_get_frame | Get frame details |
miro_update_frame | Update frame title/color/size |
miro_delete_frame | Delete a frame |
miro_get_frame_items | List items inside a frame |
| Tool | Description |
|---|---|
miro_get_mindmap_node | Get node details |
miro_list_mindmap_nodes | List all mindmap nodes |
miro_delete_mindmap_node | Delete a mindmap node |
| Tool | Description |
|---|---|
miro_list_items | List items on a board |
miro_list_all_items | Get ALL items with auto-pagination |
miro_get_item | Get item details |
miro_get_image | Get image details and Miro-hosted URL |
miro_get_document | Get document details and Miro-hosted URL |
miro_get_app_card | Get app card details |
miro_get_doc | Get Markdown document content |
miro_search_board | Search items by content |
| Tool | Description |
|---|---|
miro_update_item | Update item content/position/color |
miro_update_sticky | Update sticky note (shape, color) |
miro_update_shape | Update shape (fill, text color, type) |
miro_update_text | Update text element |
miro_update_card | Update card fields |
miro_update_image | Update image properties |
miro_update_image_from_file | Replace image file on existing item |
miro_update_document | Update document properties |
miro_update_document_from_file | Replace document file on existing item |
miro_update_embed | Update embed properties |
miro_update_group | Update group properties |
miro_update_app_card | Update app card fields |
miro_bulk_update | Update multiple items at once |
miro_delete_item | Delete an item |
miro_delete_app_card | Delete an app card |
miro_update_doc | Update document content (full or find-and-replace) |
miro_delete_doc | Delete a Markdown document |
miro_bulk_delete | Delete multiple items at once |
| Tool | Description |
|---|---|
miro_create_tag | Create a tag |
miro_list_tags | List all tags on board |
miro_get_tag | Get tag details by ID |
miro_attach_tag | Attach tag to item |
miro_detach_tag | Remove tag from item |
miro_get_item_tags | Get tags on an item |
miro_get_items_by_tag | Get all items with a specific tag |
miro_update_tag | Update tag name/color |
miro_delete_tag | Delete a tag |
| Tool | Description |
|---|---|
miro_list_connectors | List all connectors |
miro_get_connector | Get connector details |
miro_update_connector | Update connector style/caption |
miro_delete_connector | Delete a connector |
| Tool | Description |
|---|---|
miro_list_groups | List all groups on board |
miro_get_group | Get group details |
miro_get_group_items | List items in a group |
miro_delete_group | Delete or ungroup a group |
| Tool | Description |
|---|---|
miro_get_board_picture | Get board thumbnail |
miro_create_export_job | Export to PDF/SVG (Enterprise) |
miro_get_export_job_status | Check export progress |
miro_get_export_job_results | Get download links |
| Tool | Description |
|---|---|
miro_list_tables | List tables (data_table_format) on a board |
miro_get_table | Get table metadata by ID |
| Tool | Description |
|---|---|
miro_generate_diagram | Create diagram from Mermaid syntax |
miro_get_audit_log | Query local execution log |
miro_get_desire_paths | Query agent normalization patterns (what agents sent vs. what got auto-corrected) |
Create flowcharts and sequence diagrams from Mermaid syntax:
Flowchart:
flowchart TB
A[Start] --> B{Decision}
B -->|Yes| C[Success]
B -->|No| D[Retry]
D --> B
Sequence Diagram:
sequenceDiagram
Alice->>Bob: Hello Bob!
Bob-->>Alice: Hi Alice!
Supported: flowchart/graph, sequenceDiagram, directions (TB/LR/BT/RL), shapes ([] rectangle, {} diamond, (()) circle), labeled edges.
| Feature | This Server | TypeScript alternatives |
|---|---|---|
| Runtime | Single binary | Requires Node.js |
| Size | ~14MB | 100MB+ with node_modules |
| Startup | ~50ms | 500ms-2s |
| Memory | ~10MB idle | ~50MB idle |
| Diagram generation | Built-in Mermaid parser | AI-based |
| Rate limiting | Automatic with backoff | Manual |
| Caching | 2-minute TTL | None |
| Circuit breaker | Yes | No |
Miro released their official MCP server in December 2025. Here's how they compare:
| Feature | This Server | Official Miro MCP |
|---|---|---|
| Last changelog entry | April 2026 | January 2026 |
| Tools | 92 (or 15 in essentials profile) | 13 |
| Transport | stdio + HTTP | HTTPS only (hosted) |
| Self-hosting | Yes | No |
| Offline mode | Yes | No |
| Auth | Token + OAuth2 | OAuth 2.1 (admin approval) |
| Diagram generation | Mermaid syntax | Custom DSL (flowchart, UML, ER) |
| AI context | No | Yes (exploration, summaries, code workflows) |
| Bulk operations | Yes | No |
| Mindmaps | Yes | No |
| Tags & Groups | Yes | No |
| Connectors CRUD | Yes | No |
| Export | Yes (PDF/SVG) | No |
| MCP Resources | 3 | No |
| MCP Prompts | 5 workflows | 2 (code-focused) |
| Runtime | Single Go binary | Hosted (closed-source) |
| Rate limiting | Adaptive | N/A (hosted) |
| Caching | Built-in (2min TTL) | N/A |
| Metrics | Prometheus | No |
| OpenTelemetry | Built-in (mcp-otel-go, OTel Registry) | No |
When to use the official server: You want zero-setup via plugin marketplace, OAuth 2.1 enterprise security, AI-powered board context extraction, or code-to-board workflows.
When to use this server: You need full API coverage (92 vs 13 tools, or a tunable 15-tool essentials mode), offline/self-hosted operation, bulk ops, mindmaps, tags, connectors, export, or a lightweight binary.
Both can coexist — use different MCP server names in your config.
See PERFORMANCE.md for optimization tips and benchmarks.
When running with -http :8080:
| Endpoint | Description |
|---|---|
/ | MCP protocol (Streamable HTTP) |
/health | Health check (JSON) |
/health?deep=true | Deep health check (tests Miro API) |
/metrics | Prometheus metrics |
/.well-known/mcp-server-card | SEP-2127 Server Card (JSON) via mcp-servercard-go |
Health check response:
{
"status": "healthy",
"server": "miro-mcp-server",
"version": "1.21.0",
"uptime": "2h30m",
"components": {
"config": {"status": "healthy"},
"miro_api": {"status": "healthy", "latency": "145ms"}
}
}
# Build
make build
# Run tests
make test
# Run with coverage
make test-cover
# Lint
make lint
# Build for all platforms
make build-all
# See all targets
make help
Quick start:
# Using Docker Compose
export MIRO_ACCESS_TOKEN=your-token
docker compose up -d
# Or build and run manually
docker build -t miro-mcp-server .
docker run -e MIRO_ACCESS_TOKEN=xxx -p 8080:8080 miro-mcp-server
docker-compose.yml features:
Test and debug the server interactively with MCP Inspector:
# Install and run (no setup required)
npx @modelcontextprotocol/inspector miro-mcp-server
# With environment variables
MIRO_ACCESS_TOKEN=your-token npx @modelcontextprotocol/inspector miro-mcp-server
Open http://localhost:6274 to:
See SETUP.md for more debugging options.
| Platform | Binary |
|---|---|
| macOS (Apple Silicon) | miro-mcp-server-darwin-arm64 |
| macOS (Intel) | miro-mcp-server-darwin-amd64 |
| Linux (x64) | miro-mcp-server-linux-amd64 |
| Linux (ARM64) | miro-mcp-server-linux-arm64 |
| Windows (x64) | miro-mcp-server-windows-amd64.exe |
| Docker | ghcr.io/olgasafonova/miro-mcp-server |
| Tool | Status |
|---|---|
| Claude Code | Tested |
| Claude Desktop | Tested |
| Cursor | Tested |
| VS Code + GitHub Copilot | Supported |
| Windsurf | Supported |
| Replit | Supported |
| Any MCP-compatible client | Supported |
See SETUP.md for configuration guides.
| Account Type | Support |
|---|---|
| Free | Full access to all 92 tools |
| Team | Full access to all 92 tools |
| Business | Full access to all 92 tools |
| Enterprise | Full access + export to PDF/SVG |
If this server saved you time, consider giving it a ⭐ on GitHub. It helps others discover the project.
Check out my other MCP servers:
| Server | Description | Stars |
|---|---|---|
| gleif-mcp-server | Access GLEIF LEI database. Look up company identities, verify legal entities. | |
| mediawiki-mcp-server | Connect AI to any MediaWiki wiki. Search, read, edit wiki content. | |
| nordic-registry-mcp-server | Access Nordic business registries. Look up companies across Norway, Denmark, Finland, Sweden. | |
| productplan-mcp-server | Talk to your ProductPlan roadmaps. Query OKRs, ideas, launches. | |
| tilbudstrolden-mcp | Nordic grocery deal hunting. Find offers, plan meals, track spending. | |
| mcp-servercard-go | Go library for SEP-2127 Server Cards. Pre-connect discovery for MCP servers. |
MIT
Built for the Miro and MCP communities.
Miro is a trademark of Miro Inc. This project is not affiliated with or endorsed by Miro.
MIRO_ACCESS_TOKENMiro API access token with boards:read and boards:write permissions