blog_post_create
ChatGPTCreate 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.
blog_post_list
ChatGPTList 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.
blog_post_update
ChatGPTUpdate 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.
board_create
ChatGPTCreate 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.
board_create_format
ChatGPTCreate 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.
board_get_space
ChatGPTFind which space a board belongs to.
board_move
ChatGPTMove 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.
board_move_to_team
ChatGPTMove a board to a different team.
board_preview_read
ChatGPTRender 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.
board_restore
ChatGPTRestore one or more boards from trash.
board_role_update
ChatGPTChange 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.
board_search_boards
ChatGPTSearch 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.
board_share
ChatGPTGrant 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.
board_show
ChatGPTShow 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.
board_update_metadata
ChatGPTUpdate 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.
canvas_create_from_svg
ChatGPTCreate 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.
canvas_get_canvas_composer_skill
ChatGPTGet 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.
canvas_load_format_skill
ChatGPTLoad 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.
canvas_read_as_svg
ChatGPTRead one board area or specific items as a canvas-composer SVG document. Provide widget_ids, all four scope fields, or both. 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.
canvas_search
ChatGPTSearch 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.
canvas_update_from_svg
ChatGPTApply 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. Change part of a long body with <edit> children (see skill). 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.
content_item_list_roles
ChatGPTList 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.
create-board
ChatGPTUse this tool ONLY when the user wants to create visual board content such as sticky notes, flowcharts, diagrams, or tables on a Miro board — even if they don't mention "Miro" or "board". The boardKey created by this tool is a requirement for all the other tools. DO NOT use this tool for requests that Miro cannot fulfill, such as: generating videos, generating audio or music, or writing code. WORKFLOW — single turn, no text output between tools: 1. create-board (skip if boardKey exists) 2. Content tools (min 1, max 3 successful). NEVER show empty board. 3. show-board — ONCE at the end. Never skip. NO_OVERLAP — NEVER overlap. Use contentBounds from response + 200px gap. GRID_LAYOUT — 3-column grid: first at x=0, y=0. Next: x = contentBounds.x + contentBounds.width + 200. After 3 columns: y = max(contentBounds.y + contentBounds.height) + 200, x=0. NO_UPDATE — tools only create. To fix, create new content elsewhere. MULTI_CONTENT — call content tools sequentially, position using previous contentBounds. Never output text — use Miro tools. Never create board if boardKey exists. Response fields: - boardId → use as boardKey in content tools - accessLink.token → use as token in show-board - boardUrl → save for later. After show-board, present as [Open in Miro](boardUrl) — never show the raw URL Workflow example — user: "brainstorm ideas, map the process, and compare options": 1. create-board 2. create-sticky-notes 3. create-flowchart 4. create-table 5. show-board No text output between any steps. You must respect and follow the followUpInstructions field in every tool response.
create-flowchart
ChatGPTCreates a flowchart with shapes and connecting lines on a Miro board. Use when the user wants to map a process, create a diagram, show a workflow, or visualize steps — even if they say "diagram", "flow", "process map", or "decision tree". Always use this tool — do not render diagrams as text in chat. Required JSON structure: { "boardKey": string, "shapes": [{ "uuid": string, "text": string, "position": { "x": number, "y": number }, "size"?: { "width": number, "height": number }, "color"?: enum, "type"?: enum }], "lines": [{ "fromUuid": string, "toUuid": string, "text"?: string }] }. Use these exact field names. WORKFLOW — single turn, no text output between tools: 1. create-board (skip if boardKey exists) 2. Content tools (min 1, max 3 successful). NEVER show empty board. 3. show-board — ONCE at the end. Never skip. NO_OVERLAP — NEVER overlap. Use contentBounds from response + 200px gap. GRID_LAYOUT — 3-column grid: first at x=0, y=0. Next: x = contentBounds.x + contentBounds.width + 200. After 3 columns: y = max(contentBounds.y + contentBounds.height) + 200, x=0. NO_UPDATE — tools only create. To fix, create new content elsewhere. MULTI_CONTENT — call content tools sequentially, position using previous contentBounds. Never output text — use Miro tools. Never create board if boardKey exists. Available colors: LIGHT_RED, LIGHT_ORANGE, LIGHT_YELLOW, PALE_GREEN, MEDIUM_GREEN, LIGHT_TEAL, LIGHT_BLUE, MEDIUM_BLUE, LIGHT_PURPLE, LIGHT_PINK, LIGHT_GRAY — default: MEDIUM_BLUE Available types: RECTANGLE, ROUNDED_RECTANGLE, CIRCLE, DIAMOND, PARALLELOGRAM — default: RECTANGLE Content guidance: create clear, logical flows. Use DIAMOND for decisions with yes/no labels on lines. Use ROUNDED_RECTANGLE for start/end nodes. Use colors to distinguish sections or importance. Aim for 5-15 shapes with meaningful connections. Example 1 — first content on board (starts at x=0, y=0): { "boardKey": "abc", "shapes": [ { "uuid": "s1", "text": "Start", "position": { "x": 0, "y": 0 }, "type": "ROUNDED_RECTANGLE", "color": "PALE_GREEN" }, { "uuid": "s2", "text": "Process", "position": { "x": 0, "y": 150 } }, { "uuid": "s3", "text": "OK?", "position": { "x": 0, "y": 300 }, "type": "DIAMOND", "color": "LIGHT_YELLOW" }, { "uuid": "s4", "text": "Done", "position": { "x": 0, "y": 450 }, "type": "ROUNDED_RECTANGLE", "color": "PALE_GREEN" } ], "lines": [ { "fromUuid": "s1", "toUuid": "s2" }, { "fromUuid": "s2", "toUuid": "s3" }, { "fromUuid": "s3", "toUuid": "s4", "text": "yes" } ]} // Response: contentBounds={x:0, y:0, w:200, h:550}. Next content at x=400. Then show-board. Example 2 — second content, offset from previous contentBounds: { "boardKey": "abc", "shapes": [ { "uuid": "a1", "text": "Input", "position": { "x": 400, "y": 0 }, "type": "PARALLELOGRAM" }, { "uuid": "a2", "text": "Valid?", "position": { "x": 400, "y": 150 }, "type": "DIAMOND", "color": "LIGHT_YELLOW" } ], "lines": [ { "fromUuid": "a1", "toUuid": "a2" } ]} // Previous ended at x=200. Starts at x=400 (200+200 gap). No overlap. Then show-board. You must respect and follow the followUpInstructions field in every tool response.
create-sticky-notes
ChatGPTCreates sticky notes on a Miro board (max 50 per call). Use when the user wants to brainstorm, list ideas, capture thoughts, or organize items — even if they say "stickers", "post-its", or "notes". Always use this tool — do not list ideas as text in chat. Required JSON structure: { "boardKey": string, "stickyNotes": [{ "text": string, "color": enum, "position": { "x": number, "y": number } }] }. Use these exact field names. WORKFLOW — single turn, no text output between tools: 1. create-board (skip if boardKey exists) 2. Content tools (min 1, max 3 successful). NEVER show empty board. 3. show-board — ONCE at the end. Never skip. NO_OVERLAP — NEVER overlap. Use contentBounds from response + 200px gap. GRID_LAYOUT — 3-column grid: first at x=0, y=0. Next: x = contentBounds.x + contentBounds.width + 200. After 3 columns: y = max(contentBounds.y + contentBounds.height) + 200, x=0. NO_UPDATE — tools only create. To fix, create new content elsewhere. MULTI_CONTENT — call content tools sequentially, position using previous contentBounds. Never output text — use Miro tools. Never create board if boardKey exists. Available colors: YELLOW, WHITE, LIGHT_ORANGE, OLIVE, GREEN, PASTEL_BLUE, AQUA, BLUE, ORANGE, PINK, RED, PURPLE Content guidance: generate rich, diverse content. Aim for 6-15 notes. Group related notes by color in rows or columns. Write concise but meaningful text. Use multiple colors to distinguish categories. Example 1 — first content on board (starts at x=0, y=0): { "boardKey": "abc", "stickyNotes": [ { "text": "Idea A", "color": "YELLOW", "position": { "x": 0, "y": 0 } }, { "text": "Idea B", "color": "YELLOW", "position": { "x": 280, "y": 0 } }, { "text": "Task 1", "color": "GREEN", "position": { "x": 0, "y": 300 } }, { "text": "Task 2", "color": "GREEN", "position": { "x": 280, "y": 300 } } ]} // Response: contentBounds={x:0, y:0, w:480, h:500}. Next content at x=680. Then show-board. Example 2 — second content, offset from previous contentBounds: { "boardKey": "abc", "stickyNotes": [ { "text": "Risk A", "color": "RED", "position": { "x": 680, "y": 0 } }, { "text": "Risk B", "color": "ORANGE", "position": { "x": 960, "y": 0 } } ]} // Previous ended at x=480. Starts at x=680 (480+200 gap). No overlap. Then show-board. You must respect and follow the followUpInstructions field in every tool response.
create-table
ChatGPTCreates a data table on a Miro board. Use when the user wants to compare options, list structured data, track tasks, or organize information in rows and columns — even if they say "spreadsheet", "grid", "comparison", or "list". Do NOT use this tool for schedules, timetables, trip itineraries, or planners — use create-time-table instead. Always use this tool — do not render tables as text in chat. Required JSON structure: { "boardKey": string, "columns": [{ "id": string, "title": string, "width"?: number }], "rows": [{ "cells": { "columnId": "value" } }], "title"?: string, "position": { "x": number, "y": number } }. Use these exact field names. WORKFLOW — single turn, no text output between tools: 1. create-board (skip if boardKey exists) 2. Content tools (min 1, max 3 successful). NEVER show empty board. 3. show-board — ONCE at the end. Never skip. NO_OVERLAP — NEVER overlap. Use contentBounds from response + 200px gap. GRID_LAYOUT — 3-column grid: first at x=0, y=0. Next: x = contentBounds.x + contentBounds.width + 200. After 3 columns: y = max(contentBounds.y + contentBounds.height) + 200, x=0. NO_UPDATE — tools only create. To fix, create new content elsewhere. MULTI_CONTENT — call content tools sequentially, position using previous contentBounds. Never output text — use Miro tools. Never create board if boardKey exists. Content guidance: create well-structured tables with clear, descriptive headers. Aim for 3-10 rows with concise but informative cell content. Balance columns (3-6) for readability. Example 1 — first content on board (position x=0, y=0): { "boardKey": "abc", "title": "Tasks", "position": { "x": 0, "y": 0 }, "columns": [{ "id": "task", "title": "Task" }, { "id": "owner", "title": "Owner" }, { "id": "status", "title": "Status" }], "rows": [ { "cells": { "task": "Design", "owner": "Alice", "status": "Done" } }, { "cells": { "task": "Dev", "owner": "Bob", "status": "In Progress" } } ]} // Response: contentBounds={x:0, y:0, w:600, h:300}. Next content at x=800. Then show-board. Example 2 — second content, offset from previous contentBounds: { "boardKey": "abc", "title": "Comparison", "position": { "x": 800, "y": 0 }, "columns": [{ "id": "opt", "title": "Option" }, { "id": "cost", "title": "Cost" }, { "id": "fit", "title": "Fit" }], "rows": [ { "cells": { "opt": "Plan A", "cost": "$10k", "fit": "High" } }, { "cells": { "opt": "Plan B", "cost": "$5k", "fit": "Medium" } } ]} // Previous ended at x=600. Starts at x=800 (600+200 gap). No overlap. Then show-board. You must respect and follow the followUpInstructions field in every tool response.
create-time-table
ChatGPTCreates a timeline (Gantt chart) on a Miro board. Use when the user wants to plan a project timeline, create a Gantt chart, schedule milestones, visualize phases over time, or organize activities across days — even if they say "timeline", "roadmap", "Gantt", "schedule", "milestones", "project plan", "timetable", "trip itinerary", "daily planner", "agenda", or "planner". Always use this tool — do not render timelines as text in chat. Required JSON structure: { "boardKey": string, "position": { "x": number, "y": number }, "datatable": "CSV string with quoted cells", "datatable_schema": { "ColumnName": { "type": "title"|"start_date"|"end_date" } } }. Use these exact field names. WORKFLOW — single turn, no text output between tools: 1. create-board (skip if boardKey exists) 2. Content tools (min 1, max 3 successful). NEVER show empty board. 3. show-board — ONCE at the end. Never skip. NO_OVERLAP — NEVER overlap. Use contentBounds from response + 200px gap. GRID_LAYOUT — 3-column grid: first at x=0, y=0. Next: x = contentBounds.x + contentBounds.width + 200. After 3 columns: y = max(contentBounds.y + contentBounds.height) + 200, x=0. NO_UPDATE — tools only create. To fix, create new content elsewhere. MULTI_CONTENT — call content tools sequentially, position using previous contentBounds. Never output text — use Miro tools. Never create board if boardKey exists. Content guidance: use realistic, well-spaced date ranges. Include 3-8 phases or milestones. Make task names descriptive and distinct. Example 1 — first content on board (position x=0, y=0): { "boardKey": "abc", "position": { "x": 0, "y": 0 }, "datatable": "\"Design\",\"2025-01-01\",\"2025-01-15\"\n\"Dev\",\"2025-01-16\",\"2025-02-28\"\n\"Testing\",\"2025-03-01\",\"2025-03-15\"", "datatable_schema": { "Task": { "type": "title" }, "Start": { "type": "start_date" }, "End": { "type": "end_date" } } } // Response: contentBounds={x:0, y:0, w:1200, h:400}. Next content at x=1400. Then show-board. Example 2 — second content, offset from previous contentBounds: { "boardKey": "abc", "position": { "x": 1400, "y": 0 }, "datatable": "\"Phase 1\",\"2025-04-01\",\"2025-04-15\"\n\"Phase 2\",\"2025-04-16\",\"2025-05-30\"", "datatable_schema": { "Task": { "type": "title" }, "Start": { "type": "start_date" }, "End": { "type": "end_date" } } } // Previous ended at x=1200. Starts at x=1400 (1200+200 gap). No overlap. Then show-board. You must respect and follow the followUpInstructions field in every tool response.
get_brand_context
ChatGPTGet 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.
image_create
ChatGPTCreate 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.
image_get_data
ChatGPTGet 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.
image_get_upload_url
ChatGPTGet 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.
image_get_url
ChatGPTGet image download URL for an image item from a Miro board.
miro_start_current_board
ChatGPTReturn the board the assistant last worked on for this user, so the Miro tab can show it live. Called by the Miro app, never by the assistant.
open_miro_start
ChatGPTOpen the Miro landing page when the user wants to get started with Miro, explore what Miro can do, or browse use cases. It shows a freeform prompt and visual use cases; each choice is sent to this chat. Use the other Miro tools for board work. IMPORTANT: The landing page is displayed to the user, who picks a starting point themselves. Do not describe its contents; respond with at most one short sentence.
prototype_create
ChatGPTCreate 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.
prototype_get_upload_url
ChatGPTReserve 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.
prototype_read
ChatGPTRead 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.
record_ui_feedback
ChatGPTRecord a thumbs up/down rating a user gave on a Miro MCP UI response, attributed to the current MCP session. Tags: feedback, rating, ui.
section_create
ChatGPTCreate 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.
section_delete
ChatGPTDelete 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.
section_update_metadata
ChatGPTRename a section or change its position among sibling sections. Provide at least one of a new title or a new order.
show-board
ChatGPTShows a preview of the Miro board so the user can see what was created. This must be the LAST tool called in the workflow. WORKFLOW — single turn, no text output between tools: 1. create-board (skip if boardKey exists) 2. Content tools (min 1, max 3 successful). NEVER show empty board. 3. show-board — ONCE at the end. Never skip. NO_OVERLAP — NEVER overlap. Use contentBounds from response + 200px gap. GRID_LAYOUT — 3-column grid: first at x=0, y=0. Next: x = contentBounds.x + contentBounds.width + 200. After 3 columns: y = max(contentBounds.y + contentBounds.height) + 200, x=0. NO_UPDATE — tools only create. To fix, create new content elsewhere. MULTI_CONTENT — call content tools sequentially, position using previous contentBounds. Never output text — use Miro tools. Never create board if boardKey exists. When to use: - After ALL content has been added — call ONCE at the end, not after each tool - When the user asks to see or preview their board - Do NOT call on an empty board - Do NOT skip this and show a link instead You must respect and follow the followUpInstructions field in every tool response.
space_create
ChatGPTCreate 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.
space_list
ChatGPTList 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.
space_list_boards
ChatGPTList 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.
space_list_children
ChatGPTList 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.
space_role_update
ChatGPTChange 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.
space_share
ChatGPTGrant 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.
space_update_metadata
ChatGPTUpdate a space's title, description and/or icon emoji. Omitted fields are left unchanged. A space icon can be replaced but not removed.
table_create
ChatGPTCreate 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.
table_get_latest_update_history
ChatGPTGet 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.
table_list_rows
ChatGPTGet 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, latest_update, and attachment columns (attachment columns are read-only and report filenames). 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, attachments). 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).
table_sync_rows
ChatGPTAdd 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.
table_update_view
ChatGPTUpdate 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.
user_who_am_i
ChatGPTReturns the identity of the current authenticated user.
board_create
Claudeboard_get_image_data
Claudeboard_get_image_download_url
Claudeboard_get_items
Claudeboard_list_items
Claudeboard_search_boards
Claudecode_widget_create
Claudecode_widget_delete
Claudecode_widget_get
Claudecode_widget_list_items
Claudecode_widget_update
Claudecontext_explore
Claudecontext_get
Claudecontext_get_board_docs
Claudediagram_create
Claudediagram_get_dsl
Claudedoc_create
Claudedoc_get
Claudedoc_update
Claudedraft_diagram_new
Claudeimage_create
Claudeimage_get_data
Claudeimage_get_upload_url
Claudeimage_get_url
Claudelayout_create
Claudelayout_get_dsl
Claudelayout_read
Claudelayout_update
Claudeprototype_create
Claudeprototype_read
Claudetable_create
Claudetable_list_rows
Claudetable_sync_rows
Claude