Enables MCP-compatible LLMs to interact with Miro whiteboards
Miro MCP Server
A standalone Model Context Protocol (MCP) server that enables any MCP-compatible LLM to interact with Miro whiteboards
Prerequisites
- Python 3.9 or higher
- Miro Developer Account with Client ID and Client Secret
- MCP-compatible LLM client
Setup
- Clone this repository or navigate to the project directory:
cd miro-mcp
- Create a virtual environment:
python -m venv venv
source venv/bin/activate
- Install dependencies:
pip install -r requirements.txt
Configuration
- Create a
.envfile in the project root with your Miro credentials:
MIRO_CLIENT_ID=your_client_id_here
MIRO_CLIENT_SECRET=your_client_secret_here
MIRO_REDIRECT_URL=http://localhost:8080/callback
Available Tools
Authentication Tools
get_auth_url: Get the OAuth 2.0 authorization URL- Parameters: None
- Returns: Authorization URL and instructions
exchange_auth_code: Exchange authorization code for access token- Parameters:
code(string, required): Authorization code from OAuth callback
- Returns: Success status
- Parameters:
Board Management Tools
get_board: Get information about a Miro board including metadata, name, description, and settings- Parameters:
board_id(string, required): The ID of the board
- Returns: Board information
- Parameters:
Shape Manipulation Tools
create_shape: Create a shape on a board- Parameters:
board_id(string, required): The ID of the boardshape_type(string, required): Type of shape (rectangle, circle, triangle, star, arrow, rhombus, octagon, hexagon)x(number, required): X coordinate of the shape positiony(number, required): Y coordinate of the shape positionwidth(number, required): Width of the shapeheight(number, required): Height of the shapefillColor(string, optional): Fill color in hex format (e.g., #FF0000)borderColor(string, optional): Border color in hex format (e.g., #000000)borderWidth(number, optional): Border width in pixelscontent(string, optional): Text content to display in the shape
- Returns: Created shape information
- Parameters:
update_shape: Update properties of an existing shape- Parameters:
board_id(string, required): The ID of the boarditem_id(string, required): The ID of the shape item to updatex(number, optional): New X coordinatey(number, optional): New Y coordinatewidth(number, optional): New widthheight(number, optional): New heightfillColor(string, optional): New fill colorborderColor(string, optional): New border colorborderWidth(number, optional): New border widthcontent(string, optional): New text content
- Returns: Updated shape information
- Parameters:
delete_shape: Delete a shape from a board- Parameters:
board_id(string, required): The ID of the boarditem_id(string, required): The ID of the shape item to delete
- Returns: Success message
- Parameters:
Grouping Tools
group_shapes: Group multiple shapes together- Parameters:
board_id(string, required): The ID of the boarditem_ids(array, required): List of item IDs to group together (minimum 2 items)
- Returns: Group/frame information
- Parameters:
ungroup_shapes: Ungroup shapes by removing them from a group/frame- Parameters:
board_id(string, required): The ID of the boardgroup_id(string, required): The ID of the group/frame to ungroup
- Returns: Success message
- Parameters:
Usage
Running the MCP Server
The MCP server communicates via stdio using JSON-RPC protocol. To run it:
python server.py
Authentication
Before using the MCP server to interact with Miro boards, you need to authenticate and obtain an access token:
Step 1: Get Authorization URL
Call the get_auth_url tool to retrieve the OAuth authorization URL:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_auth_url",
"arguments": {}
}
}
The response will contain an auth_url that you need to visit in your browser.
Step 2: Authorize the Application
- Copy the
auth_urlfrom the response - Open it in your web browser
- Log in to your Miro account
- Review and approve the permissions requested by the application
- After authorization, Miro will redirect you to the callback URL specified in your configuration
Step 3: Extract the Authorization Code
After authorization, Miro redirects to your callback URL with a code parameter in the query string. The URL will look like:
http://localhost:8080/callback?code=AUTHORIZATION_CODE_HERE
Extract the code value from the URL (everything after code=).
Step 4: Exchange Code for Access Token
Use the exchange_auth_code tool with the authorization code to complete authentication:
{
"jsonrpc": "2.0",
Tools (8)
get_auth_urlGet the OAuth 2.0 authorization URLexchange_auth_codeExchange authorization code for access tokenget_boardGet information about a Miro board including metadata, name, description, and settingscreate_shapeCreate a shape on a boardupdate_shapeUpdate properties of an existing shapedelete_shapeDelete a shape from a boardgroup_shapesGroup multiple shapes togetherungroup_shapesUngroup shapes by removing them from a group/frameEnvironment Variables
MIRO_CLIENT_IDrequiredMiro Developer Account Client IDMIRO_CLIENT_SECRETrequiredMiro Developer Account Client SecretMIRO_REDIRECT_URLrequiredOAuth callback URLConfiguration
{"mcpServers": {"miro": {"command": "python", "args": ["/path/to/miro-mcp/server.py"], "env": {"MIRO_CLIENT_ID": "your_client_id", "MIRO_CLIENT_SECRET": "your_client_secret", "MIRO_REDIRECT_URL": "http://localhost:8080/callback"}}}}