Skip to main content
Use Miro through Corsair: one client, typed API calls. Send a Miro access token as a bearer token. Create an app in Miro under Settings, Your apps, install it on your team and copy the access token it gives you. Leave Expire user authorization token unticked when you create the app. An expiring token lasts 60 minutes, and this plugin stores the token as an API key and does not refresh it, so calls start failing with 401 once it lapses. Miro does not let you change this after the app is created. Things that shape the calls:
  • Boards page by offset, items by cursor. boards.list takes limit and offset and reports total; items.list and connectors.list take a cursor and return the next one. Members, tags and tags.items page by offset. tags.ofItem returns every tag on the item in one response.
  • List rows arrive as data. Miro names every list array data whatever the resource, so each operation renames it after the resource: boards, items, tags, members, connectors. tags.ofItem is the exception and keys them tags.
  • Item writes are nested. Miro expects a sticky note’s content and shape under data, its colour under style, and its frame under parent.id. This plugin takes them flat and groups them for you.
  • Connectors need two existing items. Both startItemId and endItemId are required and must already be on the board; a connector cannot be created against a loose point.
  • Tags on items travel in the query. tags.attach and tags.removeFromItem both address /v2/boards/{boardId}/items/{itemId} with tag_id as a query parameter. Each call handles one tag, so attach several by calling it once per tag; an earlier tag stays attached.
  • boards.copy is a PUT on the collection with copy_from as a required query parameter, not a body field.
  • Scopes. Reads need boards:read, writes need boards:write. A token without the write scope gets 403.
  • Rate limits are per minute by tier, and a 429 carries Retry-After; retries are capped at three.
  • A 5xx is retried on reads only. A write that answers 5xx may still have been applied, so it is not sent again; check the board before repeating it.
What you get:
  • 40 typed API operations

Setup

1

Install

2

Add the plugin

corsair.ts
With multiTenancy: true, scope calls with corsair.withTenant(id). See Quick start for KEK + Hub keys, and Multi-tenancy for account isolation.
3

Choose authentication

4

Connect a tenant

Mint a connect link and send the tenant to it. Hub hosts the page and delivers the result to your app — see Connect / OAuth.

Example API calls

List the boards you can see
Add a sticky note to a board
See the full list on the API page.

What’s next

API reference

Every miro.api.* operation with input and output types.

Connect / OAuth

createLink, Hub delivery, and tenant connect flows.

Use with agents

Expose this plugin’s operations as MCP tools.