TL;DR
Build an MCP server that exposes Nous campaigns as queryable resources and tools. Lets any Claude Code session — terminal, web, IDE — @-reference a campaign or call nous.search_principles("ordinal scheduling") natively, without bash plumbing.
Why this matters
On 5/20 the user explicitly tried to aggregate "all campaigns about saturation detection, with results and patches." The agent had to grep across inference-sim/.nous/*/findings.json manually. With 33 campaigns on inference-sim alone, this is acute. MCP is the canonical Claude Code answer to "give my agent access to my data."
What's already shipped
- The on-disk artifact layout (state.json, ledger.json, findings.json, patches/) is stable and well-tested. This issue just exposes it.
Proposed approach
Resources:
nous://campaigns — list all campaigns with status
nous://campaigns/<run-id>/state — current phase + iteration
nous://campaigns/<run-id>/principles — accumulated principles
nous://campaigns/<run-id>/iter/<N>/findings — findings.json
nous://campaigns/<run-id>/iter/<N>/patches/<arm>.patch — code patch
nous://campaigns/<run-id>/iter/<N>/results/<arm>/<seed> — raw result file
Tools:
nous.list_campaigns(query?, status?, repo?) — filter campaigns
nous.search_principles(text, scope?) — fuzzy/semantic search across principles.json files
nous.get_arm_results(run_id, iter, arm) — return aggregated results for an arm
nous.compare_iterations(run_id, iter_a, iter_b) — deterministic diff of findings
Acceptance criteria
Notes
- Optional: enable embedding-based semantic search when
OPENAI_API_KEY is set; fall back to ripgrep otherwise.
- Keep the MCP server stateless; campaigns live on disk.
Part of #120.
TL;DR
Build an MCP server that exposes Nous campaigns as queryable resources and tools. Lets any Claude Code session — terminal, web, IDE —
@-reference a campaign or callnous.search_principles("ordinal scheduling")natively, without bash plumbing.Why this matters
On 5/20 the user explicitly tried to aggregate "all campaigns about saturation detection, with results and patches." The agent had to grep across
inference-sim/.nous/*/findings.jsonmanually. With 33 campaigns on inference-sim alone, this is acute. MCP is the canonical Claude Code answer to "give my agent access to my data."What's already shipped
Proposed approach
Resources:
nous://campaigns— list all campaigns with statusnous://campaigns/<run-id>/state— current phase + iterationnous://campaigns/<run-id>/principles— accumulated principlesnous://campaigns/<run-id>/iter/<N>/findings— findings.jsonnous://campaigns/<run-id>/iter/<N>/patches/<arm>.patch— code patchnous://campaigns/<run-id>/iter/<N>/results/<arm>/<seed>— raw result fileTools:
nous.list_campaigns(query?, status?, repo?)— filter campaignsnous.search_principles(text, scope?)— fuzzy/semantic search across principles.json filesnous.get_arm_results(run_id, iter, arm)— return aggregated results for an armnous.compare_iterations(run_id, iter_a, iter_b)— deterministic diff of findingsAcceptance criteria
nous-mcp servestarts a local stdio MCP server.~/.claude.jsondocumented in README.Notes
OPENAI_API_KEYis set; fall back to ripgrep otherwise.Part of #120.