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.
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/mcpdo { action: "miro.boards.list", intent: "check which Miro account is connected"}# Get boards · read · 1 upstream call- 178actionsin one signed file
- 77readlook, never change
- 66writecreate and update
- 35wait for a yesdestructive, confirmed first
Set up
Connect Miro in three steps.
- 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 - 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_tokenAccess token from one sign-in with your own OAuth apprefresh_tokenRefresh token from the same sign-in; the access token is renewed from itclient_idMiro app Client IDclient_secretMiro app Client secret (same App Credentials page)
account { op: "connections.requirements", service: "miro" } # free: exactly what to paste, and what is found for you - 03
Make the first call. Check before a write.
Ask in plain words; Claude picks the action. Before anything changes,
checkvalidates the call and prices it, for free.do { action: "miro.boards.list" }# get boards · read · 1 upstream callcheck { 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_tokenrefresh_tokenclient_idclient_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 2026OpenAPI spec (GitHub)developers.miro.com
- 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.
- 77readlook, never change
- 66writecreate and update
- 35destructivewait for a confirmation
Board groups
73 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
Items
74 read · 2 write · 1 destructive
Create items in bulk · Get items on board · Get items by tag · Get items within frame
Boards
62 read · 3 write · 1 destructive
Get boards · Create board · Get specific board · Update board
Code widgets
62 read · 3 write · 1 destructive
Create code widget item · Get code widget items · Get code widget item · Move code widget item
Board export jobs
53 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
Board members
52 read · 2 write · 1 destructive
Get all board members · Get specific board member · Update board member · Remove board member
Cases
52 read · 2 write · 1 destructive
Create case · Get all cases · Get case · Edit case
Connectors
52 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.listGet organization members | Get organization members. | read | identity.user.list474 connectors |
miro.projects.listList of projects | List of projects. | read | work.project.list109 connectors |
miro.user_groups.listList of user groups | List of user groups. | read | identity.group.list262 connectors |
miro.teams.listList teams | List teams. | read | work.workspace.list50 connectors |
miro.user_group_members.listList of user group members | List of user group members. | read | identity.group_member.list103 connectors |
miro.projects.createCreate project | Create project. | write | work.project.create102 connectors |
miro.user_groups.createCreate user group | Create user group. | write | identity.group.create205 connectors |
miro.org_members.getGet organization member | Get organization member. | read | identity.user.get399 connectors |
miro.teams.createCreate team | Create team. | write | work.workspace.create36 connectors |
miro.projects.deleteDelete project | Delete project. | destructive | work.project.delete85 connectors |
miro.token.getGet access token information | Get access token information. | read | identity.current_user.get307 connectors |
miro.user_group_members.getGet user group member | Get user group member. | read | identity.group_member.get30 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.
- Readread
Give me a one-line status for every active Miro project.
calls
miro.projects.list - Writewrite
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.
Delete project?
intent: the user asked me to delete project
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: "[email protected]" }, { match: "miro.user_groups.delete", approver: "[email protected]" }, { match: "miro.teams.delete", approver: "[email protected]" } ]}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.
- 1upstream call per actionall 178 Miro actions
- 178actions pageeach page of a long list is one call
- 77reads can be cacheda cache hit costs nothing
- 100,000calls a month, freepaid plans from US$49 a month for 250,000
Action index
Every Miro action.
178 actions by area: the id your agent calls, what it does, and its effect.
Board groups7
miro.board_groups.createCreate groupwritemiro.board_groups.deleteDeletes the groupdestructivemiro.board_groups.getGet a group by its IDreadmiro.board_groups.get_itemsGet items of a group by IDreadmiro.board_groups.listGet all groups on a boardreadmiro.board_groups.ungroupUngroup itemsdestructivemiro.board_groups.updateUpdates a group with new itemswrite
Items7
miro.items.bulk_createCreate items in bulkwritemiro.items.deleteDelete itemdestructivemiro.items.getGet specific item on boardreadmiro.items.listGet items on boardreadmiro.items.list_by_tagGet items by tagreadmiro.items.list_within_frameGet items within framereadmiro.items.update_position_or_parentUpdate item position or parentwrite
Boards6
miro.boards.copyCopy boardwritemiro.boards.createCreate boardwritemiro.boards.deleteDelete boarddestructivemiro.boards.getGet specific boardreadmiro.boards.listGet boardsreadmiro.boards.updateUpdate boardwrite
Code widgets6
miro.code_widgets.createCreate code widget itemwritemiro.code_widgets.deleteDelete code widget itemdestructivemiro.code_widgets.getGet code widget itemreadmiro.code_widgets.listGet code widget itemsreadmiro.code_widgets.moveMove code widget itemwritemiro.code_widgets.updateUpdate code widget itemwrite
Board export jobs5
miro.board_export_jobs.createCreate board export jobwritemiro.board_export_jobs.get_resultsGet results for board export jobreadmiro.board_export_jobs.get_statusGet board export job statusreadmiro.board_export_jobs.listGet board export jobs listreadmiro.board_export_jobs.update_statusUpdate board export job statuswrite
Board members5
miro.board_members.getGet specific board memberreadmiro.board_members.listGet all board membersreadmiro.board_members.removeRemove board memberdestructivemiro.board_members.shareShare boardwritemiro.board_members.updateUpdate board memberwrite
Cases5
miro.cases.createCreate casewritemiro.cases.deleteClose casedestructivemiro.cases.getGet casereadmiro.cases.listGet all casesreadmiro.cases.updateEdit casewrite
Connectors5
miro.connectors.createCreate connectorwritemiro.connectors.deleteDelete connectordestructivemiro.connectors.getGet specific connectorreadmiro.connectors.listGet connectorsreadmiro.connectors.updateUpdate connectorwrite
Legal holds5
miro.legal_holds.createCreate legal holdwritemiro.legal_holds.deleteClose legal holddestructivemiro.legal_holds.getGet legal hold informationreadmiro.legal_holds.listGet all legal holds within a casereadmiro.legal_holds.updateEdit legal holdwrite
Project members5
miro.project_members.addAdd member in a projectwritemiro.project_members.getGet project memberreadmiro.project_members.listList of project membersreadmiro.project_members.removeRemove project memberdestructivemiro.project_members.updateUpdate project memberwrite
Projects5
miro.projects.createCreate projectwritemiro.projects.deleteDelete projectdestructivemiro.projects.getGet projectreadmiro.projects.listList of projectsreadmiro.projects.updateUpdate projectwrite
Tags5
miro.tags.createCreate tagwritemiro.tags.deleteDelete tagdestructivemiro.tags.getGet tagreadmiro.tags.listGet tags from boardreadmiro.tags.updateUpdate tagwrite
Team members5
miro.team_members.deleteDelete team member from teamdestructivemiro.team_members.getGet team memberreadmiro.team_members.inviteInvite team memberswritemiro.team_members.listList team membersreadmiro.team_members.updateUpdate team memberwrite
Teams5
miro.teams.createCreate teamwritemiro.teams.deleteDelete teamdestructivemiro.teams.getGet teamreadmiro.teams.listList teamsreadmiro.teams.updateUpdate teamwrite
User group members5
miro.user_group_members.addCreate user group memberwritemiro.user_group_members.bulk_updateBulk edit of membership in user groupwritemiro.user_group_members.getGet user group memberreadmiro.user_group_members.listList of user group membersreadmiro.user_group_members.removeDelete user group memberdestructive
User groups5
miro.user_groups.createCreate user groupwritemiro.user_groups.deleteDelete user groupdestructivemiro.user_groups.getGet user groupreadmiro.user_groups.listList of user groupsreadmiro.user_groups.updateUpdate user groupwrite
App cards4
miro.app_cards.createCreate app card itemwritemiro.app_cards.deleteDelete app card itemdestructivemiro.app_cards.getGet app card itemreadmiro.app_cards.updateUpdate app card itemwrite
Cards4
miro.cards.createCreate card itemwritemiro.cards.deleteDelete card itemdestructivemiro.cards.getGet card itemreadmiro.cards.updateUpdate card itemwrite
Documents4
miro.documents.createCreate document item using URLwritemiro.documents.deleteDelete document itemdestructivemiro.documents.getGet document itemreadmiro.documents.updateUpdate document item using URLwrite
Embeds4
miro.embeds.createCreate embed itemwritemiro.embeds.deleteDelete embed itemdestructivemiro.embeds.getGet embed itemreadmiro.embeds.updateUpdate embed itemwrite
Flowchart shapes4
miro.flowchart_shapes.createCreate shape itemwritemiro.flowchart_shapes.deleteDelete shape itemdestructivemiro.flowchart_shapes.getGet shape itemreadmiro.flowchart_shapes.updateUpdate shape itemwrite
Frames4
miro.frames.createCreate framewritemiro.frames.deleteDelete framedestructivemiro.frames.getGet framereadmiro.frames.updateUpdate framewrite
Images4
miro.images.createCreate image item using URLwritemiro.images.deleteDelete image itemdestructivemiro.images.getGet image itemreadmiro.images.updateUpdate image item using URLwrite
Mindmap nodes4
miro.mindmap_nodes.createCreate mind map nodewritemiro.mindmap_nodes.deleteDelete mind map nodedestructivemiro.mindmap_nodes.getGet specific mind map nodereadmiro.mindmap_nodes.listGet mind map nodesread
Shapes4
miro.shapes.createCreate shape itemwritemiro.shapes.deleteDelete shape itemdestructivemiro.shapes.getGet shape itemreadmiro.shapes.updateUpdate shape itemwrite
Sticky notes4
miro.sticky_notes.createCreate sticky note itemwritemiro.sticky_notes.deleteDelete sticky note itemdestructivemiro.sticky_notes.getGet sticky note itemreadmiro.sticky_notes.updateUpdate sticky note itemwrite
Team user groups4
miro.team_user_groups.addCreate user group to team connectionwritemiro.team_user_groups.getGet user group of a teamreadmiro.team_user_groups.listList of user group to team connectionsreadmiro.team_user_groups.removeDelete user group to team connectiondestructive
Texts4
miro.texts.createCreate text itemwritemiro.texts.deleteDelete text itemdestructivemiro.texts.getGet text itemreadmiro.texts.updateUpdate text itemwrite
Board user groups3
miro.board_user_groups.listGet board user group assignmentsreadmiro.board_user_groups.removeDelete board user group assignmentdestructivemiro.board_user_groups.shareCreate board user group assignmentswrite
Docs3
miro.docs.createCreate doc format itemwritemiro.docs.deleteDelete doc format itemdestructivemiro.docs.getGet doc format itemread
Experimental items3
miro.experimental_items.deleteDelete itemdestructivemiro.experimental_items.getGet specific item on boardreadmiro.experimental_items.listGet items on boardread
Item tags3
miro.item_tags.attachAttach tag to itemwritemiro.item_tags.listGet tags from itemreadmiro.item_tags.removeRemove tag from itemdestructive
Org members3
miro.org_members.getGet organization memberreadmiro.org_members.listGet organization membersreadmiro.org_members.search_by_emailsLook up organization members by email.read
Project user groups3
miro.project_user_groups.listGet project user group assignmentsreadmiro.project_user_groups.removeDelete project user group assignmentdestructivemiro.project_user_groups.shareCreate project user group assignmentswrite
App metrics2
miro.app_metrics.get_totalGet total app metricsreadmiro.app_metrics.listGet app metricsread
Board data classification2
miro.board_data_classification.getGet board classificationreadmiro.board_data_classification.setUpdate board classificationwrite
Board export job tasks2
miro.board_export_job_tasks.create_export_linkCreate task export linkwritemiro.board_export_job_tasks.listGet board export job tasks listread
Project settings2
miro.project_settings.getGet project settingsreadmiro.project_settings.updateUpdate project settingswrite
Team data classification settings2
miro.team_data_classification_settings.getGet team settingsreadmiro.team_data_classification_settings.updateUpdate team settingswrite
Team settings2
miro.team_settings.getGet team settingsreadmiro.team_settings.updateUpdate team settingswrite
Token2
miro.token.getGet access token informationreadmiro.token.revokeRevoke token (v2)destructive
User group teams2
miro.user_group_teams.getGet user group teamreadmiro.user_group_teams.listGet teams of a user groupread
AI interaction logs1
miro.ai_interaction_logs.listGet AI interaction logs (Beta)read
Audit logs1
miro.audit_logs.listGet audit logsread
Content logs1
miro.content_logs.listRetrieve content change logs of board itemsread
Default team settings1
miro.default_team_settings.getGet default team settingsread
Legal hold content items1
miro.legal_hold_content_items.listGet content items under legal holdread
Legal hold export jobs1
miro.legal_hold_export_jobs.listGet board export jobs of a caseread
Org data classification settings1
miro.org_data_classification_settings.getGet organization settingsread
Organizations1
miro.organizations.getGet organization inforead
Team data classification1
miro.team_data_classification.bulk_update_boardsBulk update boards classificationwrite
User sessions1
miro.user_sessions.reset_allReset all sessions of a userdestructive
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.
Give your agent Miro today.
Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.