Skip to main content
Glama

Comprehensive Miro MCP Server

A powerful Model Context Protocol server providing complete access to the Miro REST API v2. This enhanced version offers extensive functionality for board management, content creation, collaboration, and advanced features.

Features

🎯 Complete API Coverage

  • 40+ tools covering all major Miro API endpoints

  • Full CRUD operations for all content types

  • Advanced board management and collaboration features

  • Experimental features like webhooks and advanced search

πŸ“‹ Board Operations

  • list_boards - List all boards with search and team filtering

  • get_board - Get detailed board information

  • create_board - Create new boards with custom settings

  • update_board - Modify board properties

  • copy_board - Duplicate existing boards

  • delete_board - Remove boards permanently

🎨 Content Creation

  • Sticky Notes: 15+ colors, custom positioning, text content

  • Text Items: Rich formatting, custom fonts and sizes

  • Shapes: 25+ shapes including flowchart elements

  • Cards: Title/description cards for structured content

  • Images: Direct URL embedding with size control

  • Documents: PDF and document embedding

  • Embeds: Video and web content embedding

  • Frames: Container elements for organizing content

  • Connectors: Link items with optional labels and styling

🏷️ Organization Features

  • Tags: Create, manage, and attach tags to items

  • Groups: Group multiple items for batch operations

  • Frames: Organize content in containers

  • Search: Find items by content and metadata

πŸš€ Advanced Operations

  • Bulk Operations: Create, update, or delete up to 20 items simultaneously (implemented via sequential API calls)

  • Bulk Connectors: Create multiple connectors at once to efficiently link items

  • Board Sharing: Invite users with granular permissions

  • Member Management: Manage board access and roles

  • Webhooks: Real-time event notifications (experimental)

πŸŽ›οΈ Precise Control

  • Positioning: Exact pixel placement with configurable origins

  • Styling: Comprehensive visual customization

  • Geometry: Control size, rotation, and dimensions

  • Typography: Font families, sizes, colors, and alignment

Installation

npm install @aditya.mishra/miro-mcp

⚠️ Important API Limitations & Best Practices

Based on extensive testing with the Miro API v2, please note these critical requirements:

🎨 Content Creation Requirements

  • Text Items: Only support width in geometry, height is NOT supported by Miro API

  • Sticky Notes & Tags: Must use predefined color names (e.g., "yellow", "red", "blue"), NOT hex codes

  • Connectors: Both start and end items MUST exist on the board before creating connectors

πŸ“Š API Limits

  • Bulk Operations: Maximum 20 items per request (create/update/delete)

  • Board Items: Minimum limit is 10 when using get_board_items with limit parameter

  • Rate Limiting: Miro API has rate limits - consider delays for large operations

πŸ” Working with Items

  • Item IDs: Always obtain item IDs from get_board_items or item creation responses

  • Connectors: Require existing item IDs - use get_board_items to find valid item IDs first

  • Tags: Use predefined color names from the enum lists in tool descriptions

πŸ“ Positioning

  • Coordinates: Use x, y coordinates for precise placement (pixels from board center)

  • Origins: Default origin is "center" - items are positioned from their center point

Authentication

Obtain a Miro OAuth token from your Miro app and provide it via:

Environment Variable

export MIRO_OAUTH_TOKEN="your_token_here"

Command Line

miro-mcp --token "your_token_here"

Usage

As MCP Server

{ "mcpServers": { "miro-mcp": { "command": "npx", "args": ["@aditya.mishra/miro-mcp"], "env": { "MIRO_OAUTH_TOKEN": "your_token_here" } } } }

Direct Execution

# List available tools npx @modelcontextprotocol/inspector build/index.js # Run with token MIRO_OAUTH_TOKEN=your_token miro-mcp

Client Configuration

This MCP server works with any Model Context Protocol compatible client. Here are configuration examples for popular clients:

Claude Desktop

  1. Locate your configuration file:

    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

    • Windows: %APPDATA%\Claude\claude_desktop_config.json

    • Linux: ~/.config/Claude/claude_desktop_config.json

  2. Add the Miro MCP server configuration:

{ "mcpServers": { "miro-mcp": { "command": "npx", "args": ["@aditya.mishra/miro-mcp"], "env": { "MIRO_OAUTH_TOKEN": "your_miro_oauth_token_here" } } } }
  1. Restart Claude Desktop and the Miro tools will be available in your conversations.

Cursor

  1. Open Cursor Settings (Cmd/Ctrl + ,)

  2. Search for "MCP" in settings

  3. Add MCP Server:

    • Name: miro-mcp

    • Command: npx

    • Args: ["@aditya.mishra/miro-mcp"]

    • Environment Variables: MIRO_OAUTH_TOKEN=your_token_here

Cline (formerly Claude Coder)

Add to your .clinerc or MCP configuration:

{ "mcpServers": { "miro-mcp": { "command": "npx", "args": ["@aditya.mishra/miro-mcp"], "env": { "MIRO_OAUTH_TOKEN": "your_token_here" } } } }

Zed Editor

  1. Open Zed Settings (Cmd/Ctrl + ,)

  2. Add to your

{ "experimental.mcp": { "servers": { "miro-mcp": { "command": "npx", "args": ["@aditya.mishra/miro-mcp"], "env": { "MIRO_OAUTH_TOKEN": "your_token_here" } } } } }

Continue.dev

Add to your continue.json configuration:

{ "mcpServers": [ { "name": "miro-mcp", "command": "npx", "args": ["@aditya.mishra/miro-mcp"], "env": { "MIRO_OAUTH_TOKEN": "your_token_here" } } ] }

Generic MCP Client

For any other MCP-compatible client, use these parameters:

  • Command: npx

  • Arguments: ["@aditya.mishra/miro-mcp"]

  • Environment: MIRO_OAUTH_TOKEN=your_token_here

  • Working Directory: Any (the server is self-contained)

Getting Your Miro OAuth Token

  1. Go to

  2. Create a new app or use an existing one

  3. Get your OAuth token from the app settings

  4. Set required scopes: boards:read, boards:write

  5. Copy the token and use it in your MCP client configuration

⚠️ Security Note: Keep your OAuth token secure and never commit it to version control.

Tool Categories

Board Management (6 tools)

  • Complete board lifecycle management

  • Search and filtering capabilities

  • Team-based organization

Content Creation (9 tools)

  • All major content types supported

  • Rich styling and positioning options

  • URL-based media embedding

Item Operations (4 tools)

  • Universal item management

  • Advanced filtering and search

  • Batch processing capabilities

Bulk Operations (4 tools)

  • Efficient batch create/update/delete via sequential API calls

  • Bulk connector creation for linking multiple items efficiently

  • Up to 20 items per operation (validated and enforced)

  • Optimized for large-scale changes with proper error handling

Organization (8 tools)

  • Tags for categorization

  • Groups for logical clustering

  • Frames for spatial organization

  • Advanced search capabilities

Collaboration (2 tools)

  • User invitation and management

  • Role-based permissions

  • Real-time sharing

Advanced Features (8 tools)

  • Webhook management

  • Frame-based operations

  • Member administration

  • Experimental features

Examples

Creating a Project Board

// 1. Create a new board await createBoard({ name: "Project Planning", description: "Q1 project planning board" }); // 2. Create frames for organization await createFrame({ boardId: "board_id", title: "Backlog", x: 0, y: 0, width: 400, height: 600 }); // 3. Add task cards await createCard({ boardId: "board_id", title: "User Authentication", description: "Implement OAuth2 login flow", x: 50, y: 50 }); // 4. Connect related items await createConnector({ boardId: "board_id", startItemId: "item1", endItemId: "item2", caption: "depends on" }); // 5. Share with team await shareBoardWithUser({ boardId: "board_id", email: "team@company.com", role: "editor" });

Creating a Mind Map

// 1. Central topic await createStickyNote({ boardId: "board_id", content: "Main Topic", color: "yellow", x: 0, y: 0 }); // 2. Branch topics const branches = ["Idea 1", "Idea 2", "Idea 3"]; for (let i = 0; i < branches.length; i++) { const item = await createStickyNote({ boardId: "board_id", content: branches[i], color: "light_blue", x: Math.cos(i * 2 * Math.PI / 3) * 200, y: Math.sin(i * 2 * Math.PI / 3) * 200 }); await createConnector({ boardId: "board_id", startItemId: "central_item_id", endItemId: item.id }); } // 3. Add tags for categorization await createTag({ boardId: "board_id", title: "Priority High", fillColor: "#ff0000" });

Bulk Content Creation

// Create multiple items efficiently (up to 20 items) // Note: Implemented via sequential API calls for reliability await bulkCreateItems({ boardId: "board_id", items: [ { type: "sticky_note", data: { content: "Task 1" }, style: { fillColor: "yellow" }, position: { x: 0, y: 0 } }, { type: "sticky_note", data: { content: "Task 2" }, style: { fillColor: "pink" }, position: { x: 100, y: 0 } }, { type: "shape", data: { shape: "rectangle", content: "Process" }, position: { x: 200, y: 0 }, geometry: { width: 150, height: 100 } } ] }); // Update multiple items at once await bulkUpdateItems({ boardId: "board_id", updates: [ { id: "item_id_1", data: { data: { content: "Updated Task 1" }, style: { fillColor: "green" } } }, { id: "item_id_2", data: { data: { content: "Updated Task 2" }, style: { fillColor: "blue" } } } ] }); // Delete multiple items at once await bulkDeleteItems({ boardId: "board_id", itemIds: ["item_id_1", "item_id_2", "item_id_3"] });

Available Shapes

Basic Shapes

  • rectangle, round_rectangle, circle, triangle

  • rhombus, parallelogram, trapezoid

  • pentagon, hexagon, octagon, star

  • cloud, cross, can

Arrows

  • right_arrow, left_arrow, left_right_arrow

Flowchart Elements

  • flow_chart_process, flow_chart_decision

  • flow_chart_document, flow_chart_terminator

  • flow_chart_input_output, flow_chart_delay

  • flow_chart_display, flow_chart_preparation

Color Palette

Sticky Note Colors

  • gray, light_yellow, yellow, orange

  • light_green, green, dark_green, cyan

  • light_pink, pink, violet, red

  • light_blue, blue, dark_blue, black

Custom Colors

Use any hex color code for shapes, text, and other elements.

Error Handling

All operations include comprehensive error handling:

  • Detailed error messages

  • Proper HTTP status codes

  • Graceful fallbacks

  • Clear debugging information

Rate Limiting

The server respects Miro's API rate limits:

  • Automatic retry logic

  • Exponential backoff

  • Rate limit headers monitoring

API Compliance

  • Full Miro REST API v2 compatibility

  • Consistent data structures

  • Standard HTTP methods

  • Proper authentication handling

Development

Building

npm run build

Testing

npm run inspector

Watching

npm run watch

Limitations

  • Maximum 20 items per bulk operation (enforced and validated)

  • Bulk operations use sequential API calls (not true bulk endpoints)

  • DELETE operations may return empty responses (handled automatically)

  • Webhook feature is experimental

  • Some advanced enterprise features require appropriate Miro plan

  • File uploads not supported (URL-based only)

Contributing

  1. Fork the repository

  2. Create a feature branch

  3. Make your changes

  4. Add tests if applicable

  5. Submit a pull request

License

MIT License - see LICENSE file for details

Support

  • GitHub Issues for bug reports

  • Miro API Documentation: https://miroapp.github.io/api-clients/node/

  • MCP Documentation: https://modelcontextprotocol.io/

Changelog

v0.2.0 - Comprehensive Enhancement

  • Added 35+ new tools covering complete Miro API

  • Implemented board management operations

  • Added content creation for all item types

  • Introduced tags, groups, and organization features

  • Added bulk operations for efficiency

  • Implemented board sharing and collaboration

  • Added webhooks and experimental features

  • Enhanced error handling and documentation

v0.1.1 - Initial Release

  • Basic sticky note creation

  • Simple board listing

  • Frame operations

  • Limited shape support

-
security - not tested
A
license - permissive license
-
quality - not tested

Latest Blog Posts

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/soul-script/miro-mcp'

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