Skip to main content
Glama
DChuhin
by DChuhin

Miro MCP server (custom)

TypeScript Model Context Protocol server that talks to the Miro REST API v2 (plus experimental mind map endpoints under v2-experimental). It exposes tools for listing board items, board metadata, native mind maps, creating stickies, frames, shapes, and connectors, and updating, moving, or deleting items. The host (Cursor, Claude Desktop, or another MCP client) spawns this process over stdio; the model decides when to call each tool from the tool descriptions.

Requirements: Node.js 18+, a Miro OAuth access token with boards:read and boards:write.


Setup

1. Clone the repository

git clone https://github.com/DChuhin/miro-mcp-server.git
cd miro-mcp-server

Use your fork’s URL if you cloned from elsewhere.

2. Install dependencies and build

npm install
npm run build

The MCP entrypoint is dist/index.js. Re-run npm run build after changing TypeScript sources if your client runs the compiled file (see Cursor / Claude below).

3. Miro token and board ID

Token (required for the server to call Miro)

  1. In Miro, open the Developer / Your apps area and create an app.

  2. Enable scopes boards:read and boards:write.

  3. Complete the OAuth flow to obtain an access token (see Miro OAuth).

You can keep secrets out of the shell by copying the example env file:

cp .env.example .env
# Edit .env and set MIRO_TOKEN=...

For Cursor and Claude Desktop, the most reliable approach is to put MIRO_TOKEN in the MCP config’s env block (see below). The spawned process may not load .env unless the client sets the working directory to the project root.

Never commit .env or paste tokens into chat.

Board ID (required in normal use)

Tools take a board_id argument. The model needs the board ID whenever you ask for board-specific work. Find it in the board URL: the segment after /board/ (example shape: uXjVGnXi5V0=). Mention it explicitly in prompts, for example: “On board uXjV…, list sticky notes.”

The server does not read a default board from the environment for MCP tool calls. MIRO_BOARD_ID is only useful for the optional integration test script (see Development).

Cursor

  1. Complete setup steps 1–3 (clone, npm install, npm run build, obtain a token).

  2. Open Cursor Settings → MCP (or edit the MCP config file directly). Cursor commonly uses ~/.cursor/mcp.json.

Example (replace the path with the absolute path to this repo on your machine):

{
  "mcpServers": {
    "miro-custom": {
      "command": "node",
      "args": ["/absolute/path/to/miro-mcp-server/dist/index.js"],
      "env": {
        "MIRO_TOKEN": "your_miro_oauth_token_here"
      }
    }
  }
}

Alternative (development): point args at tsx and the TypeScript entry so you can skip npm run build while iterating:

{
  "mcpServers": {
    "miro-custom": {
      "command": "npx",
      "args": ["tsx", "/absolute/path/to/miro-mcp-server/src/index.ts"],
      "env": {
        "MIRO_TOKEN": "your_miro_oauth_token_here"
      }
    }
  }
}

Reload MCP servers or restart Cursor after saving the config.

Claude Desktop

  1. Complete setup steps 1–3 (clone, npm install, npm run build, obtain a token).

  2. Edit Claude Desktop MCP configuration (location varies by OS; search for claude_desktop_config.json in Claude’s documentation).

  3. Under mcpServers, add the same shape as in Cursor, using the absolute path to dist/index.js:

{
  "mcpServers": {
    "miro-custom": {
      "command": "node",
      "args": ["/absolute/path/to/miro-mcp-server/dist/index.js"],
      "env": {
        "MIRO_TOKEN": "your_miro_oauth_token_here"
      }
    }
  }
}

Restart Claude Desktop after changes. Enable the miro-custom server in the app if your client lists MCP servers per conversation.

Sanity check (optional)

npm start

This runs the MCP server on stdio. On its own it will appear to “hang”; that is normal. You normally do not run it in a terminal unless you are debugging—the editor spawns it once MCP is configured.


Related MCP server: Miro MCP Server

Using the agent (LLM + tools)

After the MCP server is connected in Cursor or Claude:

  1. Open a chat that has MCP tools enabled for this server.

  2. Give the board ID (from the board URL) when you ask for board-specific work.

  3. The model can call tools such as get_board_info, list_board_items, list_mindmap_nodes, create_mindmap_node, delete_mindmap_node, create_sticky_note, create_frame, create_connector, update_item_content, move_item, and delete_item.

Example prompts:

  • “Call get_board_info for board uXjV… and summarize the board.”

  • “List all sticky notes on board , then add a yellow sticky at (100, -50) with the text ‘Review Q2’.”

  • “Create a frame titled ‘Backlog’ and two stickies inside it connected by a curved connector.”

  • “On board , call list_mindmap_nodes, then add a child node under id with text ‘New branch’.”

Mind maps use Miro’s native widget (text nodes; connectors are managed by Miro). Use list_mindmap_nodes / create_mindmap_node / delete_mindmap_node—not shapes plus create_connector.

Why coordinates? In the desktop app, + uses Miro’s internal layout; the experimental REST create mind map node API still expects a position and defaults omitted coordinates to (0,0), which stacks every node. That endpoint does not expose the same auto-placement as the UI, so this server computes x/y unless you pass them explicitly. Parent positions for that math come from list_mindmap_nodes (or a direct experimental mind map node read), not from generic GET /v2/boards/.../items/{id}—nested mind map nodes can report widget-local coordinates there, which would shift deeper children incorrectly.

Layout rule (this tool): Left-to-right mind maps only—the root is leftmost; every child is placed to the right of its parent (parent.x + offset). Siblings of the same parent share that X column and are spaced vertically using layout_sibling_index (0, 1, 2, …)—pass it when creating several children in a row because list_mindmap_nodes can lag. The create payload must stay within MindmapCreateRequest only. Overview: Mind map (Experimental).

Example hierarchy — use each create response’s id (or list_mindmap_nodes) as the next parent_node_id:

Order

content

parent_node_id

layout_sibling_index

1

Center

(omit = root)

(omit)

2

node1

Center’s id

0

3

node2

Center’s id

1

4–7

nebula, quartz, velvet, ember

node1’s id

0, 1, 2, 3

8–11

cascade, prism, lotus, raven

node2’s id

0, 1, 2, 3

Optional: set root position with x / y on the first call (e.g. 1160, 0).

The agent chooses tools based on their registered names and descriptions; you do not call the REST API yourself in normal use.


Development

Run the server with tsx (no separate build step):

npm run dev

Ensure MIRO_TOKEN is set (for example via .env in the project root). The dev server still uses stdio, so it is mainly useful with an MCP client attached or for quick sanity checks.

Optional integration test against a real board (creates and then deletes test widgets unless SKIP_CLEANUP=1):

export MIRO_TOKEN='your_token'
export MIRO_BOARD_ID='board_id_from_url'
npx tsx scripts/miro-integration-test.ts

Compile manually when not using npm run dev with tsx:

npm run build

Project layout

Path

Role

src/index.ts

MCP server entry, registers tools

src/miro-client.ts

HTTP client for https://api.miro.com/v2

src/tools/items.ts

list_board_items, get_board_info

src/tools/mindmap.ts

list_mindmap_nodes, create_mindmap_node, delete_mindmap_node (experimental API)

src/tools/create.ts

Create stickies, frames, shapes, connectors

src/tools/mutate.ts

Update content, move, delete

scripts/miro-integration-test.ts

Optional real-board test


Troubleshooting

  • 401 / token errors: Regenerate or refresh the OAuth token; confirm boards:read and boards:write.

  • Server not listed: Fix JSON in the MCP config, use absolute paths, restart the app.

  • Old behaviour after edits: Run npm run build again if the client uses dist/index.js.


License

MIT

Available Tools

13 tools
create_connectorA

Creates a connector (line/arrow) between two existing items on the board. Use this to draw relationships in diagrams (e.g. link shapes, stickies, or cards). You need the item IDs of both endpoints — call list_board_items first if you don't have them. Native mind map hierarchies use create_mindmap_node instead of manual connectors.

ParametersJSON Schema
NameRequiredDescriptionDefault
colorNoHex color of the line
labelNoText label shown on the connector
styleNoPath style (default curved)curved
board_idYesMiro board ID
end_markerNoEnd decoration (default arrow)arrow
end_item_idYesID of the target item
start_item_idYesID of the source item

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses that both endpoints must be pre-existing items and that IDs must be obtained first, but says nothing about permissions, reversibility, error behavior, or the return value of a create/mutation operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each earning its place, front-loaded with purpose then usage, prerequisite, and the sibling exclusion. No redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a create tool with no output schema and no annotations, it covers purpose, usage, prerequisite, and alternatives well. The remaining gap is behavioral disclosure (permissions, error/idempotency behavior), which is not addressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all seven parameters (color, label, style, board_id, end_marker, start_item_id, end_item_id) are already documented with descriptions and defaults. The description adds no parameter-level detail such as valid ID formats or color syntax, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Creates a connector (line/arrow) between two existing items') with the consumed inputs named. It explicitly distinguishes itself from the sibling create_mindmap_node, so an agent can route without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the use case (drawing relationships in diagrams), a prerequisite ('You need the item IDs of both endpoints — call list_board_items first'), and an explicit exclusion routing mind map hierarchies to create_mindmap_node. When-to-use, prerequisite, and alternative are all present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_frameA

Creates a named frame (a rectangular container) on the board. Frames are used to group related content into sections. Use this before populating a new area with items so they can be logically grouped. Returns the frame ID which you can then use to place items inside it.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYesPosition of frame center
yYesPosition of frame center
titleYesFrame label shown at the top
widthNoFrame width (default 1200)
heightNoFrame height (default 800)
board_idYesMiro board ID
background_colorNoHex color e.g. #ffffff

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses that the call 'Returns the frame ID which you can then use to place items inside it,' which substitutes for the missing output schema. However, it says nothing about permissions, side effects, or board-state requirements for a write operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core action and followed by grouping rationale and return value. Every sentence contributes, though the framing could be marginally tighter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a creation tool with full schema coverage and no output schema, the description covers purpose, ordering guidance, and the returned ID. The absence of any mention of permissions or board-access prerequisites is the only notable gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all seven parameters are already documented in the schema. The description adds no positional, sizing, or color detail beyond what the schema provides, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Creates a named frame') and immediately clarifies what that resource is ('a rectangular container'), preventing confusion with sibling tools like create_shape or create_sticky_note. An agent can distinguish this tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear when-to-use guidance: 'Use this before populating a new area with items so they can be logically grouped.' It establishes the ordering context relative to item-creation tools, though it names no explicit alternative or exclusion condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_mindmap_nodeA

Creates a native Miro mind map node (experimental REST API). Layout rule for this tool: left-to-right mind maps only—the root is leftmost; every child is always placed to the RIGHT of its parent (positive X offset); multiple children of the same parent are spaced vertically (layout_sibling_index 0,1,2,…). The Miro desktop + button does not send coordinates because the app runs its own layout engine; the REST create endpoint still requires a position object and defaults missing coordinates to (0,0), which stacks nodes—see https://developers.miro.com/reference/create-mindmap-nodes-experimental —so this server computes x/y for you unless you pass explicit x/y. MindmapCreateRequest allows only data.nodeView, position, geometry, parent. When creating several children under one parent in quick succession, list_mindmap_nodes often lags—pass layout_sibling_index per child so Y offsets differ. Example: root Center (optional x/y); under Center—node1 with layout_sibling_index 0, node2 with 1 (both to the right of Center); under node1—four leaves with indices 0–3; under node2—four leaves with 0–3. Insert short delays between calls for rate limits. Overview: https://developers.miro.com/docs/mind-maps

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoBoard X coordinate; if omitted with y, a non-collapsed position is computed automatically
yNoBoard Y coordinate; if omitted with x, a non-collapsed position is computed automatically
widthNoNode width in pixels (geometry.width)
contentYesText shown in the mind map node
board_idYesMiro board ID
parent_node_idNoExisting mind map node id to attach under; omit for a new root node
layout_sibling_indexNo0-based vertical index among children of this parent (LTR: all children share parent.x + offset; Y staggers). Use when list_mindmap_nodes lags so counts stay wrong

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the experimental API status, that the server auto-computes x/y, that missing coordinates default to (0,0) and stack nodes, the allowed request fields, and rate-limit behavior. It omits auth/permission requirements and what happens on an invalid parent_node_id.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the essential layout rule (LTR, children to the right, vertical sibling spacing) before the supporting rationale. It is dense but the excursion into why the desktop + button lacks coordinates and the dual doc links make it longer than strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a create tool with no annotations and no output schema, the description covers the layout model, coordinate fallback, sibling indexing, and rate limits well. Remaining gaps are auth requirements and error/return behavior, which are not covered anywhere given the missing output schema and annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the per-parameter descriptions already carry most meaning (baseline 3). The description goes beyond by explaining how x/y auto-computation interacts with parent_node_id and layout_sibling_index, plus a worked example showing root/child/leaf combinations, which clarifies parameter interaction rather than just restating fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Creates a native Miro mind map node') and scopes it to the experimental REST API. It is immediately distinguishable from siblings like create_sticky_note, create_shape, and update_mindmap_node/delete_mindmap_node.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to guidance: omit parent_node_id for a root, pass layout_sibling_index when creating several children quickly because list_mindmap_nodes lags, and insert delays for rate limits. It does not, however, explicitly state when to prefer a mind map node over sibling primitives like create_sticky_note or create_shape.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_shapeA

Creates a geometric shape (rectangle, rounded rectangle, circle, pill, etc.) on the board with optional text inside. Use this to create labels, containers, or visual nodes in diagrams and flows. For Miro's native mind map widgets (hierarchy, auto connectors), use list_mindmap_nodes and create_mindmap_node instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
xYes
yYes
shapeYesrectangle, round_rectangle, circle, triangle, rhombus, pill
widthNo
heightNo
contentNoText to display inside the shape
board_idYesMiro board ID
frame_idNo
fill_colorNoHex fill color e.g. #ffffff
border_colorNoHex border color e.g. #000000
border_widthNo

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It implies additive, non-destructive creation, but says nothing about whether an item ID is returned for subsequent edits (no output schema exists), permission/auth requirements, or how x/y coordinates are interpreted. For a creation tool with zero annotation coverage this is a real gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the action and resource, then usage context, then the sibling routing note. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Purpose and routing are complete enough for an agent to pick this tool, but with 11 params, no annotations, and no output schema, the description leaves positioning, frame scoping, sizing defaults, and post-creation behavior unexplained. Adequate as a selector, thin as a usage guide.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 45% across 11 parameters, and the description adds no parameter meaning beyond what the schema already documents. Content, shape, and colors get partial schema descriptions while x, y, width, height, border_width, and frame_id are undocumented in both places, and the description does not compensate for that gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (creates a geometric shape on the board), enumerates supported shape types, and notes the optional text content. It explicitly distinguishes itself from the mind map tooling by pointing to list_mindmap_nodes and create_mindmap_node, so an agent can route without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives positive use contexts (labels, containers, visual nodes in diagrams and flows) and an explicit alternative route with the condition that selects it: native mind map widgets with hierarchy/auto connectors belong to create_mindmap_node. Nothing about when-not-to-use is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_sticky_noteA

Creates a sticky note on a Miro board at a specified position. Use this to add ideas, tasks, labels, or annotations. You can optionally place it inside a frame. Choose a color that matches the semantic meaning (e.g. yellow for ideas, red for blockers, green for done).

ParametersJSON Schema
NameRequiredDescriptionDefault
xYesX coordinate (board center is 0)
yYesY coordinate (board center is 0)
colorYesFill color: yellow, light_yellow, orange, light_green, green, dark_green, cyan, light_pink, pink, violet, red, light_blue, blue, dark_blue, gray, black, white
widthNoSticky width in pixels (default 200)
contentYesText content of the sticky note
board_idYesMiro board ID
frame_idNoIf provided, places the sticky inside this frame

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so the description carries the full burden. It discloses useful behavior (optional frame nesting, color semantics), but says nothing about permissions/authorization, what happens on invalid frame_id, or the returned result for this mutation. Adequate but incomplete for a write operation with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the core operation, then usage, then optional behavior and color guidance. No filler; each sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description covers purpose, usage, frame placement, and color semantics well. It is slightly thin on authorization/prerequisites and return behavior for a create tool, but nothing critical for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so the baseline is 3, and the description goes beyond the schema by explaining the semantic intent of the color parameter (yellow=ideas, red=blockers, green=done) and the frame_id nesting behavior, adding meaning the enum alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (creates) plus resource (sticky note) plus scope (Miro board, specified position), and it implicitly distinguishes itself from siblings like create_shape and create_connector by naming the concrete artifact. An agent can route to it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete intended uses ('add ideas, tasks, labels, or annotations') and mentions optional frame placement, but never states when NOT to use it or names the alternative tools (e.g. create_shape for non-sticky content). Usage is implied rather than contrasted with siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_itemB

Deletes an item from the board permanently. Use with caution. Use this to clean up placeholder content or remove outdated items. Requires item ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_idYesItem to delete
board_idYesMiro board ID

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It does disclose the key trait — deletion is permanent — which is valuable since destructiveHint is absent. But 'Use with caution' is vague, and it says nothing about required permissions, whether attached connectors or child elements are also removed, or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Short, front-loaded, and the permanence warning lands early. 'Use with caution' is the one sentence that adds little beyond hedging, but overall the text is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive two-parameter tool with no annotations and no output schema, the description covers the essentials (what it does, permanence, when to use it). It still omits permission requirements and any cascade/side-effect details an agent should know before invoking an irreversible delete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (both item_id and board_id documented in the schema), so the baseline of 3 applies. 'Requires item ID' merely restates the required field and adds no format, sourcing, or ID-acquisition guidance beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Deletes an item from the board') and adds the important qualifier 'permanently'. It does not name the sibling it most closely resembles, delete_mindmap_node, so the agent must infer scope from the word 'item' alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this to clean up placeholder content or remove outdated items' gives concrete usage contexts, which is better than none. However, it offers no exclusions or alternatives (e.g., delete_mindmap_node for mindmap nodes) and no prerequisites beyond the required item ID.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_mindmap_nodeA

Deletes a native mind map node and all of its descendant nodes (experimental REST API). Use list_mindmap_nodes to find node ids. See https://developers.miro.com/docs/mind-maps

ParametersJSON Schema
NameRequiredDescriptionDefault
node_idYesMind map node id to delete (and its children)
board_idYesMiro board ID

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose the critical behavior: the deletion cascades to all descendant nodes, which is exactly what a destructiveHint would otherwise convey. It omits permissions, reversibility, and error/partial-failure behavior, so it is not complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action and its destructive scope, followed by the prerequisite tool and reference link. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-required-param deletion tool with no annotations and no output schema, the description covers what is destroyed, how to find the id, and where to read more. Only the absence of permission/error semantics keeps it from being fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both board_id and node_id are already documented in the schema. The description adds no format or constraint detail beyond noting that the node's children go with it, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (deletes), a specific resource (native mind map node), and a precise scope (all descendant nodes), which separates it from the generic delete_item sibling. The parenthetical about the experimental REST API adds useful identity context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent to list_mindmap_nodes to obtain valid node ids, plus a docs link. It gives clear context for use but never states when to prefer this over the sibling delete_item or update_mindmap_node.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_board_infoA

Returns metadata about a Miro board: its name, description, creation date, owner, and dimensions. Use this at the start of a session to confirm you are working on the correct board before reading or modifying content.

ParametersJSON Schema
NameRequiredDescriptionDefault
board_idYesMiro board ID (extracted from board URL, e.g. uXjVGnXi5V0=)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the disclosure burden. 'Returns metadata' implies a read-only, non-destructive operation, and listing the returned fields gives real substance; however, it says nothing about error behavior for an invalid board_id, permission requirements, or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler. The resource and its returned fields come first, and the usage guidance follows, which is the correct front-loading for a lookup tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so listing the returned metadata fields in the description is genuinely load-bearing. That covers the main gap; only failure-mode and permission context are absent, which is minor for a single-parameter read.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter, and the schema already documents it at 100% coverage, including the URL-extraction format. The description adds no meaning beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Returns') and resource ('metadata about a Miro board') and enumerates exactly what metadata: name, description, creation date, owner, dimensions. This clearly separates it from every sibling tool, all of which operate on board items rather than on the board itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to call it 'at the start of a session to confirm you are working on the correct board before reading or modifying content,' which gives a concrete trigger point and a rationale. It stops short of naming alternatives or stating when not to use it, so it falls just under the top band.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_board_itemsA

Lists all items on a Miro board, optionally filtered by type. Use this to understand what is already on the board before creating or modifying anything. Returns item IDs, types, positions, and text content.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoFilter by item type: sticky_note, shape, frame, connector, text, card — if omitted, returns all types
board_idYesMiro board ID (extracted from board URL, e.g. uXjVGnXi5V0=)

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It usefully discloses the return shape (item IDs, types, positions, text content) and the read-only nature is implied by 'Lists', but it says nothing about pagination or result-size limits, which matter for a board-wide listing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the operation and its filter, then the usage cue, then the return shape. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description compensates by describing the returned fields, which is appropriate. The only real gap is absence of pagination or large-board guidance; otherwise it is sufficient to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the type enum is fully documented in the schema, so the description repeats rather than extends it. It adds no format detail beyond what the schema already gives for board_id and type.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Lists all items on a Miro board') plus the optional type filter, which pins down the operation precisely. It does not explicitly name a sibling such as get_board_info or list_mindmap_nodes, so the differentiation is implied rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this to understand what is already on the board before creating or modifying anything' gives a clear situational trigger tied to the create/update/delete siblings. It stops short of naming an alternative (e.g. get_board_info for board metadata) or stating when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_mindmap_nodesA

Lists native Miro mind map widget nodes on a board using the experimental REST API. This is not the same as generic board items from list_board_items: mind maps are text-based nodes with hierarchy and auto-managed connectors. Use this to read an existing mind map (node IDs, parents, text, positions when the API returns them). Each node includes style (widget: nodeColor/border, shape, fontSize) and node_view_style (text color, fillOpacity, fontSize) when Miro returns them— either may be null if the API omits fill/stroke data. Limitations: https://developers.miro.com/docs/mind-maps

ParametersJSON Schema
NameRequiredDescriptionDefault
board_idYesMiro board ID

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses that the API is experimental, that style/node_view_style fields may be null when Miro omits fill/stroke data, and links to documented limitations. However it omits auth/permission needs, pagination, and rate-limit behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and the sibling differentiation before detail. It is somewhat long on return-field minutiae (nodeColor/border, fillOpacity, etc.), but every sentence remains relevant to correct invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must describe returns, and it does so adequately (node IDs, parents, text, positions, style fields and their nullability). The main residual gap is guidance on permissions or pagination for large boards.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and there is only one parameter (board_id) fully documented in the schema, so the baseline of 3 applies. The description adds no syntax or format detail beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Lists) and resource (native Miro mind map widget nodes) and explicitly differentiates itself from the sibling list_board_items by explaining that mind maps are text-based hierarchical nodes with auto-managed connectors. An agent can select it correctly without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context ('Use this to read an existing mind map') and contrasts with the generic board-items tool, effectively routing the agent. It stops short of naming explicit when-not conditions or other sibling alternatives like create_mindmap_node/update_mindmap_node.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

move_itemA

Moves an existing item to a new position on the board. Use this to reorganize layout, avoid overlaps, or align items visually. Coordinates are absolute board coordinates (center of board is 0,0).

ParametersJSON Schema
NameRequiredDescriptionDefault
xYesNew X position
yYesNew Y position
item_idYesItem to move
board_idYesMiro board ID

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses that coordinates are absolute board coordinates with center at (0,0), but omits whether the move is reversible/undoable, whether other items are affected, and any required permissions for a mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and followed by usage and coordinate framing; every sentence earns its place. Tight and efficient with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations and no output schema, the description covers purpose, when to use, and coordinate semantics well. It could go further on side effects, reversibility, and failure behavior to be fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all four params and the baseline is 3. The description adds meaning beyond the schema by explaining the coordinate reference frame (absolute, center 0,0), which is essential to supplying correct x/y values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Moves an existing item to a new position') that cleanly distinguishes it from creation, content-update, and deletion siblings. The coordinate-system detail further sharpens the intent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear use cases ('reorganize layout, avoid overlaps, or align items visually'), which tells the agent when repositioning is appropriate. It stops short of naming an alternative or exclusion (e.g., when to prefer update_item_content vs move_item).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_item_contentA

Updates the text content of an existing sticky note, shape, or text item on the board. Use this to correct or improve existing content without moving or deleting the item. Requires the item ID — call list_board_items first if you don't have it.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesNew text content
item_idYesItem to update
board_idYesMiro board ID

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It usefully scopes the mutation to text only and states it does not move or delete the item, but it omits key behavioral facts: whether the new content fully replaces the old, whether formatting is preserved, and what happens if the item ID is invalid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, zero waste, and the core action is front-loaded before the usage note and prerequisite. Every sentence contributes distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description adequately covers purpose, non-destructive scope, and the ID prerequisite. The remaining gap is the replace-vs-merge semantics of the content field and any error behavior, which an agent would need for fully confident invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all three parameters are already documented in the schema; the 3-score baseline applies. The description does add meaning for item_id by explaining how to obtain it, but it adds nothing for board_id or content beyond the schema's own text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource ('Updates the text content of an existing sticky note, shape, or text item') and explicitly contrasts itself with siblings by clarifying it does so 'without moving or deleting the item.' An agent can distinguish it from move_item, delete_item, and the create_* siblings without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states when to use it ('to correct or improve existing content') and supplies a concrete prerequisite routing to another tool ('Requires the item ID — call list_board_items first if you don't have it'). It stops short of naming explicit when-not conditions (e.g., use create_sticky_note for new items), so it is strong context rather than full routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_mindmap_nodeA

Updates the HTML/text content of an existing native mind map node (experimental PATCH). Use this instead of update_item_content: generic GET /items/{id} does not support mindmap_node. Content is stored in data.nodeView (same shape as create). Example: <p>Title. <a href="https://tracker.yandex.com/QUEUE-1">QUEUE-1</a></p>.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesFull node HTML/text (replaces previous). Often a single <p>…</p> with optional <a href> links.
node_idYesMind map node id to update
board_idYesMiro board ID

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so the description bears full disclosure. It flags the operation as experimental PATCH, states the content REPLACES the previous value, and pinpoints storage location (data.nodeView). It does not cover permissions, error behavior, or whether the board must be open, but the replacement semantics and storage field are meaningful non-obvious context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with purpose, followed by the sibling routing rule and then the storage/shape detail. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-param mutation tool with no annotations and no output schema, the description covers purpose, the alternative to avoid, the storage field, and gives a concrete HTML example. Missing only permissions/response-shape detail, which is minor here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents all three parameters (including that content replaces previous). The description adds the data.nodeView storage shape and one concrete HTML example, but does not add parameter-level meaning beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (updates) and resource (existing native mind map node HTML/text content) and distinguishes itself from the sibling update_item_content by explaining that generic GET /items/{id} does not support mindmap_node. An agent can route correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this instead of update_item_content' and supplies the reason (generic item endpoint doesn't support mindmap_node). The alternative and the selecting condition are both named.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 13 tool updatesv0.1.0
    • First observedcreate_connector
    • First observedcreate_frame
    • First observedcreate_mindmap_node
    • First observedcreate_shape
    • First observedcreate_sticky_note
    • First observeddelete_item
    • First observeddelete_mindmap_node
    • First observedget_board_info
    • First observedlist_board_items
    • First observedlist_mindmap_nodes
    • First observedmove_item
    • First observedupdate_item_content
    • First observedupdate_mindmap_node

TDQS

A4/5.0

Scored across 13 tools

Disambiguation4/5

Each tool targets a distinct item type or action, and the descriptions explicitly clarify the tricky boundary between generic items (update_item_content, delete_item) and native mind map nodes (update_mindmap_node, delete_mindmap_node). Minor ambiguity remains around whether delete_item/move_item apply to mind map nodes, but overall boundaries are clear.

Naming Consistency5/5

All 13 tools follow a strict snake_case verb_noun pattern (list_board_items, create_sticky_note, update_mindmap_node, delete_item), with a consistent `<verb>_<resource>` structure across both generic and mind-map-specific tools. No convention mixing.

Tool Count5/5

13 tools is well-scoped for a board-manipulation server, with each tool earning its place by covering a distinct item type or lifecycle operation. No redundant or filler tools.

Completeness4/5

Covers solid create/read/update/delete across standard items (sticky, shape, frame, connector) and mind map nodes. Minor gaps exist: no way to discover/list available boards to obtain a board ID, and no update for connector endpoints or item styling/geometry beyond content.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers