Docs · MCP

Let your agent work the canvas.

Mumble’s reasoning isn’t in the app. It runs in your own Claude Code or Codex, over an MCP server that exposes the same engine the app uses. Point an agent at ~/Mumble and it can read transcripts, draw maps and edit them, with every change landing as a small, readable diff.

Developer setup today. The server is a local binary, mumble-mcp, that speaks MCP over stdio. It needs no API key and no network of its own.

How it fits together

The Mumble app and the MCP server are two front doors to one engine. Both change the map only through the same operations, and both read and write the same plain files. Your agent calls the server’s tools and does its thinking with your own AI provider, under your account.

Mumble apprecords · transcribes · draws
Mumble engine@mumble/core
~/Mumblecapture.json · diagram.canvas
MCP servermumble-mcp
Your agentClaude Code or Codex
Your AI providerunder your account

Two ways in

Attended

You record in the Mumble app. The app starts your agent and feeds it what’s said, and the agent draws through the MCP tools while you talk.

Detached

You, in a terminal, point your own Claude Code at ~/Mumble and edit canvases by talking to it. No Mumble window needed.

Connect your agent

Add the server to Claude Code, pointed at your workspace:

claude mcp add mumble -- /path/to/mumble-mcp ~/Mumble

Or as a config block, in a project’s .mcp.json or your user settings:

{
  "mcpServers": {
    "mumble": {
      "type": "stdio",
      "command": "/path/to/mumble-mcp",
      "args": [
        "~/Mumble"
      ]
    }
  }
}

~/Mumble works literally there: the server expands ~ itself. claude mcp add connects straight away. A project-scoped .mcp.json is approved on first use, so claude mcp list shows it as pending until you’ve started a session in that folder once.

Workspace, or one capture

The path you pass is a boundary, not a hint. If the folder contains a capture.json, the agent is scoped to that one capture; otherwise it gets the whole workspace.

mumble-mcp ~/Mumble                                   # the whole workspace
mumble-mcp ~/Mumble/2026-08-20-0900-ramp-hq-replatform  # one capture only
mumble-mcp --refine ~/Mumble                          # adds the two refine tools

Scoped to one capture, the other captures are hidden, not just unlisted: paths are resolved inside that folder, so a symlink or .. can’t reach back out. Use it when you’re handing a session to something that shouldn’t read everything else.

The tools

Fifteen in capture mode, listed in the order you reach for them. The rules for using each one well live in the tool descriptions, so you don’t need to repeat them in your prompt.

Read
list_capturesSlug, title, utterance count and view for each capture. Start here: the slug is what every other tool wants.
get_transcriptWhat was actually said, as timestamped utterances. Text only; audio is never exposed.
get_canvasA readable digest of the map: indented text, never the raw file.
search_nodesFind a node by words in its label or detail, before changing it.
Write
set_topicWhat the canvas is about. Never a node.
add_node, add_nodesDraw new nodes. Prefer the plural: three things named in one sentence are one call.
update_nodeChange a node in place, e.g. when a date is said later: “…and that’s on Wednesday” updates a node, it doesn’t create one.
remove_nodeOnly on an explicit retraction, not on a node you no longer like.
add_edgeConnect two nodes. Both ends must already exist.
remove_edgeRemove one relationship and keep both nodes. Pairs with add_edge on a reorder.
merge_nodesTwo names turned out to be one thing. Keeps the surviving id.
proposeAnything the person didn’t ask for. Lands as a proposal, drawn distinctly, for them to accept or reject.
review_provisionalConfirm or fade provisional voice guesses by id and utterance.
set_summaryAfter recording: an overview and up to 12 key points, each citing the utterances or nodes behind it.
Refine mode only (mumble-mcp --refine)
set_groupingChange how the view groups things, when the person asks for a different arrangement.
set_viewChange the diagram type, timeline zoom or drawing style, when the person asks. A type set this way stays pinned until cleared.

The refine tools are absent, not just blocked, in capture mode. While a conversation is being captured, the agent supplies the meaning and Mumble’s rules choose the picture; start a separate refine server when someone wants to override that picture.

Errors are values

Tools never throw. A failed call returns what went wrong and what to do next, so the agent corrects itself without the turn ending:

{ "ok": false, "error": "no node bata" }
{ "ok": false, "error": "capture is required; choose one of: 2026-08-20-0900-…, 2026-08-21-1623-new-test, …" }

A worked example

A workspace with one capture, five utterances and no canvas yet:

> Read the transcript for the ramp-hq capture and build me the diagram.

The tool calls that turn made, in order:

list_captures  get_transcript  get_canvas  get_canvas
set_topic  add_nodes  add_edge  add_edge  get_canvas

It reads before it writes. Once there’s something to read, get_canvas returns a digest the model can reason about:

topic: Ramp HQ replatform          view: diagram

discovery  [step]  "Discovery"  when: "through the end of August" → 2026-08-31
  └precedes→ design-system-work  [step]  "Design system work"  when: "overlaps by about two weeks"
    └precedes→ beta-with-three-customers  [step]  "Beta with three customers"  when: "in October" → 2026-10
      └precedes→ ga  [goal]  "GA"  when: "end of November" → 2026-11-30
api-migration  [step]  "API migration"  owner: Maya  flags: risk

5 nodes, 4 edges · 1 heard-not-scheduled

Then a correction:

> In the ramp-hq capture: beta is the twelfth of October, not just some time in October.
       "label": "Beta with three customers",
       "when": {
-        "said": "in October",
-        "resolved": "2026-10",
-        "precision": "month"
+        "said": "the twelfth of October",
+        "resolved": "2026-10-12",
+        "precision": "day"
       },

Three lines changed. Canvas files are serialised deterministically, so an edit shows up as an edit, not a rewrite. A noisy diff means something reordered where it should have edited.

The files

~/Mumble/
└─ 2026-08-20-0900-ramp-hq-replatform/
   ├─ capture.json       ← the transcript. append-only
   ├─ audio.wav          ← never uploaded anywhere
   └─ diagram.canvas     ← the graph: nodes, edges, and where each came from

A .canvas file is JSON with a version, a view, nodes, edges and pins. Node ids are readable slugs derived from labels, like api-migration, and never change. Editing one by hand is fine; the next get_canvas reads it back. Two rules keep it safe:

There’s no undo tool across calls. Git is the undo: keep the workspace under version control and every change is a commit you can read.

Known limits