---
title: "Miro MCP server for AI agents - actionlake"
description: "Give Claude 178 Miro actions through one MCP server: board groups, items, boards. Your agent never holds the credential. 100,000 calls a month free."
canonical: https://actionlake.com/connectors/miro
updated: 2026-10-22
---

Connectors · Work & projects

# Miro MCP server for AI agents.

actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to Miro and the rest of your systems. It gives your agent 178 Miro actions (77 reads, 66 writes and 35 that wait for a confirmation) and holds the Miro credential itself, so the agent never does. It paces Miro's limits and records every call. Connecting Miro needs your own Miro OAuth app and one admin sign-in.

[Connect Miro free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

100,000 free calls a month. No card, no email, no password: press Start a free sandbox on the next screen and keep the key it shows you.

`claude mcp add --transport http actionlake https://connect.actionlake.com/mcp`

the first call

```
do {
  action: "miro.boards.list",
  intent: "check which Miro account is connected"
}
# Get boards · read · 1 upstream call
```

- 178 actions in one signed file
- 77 read look, never change
- 66 write create and update
- 35 wait for a yes destructive, confirmed first

Set up

## Connect Miro in three steps.

1. 01
   ### Add actionlake to Claude.
   Run the command once in Claude Code; its consent page can create a free sandbox: 100,000 calls a month, no card. In the Claude app, add a custom connector with the URL below and paste your key on the consent page. Creating a new sandbox from the Claude app is not yet tested by us.
   `https://connect.actionlake.com/mcp`
2. 02
   ### Connect Miro.
   OAuth 2.0, authorization code. You register your own OAuth app with Miro, an admin signs in once, and you paste the app's client id and secret and the tokens from that sign-in; actionlake renews the access token from then on. actionlake stores what you paste write-only, sealed under your tenant's key.
   Before the first sign-in, Miro needs an OAuth app of your own, registered in its developer portal. actionlake has no Miro app to lend you.
   - `access_token` Access token from one sign-in with your own OAuth app
   - `refresh_token` Refresh token from the same sign-in; the access token is renewed from it
   - `client_id` Miro app Client ID
   - `client_secret` Miro app Client secret (same App Credentials page)
   ```
   account { op: "connections.requirements", service: "miro" }
   # free: exactly what to paste, and what is found for you
   ```
3. 03
   ### Make the first call. Check before a write.
   Ask in plain words; Claude picks the action. Before anything changes, `check` validates the call and prices it, for free.
   ```
   do    { action: "miro.boards.list" }
   # get boards · read · 1 upstream call
   check { action: "miro.projects.create", input: { … } }
   # free: inputs, permissions, cost and confirmations, nothing sent
   ```

Miro at a glance

**Sign-in**

OAuth 2.0, authorization code. You register your own OAuth app with Miro, an admin signs in once, and you paste the app's client id and secret and the tokens from that sign-in; actionlake renews the access token from then on.

**You provide**

`access_token` `refresh_token` `client_id` `client_secret`

**Limits we pace to**

25 calls a second, per connection

**API covered**

Miro REST API v2 (v2.0, OpenAPI 3.0.1)`api.miro.com`

**Built from**

Miro's documentation, read 22 October 2026[OpenAPI spec (GitHub)](https://raw.githubusercontent.com/miroapp/api-clients/main/packages/generator/spec.json) [developers.miro.com](https://developers.miro.com/reference/api-reference)

**Service file**

Version 1.0.0, signed (Ed25519)

**Cached reads**

77 of 77 reads, for up to 5 minutes; a write clears what it affects

**Shared entities**

6, so ask can line Miro up with your other systems

**Data**

Processed and stored in Sydney, Australia. No US region yet

Capabilities

## What an AI agent can do in Miro.

178 actions in 52 areas. Every one carries its effect, so a key can allow the reads and hold the rest.

- **77** read look, never change
- **66** write create and update
- **35** destructive wait for a confirmation

1. ### Board groups
   7
   3 read · 2 write · 2 destructive
   Create group · Get all groups on a board · Get a group by its ID · Get items of a group by ID
2. ### Items
   7
   4 read · 2 write · 1 destructive
   Create items in bulk · Get items on board · Get items by tag · Get items within frame
3. ### Boards
   6
   2 read · 3 write · 1 destructive
   Get boards · Create board · Get specific board · Update board
4. ### Code widgets
   6
   2 read · 3 write · 1 destructive
   Create code widget item · Get code widget items · Get code widget item · Move code widget item
5. ### Board export jobs
   5
   3 read · 2 write · 0 destructive
   Create board export job · Get board export jobs list · Get results for board export job · Get board export job status
6. ### Board members
   5
   2 read · 2 write · 1 destructive
   Get all board members · Get specific board member · Update board member · Remove board member
7. ### Cases
   5
   2 read · 2 write · 1 destructive
   Create case · Get all cases · Get case · Edit case
8. ### Connectors
   5
   2 read · 2 write · 1 destructive
   Create connector · Get connectors · Get specific connector · Update connector

**44 more areas · 132 actions**

- Legal holds **5**
- Project members **5**
- Projects **5**
- Tags **5**
- Team members **5**
- Teams **5**
- User group members **5**
- User groups **5**
- App cards **4**
- Cards **4**
- Documents **4**
- Embeds **4**
- Flowchart shapes **4**
- Frames **4**
- Images **4**
- Mindmap nodes **4**
- Shapes **4**
- Sticky notes **4**
- Team user groups **4**
- Texts **4**
- Board user groups **3**
- Docs **3**
- Experimental items **3**
- Item tags **3**
- Org members **3**
- Project user groups **3**
- App metrics **2**
- Board data classification **2**
- Board export job tasks **2**
- Project settings **2**
- Team data classification settings **2**
- Team settings **2**
- Token **2**
- User group teams **2**
- AI interaction logs **1**
- Audit logs **1**
- Content logs **1**
- Default team settings **1**
- Legal hold content items **1**
- Legal hold export jobs **1**
- Org data classification settings **1**
- Organizations **1**
- Team data classification **1**
- User sessions **1**

Top actions

## The Miro API, shaped for agents.

The ids your agent types, what each does, and the one name it shares with other systems. 28 of Miro's 39 action names are shared with at least one other connector, so an agent learns them once.

| Action | What it does | Effect | Same name in |
| --- | --- | --- | --- |
| `miro.org_members.list` Get organization members | Get organization members. | read | `identity.user.list` 474 connectors |
| `miro.projects.list` List of projects | List of projects. | read | `work.project.list` 109 connectors |
| `miro.user_groups.list` List of user groups | List of user groups. | read | `identity.group.list` 262 connectors |
| `miro.teams.list` List teams | List teams. | read | `work.workspace.list` 50 connectors |
| `miro.user_group_members.list` List of user group members | List of user group members. | read | `identity.group_member.list` 103 connectors |
| `miro.projects.create` Create project | Create project. | write | `work.project.create` 102 connectors |
| `miro.user_groups.create` Create user group | Create user group. | write | `identity.group.create` 205 connectors |
| `miro.org_members.get` Get organization member | Get organization member. | read | `identity.user.get` 399 connectors |
| `miro.teams.create` Create team | Create team. | write | `work.workspace.create` 36 connectors |
| `miro.projects.delete` Delete project | Delete project. | destructive | `work.project.delete` 85 connectors |
| `miro.token.get` Get access token information | Get access token information. | read | `identity.current_user.get` 307 connectors |
| `miro.user_group_members.get` Get user group member | Get user group member. | read | `identity.group_member.get` 30 connectors |

Try it

## Prompts to paste into Claude.

Each one names the Miro actions it will call, so you know what it reads and what it changes before you send it.

1. Read read
   Give me a one-line status for every active Miro project.
   calls `miro.projects.list`
2. Write write
   Create project in Miro. Show me exactly what you will send before you save it.
   calls `miro.projects.create`

Governance for Miro

## Destructive actions wait for a yes.

35 Miro actions are destructive. The first 10:

- Delete project `miro.projects.delete`
- Delete user group `miro.user_groups.delete`
- Delete team `miro.teams.delete`
- Delete user group member `miro.user_group_members.remove`
- Delete team member from team `miro.team_members.delete`
- Remove board member `miro.board_members.remove`
- Delete doc format item `miro.docs.delete`
- Delete tag `miro.tags.delete`
- Delete card item `miro.cards.delete`
- Close case `miro.cases.delete`

A destructive action runs only with `confirm: true`. Under the `human` policy the agent cannot confirm for itself: the run stops until a named person approves, in the console or from a signed link in an email. The cap on a key is refused before the call is sent, never after.

do miro.projects.delete confirm_policy: **human**

Delete project?

**intent:** the user asked me to delete project

run suspended · waiting for a named person · key _miro-agent_ cannot confirm itself

In the console, or from an emailed signed link.

a key for this connector

```
account {
  op: "keys.create", name: "miro-agent",
  allowed_actions: ["miro.*"], cap_calls: 2000,
  confirm_policy: "human_for_writes",
  approval_rules: [
    { match: "miro.projects.delete", approver: "lead@example.com" },
    { match: "miro.user_groups.delete", approver: "lead@example.com" },
    { match: "miro.teams.delete", approver: "lead@example.com" }
  ]
}
```

Illustrative. Scoped to Miro only, capped at 2,000 upstream calls, every write confirmed, and the destructive ones approved by a named person.

Cost

## What Miro costs on actionlake.

Every Miro action is one upstream call, the only thing actionlake bills. Searching, `check`, `cost`, `account` and any call Miro refused with 401, 403, 429 or a 5xx are free. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

- 1 upstream call per action all 178 Miro actions
- 178 actions page each page of a long list is one call
- 77 reads can be cached a cache hit costs nothing
- 100,000 calls a month, free paid plans from US$49 a month for 250,000

[See pricing](https://actionlake.com/pricing)

Action index

## Every Miro action.

178 actions by area: the id your agent calls, what it does, and its effect.

**Board groups 7**

- `miro.board_groups.create` Create group write
- `miro.board_groups.delete` Deletes the group destructive
- `miro.board_groups.get` Get a group by its ID read
- `miro.board_groups.get_items` Get items of a group by ID read
- `miro.board_groups.list` Get all groups on a board read
- `miro.board_groups.ungroup` Ungroup items destructive
- `miro.board_groups.update` Updates a group with new items write

**Items 7**

- `miro.items.bulk_create` Create items in bulk write
- `miro.items.delete` Delete item destructive
- `miro.items.get` Get specific item on board read
- `miro.items.list` Get items on board read
- `miro.items.list_by_tag` Get items by tag read
- `miro.items.list_within_frame` Get items within frame read
- `miro.items.update_position_or_parent` Update item position or parent write

**Boards 6**

- `miro.boards.copy` Copy board write
- `miro.boards.create` Create board write
- `miro.boards.delete` Delete board destructive
- `miro.boards.get` Get specific board read
- `miro.boards.list` Get boards read
- `miro.boards.update` Update board write

**Code widgets 6**

- `miro.code_widgets.create` Create code widget item write
- `miro.code_widgets.delete` Delete code widget item destructive
- `miro.code_widgets.get` Get code widget item read
- `miro.code_widgets.list` Get code widget items read
- `miro.code_widgets.move` Move code widget item write
- `miro.code_widgets.update` Update code widget item write

**Board export jobs 5**

- `miro.board_export_jobs.create` Create board export job write
- `miro.board_export_jobs.get_results` Get results for board export job read
- `miro.board_export_jobs.get_status` Get board export job status read
- `miro.board_export_jobs.list` Get board export jobs list read
- `miro.board_export_jobs.update_status` Update board export job status write

**Board members 5**

- `miro.board_members.get` Get specific board member read
- `miro.board_members.list` Get all board members read
- `miro.board_members.remove` Remove board member destructive
- `miro.board_members.share` Share board write
- `miro.board_members.update` Update board member write

**Cases 5**

- `miro.cases.create` Create case write
- `miro.cases.delete` Close case destructive
- `miro.cases.get` Get case read
- `miro.cases.list` Get all cases read
- `miro.cases.update` Edit case write

**Connectors 5**

- `miro.connectors.create` Create connector write
- `miro.connectors.delete` Delete connector destructive
- `miro.connectors.get` Get specific connector read
- `miro.connectors.list` Get connectors read
- `miro.connectors.update` Update connector write

**Legal holds 5**

- `miro.legal_holds.create` Create legal hold write
- `miro.legal_holds.delete` Close legal hold destructive
- `miro.legal_holds.get` Get legal hold information read
- `miro.legal_holds.list` Get all legal holds within a case read
- `miro.legal_holds.update` Edit legal hold write

**Project members 5**

- `miro.project_members.add` Add member in a project write
- `miro.project_members.get` Get project member read
- `miro.project_members.list` List of project members read
- `miro.project_members.remove` Remove project member destructive
- `miro.project_members.update` Update project member write

**Projects 5**

- `miro.projects.create` Create project write
- `miro.projects.delete` Delete project destructive
- `miro.projects.get` Get project read
- `miro.projects.list` List of projects read
- `miro.projects.update` Update project write

**Tags 5**

- `miro.tags.create` Create tag write
- `miro.tags.delete` Delete tag destructive
- `miro.tags.get` Get tag read
- `miro.tags.list` Get tags from board read
- `miro.tags.update` Update tag write

**Team members 5**

- `miro.team_members.delete` Delete team member from team destructive
- `miro.team_members.get` Get team member read
- `miro.team_members.invite` Invite team members write
- `miro.team_members.list` List team members read
- `miro.team_members.update` Update team member write

**Teams 5**

- `miro.teams.create` Create team write
- `miro.teams.delete` Delete team destructive
- `miro.teams.get` Get team read
- `miro.teams.list` List teams read
- `miro.teams.update` Update team write

**User group members 5**

- `miro.user_group_members.add` Create user group member write
- `miro.user_group_members.bulk_update` Bulk edit of membership in user group write
- `miro.user_group_members.get` Get user group member read
- `miro.user_group_members.list` List of user group members read
- `miro.user_group_members.remove` Delete user group member destructive

**User groups 5**

- `miro.user_groups.create` Create user group write
- `miro.user_groups.delete` Delete user group destructive
- `miro.user_groups.get` Get user group read
- `miro.user_groups.list` List of user groups read
- `miro.user_groups.update` Update user group write

**App cards 4**

- `miro.app_cards.create` Create app card item write
- `miro.app_cards.delete` Delete app card item destructive
- `miro.app_cards.get` Get app card item read
- `miro.app_cards.update` Update app card item write

**Cards 4**

- `miro.cards.create` Create card item write
- `miro.cards.delete` Delete card item destructive
- `miro.cards.get` Get card item read
- `miro.cards.update` Update card item write

**Documents 4**

- `miro.documents.create` Create document item using URL write
- `miro.documents.delete` Delete document item destructive
- `miro.documents.get` Get document item read
- `miro.documents.update` Update document item using URL write

**Embeds 4**

- `miro.embeds.create` Create embed item write
- `miro.embeds.delete` Delete embed item destructive
- `miro.embeds.get` Get embed item read
- `miro.embeds.update` Update embed item write

**Flowchart shapes 4**

- `miro.flowchart_shapes.create` Create shape item write
- `miro.flowchart_shapes.delete` Delete shape item destructive
- `miro.flowchart_shapes.get` Get shape item read
- `miro.flowchart_shapes.update` Update shape item write

**Frames 4**

- `miro.frames.create` Create frame write
- `miro.frames.delete` Delete frame destructive
- `miro.frames.get` Get frame read
- `miro.frames.update` Update frame write

**Images 4**

- `miro.images.create` Create image item using URL write
- `miro.images.delete` Delete image item destructive
- `miro.images.get` Get image item read
- `miro.images.update` Update image item using URL write

**Mindmap nodes 4**

- `miro.mindmap_nodes.create` Create mind map node write
- `miro.mindmap_nodes.delete` Delete mind map node destructive
- `miro.mindmap_nodes.get` Get specific mind map node read
- `miro.mindmap_nodes.list` Get mind map nodes read

**Shapes 4**

- `miro.shapes.create` Create shape item write
- `miro.shapes.delete` Delete shape item destructive
- `miro.shapes.get` Get shape item read
- `miro.shapes.update` Update shape item write

**Sticky notes 4**

- `miro.sticky_notes.create` Create sticky note item write
- `miro.sticky_notes.delete` Delete sticky note item destructive
- `miro.sticky_notes.get` Get sticky note item read
- `miro.sticky_notes.update` Update sticky note item write

**Team user groups 4**

- `miro.team_user_groups.add` Create user group to team connection write
- `miro.team_user_groups.get` Get user group of a team read
- `miro.team_user_groups.list` List of user group to team connections read
- `miro.team_user_groups.remove` Delete user group to team connection destructive

**Texts 4**

- `miro.texts.create` Create text item write
- `miro.texts.delete` Delete text item destructive
- `miro.texts.get` Get text item read
- `miro.texts.update` Update text item write

**Board user groups 3**

- `miro.board_user_groups.list` Get board user group assignments read
- `miro.board_user_groups.remove` Delete board user group assignment destructive
- `miro.board_user_groups.share` Create board user group assignments write

**Docs 3**

- `miro.docs.create` Create doc format item write
- `miro.docs.delete` Delete doc format item destructive
- `miro.docs.get` Get doc format item read

**Experimental items 3**

- `miro.experimental_items.delete` Delete item destructive
- `miro.experimental_items.get` Get specific item on board read
- `miro.experimental_items.list` Get items on board read

**Item tags 3**

- `miro.item_tags.attach` Attach tag to item write
- `miro.item_tags.list` Get tags from item read
- `miro.item_tags.remove` Remove tag from item destructive

**Org members 3**

- `miro.org_members.get` Get organization member read
- `miro.org_members.list` Get organization members read
- `miro.org_members.search_by_emails` Look up organization members by email. read

**Project user groups 3**

- `miro.project_user_groups.list` Get project user group assignments read
- `miro.project_user_groups.remove` Delete project user group assignment destructive
- `miro.project_user_groups.share` Create project user group assignments write

**App metrics 2**

- `miro.app_metrics.get_total` Get total app metrics read
- `miro.app_metrics.list` Get app metrics read

**Board data classification 2**

- `miro.board_data_classification.get` Get board classification read
- `miro.board_data_classification.set` Update board classification write

**Board export job tasks 2**

- `miro.board_export_job_tasks.create_export_link` Create task export link write
- `miro.board_export_job_tasks.list` Get board export job tasks list read

**Project settings 2**

- `miro.project_settings.get` Get project settings read
- `miro.project_settings.update` Update project settings write

**Team data classification settings 2**

- `miro.team_data_classification_settings.get` Get team settings read
- `miro.team_data_classification_settings.update` Update team settings write

**Team settings 2**

- `miro.team_settings.get` Get team settings read
- `miro.team_settings.update` Update team settings write

**Token 2**

- `miro.token.get` Get access token information read
- `miro.token.revoke` Revoke token (v2) destructive

**User group teams 2**

- `miro.user_group_teams.get` Get user group team read
- `miro.user_group_teams.list` Get teams of a user group read

**AI interaction logs 1**

- `miro.ai_interaction_logs.list` Get AI interaction logs (Beta) read

**Audit logs 1**

- `miro.audit_logs.list` Get audit logs read

**Content logs 1**

- `miro.content_logs.list` Retrieve content change logs of board items read

**Default team settings 1**

- `miro.default_team_settings.get` Get default team settings read

**Legal hold content items 1**

- `miro.legal_hold_content_items.list` Get content items under legal hold read

**Legal hold export jobs 1**

- `miro.legal_hold_export_jobs.list` Get board export jobs of a case read

**Org data classification settings 1**

- `miro.org_data_classification_settings.get` Get organization settings read

**Organizations 1**

- `miro.organizations.get` Get organization info read

**Team data classification 1**

- `miro.team_data_classification.bulk_update_boards` Bulk update boards classification write

**User sessions 1**

- `miro.user_sessions.reset_all` Reset all sessions of a user destructive

Questions

## The Miro MCP server, answered.

**Is there a Miro MCP server for Claude?**

Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 178 Miro actions across board groups, items, boards and code widgets, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by Miro.

**What do I need to connect Miro?**

Your own Miro OAuth app, registered with Miro (its client id and client secret), and the access and refresh tokens from one admin sign-in. actionlake has no Miro app of its own, so this is not a one-step consent. actionlake renews the access token as it expires. The free call account { op: "connections.requirements", service: "miro" } lists exactly what to paste.

**Can an AI agent delete or change things in Miro?**

Only if its key allows it, and only with an explicit confirmation. 35 Miro actions are destructive, including delete project, delete user group and delete team. Each runs only with confirm: true. Under the human confirm policy, or an approval rule on the key, the run waits until a named person approves it.

**Will an AI agent use up my Miro API limit?**

actionlake paces every call to the limits in the Miro service file: 25 calls a second per connection. Repeated reads are answered from cache (77 Miro actions can be), which never reaches Miro.

**What does a Miro action cost?**

One upstream call, the only unit actionlake bills. A list that pages bills one call per page (178 Miro actions page). Cache hits, searches, dry runs and calls Miro refused with 401, 403, 429 or a 5xx are free. The Free plan includes 100,000 calls a month with no card. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

**Which Miro API does it cover?**

The Miro REST API v2 (v2.0, OpenAPI 3.0.1) at api.miro.com. It is built from Miro's documentation as read on 22 October 2026. 178 actions in 52 areas, each one in the signed service file (version 1.0.0).

**Does actionlake keep my Miro data, and where?**

actionlake processes and stores data in Sydney, Australia; there is no US region yet. Reads may be cached for up to 5 minutes, and a write clears the reads it affects. Each run's request and response is kept, sealed, for your plan's trace window: 1 day on Free, 3 days on Starter, 7 days on Pro, 14 days on Team, 30 days on Business and 30 days on Enterprise. Your Miro credential is sealed under your tenant's key, never logged and never returned. Your traffic is not used to train models.

**Which AI clients can use it?**

Claude Code, tested by us end to end, and the Claude app as a custom connector, tested by us with an existing key. Other MCP clients that support remote servers over Streamable HTTP (MCP revisions 2025-06-18 and 2025-11-25) and OAuth dynamic client registration, or a bearer header, should connect the same way; we have not tested them. Or plain REST, under the same action names.

## More connectors like Miro

Shares the most action names with

- [Gitea 23](https://actionlake.com/connectors/gitea)
- [Toggl Track 18](https://actionlake.com/connectors/toggl-track)
- [OpenProject 18](https://actionlake.com/connectors/openproject)
- [Clockify 14](https://actionlake.com/connectors/clockify)
- [Tempo Timesheets (Jira) 14](https://actionlake.com/connectors/tempo-timesheets-jira)
- [Todoist 14](https://actionlake.com/connectors/todoist)

Joins with, on shared entities

- [Tableau 4](https://actionlake.com/connectors/tableau)
- [MongoDB Atlas 4](https://actionlake.com/connectors/mongodb-atlas)
- [Sentry 4](https://actionlake.com/connectors/sentry)
- [Adobe Frame.io (V4) 4](https://actionlake.com/connectors/adobe-frame-io-v4)
- [HaloPSA 3](https://actionlake.com/connectors/halopsa)
- [Delinea Secret Server 3](https://actionlake.com/connectors/delinea-secret-server)

Browse

- [All Work & projects connectors](https://actionlake.com/connectors/category/work-and-projects)
- [All connectors](https://actionlake.com/connectors)
- [How actionlake compares](https://actionlake.com/compare)

actionlake is independent. It is not made or endorsed by Miro; the name is the vendor's own. Counts are from the Miro service file, version 1.0.0.

## Give your agent Miro today.

[Connect Miro free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.

---

Source: https://actionlake.com/connectors/miro
More: https://actionlake.com/llms.txt
