trackmcp
Back to directory
olgasafonova

miro-mcp-server

View on GitHub

MCP server for controlling Miro whiteboards with AI assistants

26 stars GoOthers Updated Aug 31, 2026
anthropicclaudecollaborationgogolangmcpmcp-servermiromodel-context-protocolwhiteboardmiro-api

Documentation

Miro MCP Server

Run 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.

110 tools | Single binary | All platforms | All major AI tools

CI
lint
CodeScene Average Code Health
License: MIT
Go Reference
codecov
MCP context

Documentation

DocumentDescription
QUICKSTART.mdGet running in 2 minutes
SETUP.mdFull setup for all AI tools
CONFIG.mdConfiguration reference
PERFORMANCE.mdOptimization guide
CHANGELOG.mdVersion history
ERRORS.mdError handling & troubleshooting

Quick Start

1. Install

Homebrew (macOS/Linux):

bash
brew tap olgasafonova/tap && brew install miro-mcp-server

One-liner (macOS/Linux):

bash
curl -fsSL https://raw.githubusercontent.com/olgasafonova/miro-mcp-server/main/install.sh | sh

Docker:

bash
docker pull ghcr.io/olgasafonova/miro-mcp-server:latest

Manual download: See SETUP.md for all platforms

2. Get a Miro Token

1. Go to miro.com/app/settings/user-profile/apps

2. Create an app with `boards:read` and `boards:write` permissions

3. Install to your team and copy the token

3. Configure Your AI Tool

Claude Code:

bash
claude mcp add miro -e MIRO_ACCESS_TOKEN=your-token -- miro-mcp-server

Claude Desktop / Cursor / VS Code: See SETUP.md

Cursor Marketplace:

bash
/add-plugin miro

> Not working? Tell us what made it hard — even one sentence helps.


What You Can Do

CategoryExamples
BoardsCreate, copy, delete, update, share, list members
ItemsSticky notes, shapes, text, cards, app cards, images, documents, frames, docs
DiagramsGenerate flowcharts and sequence diagrams from Mermaid; list and inspect native diagram items
DocsCreate and manage Markdown documents on boards
UploadUpload and replace local image and document files on boards
TablesDiscover and inspect tables on boards
MindmapsCreate mindmap nodes with parent-child relationships
Code WidgetsSyntax-highlighted code snippets on boards (v2-experimental)
Bulk OpsCreate multiple items at once, sticky grids
TagsCreate, attach, update, and organize with tags
GroupsGroup, list, and manage item groups
ConnectorsConnect items with styled arrows
ExportBoard thumbnails, PDF/SVG export (Enterprise)

Voice Examples

  • *"Add a yellow sticky saying 'Review PRs'"*
  • *"Create a flowchart: Start → Decision → End"*
  • *"What boards do I have?"*
  • *"Share the Design board with jane@example.com"*
  • *"Create a mindmap with 'Project Ideas' as root"*

Companion Skill: `miro-workflow`

Validated by SkillCheck Pro

For 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:

WorkflowTrigger 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.


Companion CLI: `miro-cli`

For 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:

bash
brew install olgasafonova/tap/miro-cli
# or
go install github.com/olgasafonova/miro-cli/cmd/miro-cli@latest

Companion MCP Apps server: `miro-mcp-apps`

If 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`. Eleven 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 110-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.


Token Efficiency

The full tool surface (110 tools) costs roughly 20.8K tokens of preload; the `essentials` profile trims that to ~2.8K. For sessions where that footprint matters, set `MIRO_TOOLS_PROFILE=essentials` in your client config; the server then registers a curated 14-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.

ProfileToolsPreload tokens (est.)
`full` (default)110~20,795
`essentials`15~2,848

Savings: ~17,760 tokens (86.2% 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.


All 110 Tools

Board Management (9)

ToolDescription
`miro_list_boards`List accessible boards with owner, team, and timestamps
`miro_find_board`Find board by name, with the same metadata as the listing
`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

Board Members (5)

ToolDescription
`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.md` and `CONFIG.md`.

Create Items (18)

ToolDescription
`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

Frames (4)

ToolDescription
`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

Mindmaps (3)

ToolDescription
`miro_get_mindmap_node`Get node details
`miro_list_mindmap_nodes`List all mindmap nodes
`miro_delete_mindmap_node`Delete a mindmap node

Code Widgets (6, v2-experimental)

ToolDescription
`miro_create_code_widget`Add a syntax-highlighted code snippet
`miro_get_code_widget`Get full source and settings
`miro_list_code_widgets`List widgets with code previews
`miro_update_code_widget`Change code, language, title, or size
`miro_move_code_widget`Move to a new position
`miro_delete_code_widget`Delete a code widget

Comments (5, v2-experimental)

ToolDescription
`miro_create_comment`Open a comment thread, optionally attached to an item
`miro_list_comments`List threads with messages and resolved state
`miro_get_comment`Get one thread with its full message history
`miro_reply_comment`Append a reply to a thread
`miro_resolve_comment`Resolve a thread, or reopen with resolved=false

Canvas SVG (3, local transform)

ToolDescription
`miro_read_board_svg`Render board items as an SVG document (computed locally); `frame_id` scopes the render to one frame
`miro_create_from_svg`Create items from SVG: shapes, text, stickies and frames (`data-type` hints), triangles, images, connectors (`line` with `data-start`/`data-end`)
`miro_update_from_svg`Apply an SVG diff keyed on `data-miro-id`: update in place, delete (`data-deleted`), create additively; read output is re-submittable

Read Items (9)

ToolDescription
`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
`miro_who_am_i`Introspect the access token: user, team, organization, application, scopes

Update & Delete Items (18)

ToolDescription
`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

Tags (9)

ToolDescription
`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

Connectors (4)

ToolDescription
`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

Groups (4)

ToolDescription
`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

Export (4)

ToolDescription
`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

Tables (2)

ToolDescription
`miro_list_tables`List tables (data_table_format) on a board
`miro_get_table`Get table metadata by ID

Discovery (1)

ToolDescription
`miro_tool_search`Find the right tool by keyword or category; registered in both profiles and the only gateway to the full surface in `essentials` mode

Diagrams & Audit (6)

ToolDescription
`miro_generate_diagram`Create diagram from Mermaid syntax
`miro_list_diagrams`List native diagram items on a board
`miro_get_diagram`Get native diagram metadata by ID
`miro_get_audit_log`Query THIS SERVER's local execution log
`miro_get_org_audit_logs`Query MIRO's org-wide audit log (Enterprise; `auditlogs:read`)
`miro_get_desire_paths`Query agent normalization patterns (what agents sent vs. what got auto-corrected)

Diagram Generation

Create flowcharts and sequence diagrams from Mermaid syntax:

Flowchart:

code
flowchart TB
    A[Start] --> B{Decision}
    B -->|Yes| C[Success]
    B -->|No| D[Retry]
    D --> B

Sequence Diagram:

code
sequenceDiagram
    Alice->>Bob: Hello Bob!
    Bob-->>Alice: Hi Alice!

Supported: `flowchart`/`graph`, `sequenceDiagram`, directions (TB/LR/BT/RL), shapes (`[]` rectangle, `{}` diamond, `(())` circle), labeled edges.


Why This Server?

FeatureThis ServerTypeScript alternatives
RuntimeSingle binaryRequires Node.js
Size~14MB100MB+ with node_modules
Startup~50ms500ms-2s
Memory~10MB idle~50MB idle
Diagram generationBuilt-in Mermaid parserAI-based
Rate limitingAutomatic with backoffManual
Caching2-minute TTLNone
Circuit breakerYesNo

Official vs Community

Miro released their official MCP server in December 2025 and has grown it substantially since. Comparison refreshed 18-08-2026 by enumerating the 63 tools the hosted server actually registers at `mcp.miro.com`, rather than counting the documented set — the docs lag the deployment in both directions: `board_trash` and `space_delete`, present on 17-08-2026, were gone the next day, leaving the surface with no hard-destructive verbs. Recent additions come from their changelogs on new MCP tools and code widget endpoints.

FeatureThis ServerOfficial Miro MCP
Tools110 (or 15 in `essentials` profile)63
Transportstdio + HTTPHTTPS only (hosted at mcp.miro.com)
Self-hostingYesNo
Offline modeYesNo
AuthToken + OAuth2OAuth 2.1, dynamic client registration (Enterprise orgs need admin enablement)
Board list metadataid, owner, team, created/modified timestampsname and URL
Diagram generationMermaid, parsed locally; native diagram items readable via `miro_list_diagrams`/`miro_get_diagram`Mermaid (`diagram_create_mermaid`, `diagram_update_mermaid`) plus a custom DSL
AI contextNoYes (`context_explore`, `context_get`)
Layout DSLComposed from bulk create + the `miro-workflow` skillYes, but marked deprecated upstream in favour of the canvas tools
Canvas as SVGRead + create + update (`data-miro-id` diff; local geometry transform; spatial approximation). Reads scope to a single frame via `frame_id`, and read output is directly re-submittable to the update toolYes (read, create, update from SVG). Reads are whole-board only, and read output is re-escaped, so it cannot be fed back to the update tool verbatim
Spaces & sectionsNoYes (10 tools) — workspace-level grouping of boards, not board content
CommentsYes (create, list, get, reply, resolve; v2-experimental)Yes (create, list, reply, resolve)
PrototypesNoYes (read, create, upload URL)
Code widgets6 tools incl. position move (v2-experimental)5 tools (no move)
Docs & TablesDoc formats + table readDoc create/update + table create/sync/history
ImagesCreate, upload, update from fileCreate, upload URL, get data/URL
Bulk operationsYesPartial (`table_sync_rows` upsert only)
MindmapsYesNo
Tags & GroupsYesNo
Connectors CRUDYesNo
Item-level CRUDYes (sticky, shape, text, card, image, document, embed, frame)Layout DSL, not per-item verbs
Board sharing / membersYes (allowlist-gated)Sharing and role updates; no member CRUD
ExportYes (PDF/SVG)No
Current userDerived from board ownerYes (`user_who_am_i`)
MCP Resources3No
MCP Prompts5 workflowsBundled agent skills (browse, code-review, diagram, doc, table)
RuntimeSingle Go binaryHosted (closed-source)
Rate limitingAdaptiveN/A (hosted)
CachingBuilt-in (2min TTL)N/A
MetricsPrometheusNo
OpenTelemetryBuilt-in (mcp-otel-go, OTel Registry)No

Where the differences come from. Spaces, sections, canvas-SVG and prototypes have no endpoints in the public REST API v2 — checked 13-08-2026 against the 114-path OpenAPI spec tracked in `api-tracking/`, and re-checked by probing the live API, since the spec omits endpoints Miro does ship. Those run on Miro-internal APIs. The reverse also holds: mindmaps, tags, groups, connectors and export are public REST surfaces the official server has not wrapped.

Board context is a design difference rather than a gap. `context_get` returns a server-side AI summary of a board; `miro_get_board_content` returns the structured content itself — items by type, frame hierarchy, connectors and tags — and lets the model already in your session do the summarizing, with no second inference hop.

When to use the official server: You want zero-setup via plugin marketplace, OAuth 2.1 enterprise security, spaces and sections, comments, board context extraction, or SVG/prototype workflows.

When to use this server: You need full REST coverage (110 tools, or a tunable 15-tool `essentials` mode), offline/self-hosted operation, richer board listing metadata, bulk ops, mindmaps, tags, connectors, or export.

Both can coexist — use different MCP server names in your config.


Performance

  • Caching: 2-minute TTL reduces API calls
  • Rate limiting: Adapts to Miro's rate limit headers
  • Circuit breaker: Isolates failing endpoints
  • Parallel bulk ops: Creates items concurrently
  • Token validation: Fails fast on startup with clear error
  • Transient error retry: Auto-retries 502/503/504 with backoff
  • OpenTelemetry: Built-in tracing and metrics via mcp-otel-go (OTel Registry)

See PERFORMANCE.md for optimization tips and benchmarks.


HTTP Mode Endpoints

When running with `-http :8080`:

EndpointDescription
`/`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:

json
{
  "status": "healthy",
  "server": "miro-mcp-server",
  "version": "1.21.0",
  "uptime": "2h30m",
  "components": {
    "config": {"status": "healthy"},
    "miro_api": {"status": "healthy", "latency": "145ms"}
  }
}

Development

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

Docker Deployment

Quick start:

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

  • Health checks configured
  • Resource limits template
  • Environment variable passthrough

Debugging with MCP Inspector

Test and debug the server interactively with MCP Inspector:

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

  • Browse all 110 tools with their schemas
  • Test tool calls interactively
  • View raw JSON-RPC messages
  • Debug parameter validation

See SETUP.md for more debugging options.


Supported Platforms

PlatformBinary
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`

Supported AI Tools

ToolStatus
Claude CodeTested
Claude DesktopTested
CursorTested
VS Code + GitHub CopilotSupported
WindsurfSupported
ReplitSupported
Any MCP-compatible clientSupported

See SETUP.md for configuration guides.


Account Compatibility

Account TypeSupport
Free106 tools
Team106 tools
Business106 tools
EnterpriseAll 110 tools

Four tools need an Enterprise plan and fail with a hint saying so: the three PDF/SVG export tools (`miro_create_export_job`, `miro_get_export_job_status`, `miro_get_export_job_results`) and `miro_get_org_audit_logs`, which additionally needs the `auditlogs:read` scope. `miro_get_board_picture` works on every plan. Everything else works on any plan.

The 6 code widget tools and 5 comment tools use Miro's v2-experimental API; availability may vary by account or plan, and the endpoints may change before GA.


Like This Project?

If this server saved you time, consider giving it a ⭐ on GitHub. It helps others discover the project.


More MCP Servers

Check out my other MCP servers:

ServerDescriptionStars
gleif-mcp-serverAccess GLEIF LEI database. Look up company identities, verify legal entities.!GitHub stars
mediawiki-mcp-serverConnect AI to any MediaWiki wiki. Search, read, edit wiki content.!GitHub stars
nordic-registry-mcp-serverAccess Nordic business registries. Look up companies across Norway, Denmark, Finland, Sweden.!GitHub stars
productplan-mcp-serverTalk to your ProductPlan roadmaps. Query OKRs, ideas, launches.!GitHub stars
tilbudstrolden-mcpNordic grocery deal hunting. Find offers, plan meals, track spending.!GitHub stars
mcp-servercard-goGo library for SEP-2127 Server Cards. Pre-connect discovery for MCP servers.!GitHub stars

License

MIT


Built for the and communities.

Miro is a trademark of Miro Inc. This project is not affiliated with or endorsed by Miro.

Frequently asked questions

What is miro-mcp-server?

miro-mcp-server is MCP server for controlling Miro whiteboards with AI assistants

How do I install miro-mcp-server?

Open the GitHub repository and follow its README. Most MCP servers are added to your client's MCP config, then called by your agent.

Is miro-mcp-server open source?

Yes — it is hosted on GitHub at https://github.com/olgasafonova/miro-mcp-server and has 26 stars.

Related MCP tools

Run your own MCP server? See who uses it and what to fix.

Measure it with TrackMCP