kachar.dev
The index
No. 20ai / agents / architecture / cto

Agents should draw their work. Miro MCP lets them.

Agents now make more than anyone can read. Connect Claude Code or Codex to the Miro MCP and have them draw it instead. Five skills to copy.

By , CTO & Co-founder, Juma Labs

Published
Words
1,882
Reading
9 min
Sections
05

A dim workshop. On the left, a towering stack of printed code pages spills onto the floor. On the right, a brass drafting arm draws a small block diagram in glowing electric violet on a clean sheet of paper.

My agents now produce more than I can read. One session is hundreds of tool calls. One afternoon is a new module, a benchmark, a pile of research notes and a design that changed twice along the way. I can't read all of it. I also can't stop checking it.

So I ask the agent to draw it.

A picture is small enough to check. A wrong arrow jumps out in a way a wrong sentence on page nine never does. With the , the agent draws straight onto a board, as real diagrams I can move, comment on and share with the team. That's the whole practice: let the agent do the work, then make it show you the work as a picture.

Agents write faster than people read

This isn't a feeling. Faros AI tracked more than 10,000 developers across 1,255 teams in 2025 and found that teams with high AI adoption produce 154% bigger pull requests and spend 91% longer reviewing them. 's March 2026 guidance says the time saved writing code "is often re-allocated to verification overhead".

The cost isn't only review time. It's losing the picture in your head. Simon Willison described it after letting agents build features he didn't review: "I no longer have a firm mental model of what they can do and how they work."

That mental model is the thing to protect. You don't need to read every line an agent wrote. You do need to know how the system fits together, how the important flows run, what just changed and why you chose it.

Diagrams always helped. They were just expensive.

The evidence that pictures help people understand software is old and consistent. In a experiment at Simula, the hardest maintenance task got 46% correct answers without diagrams and 89% with them. In a 2024 study, analysts given linked back to the code were 41% more correct on a security review.

The problem was cost. Microsoft researchers found developer diagrams were mostly throwaway "because of the high cost of changing whiteboard sketches to electronic renderings." Redrawing took a person an afternoon, so diagrams went stale a week after someone drew them.

An agent that has just done the work can draw it in a minute. So the diagram doesn't have to last. You ask for it when you need to understand something, check it, and draw a new one next time.

Connecting takes one command

Miro runs a remote server at https://mcp.miro.com/. You sign in with , so there's no API key to paste. You pick a Miro team when you sign in, and the agent can use the boards you can already open in that team.

. Either install Miro's plugin, which also brings Miro's own code-explain, code-review and code-spec skills:

claude plugin install miro@claude-plugins-official

Or register just the server:

claude mcp add --transport http miro https://mcp.miro.com/

. One command, and it opens the sign-in page in your browser straight away:

codex mcp add miro --url https://mcp.miro.com/

Two things to know first. Miro keeps one MCP connection per user: "if you auth into 3 clients, only the latest client connection will work." So connect each tool one way, not two.

The other is a daily limit, and every tool call counts. As of September 2026 that's 100 calls on Free, 500 on Starter, 2,000 on Business and 10,000 on Enterprise. Each figure in this post took a handful of calls. On Enterprise, an admin may need to switch MCP on first.

Miro's launch video shows the same idea from their side:

Introducing Miro's MCP Server (Miro, February 2026)

The tools changed a lot this month. In mid-September Miro retired fifteen old tools, including every diagram_*, layout_* and doc_* call. Now the agent writes plain SVG, and Miro turns it into real board items: sticky notes, shapes, and proper flowcharts, sequence diagrams, and class diagrams. Miro's reason is simple: "SVG sits in every model's training data."

Five pictures worth asking for

A skill is a Markdown file that tells the agent when and how to do one job. Claude Code reads them from ~/.claude/skills/ and Codex from ~/.agents/skills/. Each skill below installs with one line, and you can read the whole file before you do.

All five also live in a public repo, kachar/miro-agent-skills, so one command installs them into Claude Code, Codex, and the other agents skills.sh supports:

npx skills add kachar/miro-agent-skills

The examples come from real work: the tool search I wrote about in Jev picks the right tool for an LLM and BM25 got Orama. Jev still needs one. The engine and its benchmark are open source, so every box in these pictures is public.

What the agent just did

Start with the session itself. I gave Claude Code an empty frame and asked it to draw how this article was being made:

A left-to-right flowchart on a Miro board titled "How this article got made": a /goal brief leads to a git worktree, which fans out to two research subagents and a Miro MCP step. A decision gate asks whether every claim was opened at the source, looping to "Drop or re-fetch" on No. Then drafting, a gate for tests at 100%, a humanizer pass and screenshots, and a final step that ships it.

A transcript of that run is hundreds of tool calls long. The picture is eleven boxes, and the two decision gates are where the real work happened. That's the first thing I check.

miro-session-map

Draw what the current agent session did, or is about to do, as a flowchart on a Miro board - steps, parallel branches, decision gates and where it ended. Use when the user says "map this session", "draw what we just did", "document this process on the board", or wants a visual record of a long agent run before reviewing its output.

skills.sh
npx skills add kachar/miro-agent-skills --skill miro-session-map
Claude Code
mkdir -p ~/.claude/skills/miro-session-map && curl -fsSL https://kachar.dev/skills/miro-session-map/SKILL.md -o ~/.claude/skills/miro-session-map/SKILL.md
Codex
mkdir -p ~/.agents/skills/miro-session-map && curl -fsSL https://kachar.dev/skills/miro-session-map/SKILL.md -o ~/.agents/skills/miro-session-map/SKILL.md
Read the SKILL.md
---
name: miro-session-map
description: Draw what the current agent session did, or is about to do, as a flowchart on a Miro board - steps, parallel branches, decision gates and where it ended. Use when the user says "map this session", "draw what we just did", "document this process on the board", or wants a visual record of a long agent run before reviewing its output.
---

# Map this session on a Miro board

A long agent session is a process nobody watched end to end. This skill turns it into one
flowchart a human can check in thirty seconds.

## Before drawing

1. Ask for the board URL if you don't have one. If the user gave a frame link
   (`?moveToWidget=<id>`), read that frame first with `canvas_read_as_svg` and draw inside it.
2. Reconstruct the session from evidence, not memory: the conversation, `git log --oneline`,
   `git diff --stat`, files you created, subagents you started, tests you ran. Every node must map
   to something that happened (or, for a plan, something you will do next).
3. Keep it to 8-15 nodes. Merge small steps. If the session had more than 15 real steps,
   draw one frame per phase instead of one crowded diagram.

## Drawing

1. Call `canvas_get_canvas_composer_skill` first (it is required), then
   `canvas_load_format_skill` with `format_name: "diagramming"` and `notation: "flowchart"`.
2. One Mermaid `flowchart LR` inside a `<foreignObject data-type="diagram">`:
   - start and end nodes as stadiums `([...])`
   - work as rectangles, decision gates as `{{...}}` with labeled `Yes` / `No` edges
   - parallel work (subagents, background jobs) as sibling branches from the same node
   - loops that actually happened (a failed test, a re-fetch) as edges back to the gate
3. Label nodes with the concrete thing, not the category: "Subagent: benchmark research", not
   "Research".
4. Under the diagram, add one line with the prompt that produced it, so the board explains itself.

## Miro gotchas

- A diagram widget sizes itself from the Mermaid source and cannot be moved or deleted with the
  canvas tools after creation. Choose its position first, then fit the frame around the rendered
  size.
- Its title chip floats just above it. Leave about 64px of empty space above the diagram.
- Children of a frame use frame-relative coordinates.
- Quote any label that starts with `/` (`a["/api/orders"]`) or Mermaid draws a parallelogram.

## Finish

Report the frame link (`<board>?moveToWidget=<frame id>`) and one sentence on what the map shows
that the transcript hides, such as a gate that failed twice.

How the system fits together

This is the map you'd want on day one of a new codebase: what runs where, what calls what, and what writes data. Here is the Jev tool search, drawn from its repo:

A Miro block diagram titled "How does the Jev tool search fit together?". Claude asks a custom tool search for tools and gets tool_reference blocks back. The tool search shortlists with Voyage embeddings and hands off to the jev-search prototype, where createIndex feeds a planner (direct, tournament, fallback). The planner asks Jev on Vercel AI Gateway which tool fits, and falls back to Orama BM25 if Jev keeps refusing. An eval harness with MetaTool (199 tools) and LiveMCPBench (525 tools) measures hit@1, top 5, capacity errors, latency and cost, and picks the planner's defaults.

The box I'd have missed in the code is the at the bottom left. It never serves a search, yet every default the planner uses was picked by measuring with it. In the picture, that arrow is hard to miss.

One warning. A good map of your own production system lists every endpoint, login path and data store. That's the first page of an attacker's notes. Draw it on a board only your team can open.

miro-system-map

Read the current repository and draw how the system is put together today as a block diagram on a Miro board - runtimes, services, data stores, external APIs and the arrows that write data. Use when the user asks to "draw the current setup", "diagram the architecture", "show me how this repo fits together", or is onboarding onto an unfamiliar or agent-written codebase.

skills.sh
npx skills add kachar/miro-agent-skills --skill miro-system-map
Claude Code
mkdir -p ~/.claude/skills/miro-system-map && curl -fsSL https://kachar.dev/skills/miro-system-map/SKILL.md -o ~/.claude/skills/miro-system-map/SKILL.md
Codex
mkdir -p ~/.agents/skills/miro-system-map && curl -fsSL https://kachar.dev/skills/miro-system-map/SKILL.md -o ~/.agents/skills/miro-system-map/SKILL.md
Read the SKILL.md
---
name: miro-system-map
description: Read the current repository and draw how the system is put together today as a block diagram on a Miro board - runtimes, services, data stores, external APIs and the arrows that write data. Use when the user asks to "draw the current setup", "diagram the architecture", "show me how this repo fits together", or is onboarding onto an unfamiliar or agent-written codebase.
---

# Draw the current system as a block diagram

The goal is the picture a new engineer would draw after a week, produced from the code in ten
minutes. Draw what the code does today, not what the README says it should do.

## Gather facts from the code

1. Entry points: framework routes, API handlers, CLIs, workers, cron jobs.
2. Data: ORM schemas, migrations, connection env vars (names only, never values).
3. Outbound calls: SDK imports and `fetch` targets (email, payments, analytics, LLM providers).
4. Deployment: `vercel.json`/`vercel.ts`, Dockerfiles, IaC, CI workflows.
5. For every arrow you plan to draw, find the line of code that makes the call. If you can't find
   it, leave the arrow out.

## Drawing

1. Call `canvas_get_canvas_composer_skill` first, then `canvas_load_format_skill` with
   `format_name: "diagramming"`, `notation: "flowchart"`.
2. One Mermaid `flowchart LR`:
   - a `subgraph` per place the code runs (for example "Vercel: Next.js", "Worker", "Browser")
   - data stores as cylinders `[(...)]`
   - third-party services in one neutral color, your code in one color, data in a third
   - who calls whom as arrows. Label every arrow that writes or sends data
     ("writes orders", "sends receipts"); leave reads unlabeled
3. 10-15 nodes. If it needs more, draw a top-level map plus one frame per subsystem.
4. Title the frame with a question the diagram answers ("What is <project>, today?").
5. Add the prompt as a caption under the diagram.

## Miro gotchas

- Quote labels that start with `/` or contain brackets: `blog["/blog/[slug]"]`.
- Diagram widgets size themselves, and the canvas tools can't move them after creation. Size the
  frame to the rendered diagram, not to what you authored.
- Leave about 64px above the diagram for its floating title chip.

## Keep it private

A system map lists every endpoint, auth path and data store in one picture. That's the first page of a
threat model. Draw it on a board only your team can open, and never paste it into public docs or posts.

## Finish

Share the frame link and list anything surprising the map exposed, such as a service two
subsystems both write to, or a dependency no one documented.

How one flow runs

A sequence diagram answers "what happens when," which is most of what you want to know about code you didn't write. Here is one Jev search, including what happens when the provider refuses:

A UML sequence diagram titled "What happens on one Jev search?". Claude asks the tool search for a tool, which gets a top 100 shortlist from Voyage embeddings and calls the planner. The planner asks Jev one question with two hedged requests racing. If Jev answers, it returns picks with probabilities. If it is refused twice, the planner sends parallel chunks of short summaries, then a final round over 8 finalists with full text and parameters. If it is refused again, Orama BM25 ranks by words and the plan is marked as fallback. The hits go back to Claude as tool_reference blocks.

Those three branches are the whole design of the engine, and the picture puts them in one box with three rows. When a search is slow, that box tells you where to look.

miro-flow-trace

Trace one request, job or user action through the code and draw it as a UML sequence diagram on a Miro board, including auth branches, retries and error paths. Use when the user asks "what happens when...", "trace this flow", "how does X get from A to B", or needs to review a change to a request path they didn't write.

skills.sh
npx skills add kachar/miro-agent-skills --skill miro-flow-trace
Claude Code
mkdir -p ~/.claude/skills/miro-flow-trace && curl -fsSL https://kachar.dev/skills/miro-flow-trace/SKILL.md -o ~/.claude/skills/miro-flow-trace/SKILL.md
Codex
mkdir -p ~/.agents/skills/miro-flow-trace && curl -fsSL https://kachar.dev/skills/miro-flow-trace/SKILL.md -o ~/.agents/skills/miro-flow-trace/SKILL.md
Read the SKILL.md
---
name: miro-flow-trace
description: Trace one request, job or user action through the code and draw it as a UML sequence diagram on a Miro board, including auth branches, retries and error paths. Use when the user asks "what happens when...", "trace this flow", "how does X get from A to B", or needs to review a change to a request path they didn't write.
---

# Trace one flow as a sequence diagram

A sequence diagram answers one question: in what order do these parts talk, and what happens when
something fails? Pick exactly one flow per diagram.

## Trace it in the code

1. Start at the entry point the user named (route, handler, queue consumer, CLI command).
2. Follow the calls in order. For each hop write down the caller, the callee, the message (the
   function or HTTP call) and the file it happens in.
3. Record the branches that matter: auth paths, cache hit or miss, retries, the error the
   caller actually sees. Skip logging and metrics.
4. Participants are components (route handler, auth library, DB), not individual functions.
   Five to seven participants is plenty.

## Drawing

1. Call `canvas_get_canvas_composer_skill` first, then `canvas_load_format_skill` with
   `format_name: "diagramming"`, `notation: "uml_sequence"`.
2. One Mermaid `sequenceDiagram`. Use `alt` / `else` for branches and a nested `alt` for the
   failure case inside a branch. Dashed arrows (`--&gt;&gt;`) for responses. Remember that the
   body is XML, so `-&gt;&gt;` not `->>`.
3. Message labels are the real call names from the code (`verifySession`, `POST /orders`),
   so a reviewer can grep for them.
4. Sequence diagrams render tall. Give the frame at least 1,300px of height and check the
   rendered size before placing the caption.

## Keep it private

Auth flows are the part of a system an attacker most wants mapped. Keep these frames on a team-only board,
and leave secrets out of the labels: name an env var if you must, never its value.

## Finish

Share the frame link and name the one step where you'd put a breakpoint or a test if this flow
broke in production.

What changed

Agents change a lot at once. The useful question is small: what did it look like before, and what does it look like now? This is the change from the second Jev post, drawn as two rows:

A Miro change map titled "What changed when it met real MCP tools?". Before, with defaults tuned on MetaTool: full description in every option, 1,600-token chunks holding a dozen tools, dozens of chunks, a final round comparing lookalikes on thin text, and 39% right tool first. After, tuned on 525 real MCP tools too: embeddings top 100 in front, 160-character summaries to narrow, a final round over 8 finalists with full description and parameters, and 59% right tool first with 92% in the top 5.

In the post, that change took several paragraphs to explain. The two rows show it in one look: orange is what broke, green is what was added, blue is what was reworked.

miro-change-map

Draw what an agent changed as a before-and-after map on a Miro board - which parts were added, removed or rewired, and what that did to the behaviour or the numbers. Use when the user asks "what did you change", "show me before and after", "what's different now", or has to understand a large agent-made change (a refactor, a migration, a new pipeline, a tuned config) without reading all of it.

skills.sh
npx skills add kachar/miro-agent-skills --skill miro-change-map
Claude Code
mkdir -p ~/.claude/skills/miro-change-map && curl -fsSL https://kachar.dev/skills/miro-change-map/SKILL.md -o ~/.claude/skills/miro-change-map/SKILL.md
Codex
mkdir -p ~/.agents/skills/miro-change-map && curl -fsSL https://kachar.dev/skills/miro-change-map/SKILL.md -o ~/.agents/skills/miro-change-map/SKILL.md
Read the SKILL.md
---
name: miro-change-map
description: Draw what an agent changed as a before-and-after map on a Miro board - which parts were added, removed or rewired, and what that did to the behaviour or the numbers. Use when the user asks "what did you change", "show me before and after", "what's different now", or has to understand a large agent-made change (a refactor, a migration, a new pipeline, a tuned config) without reading all of it.
---

# Map a change as before and after

An agent can change more in an hour than a person can read in a day. The question a human needs
answered is small: what did it look like before, what does it look like now, and what did that do?

## Find the change, don't guess it

1. Work from evidence: `git diff --stat <base>...HEAD`, the files you touched, the config or
   prompts you edited, the benchmark or test output before and after.
2. Name the unit that changed. It is usually a flow (how a request moves), a structure (which
   parts exist and who calls whom) or a setting (the defaults a system runs with).
3. Write the before in three to six steps and the after in three to six steps, in the same
   vocabulary, so the two rows can be compared box by box.
4. If a number moved (accuracy, latency, cost, error rate), put the before and after values in
   the last box of each row. Only use numbers you measured or can point to.

## Drawing

1. Call `canvas_get_canvas_composer_skill` first, then `canvas_load_format_skill` with
   `format_name: "diagramming"`, `notation: "flowchart"`.
2. Draw two separate Mermaid `flowchart LR` diagrams in one frame, "Before" on top and "After"
   below it. (Miro lays out one diagram with two subgraphs side by side, which gets too wide.)
3. Colors: added = green, removed or broken = orange, changed = blue, unchanged = no fill.
4. Put a bold "Before" and "After" label next to each diagram. Diagram titles only show on hover.
5. Title the frame with the question it answers ("What changed when it met real data?") and
   add the prompt as a caption.

## Miro gotchas

- Miro treats every diagram as a 1600x900 box when you resize a frame, even though it renders
  smaller. Leave the frame at least that tall below the lowest diagram's top edge.
- Leave about 64px above each diagram for its floating title chip.

## Finish

Share the frame link and name the one box a reviewer should check first, usually the most
important green or orange one.

The decision

Hard calls usually come down to a few numbers pulling in different directions: accuracy, cost, speed. Miro has no chart widget, so this skill builds bars out of shapes, highlights the option you picked, and writes the decision underneath. These are the results from the first Jev post:

A horizontal bar chart on Miro titled "Which tool search ships by default?", showing right-tool-first accuracy at 525 MCP tools: Voyage rerank 60%, Jev search 56%, embeddings top 100 then Jev 52% highlighted in green, Voyage embeddings 46%, Orama BM25 then Jev 38-40%, Orama BM25 alone 32%, each with cost per 1,000 searches and median latency. A green box states the decision: embeddings then Jev, four points behind Jev alone at about a quarter of the cost.

The decision fits in one sentence, and the reason sits next to it. People who will never open the results table can still see the trade-off and argue with it.

miro-decision-chart

Turn the numbers behind a hard technical decision into a chart on a Miro board, with the chosen option highlighted and the decision written underneath. Use when the user asks to "chart these results", "help me decide between", "visualize this benchmark/comparison", or needs to explain a trade-off (accuracy vs cost vs latency) to people who won't read the raw table.

skills.sh
npx skills add kachar/miro-agent-skills --skill miro-decision-chart
Claude Code
mkdir -p ~/.claude/skills/miro-decision-chart && curl -fsSL https://kachar.dev/skills/miro-decision-chart/SKILL.md -o ~/.claude/skills/miro-decision-chart/SKILL.md
Codex
mkdir -p ~/.agents/skills/miro-decision-chart && curl -fsSL https://kachar.dev/skills/miro-decision-chart/SKILL.md -o ~/.agents/skills/miro-decision-chart/SKILL.md
Read the SKILL.md
---
name: miro-decision-chart
description: Turn the numbers behind a hard technical decision into a chart on a Miro board, with the chosen option highlighted and the decision written underneath. Use when the user asks to "chart these results", "help me decide between", "visualize this benchmark/comparison", or needs to explain a trade-off (accuracy vs cost vs latency) to people who won't read the raw table.
---

# Chart a decision

A decision chart shows the options, the one you picked, and one sentence explaining why, in that
order. It is not a dashboard.

## Get the numbers right first

1. Take numbers only from a source you can point to: a benchmark output file, a query result, a
   design doc, a spreadsheet. Record where each one came from.
2. Choose one primary metric for the bars (accuracy, p50 latency, monthly cost). Secondary
   metrics go in a text label next to each bar, not in extra bars.
3. Sort options by the primary metric. Keep ranges as ranges ("38-40%"), not midpoints.

## Drawing

Miro has no native chart widget, so build a horizontal bar chart from shapes. The canvas SVG
format supports it well:

1. Call `canvas_get_canvas_composer_skill` first and use the Bright Paper palette it returns.
2. One frame. Title = the decision as a question ("Which tool search ships by default?").
   A one-line subtitle states the metric, the dataset and the unit.
3. Per option: a right-aligned `textArea` label, a `rect` bar whose width is proportional to the
   value (fix one scale, such as 14px per percentage point, and use it for every bar), and a
   `textArea` after the bar with the value and the secondary metrics separated by " / ".
4. Every bar in one neutral color, the chosen option in green with a bold label.
5. Under the bars, a light green rounded rect with the decision and the one reason that settled
   it ("four points behind the best at a quarter of the cost").
6. Caption with the source of the numbers.

## Finish

Share the frame link and state which number would change the decision if it moved, so the chart
can be redrawn when that number is re-measured.

A picture is only as good as its arrows

Miro's own FAQ admits that layouts from scratch "may need a couple of refinement passes." Mine did. A diagram sizes itself and can't be moved once it's on the board. A label that starts with / turns a box into a parallelogram. One before-and-after came out as a single column two screens tall. None of that is hard to fix, and the skills above already know about it.

The part that matters is honesty. A diagram can be wrong in a more convincing way than text can.

Check the arrows, not the colors

Every arrow should point to a line of code, and every number to a command or a file you can open. A picture that follows both rules is easier to check than the work it summarizes. One that doesn't is a nicer-looking hallucination.

It's the same trade I argued for in write the done-condition, not the prompt. You can't check everything an agent produces anymore, so you check something small enough to verify.

Let the agent do the work. Then make it draw the work.

Glossary

Terms

dataflow diagram
A diagram showing how data moves between the parts of a system: where it comes from, what processes change it and where it is stored.
DORA
A long-running research program on software delivery performance. Its metrics, such as how often teams deploy and how often changes fail, are an industry yardstick for engineering teams.
ERD
Entity-relationship diagram: a chart of the things a database stores, such as users and orders, and how they relate to each other.
eval harness
Code that runs a system against a fixed set of test cases and records the scores, so different approaches can be compared fairly and repeatably.
UML
Unified Modeling Language: a standard set of diagram types for drawing how software is structured and how its parts interact, such as class and sequence diagrams.

Tools

Claude Code
Anthropic's agentic coding tool that reads a codebase, edits files and runs commands, in the terminal, IDEs, a desktop app and the web.
Codex
OpenAI's coding agent, which runs in the terminal and is also offered in IDEs and the cloud.
Cursor
An AI coding tool that uses agents to build, test and change software.
Jev
TypeSafe AI's decision model. It writes no free text: given a situation and a question with named options, it returns a probability for each option.
MCP
Model Context Protocol, an open standard for connecting AI applications to external data sources, tools and workflows.
Mermaid
A diagramming tool that renders flowcharts, sequence diagrams and other charts from a simple text syntax.
Miro
A collaborative online whiteboard for diagramming, planning and brainstorming, where teams work together on a shared canvas.
Miro MCP
Miro's MCP server. It lets AI agents such as Claude read and create content on Miro boards so people can see and edit the result together.
OAuth
The industry-standard protocol for authorization. It lets an app get limited access to a user's account on another service without handling the user's password.