Agent access (MCP)

zurdo mcp serve: the structural index, Pyxis retrieval, the compound loop's state and manual sign-offs, served to coding agents over the Model Context Protocol.

zurdo v1.36.0

Agents spend much of each iteration re-reading the tree to learn where a type lives or who calls a function. The Lumen index already knows. zurdo mcp serve hands those answers, and a few about runs and sign-offs, to any Model Context Protocol client.

You, any shell MCP client the agent zurdo run starts Lumen index Lessons + run state zurdo lumen query zurdo mcp serve zurdo mcp serve You, any shell zurdo lumen query Lumen index zurdo mcp serve MCP client the agent zurdo run starts zurdo mcp serve Lessons + run state

The server

zurdo mcp serve speaks MCP over stdio. A client launches it as a subprocess in the repository root; it takes no flags and serves until stdin closes. It needs [lumen] enabled = true, and refuses at startup otherwise. To add it to your own client, register a stdio server with command zurdo and args ["mcp", "serve"].

The tools

ToolFamilyArgumentsAnswers like
search_symbolsstructuralname, limitzurdo lumen query --name
file_outlinestructuralpath, limit--outline
find_callersstructuralname, limit--callers
find_referencesstructuralname, limit--references
match_lessonscompoundprdzurdo reason match
run_reportcompoundprdzurdo report --format json
pending_signoffsreviewprdzurdo review --no-prompt
sign_offreviewprd, address, by, notezurdo review --sign-off
find_relatedretrievalquery, limitzurdo pyxis query
  • Structural tools repair the index before each call, so an agent asking about a file it just edited gets the new answer. limit defaults to 20; 0 lifts it. An empty answer is the text no results.
  • Compound tools are read-only: match_lessons counts no lesson use, and run_report writes no file and refuses a PRD with no run.
  • Review tools are covered on Signing off manual checks. pending_signoffs is read-only and takes no lock. sign_off writes: it appends to the review log and can flip a task to passed, irreversibly.
  • find_related appears only with [pyxis] enabled = true. Its rows are labelled lexical or hybrid and point at files, never lines. See Pyxis.
zurdo mcp serve (stdout)
← initialize
{"id":1,"result":{"capabilities":{"tools":{}},"protocolVersion":"2025-06-18",
 "serverInfo":{"name":"zurdo","version":"1.36.0"}}}
← tools/call find_callers {"name":"install_limiter"}
{"id":3,"result":{"content":[{"type":"text",
 "text":"install_limiter\tbuild_router\tsrc/app.rs:6:20"}],"isError":false}}
← tools/call search_symbols {"name":"load"}
{"id":4,"result":{"content":[{"type":"text",
 "text":"segment\tmethod\tAppConfig::load\tsrc/config.rs:6:5"}],"isError":false}}
Real responses, wrapped, with the jsonrpc field trimmed. Each text is the CLI's own tab-separated row.

Every answer is the CLI's own output. A call the CLI would refuse (a PRD outside the repo, an invalid address) comes back as a result with isError: true and the CLI's message, not as a protocol error.

Letting zurdo run hand the server to the agent

A run can register the server with the agent it launches. It's off by default:

[lumen]
enabled = true          # required: a server with no index has nothing to answer

[mcp]
inject_server        = true    # master switch
strict_claude_config = false   # claude only; see below

[mcp.adapters]                 # per-provider gates
anthropic = true
codex     = true
copilot   = false

All three gates must be open: inject_server, [lumen] enabled, and the provider's adapter. Otherwise the agent's command line is exactly what it would be without the feature. Zurdo registers the running binary once at run start:

ProviderRegistrationGate default
claude--mcp-config .zurdo/mcp-claude.json, plus --strict-mcp-config only with strict_claude_config = trueon
codex-c mcp_servers.zurdo.* overrides; nothing written to your codex configon
copilot--additional-mcp-config @.zurdo/mcp-copilot.jsonoff

Warning

strict_claude_config cuts off your other servers. --strict-mcp-config makes claude ignore every MCP server configured elsewhere. Leave it off unless you want only Zurdo's.

copilot defaults off because an organization's policy can disable third-party MCP servers, which costs a failed connection every iteration. Verification never depends on the server: Zurdo still checks every criterion against the tree.

Troubleshooting

SymptomFix
zurdo mcp serve exits at onceEnable Lumen.
The agent never sees the serverCheck all three gates. copilot defaults off.
find_related is missingSet [pyxis] enabled = true.
claude lost your own MCP serversSet strict_claude_config = false.
A compound or review tool returns an error resultFix the PRD or address as you would for the CLI twin.