MCP server reference

Zumba includes a Model Context Protocol server with tools that let a coding agent look things up instead of reading whole files: a file's outline, where a symbol is defined, where a name is used, and the diagnostics your editor shows. Fewer files read means fewer tokens spent.

In Zumba

Agent tasks and inline edits get the server automatically, for the folder they work in (a task's worktree, or your project for inline edits). Claude Code, Codex and OpenCode all receive it next to the MCP servers from their own configuration, which still apply. Turn it off with editor_mcp = false in settings.toml, or Settings → Agents → Editor tools for agents: the tools' descriptions then cost no tokens.

Using it from any agent

The server is the Zumba app itself, started with mcp and a project folder. It speaks MCP over stdio, so any MCP client can use it, inside Zumba or not:

/Applications/Zumba.app/Contents/MacOS/Zumba mcp /path/to/project [--diagnostics <file>]

Claude Code:

claude mcp add zumba -- /Applications/Zumba.app/Contents/MacOS/Zumba mcp "$PWD"

Codex (~/.codex/config.toml):

[mcp_servers.zumba]
command = "/Applications/Zumba.app/Contents/MacOS/Zumba"
args = ["mcp", "/path/to/project"]

Other clients (mcpServers JSON):

{
  "mcpServers": {
    "zumba": {
      "command": "/Applications/Zumba.app/Contents/MacOS/Zumba",
      "args": ["mcp", "/path/to/project"]
    }
  }
}

Adjust the path if Zumba isn't in /Applications. It opens no window and needs nothing else running. Only diagnostics depends on the editor: it reads the file passed with --diagnostics, which Zumba keeps up to date while the project is open (~/Library/Application Support/Zumba/worktrees/<folder>-<id>.diagnostics.json). Without --diagnostics, the tool answers "No diagnostics."

Tools

Every tool returns plain text, one result per line, with 1-based line numbers. Paths are relative to the project folder. A tool that can't answer (no such file, a path outside the project) returns its message with isError: true.

outline

A file's functions, types, constants and headings, indented by nesting.

Argument Type Required Meaning
path string yes File path relative to the project.
14 enum Incoming
33 struct Rpc
42 impl Rpc
  43 method spawn
  150 method call

Use it to read only the lines you need. It recognizes declarations that start with a keyword (fn, struct, enum, trait, impl, function, class, interface, def, func, const, type…), which covers Rust, TypeScript, JavaScript, Python, Go and Swift, plus Markdown headings. C and C++ functions, which have no keyword, aren't listed.

find_symbol

Where a function, type, constant or heading is defined.

Argument Type Required Meaning
name string yes The name to find.
crates/app/src/agents.rs:309 function — pub fn handoff_prompt(t: &Task) -> String {

Exact (case-sensitive) matches first. If there are none, it lists names containing the text, ignoring case, starting with "No exact match; names containing it:". At most 40 results.

find_references

Lines that use a name, as a whole word, case-sensitive.

Argument Type Required Meaning
name string yes The name to find.
path string no Only files matching these comma-separated globs, e.g. src/**, *.rs.
crates/app/src/agents.rs:309: pub fn handoff_prompt(t: &Task) -> String {
crates/app/src/agents.rs:1063: let mut prompt = handoff_prompt(t);

It's a text search, so it also finds other things that share the name; it doesn't need a language server. At most 80 lines, then "… more; narrow it with path".

diagnostics

Errors and warnings from the language servers in the user's editor.

Argument Type Required Meaning
path string no Only this file.
src/client.rs:34:9: error: cannot find value `delay` in this scope
src/main.rs:3:5: warning: unused import: `std::fmt`

These are the user's files as the editor sees them, including unsaved edits. In a Zumba task they don't include the agent's own changes that haven't been applied yet.

What it searches

find_symbol and find_references cover every file in the project except what .gitignore excludes, the .git folder, and files over 512 KB (usually generated).

Protocol

MCP over stdio: one JSON-RPC 2.0 message per line. The server answers initialize (with the protocol version the client asks for), ping, tools/list and tools/call; other requests get error -32601, and notifications are ignored. Server name zumba, version = the app version.

printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"outline","arguments":{"path":"src/main.rs"}}}' \
  | /Applications/Zumba.app/Contents/MacOS/Zumba mcp "$PWD"