Read and interpret Miro boards
Reads and interprets Miro boards via API, presenting structured analysis of sticky notes, shapes, frames, and connectors. Use it to analyze workflows, extract tasks, or understand visual planning boards when you need to convert Miro content into actionable insights.
/plugin marketplace add paddo/claude-tools/plugin install miro@paddo-toolssonnetRead and interpret Miro boards via API, presenting structured analysis for planning and reasoning.
Base URL: https://api.miro.com/v2
Auth Header:
Authorization: Bearer $MIRO_TOKEN
From URL https://miro.com/app/board/uXjV...=/ → board ID is uXjV...=
curl -s "https://api.miro.com/v2/boards/{board_id}" \
-H "Authorization: Bearer $MIRO_TOKEN" | jq '{name, description, createdAt, modifiedAt}'
curl -s "https://api.miro.com/v2/boards/{board_id}/items?limit=50" \
-H "Authorization: Bearer $MIRO_TOKEN" | jq
# Types: sticky_note, shape, text, frame, connector, image, card, app_card
curl -s "https://api.miro.com/v2/boards/{board_id}/sticky_notes?limit=50" \
-H "Authorization: Bearer $MIRO_TOKEN" | jq
Response includes cursor for next page:
curl -s "https://api.miro.com/v2/boards/{board_id}/items?limit=50&cursor={cursor}" \
-H "Authorization: Bearer $MIRO_TOKEN" | jq
{
"id": "...",
"type": "sticky_note",
"data": { "content": "Text content", "shape": "square" },
"style": { "fillColor": "yellow" },
"position": { "x": 100, "y": 200 },
"parent": { "id": "frame_id" } // if inside a frame
}
{
"id": "...",
"type": "shape",
"data": { "content": "Text", "shape": "rectangle|circle|triangle|..." },
"style": { "fillColor": "#ffffff", "borderColor": "#000000" },
"position": { "x": 100, "y": 200 },
"geometry": { "width": 200, "height": 100 }
}
{
"id": "...",
"type": "frame",
"data": { "title": "Frame Title" },
"position": { "x": 0, "y": 0 },
"geometry": { "width": 800, "height": 600 }
}
{
"id": "...",
"type": "connector",
"startItem": { "id": "item1_id" },
"endItem": { "id": "item2_id" },
"style": { "strokeColor": "#000000" },
"captions": [{ "content": "label" }]
}
{
"id": "...",
"type": "text",
"data": { "content": "Free text content" },
"position": { "x": 100, "y": 200 }
}
Present the board as structured analysis:
# Board: {name}
{description}
## Frames / Sections
### {Frame Title}
- Sticky: "content" (yellow)
- Sticky: "content" (blue)
- Shape: "content" (rectangle)
### Unframed Items
- Text: "content"
- Sticky: "content"
## Connections / Flow
- "Item A" → "Item B" (label)
- "Item B" → "Item C"
## Interpretation
[Your analysis of what the board represents - workflows, hierarchies, brainstorms, etc.]
## Suggested Actions
[If user wants work items, extract actionable tasks from the board]
parent.id are grouped in the same frameFrames titled: "To Do", "In Progress", "Done" with stickies inside
Shapes connected by connectors, often with decision diamonds
Scattered stickies, possibly clustered by color or position
Horizontal frames representing stages, stickies for touchpoints
Use this agent when analyzing conversation transcripts to find behaviors worth preventing with hooks. Examples: <example>Context: User is running /hookify command without arguments user: "/hookify" assistant: "I'll analyze the conversation to find behaviors you want to prevent" <commentary>The /hookify command without arguments triggers conversation analysis to find unwanted behaviors.</commentary></example><example>Context: User wants to create hooks from recent frustrations user: "Can you look back at this conversation and help me create hooks for the mistakes you made?" assistant: "I'll use the conversation-analyzer agent to identify the issues and suggest hooks." <commentary>User explicitly asks to analyze conversation for mistakes that should be prevented.</commentary></example>