Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to the Miro MCP server

Vendor MCP
Open markdown

The Miro MCP connector routes your AI agent's tool calls to Miro's own MCP server through Scalekit. Each user signs in to Miro once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 68 tools.

Tools
68
What they doRead · write · destructive
28 · 36 · 428 read36 write4 destructive
Users sign in with
OAuth app
Scalekit's or your own

What you can do

  • Find and organize boards: search and create boards, and move them between spaces, sections, and teams
  • Build board content: add shapes, sticky notes, text, frames, diagrams, images, and code widgets to a board
  • Read boards: get an AI summary of a board, explore its frames and docs, and read items
  • Work with tables and docs: create tables, add or update rows, switch to timeline or kanban, and edit docs
  • Comment on boards: post comments, reply to threads, and resolve or reopen them
  • Share boards and spaces: grant access to users or groups and change their roles

Setup

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. Create the Miro MCP connection

    In AgentKit > Connections, create a Miro MCP connection. The name you give it is the connection_name your code passes. See Configure connections.

    Scalekit credentials are available for Miro, so you don't need to register an OAuth app.

  4. Authorize a user and make your first call

    quickstart.mts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    import { createInterface } from 'node:readline/promises'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENVIRONMENT_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'miromcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Miro MCP:', link)
    const rl = createInterface({ input: process.stdin, output: process.stdout })
    await rl.question('Press Enter after authorizing...')
    rl.close()
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'miromcp_board_search_boards',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • miromcp_board_get_spaceFind which space a board belongs to.Read-only

    Get Board Space

    Find which space a board belongs to.

    Inputs

    miro_urlstringrequired
    Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.
    invocation_sourcestring
    Tells the server what triggered this particular call. Populate with 'skill' if a Miro AI skill directed the call, with 'ui' if it originated from the Miro MCP interface, and leave it out for any other caller.
    is_repositoryboolean
    True if the working directory for this call is a source-controlled repository (a checked-out Git project, for instance); false in every other case.default false
  • miromcp_board_list_itemsList items on a board with cursor-based pagination.Read-only

    List Board Items

    List items on a board with cursor-based pagination. For slide content, prefer slides_read_html over this tool.

    Inputs

    limitintegerrequired
    Maximum number of items to return per page. Range: 10-1000; capped at 50 when filtering by parent.
    miro_urlstringrequired
    Full Miro board URL, optionally with a frame target via moveToWidget query parameter.
    cursorstring
    Opaque cursor for retrieving the next page of results.
    invocation_sourcestring
    Identifies what triggered this tool call.
    is_repositoryboolean
    Set to true when operating in a source-control repository folder, false otherwise.default false
    item_typestring
    Filter items by type. Leave empty to return all item types.one of app_cardcarddata_table_formatdocumentdoc_formatembedframeimagepreviewshapesticky_notetext
  • miromcp_board_search_boardsSearch and list boards accessible to the current user, scoped to their team.Read-only

    Search Boards

    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.

    Inputs

    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.
    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.default
  • miromcp_canvas_get_canvas_composer_skillGet the DSL (Domain-Specific Language) format specification for creating board items.Read-only

    Get Canvas Composer Skill

    Get the DSL (Domain-Specific Language) format specification for creating board items. Returns syntax rules, item types, valid colors, valid shape types, and a complete example. REQUIRED and FIRST: call this before canvas_create_from_svg, and before canvas_load_format_skill, to learn the SVG board format. 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, call this only once and reuse the specification.

    Inputs

    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.
    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
    No description.
    stepstring
    Workflow step selector. Omit on the first call; each response names the valid value for the next call.
  • miromcp_canvas_load_format_skillLoad supplementary authoring guidance (a skill) for a specific composition format, layered ON TOP OF the general canvas format.Read-only

    Load Canvas Format Skill

    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). 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.

    Inputs

    format_namestringrequired
    The composition format to load guidance for. 'diagramming' for styling and worked examples of diagrams; 'presentation' for slide decks; 'prototyping' for HTML prototype screens; 'tables' for tables, kanbans and timelines.one of diagrammingflowspresentationprototypingtables
    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.
    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 notation you are drawing: 'flowchart', 'entity_relationship', 'uml_class', 'uml_sequence', or 'free_form' for a hand-assembled diagram no notation fits (e.g. a mind map). Omit for the shared color contract and the list of notations.one of flowchartentity_relationshipuml_classuml_sequencefree_form
    rendererstring
    For format_name='diagramming': 'native' returns guidance to draw the notation from editable shapes and connectors; omit (mermaid) for the Mermaid diagram widget.one of mermaidnative
  • miromcp_canvas_read_as_svgRead existing board items and return them as a canvas-composer SVG document.Read-only

    Read Canvas As SVG

    Read existing board items and return them as a canvas-composer SVG document. Every element carries a data-miro-id so the SVG can be edited and fed back into canvas_update_from_svg. Unsupported (foreign) items are recorded but not drawn. By default the whole board is read; to keep the response small on large boards, scope the read to a subset with widget_ids (an explicit list of item ids). Ancestor frames of any selected item are included automatically.

    Inputs

    miro_urlstringrequired
    Full Miro board URL (e.g., 'https://miro.com/app/board/uXjVOakxTk0='). To target a specific parent frame, include ?moveToWidget=<frame_id>.
    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.
    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.
    scope_widthinteger
    Working area width.
    scope_xinteger
    Working area left edge.
    scope_yinteger
    Working area top edge.
    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.
  • miromcp_code_widget_getRead a code widget from a Miro board, returning its source code, language, title, and position.Read-only

    Get Code Widget

    Read a code widget from a Miro board, returning its source code, language, title, and position.

    Inputs

    miro_urlstringrequired
    Full Miro URL to a specific code widget item.
    invocation_sourcestring
    Identifies what triggered this tool call.
    is_repositoryboolean
    Set to true when operating in a source-control repository folder, false otherwise.default false
  • miromcp_code_widget_list_itemsList code widgets on a Miro board.Read-only

    List Code Widgets

    List code widgets on a Miro board. Returns a paginated list of all code widget items on the board. Use the cursor from a previous response to retrieve the next page.

    Inputs

    cursorstring
    Pagination cursor from a previous list response. Omit to start from the beginning.
    invocation_sourcestring
    Identifies what triggered this tool call.
    is_repositoryboolean
    Set to true when operating in a source-control repository folder, false otherwise.default false
    limitinteger
    Maximum number of items to return (10-50). Defaults to 10.default 10
    miro_urlstring
    Full Miro board URL. If not provided, a new board will be created (requires user confirmation).