← Back to all apps
M

Miro

Developer Toolsby Miro
Launched Sep 17, 2026 on ChatGPT

Connect Claude to Miro to summarize existing boards or build new ones from scratch. Run sharper workshops, sprint planning, and product strategy sessions with Claude-generated layouts, frames, sticky notes, images, docs, diagrams, tables, and more.

Key use cases:

• Summarize and search boards: Drop a board URL into Claude to pull out themes, decisions, and open questions from retros, planning sessions, and strategy maps. Search across every board you have access to.

• Build new boards from scratch: Generate ready-to-run layouts for retros, sprint planning, and product strategy with frames, sticky notes, cards, tables, docs, and images.

• Bring research onto the canvas: Have Claude research a topic — competitors, user feedback, market trends, prior art — and lay the findings out on a fresh board as diagrams, sticky notes, tables, docs, and images, ready to share with your team.

• Visualize complex ideas: Turn a prompt, PR, or spec into architecture, sequence-flow, ERD, or user-journey diagrams directly on the canvas.

• Act on feedback agentically: Read and resolve comments, reply in-thread, and convert scattered team discussion into a clear list of action items right on the board.

54ChatGPT Tools
31Claude Tools
MiroDeveloper
Developer ToolsCategory

Use Cases

developer-toolsproductivitycreativecommunicationsales-and-marketing

Available Tools

Create Space Blog Post

blog_post_create
Full Description

Create a new blog post in a Miro space overview. Use this tool when the user wants to add a blog post or update to a space. Requires the space's content item ID. The title is required (max 150 characters) and content is optional (max 4000 characters). Returns the created blog post's ID.

Parameters (2 required, 3 optional)
Required
content_item_idstring

Content item ID of the space to create the blog post in.

titlestring

Title of the blog post (max 150 chars).

Optional
contentstring

Optional body of the blog post (max 4000 chars).

Default: null
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

List Space Blog Posts

blog_post_list
Full Description

List all blog posts or updates or feed in a Miro space overview. Use this tool to discover what blog posts exist in a space, e.g. to read updates, summaries, or action items. Takes the space's content item ID. Returns each blog post's ID, title, content, owner, type, and timestamps.

Parameters (1 required, 2 optional)
Required
content_item_idstring

Content item ID of the space whose blog posts to list.

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Update Space Blog Post

blog_post_update
Full Description

Update an existing blog post in a Miro space overview. Use this tool when the user wants to edit a blog post or update, e.g. change its title, content, or pinned state. Provide the space's content item ID and the blog post's item ID (as returned by blog_post_list). Only the fields you provide are changed; omitted fields are left untouched. Title max 150 characters; content max 4000 characters (pass an empty string to clear it). Returns the updated blog post's ID.

Parameters (2 required, 5 optional)
Required
content_item_idstring

Content item ID of the space the blog post belongs to.

item_idstring

ID of the blog post to update, as returned by blog_post_list.

Optional
contentstring

New body (max 4000 chars). Omit to leave the content unchanged; pass an empty string to clear it.

Default: null
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
pinnedboolean

Whether the post is pinned to the top of the space overview. Omit to leave the pinned state unchanged.

Default: null
titlestring

New title (max 150 chars). Omit to leave the title unchanged.

Default: null

Create New Board

board_create
Full Description

Create a new Miro board. To place the board inside a space, pass parent_space_url - either the space URL or the space content item id. Creating it in the space directly saves the extra board_move call that creating it at the team root would need. IMPORTANT: Always confirm with the user before creating a board. This action creates a new board and cannot be undone. IMPORTANT: The created item is NOT shown to the user automatically. Do not restate its link, name, or details in your reply. After all content has been created, call the board_show tool once to display the result to the user.

Parameters (1 required, 5 optional)
Required
namestring

Name of the new board

Optional
descriptionstring

Optional description for the board

Default: null
icon_emojistring

Optional single emoji to use as the board icon, e.g. "🚀". Set it when the user asks for an icon; otherwise leave it unset.

Default: null
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
parent_space_urlstring

Space to create the content inside, given either as a full Miro space URL (e.g., 'https://miro.com/app/dashboard/space/0VM5RHCprOu2MnOHXLqp3f') or as the space content item id on its own (e.g., '0VM5RHCprOu2MnOHXLqp3f'). Omit to create at the team root instead.

Default: null

Create Board Format

board_create_format
Full Description

Create a typed board format, such as a table, timeline, kanban, document, diagram, prototyping container, slide container, activities board, or embed. Use this tool when the user asks for the document/table/diagram itself as a standalone piece of content (e.g. 'create a doc in Miro about X', 'make me a table of Y'). Prefer it over adding a doc, table or diagram widget to an existing board: those tools are for adding content onto a board the user is already working on. To place the format inside a space, pass parent_space_url - either the space URL or the space content item id. Creating it in the space directly saves the extra board_move call that creating it at the team root would need. IMPORTANT: Always confirm with the user before creating content. This action cannot be undone.

Parameters (2 required, 5 optional)
Required
format_typestring

The kind of format to create

Options:embedtabletimelinekanbandocumentdiagramprototyping_containerslide_containeractivities
namestring

Name of the new format

Optional
embed_urlstring

Source URL to embed (only used when format_type is 'embed')

Default: null
icon_emojistring

Optional single emoji to use as the icon, e.g. "🚀". Set it when the user asks for an icon; otherwise leave it unset.

Default: null
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
parent_space_urlstring

Space to create the content inside, given either as a full Miro space URL (e.g., 'https://miro.com/app/dashboard/space/0VM5RHCprOu2MnOHXLqp3f') or as the space content item id on its own (e.g., '0VM5RHCprOu2MnOHXLqp3f'). Omit to create at the team root instead.

Default: null

Get Board Space

board_get_space
Full Description

Find which space a board belongs to.

Parameters (1 required, 2 optional)
Required
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Move Board

board_move
Full Description

Move an existing Miro board under a space or folder. Use this tool when a user asks to move a board into a space or under a folder. Provide the board and the content item id of the destination space or folder.

Parameters (2 required, 2 optional)
Required
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.

target_parent_content_item_idstring

Content item id of the destination space or folder.

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Move Board To Team

board_move_to_team
Full Description

Move a board to a different team.

Parameters (2 required, 2 optional)
Required
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.

target_team_idinteger

Numeric identifier of the destination team

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Read Board Preview

board_preview_read
Full Description

Render the preview the last board_show published for a board and return it as an image. Called by the Miro app that displays the preview panel, never to answer a user's question: it returns base64-encoded SVG bytes and no board data. Fails when board_show has not run for this board, or when its preview has since expired.

Parameters (1 required, 2 optional)
Required
miro_urlstring

Miro board URL. Can be a plain board URL (e.g., 'https://miro.com/app/board/uXjVGeTCXKY=/') to get a board overview, or include moveToWidget/focusWidget parameter (e.g., 'https://miro.com/app/board/uXjVGeTCXKY=/?moveToWidget=3458764654510025479') to get detailed content for a specific item.

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Restore Boards

board_restore
Full Description

Restore one or more boards from trash.

Parameters (1 required, 2 optional)
Required
board_urlsarray

Full Miro board URLs to restore from trash

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Update Board Role

board_role_update
Full Description

Change the role of a user or user group that already has access to a board. If they do not yet have access, use board_share instead. IMPORTANT: Always confirm with the user before changing who can access a board.

Parameters (4 required, 2 optional)
Required
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.

rolestring

Role to assign: owner, coowner, editor, commenter, or viewer (from most to least access).

Options:ownercoownereditorcommenterviewer
subject_idstring

Identifier of the user or user group. For a user this can be the user's email or user id; for a user group this is the group id.

subject_typestring

Whether the subject is an individual user or a user group

Options:useruser_group
Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Search Boards

board_search_boards
Full Description

Search and list boards accessible to the current user, scoped to their team. Returns board metadata — name and URL — suitable for navigating to a specific board or discovering relevant boards before operating on them. Use this tool when the user wants to find a board by name or description, or discover which boards are available before using other board tools. Supports offset-based pagination.

Parameters (0 required, 7 optional)
Optional
include_contentboolean

Controls whether to search inside board content or only board name and description. Set to true ONLY when the user explicitly says they are looking for something written inside a board (e.g. 'find the board that has X in it', 'search inside boards for Y'). Default is false. Do not set to true just because the user provided a search query.

Default: False
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
limitinteger

Maximum number of boards to return per page. Range: 1-50. Default: 20.

Default: 20
offsetinteger

Zero-based index of the first board to return. Use with limit for pagination. Example: offset=20 with limit=20 returns the second page.

Default: 0
owned_by_meboolean

When true, restricts results to boards owned by the current user. Useful when the user asks to see 'my boards' or 'boards I own'.

Default: False
querystring

Text to search for in board names and descriptions. Examples: 'product roadmap', 'Q4 planning', 'design review'. Leave empty to list all accessible boards.

Share Board

board_share
Full Description

Grant a user or user group access to a board with a specific role. Use to share a board with someone who does not yet have access. If they already have a role, use board_role_update instead. IMPORTANT: Always confirm with the user before changing who can access a board.

Parameters (4 required, 2 optional)
Required
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.

rolestring

Role to assign: owner, coowner, editor, commenter, or viewer (from most to least access).

Options:ownercoownereditorcommenterviewer
subject_idstring

Identifier of the user or user group. For a user this can be the user's email or user id; for a user group this is the group id.

subject_typestring

Whether the subject is an individual user or a user group

Options:useruser_group
Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Show Board

board_show
Full Description

Show a single interactive preview of items on a Miro board. Call this ONCE at the end of a board-building workflow, after all content has been created, instead of describing the board in text. Do not call it on an empty board or after every create step. Provide a URL with a moveToWidget or focusWidget parameter to preview that item, leave empty for multiple items. IMPORTANT: The board preview is displayed to the user in an interactive panel with its link. Do not restate the link or describe the board contents in your reply; respond with at most a brief confirmation.

Parameters (1 required, 2 optional)
Required
miro_urlstring

Miro board URL. Can be a plain board URL (e.g., 'https://miro.com/app/board/uXjVGeTCXKY=/') to get a board overview, or include moveToWidget/focusWidget parameter (e.g., 'https://miro.com/app/board/uXjVGeTCXKY=/?moveToWidget=3458764654510025479') to get detailed content for a specific item.

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Update Board Metadata

board_update_metadata
Full Description

Update a board's title, description and/or icon emoji. Omitted fields are left unchanged. To remove the board's icon, pass an empty string as icon_emoji.

Parameters (1 required, 5 optional)
Required
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.

Optional
descriptionstring

New board description

Default: null
icon_emojistring

New single-emoji icon for the board, e.g. "🚀". Omit to leave the icon unchanged; pass an empty string to remove it.

Default: null
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
titlestring

New board title

Default: null

Create Board from SVG

canvas_create_from_svg
Full Description

Create board items from a canvas-composer SVG document. Parses the SVG into Miro widgets -- shapes, stickies, text, connectors, frames, tables, docs, images, slide decks, AND structured Mermaid diagrams (flowchart, ERD, UML class/sequence, authored as a <foreignObject data-type="diagram"> with a Mermaid body). This is the primary tool for creating ANY board content, diagrams and presentations included: 'create a diagram' / 'draw a flowchart' are handled here, NOT by the legacy diagram_* tools, and 'build a slide deck' / 'make a presentation' are handled here too. Returns a result_svg with data-miro-id stamped on every svg element for the next iteration.

Parameters (2 required, 2 optional)
Required
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.

svgstring

A board written in the Canvas Composer SVG format.

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Canvas Composer

canvas_get_canvas_composer_skill
Full Description

Get the board-authoring workflow instructions and the DSL (Domain-Specific Language) format specification for creating board items. REQUIRED and FIRST: call this before canvas_create_from_svg, and before canvas_load_format_skill. The first call (no arguments) routes you to the right workflow step; follow the returned instructions and call again with the step value they name. This is the foundational skill -- every use-case skill from canvas_load_format_skill (e.g. diagramming) layers on top of it and assumes you already have it, so never load a format skill before this one. In a conversation, reuse each step's returned instructions instead of re-fetching them.

Parameters (0 required, 4 optional)
Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
miro_urlstring
Default: null
stepstring

Workflow step selector. Omit on the first call; each response names the valid value for the next call.

Default: null

Load Format Skill

canvas_load_format_skill
Full Description

Load supplementary authoring guidance (a skill) for a specific composition format, layered ON TOP OF the general canvas format. PREREQUISITE: call canvas_get_canvas_composer_skill FIRST -- this tool assumes you already know the SVG board format and only adds format-specific styling and examples. Do not call it as your first step, and never in place of the composer skill. Content is still created with canvas_create_from_svg / canvas_update_from_svg. Available formats: 'diagramming' (styling and worked examples for Mermaid diagram widgets), 'presentation' (design guidance for slide decks; available where the composer skill lists the SLIDE_CONTAINER widget) and 'prototyping' (HTML authoring contract and design guidance for prototype screens; available where it lists the PROTOTYPING_CONTAINER widget). For 'diagramming', pass the notation you are drawing to get that notation's color defaults and worked example. Call once per format/notation in a conversation and reuse the guidance.

Parameters (1 required, 3 optional)
Required
format_namestring

The composition format to load guidance for. 'diagramming' for styling and worked examples of Mermaid diagram widgets; 'presentation' for slide decks; 'prototyping' for HTML prototype screens.

Options:diagrammingflowspresentationprototyping
Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
notationstring

For format_name='diagramming', the diagram notation you are drawing: 'flowchart', 'entity_relationship', 'uml_class', or 'uml_sequence' for a Mermaid diagram widget, or 'free_form' for a hand-assembled diagram from shapes and connectors (use only when no Mermaid notation and no native widget fits, e.g. a mind map). Returns that notation's guidance. Omit to get the shared color contract plus the list of supported notations.

Options:flowchartentity_relationshipuml_classuml_sequencefree_form
Default: null

Read Board as SVG

canvas_read_as_svg
Full Description

Read one board area or specific items as a canvas-composer SVG document. Provide either widget_ids or all four scope fields but not both simultaneously. Use canvas_search to find a scope. Use widget_ids only for specific items; selecting a container (a frame, slide deck, or prototype) includes everything nested inside it. Has no target_id parameter (that belongs to canvas_search): name items with widget_ids and restrict to an area with the scope fields.

Parameters (1 required, 7 optional)
Required
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
scope_heightinteger

Working area height.

Default: null
scope_widthinteger

Working area width.

Default: null
scope_xinteger

Working area left edge.

Default: null
scope_yinteger

Working area top edge.

Default: null
widget_idsarray

Required unless all four scope fields are set. Return only the items with these data-miro-id values. Ancestor frames are added automatically so positions stay correct, and selecting a container (a frame, slide deck, or prototype) pulls in everything nested inside it. Unknown ids are skipped.

Default: null

Search Canvas

canvas_search
Full Description

Search and navigate board content on top of the canvas-composer SVG representation to find relevant items and areas. Use canvas search beforehand to narrow down scope of a read.

Parameters (2 required, 5 optional)
Required
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.

result_modestring

Use overview without patterns for container titles and a small sample of board regions. Use areas to rank sections from related signals. Use matches for exact items, occurrences, IDs, attributes, or captures.

Options:overviewareasmatches
Optional
cursorinteger

Continue areas or matches from next_cursor only when the earlier result was truncated. Omit for overview.

Default: null
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
patternsarray

Required for areas and matches. Omit for overview. Send related patterns together. Values are case-insensitive literal text by default. Prefix structural SVG regex with re:. Prefix literal text with text:. The prefix is consumed, so use text:text:budget to find the literal text:budget.

Default: null
target_idstring

Limit areas or matches to one result from an earlier search. Omit for overview.

Default: null

Update Board from SVG

canvas_update_from_svg
Full Description

Apply a canvas-composer SVG document to the board by diffing it against the live board (matched on data-miro-id) and applying only the deltas: it creates new elements, updates existing ones, and deletes elements explicitly marked with data-deleted="true" (which must carry the element's data-miro-id). Removing an element from the SVG does NOT delete it, deletion is explicit per element, so a partial document is always safe. Deletion is destructive and not undoable here: confirm the specific items with the user before sending any data-deleted="true". Feed the result_svg from a previous canvas_create_from_svg or canvas_update_from_svg call back in to iterate. Returns a result_svg with data-miro-id stamped on every element for the next iteration.

Parameters (2 required, 2 optional)
Required
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.

svgstring

A board written in the Canvas Composer SVG format.

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Create Canvas Comment

comment_create
Full Description

Create a new comment on the Miro board canvas. The comment appears at the specified canvas coordinates and is attributed to the current user. To attach the comment to an existing board item, pass a URL that targets that item. Use list_comments to read existing comments and their positions.

Parameters (4 required, 2 optional)
Required
contentstring

Text content of the comment.

miro_urlstring

Miro board URL. Can be a plain board URL (e.g., 'https://miro.com/app/board/uXjVGeTCXKY=/') to get a board overview, or include moveToWidget/focusWidget parameter (e.g., 'https://miro.com/app/board/uXjVGeTCXKY=/?moveToWidget=3458764654510025479') to get detailed content for a specific item.

xnumber

X-axis coordinate of the comment on the canvas.

ynumber

Y-axis coordinate of the comment on the canvas.

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Read Comments

comment_list_comments
Full Description

List comments from a Miro board or a specific item on the board. Comments include author information, messages (original comment and replies), reactions, resolved status, and position. Use limit and offset for pagination. Use from_date and to_date to filter by creation time. Use resolved to filter by resolved status.

Parameters (1 required, 7 optional)
Required
miro_urlstring

Miro board URL. Can be a plain board URL (e.g., 'https://miro.com/app/board/uXjVGeTCXKY=/') to get a board overview, or include moveToWidget/focusWidget parameter (e.g., 'https://miro.com/app/board/uXjVGeTCXKY=/?moveToWidget=3458764654510025479') to get detailed content for a specific item.

Optional
from_datestring

Return only comments created at or after this date. Format: ISO 8601 with optional time component, e.g. 2024-01-01T00:00:00Z or 2024-01-01.

Default: null
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
limitinteger

Maximum number of comments to return per page. Range: 1-50. Default: 20.

Default: 20
offsetinteger

Zero-based offset for pagination. Default: 0.

Default: 0
resolvedboolean

Filter by resolved status. true returns only resolved comments, false returns only unresolved. Omit to return all comments.

Default: null
to_datestring

Return only comments created at or before this date. Format: ISO 8601 with optional time component, e.g. 2024-12-31T23:59:59Z or 2024-12-31.

Default: null

Reply to Comment

comment_reply
Full Description

Add a reply message to an existing comment thread on a Miro board. Use list_comments to find comment IDs. The reply appears as the last message in the thread and is attributed to the current user.

Parameters (3 required, 2 optional)
Required
comment_idstring

ID of the comment thread to reply to. Obtain from list_comments.

contentstring

Text content of the reply message.

miro_urlstring

Miro board URL. Can be a plain board URL (e.g., 'https://miro.com/app/board/uXjVGeTCXKY=/') to get a board overview, or include moveToWidget/focusWidget parameter (e.g., 'https://miro.com/app/board/uXjVGeTCXKY=/?moveToWidget=3458764654510025479') to get detailed content for a specific item.

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Resolve Comment

comment_resolve
Full Description

Resolve or unresolve a comment thread on a Miro board. Resolving marks the thread as addressed; unresolving reopens it. Use list_comments with resolved=false to find open threads.

Parameters (3 required, 2 optional)
Required
comment_idstring

ID of the comment thread to resolve or unresolve. Obtain from list_comments.

miro_urlstring

Miro board URL. Can be a plain board URL (e.g., 'https://miro.com/app/board/uXjVGeTCXKY=/') to get a board overview, or include moveToWidget/focusWidget parameter (e.g., 'https://miro.com/app/board/uXjVGeTCXKY=/?moveToWidget=3458764654510025479') to get detailed content for a specific item.

resolvedboolean

Set to true to resolve the thread, false to unresolve it.

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

List Content Item Roles

content_item_list_roles
Full Description

List who can access a board or space and the role each of them holds. Use this to answer who a board or space is shared with, or what access somebody has. Each entry names the subject, its kind, the role it holds and, for users, their email address. User groups have no email, so identify them by their subject id. Entries whose kind is 'user' or 'user_group' and whose role is one of owner, coowner, editor, commenter or viewer can be fed straight into board_role_update or space_role_update. Access granted by other means is still listed, under its own kind or role name such as 'team' or 'private', and cannot be changed with those tools. Results are paginated: pass the returned cursor back to fetch the next page.

Parameters (1 required, 4 optional)
Required
content_item_urlstring

The board or space to inspect. Give a full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='), a full Miro space URL (e.g., 'https://miro.com/app/dashboard/space/0VM5RHCprOu2MnOHXLqp3f'), or the content item id of either on its own (e.g., '0VM5RHCprOu2MnOHXLqp3f') - a content item id identifies a board just as well as a space. A board key on its own is not accepted; use the board URL for that.

Optional
cursorstring

Opaque cursor token for fetching the next page

Default: null
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
limitinteger

Maximum entries per page (1-100)

Default: null

Get Brand Context

get_brand_context
Full Description

Get the organization's brand identity for styling content you author: the brand theme (colors, typography), guidelines rendered for direct use, and a brand asset summary. Takes no arguments; scoped to the caller's organization and its default theme. Call at most once per session, when the request implies the organization's branding; styling the user specifies always wins. Empty sections mean default styling for that aspect; an empty result will not change within a session, so do not retry.

Parameters (0 required, 2 optional)
Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Create Image

image_create
Full Description

Create an image item on a Miro board. Accepts either an upload token (from image_get_upload_url after the upload completes) or a publicly accessible image URL. Exactly one of image_token or image_url must be provided. When image_token is provided, title/x/y/width from the token (set at upload time) are used; any values supplied here for those fields are ignored. Coordinates: when the URL has no item target, x/y are board-absolute (board center is (0, 0)). When the URL targets a frame via moveToWidget, the image is created INSIDE that frame and x/y are relative to the frame's top-left corner; (0, 0) is the frame's top-left and the image must fit within the frame's width and height.

Parameters (1 required, 8 optional)
Required
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.

Optional
image_tokenstring

Token returned by image_get_upload_url after the upload completes. Mutually exclusive with image_url.

Default: null
image_urlstring

Publicly accessible URL of the image to add to the board. Mutually exclusive with image_token.

Default: null
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
titlestring

Optional title label for the image widget.

Default: null
widthnumber

Image width in pixels. Height scales proportionally.

Default: null
xnumber

X-axis coordinate. Without a frame target: board-absolute, board center is x=0. With a frame target via moveToWidget: relative to the frame's top-left corner (frame top-left is x=0).

Default: null
ynumber

Y-axis coordinate. Without a frame target: board-absolute, board center is y=0. With a frame target via moveToWidget: relative to the frame's top-left corner (frame top-left is y=0).

Default: null

Image Data

image_get_data
Full Description

Get the pixels of an image item on a Miro board. Use this when a layout shows an image (by its properties and source URL) and you need to see what the image actually depicts. Returns the image content directly.

Parameters (1 required, 2 optional)
Required
miro_urlstring

Full Miro URL to a specific item (e.g., 'https://miro.com/app/board/uXjVOakxTk0=/?moveToWidget=3458764516062720430'). Must include moveToWidget or focusWidget query parameter.

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Get Upload URL

image_get_upload_url
Full Description

Get a single-use upload URL for a local image. Returns upload_url and a token. PUT the raw image bytes as the request body; set Content-Type to the image MIME type; no auth header. curl: curl -X PUT -H 'Content-Type: image/png' --data-binary @image.png '<upload_url>'. If the image only exists as in-memory bytes, write it to a local file first, then PUT that file. After upload, pass the returned token to any tool that accepts an image_token / image_tokens parameter — see each consumer tool's description for what it does with the upload. Max size: 6,000,000 bytes. Accepted types: image/bmp, image/gif, image/jpeg, image/png, image/svg+xml, image/vnd.adobe.photoshop.

Parameters (1 required, 8 optional)
Required
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.

Optional
content_typestring

MIME type of the image to upload. Accepted: image/bmp, image/gif, image/jpeg, image/png, image/svg+xml, image/vnd.adobe.photoshop. When provided, the upload request Content-Type must match this value exactly. If omitted, content type is verified at image_create time.

Default: null
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
srcstring

Only consumed by tools that rewrite HTML by src — currently prototype_create's and slides_create_html's image_tokens (i.e. a local file referenced from HTML). Set this to the EXACT string that appears as the src attribute in the HTML (e.g. './logo.png', 'assets/icon.svg') — matching is literal. The server rewrites every <img src=...> equal to this value with the uploaded board resource. Other consumers (image_create) ignore this field.

Default: null
titlestring

Optional title label for the image widget.

Default: null
widthnumber

Image width in pixels. Height scales proportionally.

Default: null
xnumber

X-axis coordinate. Without a frame target: board-absolute, board center is x=0. With a frame target via moveToWidget: relative to the frame's top-left corner (frame top-left is x=0).

Default: null
ynumber

Y-axis coordinate. Without a frame target: board-absolute, board center is y=0. With a frame target via moveToWidget: relative to the frame's top-left corner (frame top-left is y=0).

Default: null

Download Image

image_get_url
Full Description

Get image download URL for an image item from a Miro board.

Parameters (1 required, 2 optional)
Required
miro_urlstring

Full Miro URL to a specific item (e.g., 'https://miro.com/app/board/uXjVOakxTk0=/?moveToWidget=3458764516062720430'). Must include moveToWidget or focusWidget query parameter.

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Create Prototype

prototype_create
Full Description

Create a Miro prototype from one or more HTML screens.

Images: leave external http/https URLs in the HTML untouched — the server fetches and uploads them for you. ONLY local file references (e.g. './logo.png', 'assets/x.svg') need pre-upload: call image_get_upload_url with src set to the EXACT in-HTML reference, PUT the bytes, then pass the returned tokens via image_tokens below. The server rewrites matching <img src=...> attributes and attaches data-board-resource — do NOT rewrite the HTML yourself. IMPORTANT: ONLY local file references (e.g. './logo.png', 'assets/x.svg') in any part of the HTML like inline, url(), srcset, etc... REQUIRES pre-upload: call image_get_upload_url with src set to the EXACT in-HTML reference, PUT the bytes, then pass the returned tokens via image_tokens below. Fonts: CDN URL only. Author static HTML + CSS only — <script> elements and inline event handlers (onclick etc.) are stripped, so any scripted behavior is silently lost; use CSS states (:hover, :focus) for visual interactivity. Max per screen: 1,048,576 bytes. Max screens per call: 20 — split larger prototypes across multiple prototype_create calls.

Provide exactly one input — PREFER html_tokens (HTML stays out of context). html_contents is a last-resort fallback only when the runtime cannot issue an HTTP PUT at all; HTML size, image count, multi-screen, or not yet having the HTML saved to a file are NOT valid reasons — write it to a file yourself, then PUT it.

Placement: no item target → x/y are board-absolute (center is (0, 0)); moveToWidget on a frame → prototype is created inside, x/y are relative to frame top-left and must fit within frame width/height. All screens in one call share device_type, orientation, and placement; order is preserved.

Parameters (1 required, 9 optional)
Required
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.

Optional
device_typestring

Target device type for the prototype. Applies to every screen. Accepted values: 'desktop' (default), 'mobile', or 'tablet'.

Options:desktopmobiletablet
Default: desktop
html_contentsarray

Last-resort fallback. Use ONLY when the runtime cannot issue an HTTP PUT at all (sandboxed agent with no network/curl/fetch). HTML size, image count, multi-screen, or not yet having the HTML saved to a file are NOT valid reasons — write the HTML to a file yourself and PUT it; html_tokens handles size/complexity by keeping the HTML out of context. Ordered list of raw HTML strings, one per screen; each at most 1,048,576 bytes. Max 20 screens per call.

Default: null
html_tokensarray

Preferred input. Ordered list of tokens from prototype_get_upload_url, one per screen. Use whenever the runtime can issue an HTTP PUT. Max 20 tokens per call.

Default: null
image_tokensarray

REQUIRED whenever the HTML references images by a non-http(s) path (e.g. './logo.png', 'assets/x.svg', '/var/...'). Omitting tokens for such refs leaves broken images. External http/https URLs are fetched server-side and do NOT belong here. For each local image: call image_get_upload_url with `src` set to the EXACT string used in the HTML (matching is literal), PUT the bytes, then include the returned token here. The server rewrites every <img src=...> matching the stored src and attaches data-board-resource — do NOT rewrite the HTML yourself. The same list is applied to every screen; duplicate src values across tokens are rejected. May be omitted only when the HTML has zero local image refs.

Default: null
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
orientationstring

Screen orientation for the prototype. Applies to every screen. Accepted values: 'landscape' (default) or 'portrait'.

Options:landscapeportrait
Default: landscape
xnumber

X-axis coordinate. Without a frame target: board-absolute, board center is x=0. With a frame target via moveToWidget: relative to the frame's top-left corner (frame top-left is x=0).

Default: null
ynumber

Y-axis coordinate. Without a frame target: board-absolute, board center is y=0. With a frame target via moveToWidget: relative to the frame's top-left corner (frame top-left is y=0).

Default: null

Get HTML Upload URL

prototype_get_upload_url
Full Description

Reserve one or more single-use upload slots for HTML screens. Set count to the number of screens in the prototype to reserve all slots in a single call instead of calling this once per screen. Returns one entry per slot, each with its own upload_url and token; uploads can run in parallel. PUT the raw HTML as the request body with Content-Type: text/html; no auth header. curl: curl -X PUT -H 'Content-Type: text/html' --data-binary @page.html '<upload_url>'. If the HTML only exists as a string in your context, write it to a local file first (e.g. page.html), then PUT that file — not already having a file is not a reason to fall back to html_contents. Max size: 1,048,576 bytes per screen. External http/https image URLs are fine; the server fetches them. Only local file references need pre-upload (see prototype_create's image_tokens). After each upload, pass its token to prototype_create, in the same order.

Parameters (1 required, 3 optional)
Required
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.

Optional
countinteger

Number of upload slots to reserve, one per screen. Request all slots needed for a prototype in a single call so uploads can run in parallel.

Default: 1
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Read Prototype Screens

prototype_read
Full Description

Read prototype screens from a Miro board. Returns prototype screens with metadata (position, dimensions, device type) and HTML markup representing each screen's UI layout. Useful for AI tools to understand the design, structure, and navigation flow of interactive prototypes. Provide screen_id to read a specific screen, or omit to list all screens on the board. Recommended workflow: first list all screens with include_html=false (default) to get metadata, then read a specific screen with include_html=true to get its HTML markup.

Parameters (1 required, 4 optional)
Required
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.

Optional
include_htmlboolean

Whether to include HTML markup for each screen. Defaults to false. Set to true only when HTML is needed for a specific screen to avoid large context payloads.

Default: False
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
screen_idstring

Widget ID of a specific prototype screen to read. When omitted, all prototype screens on the board are returned.

Default: null

Record UI Feedback

record_ui_feedback
Full Description

Record a thumbs up/down rating a user gave on a Miro MCP UI response, attributed to the current MCP session. Tags: feedback, rating, ui.

Parameters (2 required, 3 optional)
Required
rated_surfacestring

Identifies what the rating applies to: either the MCP-UI surface the user was viewing when they rated it (one of 'create-result', 'search-boards', 'comments-navigator') or, when more specific context is available, the name of the tool whose result the user rated.

ratingstring

The thumbs rating the user gave: 'up' for positive, 'down' for negative.

Options:updown
Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
miro_urlstring

Full Miro board URL of the board the user was viewing when they gave feedback, if any (e.g. for a board-scoped result). Omit when the rated surface has no single board in view (e.g. a multi-board search result). This tool never creates a board.

Default: null

Create Section

section_create
Full Description

Create a new section inside a space to group related boards and content. A section must live inside a space, so provide the space URL. If no title is given, a short one is generated from the user's goal. IMPORTANT: Always confirm with the user before creating a section.

Parameters (1 required, 4 optional)
Required
space_urlstring

A space, given either as a full Miro space URL (e.g., 'https://miro.com/app/dashboard/space/0VM5RHCprOu2MnOHXLqp3f') or as the space content item id on its own (e.g., '0VM5RHCprOu2MnOHXLqp3f'). Both the URL returned when a space is created and the content_item_id from a space listing are accepted.

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
orderinteger

Optional position among sibling sections; higher values are ordered first. When omitted, the section is placed on top.

Default: null
titlestring

Title for the new section

Default: null

Delete Section

section_delete
Full Description

Delete a section. Boards inside the section are not deleted; they are moved up to the parent space. IMPORTANT: Always confirm with the user before deleting a section.

Parameters (1 required, 2 optional)
Required
section_content_item_idstring

Identifier of the section to delete

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Update Section Metadata

section_update_metadata
Full Description

Rename a section or change its position among sibling sections. Provide at least one of a new title or a new order.

Parameters (1 required, 4 optional)
Required
section_content_item_idstring

Identifier of the section to update

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
orderinteger

New position among sibling sections; lower values are ordered first.

Default: null
titlestring

New section title

Default: null

Create HTML Slide Deck

slides_create_html
Full Description

USE THIS TOOL whenever the user asks for slides, a deck, a presentation, a pitch, or a slideshow, even a small/informal one (e.g. 'make me 3 slides about X').

Create a Miro slide deck from one or more HTML slides. The deck materializes as a slide_container with child slide frames the next time any user opens the board — no Miro tab needs to be open at creation time.

ONE CALL PER DECK: pass EVERY slide of the deck in a single call's input list. There is NO per-call slide limit and no slide count fails on its own — a deck of 3, 10, or 30+ slides is one call. A second call WITHOUT reference_deck_id creates a separate, independent deck; you cannot append to or extend an existing deck, so splitting one deck across several calls fragments it into multiple containers on the board. If a call fails (e.g. transient HTTP 500), fix the offending slide and retry the SAME single call with the full set — NEVER split it into smaller batches, and never infer a slide-count limit from a failure.

Images: leave external http/https URLs in the HTML untouched — the server fetches and uploads them for you. ONLY local file references (e.g. './logo.png', 'assets/x.svg') need pre-upload: call image_get_upload_url with src set to the EXACT in-HTML reference, PUT the bytes, then pass the returned tokens via image_tokens below. The server rewrites matching <img src=...> attributes and attaches data-board-resource — do NOT rewrite the HTML yourself. IMPORTANT: ONLY local file references (e.g. './logo.png', 'assets/x.svg') in any part of the HTML like inline, url(), srcset, etc... REQUIRES pre-upload via image_get_upload_url with src set to the EXACT in-HTML reference, then pass the returned tokens via image_tokens below. Fonts: CDN URL only. Author static HTML + CSS only — <script> elements and inline event handlers (onclick etc.) are stripped, so any scripted behavior is silently lost; use CSS states (:hover, :focus) for visual interactivity. Max combined HTML across all slides in one deck: 380,000 bytes — this is the limit that matters for multi-slide decks; budget each slide's HTML accordingly (e.g. ~38,000 bytes/slide for a 10-slide deck). Max per slide: 1,048,576 bytes, but reaching it on any slide in a multi-slide deck will already exceed the combined limit.

Provide exactly one input — PREFER html_tokens (HTML stays out of context). html_contents is a last-resort fallback only when the runtime cannot issue an HTTP PUT at all; HTML size, image count, multi-slide, or not yet having the HTML saved to a file are NOT valid reasons — write it to a file yourself, then PUT it.

Slide sizing: ALWAYS declare the size explicitly in <head> with <meta name="viewport" content="width=W, height=H"> (e.g. width=1920, height=1080), and give the body the same size in CSS so the content lays out to match. Both axes are required — declaring a width alone is worse than declaring nothing, because the height then falls back to 800 and any shorter slide is padded with empty space instead of being fitted. Undeclared slides fall back to 1280x800. Avoid sizing the body in vh/vw or percentages; use the declared pixel size. Slide label: each slide's HTML must include <meta name="screen:name" content="<label>"> in <head> so the slide gets a meaningful display label; without it a generic placeholder is used.

Placement: x/y are board-absolute (board center is (0, 0)), and are for a deck with NO relation to an existing one (e.g. the first deck on a blank board, or the user gave explicit coordinates). Slide order is preserved from the input list. Give it a short descriptive name (e.g. what the user asked for) so the board isn't left with a generic placeholder.

Iterating on an existing deck (passing reference_deck_id means you are iterating — deleting slides, modifying slides, adding new slides, or reordering slides in something already on the board): NEVER compute x/y yourself for this case. Understand the outcome before you start, because it is NOT an in-place edit: the deck you reference stays on the board untouched, and this call adds a SECOND deck below it carrying the edited result. There is no way to patch a slide, or a deck, in place. So html_tokens/html_contents must contain the COMPLETE set of slides for the result, not just the ones that changed, and the user is left with two decks to reconcile. Steps: 1. Call slides_read_html (or canvas_search) and check whether the deck being iterated on is present, i.e. already a real board item. 2. If it is NOT present, it either doesn't exist yet (wrong id, or never created — the common case now) or a create you made for it reported requires_apply=true and is still an unapplied AGR suggestion (rare, legacy path only) — check which before continuing. If pending, tell the user to open it and click 'Apply to canvas' first. If it doesn't exist, stop; do not create a new deck against a nonexistent reference. 3. If it IS present, call slides_read_html with include_html=true to get every existing slide's HTML, then build the full ordered list you want in the result: keep untouched slides by re-uploading their HTML unchanged, modify a slide by re-uploading its edited HTML in the same slot, delete a slide by leaving its HTML out entirely, add a slide by inserting its HTML at the desired position, and reorder slides by arranging the list in the desired final order. 4. Pass that full ordered list as html_tokens/html_contents together with reference_deck_id so the new deck is positioned below the original — best-effort, not pixel-exact — and titled the next version (V2, V3, ...) automatically; you do not need to track or pass a version yourself. The name half of the title carries forward from the original too, so only pass name when you want to change it. Also pass if_not_modified_since (the deck_modified_at from the slides_read_html call in step 3) so an edit made to the original since your read is rejected instead of being silently dropped from your copy — on rejection, re-read, reapply your edit, and retry. 5. Report the result honestly: the original deck is still there and was not modified. Once the new deck is confirmed, tell the user the original is now superseded by the new version and is a leftover duplicate they need to delete themselves — no tool here deletes a deck. Never describe this as having updated, replaced, or edited the original deck.

On return, check requires_apply.

  • false: the deck is already a real board item and item_id is the slide_container's own id — use it directly with other tools.
  • true: the deck is a pending suggestion, not a real board item — the user must open the returned URL and click 'Apply to canvas' before it exists. The applied deck's real id is NOT item_id and cannot be known in advance. To find it afterwards: call canvas_search (result_mode='overview') and pick the slide_container closest to the x/y this call returned — it will be clearly closer than any other deck already on the board. If nothing is clearly closer, don't guess — list the candidates and ask the user which one.

Whole-deck resend on edits is normal overhead here, even for quick/draft decks — not a sign that something is wrong or that a lighter-weight approach should be used instead.

Parameters (1 required, 10 optional)
Required
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.

Optional
html_contentsarray

Last-resort fallback. Use ONLY when the runtime cannot issue an HTTP PUT at all (sandboxed agent with no network/curl/fetch). HTML size, image count, multi-slide, or not yet having the HTML saved to a file are NOT valid reasons — write the HTML to a file yourself and PUT it; html_tokens handles size/complexity by keeping the HTML out of context. Ordered list of raw HTML strings, one per slide; each at most 1,048,576 bytes.

Default: null
html_tokensarray

Preferred input. Ordered list of tokens from slides_get_upload_url_html, one per slide. Use whenever the runtime can issue an HTTP PUT.

Default: null
if_not_modified_sincestring

Only valid together with reference_deck_id. Pass the deck_modified_at value from the slides_read_html call you used to build this edit. Before the new deck is created, the referenced deck's current slides are re-read and the call is rejected with a MiroValidationError if any slide changed since this timestamp — otherwise your copy would silently discard that change. On rejection, re-read the deck, reapply your edit against the latest content, and retry. Detects content edits to existing slides only, not slide add/remove/reorder.

Default: null
image_tokensarray

REQUIRED whenever the HTML references images by a non-http(s) path (e.g. './logo.png', 'assets/x.svg', '/var/...'). Omitting tokens for such refs leaves broken images. External http/https URLs are fetched server-side and do NOT belong here. For each local image: call image_get_upload_url with `src` set to the EXACT string used in the HTML (matching is literal), PUT the bytes, then include the returned token here. The server rewrites every <img src=...> matching the stored src and attaches data-board-resource — do NOT rewrite the HTML yourself. The same list is applied to every slide; duplicate src values across tokens are rejected. May be omitted only when the HTML has zero local image refs.

Default: null
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
namestring

Short descriptive deck name (e.g. 'Q3 Sales Pitch'), shown in the deck's title alongside its version. Omit to keep the name from reference_deck_id (iterating) or fall back to a generic placeholder (fresh deck). Max 128 characters; rejected if it contains control characters, '<', or '>'.

Default: null
reference_deck_idstring

Deck ID of an existing slide deck to position this new deck below (aligned on the same x, positioned below its bottom edge). Mutually exclusive with x/y. Best-effort: the new deck's rendered size cannot be known in advance, so this avoids overlap in the common case but is not pixel-guaranteed. Passing this ALWAYS means you are iterating on that deck — deleting, modifying, adding, or reordering its slides — rather than computing coordinates yourself. The new deck is titled the next version (V2, V3, ...) automatically, keeping the original's name unless the name param overrides it. This does NOT edit the referenced deck in place. That deck is left on the board exactly as it was, and you get a SECOND deck below it holding your edited version — which the user then has to reconcile by deleting the original by hand. Because the second deck is built from scratch rather than patched, html_tokens/html_contents must carry the COMPLETE set of resulting slides: read the original deck's HTML (slides_read_html, include_html=true), re-upload unchanged slides as-is, re-upload modified slides with their edits, drop any slide you want deleted, insert new slides where they belong, and order the list to match the desired final slide order. If it's not clear which existing deck the user means, list decks first via slides_read_html and confirm with the user before calling this — do not guess the deck id. Precondition: the referenced deck must already exist as a real board item. Verify this with slides_read_html first — if the deck isn't in the results it cannot be referenced yet; a deck whose create reported requires_apply=true is still pending, so tell the user to open it and click 'Apply to canvas', then retry. Do not fall back to manual x/y as a workaround.

Default: null
xnumber

X-axis coordinate. Board-absolute; board center is x=0.

Default: null
ynumber

Y-axis coordinate. Board-absolute; board center is y=0.

Default: null

Get Slide HTML Upload URL

slides_get_upload_url_html
Full Description

Use this together with slides_create_html to publish a new slide deck, presentation, pitch, or slideshow from HTML. Call this first to reserve upload slots, then PUT each slide's HTML to the returned URLs.

Reserve one or more single-use upload slots for HTML slides. Set count to the number of slides in the deck to reserve all slots in a single call instead of calling this once per slide. Returns one entry per slot, each with its own upload_url and token. PUT every slide's HTML concurrently — start all uploads before waiting on any of them; uploading one at a time defeats the point of batching and is noticeably slower for the end user. PUT the raw HTML as the request body with Content-Type: text/html; no auth header. curl: curl -X PUT -H 'Content-Type: text/html' --data-binary @slide.html '<upload_url>'. If the HTML only exists as a string in your context, write it to a local file first (e.g. slide.html), then PUT that file — not already having a file is not a reason to fall back to html_contents. Max size: 1,048,576 bytes per slide. External http/https image URLs are fine; the server fetches them. Only local file references need pre-upload (see slides_create_html's image_tokens). Slide sizing: declare the size explicitly in <head> with <meta name="viewport" content="width=W, height=H">, and give the body the same size in CSS. Both axes are required; a width alone leaves the height at 800 and pads anything shorter. Undeclared slides fall back to 1280x800. Slide label: include <meta name="screen:name" content="<label>"> in <head> so the slide gets a meaningful display label; without it a generic placeholder is used. Once all uploads complete, pass the full list of tokens to a single slides_create_html call, preserving upload order. A deck is always ONE slides_create_html call: if it has more than 30 slides, reserve slots across several calls here, then combine all tokens into that one create call — never split the deck into multiple create calls.

Parameters (1 required, 3 optional)
Required
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.

Optional
countinteger

Number of upload slots to reserve, one per slide. Request all slots needed for a deck in a single call so uploads can run in parallel.

Default: 1
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Read HTML Slides

slides_read_html
Full Description

Use this tool first whenever the user wants to view, inspect, or read existing slides, a slide deck, a presentation, a pitch, or a slideshow. Not for creating a new deck — use slides_create_html for that. Not for generic Miro frames — only HTML-based slides are covered. Read HTML slides from a Miro board. Returns slides with metadata (position, dimensions) and optionally their HTML markup. Covers both deck slides (HTML slides inside a slide deck container) and standalone HTML content widgets on the canvas. Non-HTML slide types are ignored. Provide deck_id to scope results to a specific deck, or omit to list all HTML slides on the board. If the query can be resolved using metadata alone (slide position, deck membership, dimensions), always call with include_html=false first to identify the minimal target set, then fetch include_html=true only for those slides. Only skip the metadata step when the query requires filtering on HTML content itself (e.g. 'find slides containing X text') — in that case fetch HTML directly, but scope to a specific deck_id where possible to avoid loading the entire board. When scoped to a deck_id, the response includes deck_modified_at (latest slide edit in that deck). Before iterating on a deck with slides_create_html's reference_deck_id, capture this value and pass it back as if_not_modified_since — that call rejects the edit if the deck changed after this read, so re-read and reapply before retrying. Note that iterating produces a second deck rather than editing this one in place; see slides_create_html.

Parameters (1 required, 4 optional)
Required
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.

Optional
deck_idstring

Deck ID of a slide container to read (use deck_id from a prior listing call). When omitted, all HTML slides on the board are returned.

Default: null
include_htmlboolean

Whether to include HTML markup for each slide. Defaults to false. Set to true only when HTML is needed for a specific slide to avoid large context payloads.

Default: False
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Create New Space

space_create
Full Description

Create a new Miro space. A space organizes related content together (Boards; Documents; Tables; Diagrams; etc). Always give the space an icon: use the emoji the user asked for, and when they did not name one, pick a fitting emoji yourself from the space name. IMPORTANT: Always confirm with the user before creating a space. This action creates a new space and cannot be undone.

Parameters (1 required, 4 optional)
Required
namestring

Name of the new space

Optional
descriptionstring

Optional description for the space

Default: null
icon_emojistring

Single emoji to use as the space icon, e.g. "🚀". Pass the emoji the user asked for; if they did not name one, choose a fitting emoji yourself based on the space name rather than leaving this empty.

Default: null
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

List Team Spaces

space_list
Full Description

List the spaces in the current user's team. Spaces are the top-level containers that organize a team's boards and other content, so this is the primary entry point for exploring what a team has. Prefer this tool for any team-level listing request, including phrasings like 'list boards in my team', 'what's in my Miro team', 'show my team's content', or 'get team spaces'. To then list the boards inside a particular space, use the space boards tool.

Parameters (0 required, 4 optional)
Optional
cursorstring

Opaque cursor token for fetching the next page

Default: null
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
limitinteger

Maximum number of spaces to return per page

Default: 20

List Space Boards

space_list_boards
Full Description

List the boards inside one specific space. Requires the identifier or URL of that space, so use it only when the user names a particular space (e.g. 'boards in the Design space'). For team-level requests (e.g. 'list boards in my team'), list the team's spaces first with the list spaces tool.

Parameters (1 required, 2 optional)
Required
space_urlstring

A space, given either as a full Miro space URL (e.g., 'https://miro.com/app/dashboard/space/0VM5RHCprOu2MnOHXLqp3f') or as the space content item id on its own (e.g., '0VM5RHCprOu2MnOHXLqp3f'). Both the URL returned when a space is created and the content_item_id from a space listing are accepted.

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

List Space Or Section Children

space_list_children
Full Description

List the direct children of a space or section, one level deep. Provide the content item id of a space or a section, and it returns each immediate child's content item id, type (e.g. board, folder, doc, diagram) and title, plus a board URL when the child is a board. Use it to explore what sits directly inside a space or section (e.g. its boards and sub-sections). The id must belong to a space or a section; other content items are rejected. Results are paginated: pass the returned cursor to fetch the next page.

Parameters (1 required, 4 optional)
Required
content_item_idstring

Content item id of the space or section whose direct children to list

Optional
cursorstring

Opaque cursor token for fetching the next page

Default: null
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
limitinteger

Maximum number of children to return per page

Default: 50

Update Space Role

space_role_update
Full Description

Change the role of a user or user group that already has access to a space. If they do not yet have access, use space_share instead. IMPORTANT: Always confirm with the user before changing who can access a space.

Parameters (4 required, 2 optional)
Required
rolestring

Role to assign: owner, coowner, editor, commenter, or viewer (from most to least access).

Options:ownercoownereditorcommenterviewer
space_urlstring

A space, given either as a full Miro space URL (e.g., 'https://miro.com/app/dashboard/space/0VM5RHCprOu2MnOHXLqp3f') or as the space content item id on its own (e.g., '0VM5RHCprOu2MnOHXLqp3f'). Both the URL returned when a space is created and the content_item_id from a space listing are accepted.

subject_idstring

Identifier of the user or user group. For a user this can be the user's email or user id; for a user group this is the group id.

subject_typestring

Whether the subject is an individual user or a user group

Options:useruser_group
Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Share Space

space_share
Full Description

Grant a user or user group access to a space with a specific role. Use to share a space with someone who does not yet have access. If they already have a role, use space_role_update instead. IMPORTANT: Always confirm with the user before changing who can access a space.

Parameters (4 required, 2 optional)
Required
rolestring

Role to assign: owner, coowner, editor, commenter, or viewer (from most to least access).

Options:ownercoownereditorcommenterviewer
space_urlstring

A space, given either as a full Miro space URL (e.g., 'https://miro.com/app/dashboard/space/0VM5RHCprOu2MnOHXLqp3f') or as the space content item id on its own (e.g., '0VM5RHCprOu2MnOHXLqp3f'). Both the URL returned when a space is created and the content_item_id from a space listing are accepted.

subject_idstring

Identifier of the user or user group. For a user this can be the user's email or user id; for a user group this is the group id.

subject_typestring

Whether the subject is an individual user or a user group

Options:useruser_group
Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Update Space Metadata

space_update_metadata
Full Description

Update a space's title, description and/or icon emoji. Omitted fields are left unchanged. A space icon can be replaced but not removed.

Parameters (1 required, 5 optional)
Required
space_urlstring

A space, given either as a full Miro space URL (e.g., 'https://miro.com/app/dashboard/space/0VM5RHCprOu2MnOHXLqp3f') or as the space content item id on its own (e.g., '0VM5RHCprOu2MnOHXLqp3f'). Both the URL returned when a space is created and the content_item_id from a space listing are accepted.

Optional
descriptionstring

New space description

Default: null
icon_emojistring

New single-emoji icon for the space, e.g. "🚀". Omit to leave the icon unchanged. A space icon cannot be removed, only replaced.

Default: null
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
titlestring

New space title

Default: null

Create Table

table_create
Full Description

Create a table on a Miro board with specified columns. Supports text, select, multiselect, date, link, person, and number column types. This always creates a plain grid table. To produce a timeline, kanban, or tree, first create the table here, then call table_update_view to switch its layout. For a request like 'create a timeline/kanban/tree', do BOTH steps in sequence. Coordinates: when the URL has no item target, x/y are board-absolute (board center is (0, 0)). When the URL targets a frame via moveToWidget, the table is created INSIDE that frame and x/y are relative to the frame's top-left corner; (0, 0) is the frame's top-left and the table must fit within the frame's width and height. If no board URL is provided, a new board will be created. IMPORTANT: Always confirm with the user before creating a new board. IMPORTANT: The created item is NOT shown to the user automatically. Do not restate its link, name, or details in your reply. After all content has been created, call the board_show tool once to display the result to the user.

Parameters (2 required, 5 optional)
Required
columnsarray

List of columns to create. At least one column must be provided. Column types: 1. Text columns: Simple text fields 2. Select columns: Dropdown menus with predefined options, single value per row - Each option needs a displayValue and color (hex code) 3. Multiselect columns: Like select, but a row can hold multiple options - Each option needs a displayValue and color (hex code) 4. Date columns: Date/time values in ISO 8601 format 5. Link columns: URLs with optional display text 6. Person columns: Assign Miro users by their user ID 7. Number columns: Numeric values with configurable decimal places - Optional "decimals" (int, default 0) sets displayed decimal places Examples: [ {"column_type": "text", "column_title": "Name", "isTitle": true}, {"column_type": "text", "column_title": "Description"}, {"column_type": "date", "column_title": "Due Date"}, {"column_type": "link", "column_title": "Reference"}, {"column_type": "person", "column_title": "Assignee"}, {"column_type": "number", "column_title": "Estimate", "decimals": 1}, { "column_type": "select", "column_title": "Status", "options": [ {"displayValue": "To Do", "color": "#FF0000"}, {"displayValue": "In Progress", "color": "#FFA500"}, {"displayValue": "Done", "color": "#00FF00"} ] }, { "column_type": "multiselect", "column_title": "Tags", "options": [ {"displayValue": "Frontend", "color": "#FF0000"}, {"displayValue": "Backend", "color": "#FFA500"} ] } ]

table_titlestring

The title/name of the table

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
miro_urlstring

Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). If not provided, a new board will be created (requires user confirmation). To target a specific parent frame, include ?moveToWidget=<frame_id>.

Default: null
xnumber

X-axis coordinate for table placement. Without a frame target: board-absolute, board center is x=0. With a frame target via moveToWidget: relative to the frame's top-left corner (frame top-left is x=0). Use different x values to prevent overlap when creating multiple items.

Default: null
ynumber

Y-axis coordinate for table placement. Without a frame target: board-absolute, board center is y=0. With a frame target via moveToWidget: relative to the frame's top-left corner (frame top-left is y=0). Use different y values to prevent overlap when creating multiple items.

Default: null

Read Latest Update History

table_get_latest_update_history
Full Description

Get the history of a row's Latest Update field. The Latest Update field accumulates the text updates submitted for that row over time; this returns those entries ordered chronologically. Provide the table via its Miro URL and the target row via rowId (get rowIds from table_list_rows).

Response includes for each entry: text, author_id (Miro user ID of the author), created_at and modified_at (ISO 8601 timestamps), plus the total number of entries.

Parameters (2 required, 2 optional)
Required
miro_urlstring

Full Miro URL to a specific item (e.g., 'https://miro.com/app/board/uXjVOakxTk0=/?moveToWidget=3458764516062720430'). Must include moveToWidget or focusWidget query parameter.

row_idstring

Stable identifier of the row whose Latest Update field history to fetch. Get rowIds from table_list_rows.

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Read Table

table_list_rows
Full Description

Get rows from a Miro table with column metadata. Each row includes a stable rowId that uniquely identifies it within the table. rowIds persist across sorting, insertion, and deletion — use them to target specific rows in table_sync_rows. Supports filtering by column value. Returns text, select, multiselect, and latest_update columns.

Best practice: always use filter_by and limit when possible.Examples: next item that is not done: {"filter_by": {"Status":["To do", "In progress"]}, "limit": 1}top 5 high priority tasks: {"filter_by": {"Priority":["High"]}, "limit": 5}

Response includes for each row: rowId (stable row identifier), cells (array of columnTitle, valueType, content, options, latest_update_text, latest_update_author_id).

Pagination: Use 'limit' to control page size (default 10) and 'next_cursor' to fetch subsequent pages. The cursor is opaque and encodes pagination state.

IMPORTANT: Do not change 'filter_by' when using a cursor from a previous response, as this will result in an error. To apply a different filter, start a new pagination sequence (no cursor).

Parameters (1 required, 5 optional)
Required
miro_urlstring

Full Miro URL to a specific item (e.g., 'https://miro.com/app/board/uXjVOakxTk0=/?moveToWidget=3458764516062720430'). Must include moveToWidget or focusWidget query parameter.

Optional
filter_bystring

Filter rows by column value(s) in JSON format (case-insensitive). Only select and multiselect columns are supported. Format: JSON object mapping column names to arrays of display values. Example: {"Status": ["In Progress", "Done"]} matches rows where Status is either 'In Progress' OR 'Done'

Default: null
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
limitinteger

Maximum rows to return (minimum 1)

Default: null
next_cursorstring

Pagination cursor for the next set of results

Default: null

Update Table

table_sync_rows
Full Description

Add or update rows in a Miro table.

To update existing rows, include rowId in the row object. rowId precisely targets a single row. Get rowIds from table_list_rows. Rows without rowId are inserted as new.

Examples: Update a specific row by rowId: {"rows": [{"rowId": "3", "cells": [{"columnTitle": "Status", "value": "Complete"}]}]} Insert new rows: {"rows": [{"cells": [{"columnTitle": "Task", "value": "New task"}, {"columnTitle": "Status", "value": "Not Started"}]}]} IMPORTANT: The created item is NOT shown to the user automatically. Do not restate its link, name, or details in your reply. After all content has been created, call the board_show tool once to display the result to the user.

Parameters (2 required, 2 optional)
Required
miro_urlstring

Full Miro URL to a specific item (e.g., 'https://miro.com/app/board/uXjVOakxTk0=/?moveToWidget=3458764516062720430'). Must include moveToWidget or focusWidget query parameter.

rowsarray

Array of rows to add or update. Include rowId to update an existing row. Rows without rowId are inserted as new. [{"rowId": "3", "cells": [{"columnTitle": "Status", "value": "Complete"}]}] [{"cells": [{"columnTitle": "Task", "value": "Write tests"}, {"columnTitle": "Status", "value": "To Do"}]}]

Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False

Update Table View

table_update_view
Full Description

Update a Miro table widget's view: switch it to a grid table, timeline, or kanban board. The table keeps its data; only how it is displayed changes.

Choose layout:

  • table: plain grid (use to revert from another layout)
  • timeline: lays records out on a time axis; optionally set the visible window with timeline_start_date and timeline_end_date
  • kanban: groups records into columns; set group_by_column to the name of a select column to group by (omit for an ungrouped board)

Only provide config that matches the chosen layout. Examples: switch to kanban grouped by Status: {"layout": "kanban", "group_by_column": "Status"}. Switch to a timeline for 2026: {"layout": "timeline", "timeline_start_date": "2026-01-01T00:00:00Z", "timeline_end_date": "2026-12-31T00:00:00Z"}. IMPORTANT: The created item is NOT shown to the user automatically. Do not restate its link, name, or details in your reply. After all content has been created, call the board_show tool once to display the result to the user.

Parameters (2 required, 11 optional)
Required
layoutstring

The layout to apply: 'table', 'timeline', 'kanban', or 'tree'.

Options:tabletimelinekanbantree
miro_urlstring

Full Miro URL to a specific item (e.g., 'https://miro.com/app/board/uXjVOakxTk0=/?moveToWidget=3458764516062720430'). Must include moveToWidget or focusWidget query parameter.

Optional
group_by_columnstring

KANBAN only: name of the select column to group cards into columns. Omit for an ungrouped board.

Default: null
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False
table_nesting_enabledboolean

TABLE only: enable nested (hierarchical parent/child) rows.

Default: null
timeline_date_unitstring

TIMELINE only: time-axis granularity.

Options:dayweekmonthquarteryear
Default: null
timeline_dependencies_enabledboolean

TIMELINE only: show dependency links between records.

Default: null
timeline_end_datestring

TIMELINE only: visible end of the timeline window in UTC format YYYY-MM-DDThh:mm:ssZ. This is the viewport, not a per-record date.

Default: null
timeline_nesting_enabledboolean

TIMELINE only: enable nested (hierarchical parent/child) rows.

Default: null
timeline_start_datestring

TIMELINE only: visible start of the timeline window in UTC format YYYY-MM-DDThh:mm:ssZ. This is the viewport, not a per-record date.

Default: null
tree_directionstring

TREE only: direction the tree grows.

Options:top_to_bottomleft_to_right
Default: null
view_namestring

Optional new display name for the view. Applies to any layout.

Default: null

Who Am I

user_who_am_i
Full Description

Returns the identity of the current authenticated user.

Parameters (0 required, 2 optional)
Optional
invocation_sourcestring

Identifies what triggered this tool call. You must populate this field. Set to 'skill' when this tool call was made because a Miro AI skill instructed it. Set to 'ui' when invoked from the Miro MCP UI. Leave unset otherwise.

Default: null
is_repositoryboolean

Set to true when the folder you are operating in is a source-control repository (for example a Git working directory); set to false otherwise. You must populate this field. Defaults to false.

Default: False