

Also from Kynth Studios


Also from Kynth Studios


Also from Kynth Studios
1# mcp — the Caveman MCP server (commercial Go core + MIT launcher)23A thin **stdio JSON-RPC** adapter exposing the compression [engine](../engine/CLAUDE.md) as4five MCP tools to any host (Claude Code, Cursor, …). It owns only the MCP framing; all5compression is the engine's, linked **in-process** (no subprocess, no drift). Local-only — it6opens no network connection — and everything it reports is `inferred`, never `verified`.78## Layout9- `server.go` — the `Server`: JSON-RPC loop, dispatch, the five tool handlers. Takes an injectable `Engine` interface so the framing is testable without the real compressors.10- `protocol.go` — JSON-RPC + MCP tool-result types, `toolText`/`toolError` helpers, the exact `tools/list` definitions.11- `cmd/caveman-mcp/` — binary: opens shared file CCR store (`CAVEMAN_CCR_DB`,12 else `CAVEMAN_HOME/ccr.db`/`~/.caveman/ccr.db`) so proxy handles resolve across13 processes, then serves stdin↔stdout. `CAVEMAN_MCP_EPHEMERAL=1` opts into an14 isolated in-memory store for tests/sessions that do not need proxy recovery.15- `bin/caveman-mcp.mjs` + `package.json` — the `npx caveman-mcp` launcher that execs the prebuilt Go binary.1617## The five tools (exact names, case-sensitive)18- `caveman_compress(input)` → compressed text + inferred ratio + `recovery_handle`. Lossy (S4), recoverable, and fail-closed: incompressible/malformed/not-smaller input returns unchanged, `ratio:0`, `recovery_handle:null` — never an error.19- `caveman_retrieve(recovery_handle)` → the byte-exact original. Unknown handle → `isError:true` + a `cave_snake_code`, never a fabricated payload.20- `caveman_stats()` → `basis:"inferred"`, `scope:"session"`; the string `verified` never appears.21- `caveman_toon_encode(input)` → explicit JSON→TOON re-encoding with input/output sizes; returns pass-through plus note when encoding fails.22- `caveman_toon_decode(input)` → TOON→JSON; invalid TOON returns `isError:true`, never raw input as JSON.2324## These five tools are a prompt-prefix cost, and it is measured25Registering this server puts all five tool schemas in the wrapped agent's prefix26on **every** call — **11,060 tokens/call** in the agent bench (~2.22M over its 20127calls). That is why `caveman wrap` gates the injection behind the `execute.mcp`28surface knob (`auto` | `marker-only` | `true` | `false`, `packages/cli/src/index.ts`).29Under a non-auto surface wrap suppresses **both** of its injection sites — the30`mcp install` write and, for config-file agents like openclaw, the profile's31`mcp.servers.caveman` overlay — but it never uninstalls a server the user32installed themselves, so an existing install keeps costing its prefix until33`caveman tools mcp uninstall <agent>`. The knob never touches recovery honesty on34the wrap door: `CAVEMAN_RECOVERY` is answered from evidence that this launch is35really giving the agent `caveman_retrieve`, so the proxy is never told a36retrieval tool exists when none does. Adding a sixth tool here raises that37per-call tax for every wrapped agent.3839## Conventions40- Build/test: `make product-build PRODUCT=mcp` / `make product-test PRODUCT=mcp`.41- **stdout is the protocol channel** — logs go to stderr only (a dedicated test guards this).4243## Gotchas (honesty invariants)44- **un-killable transport** — the stdio server survives everything short of EOF (issue #139). Framing is line-delimited: a malformed line is answered `-32700` and the loop RESYNCHRONIZES to the next newline (never `return`); a handler panic is contained by `recover()` → `cave_tool_panicked` (dispatch panics → `cave_internal_error`); JSON-RPC batch arrays are handled per spec (one array response); id-less/`"id":null` requests are notifications and get no reply; and both inbound lines and generated tool output (compress/toon) are size-capped (`cave_payload_too_large`, `maxInboundBytes`/`maxResultBytes`, 16 MiB default) — but `caveman_retrieve` is exempt (`Tool.ExemptResultCap`): recovery returns the byte-exact original and must never fail closed on size, since the shared gateway store has no matching ceiling. A dead server is worse than a slow one — the proxy keeps eliding content that no longer has a `caveman_retrieve` to expand it.45- **fail-open** — engine error or malformed input → byte-identical pass-through, never a protocol error.46- **fail-closed** — unknown tool/handle → `isError` + cave_snake_code; unknown JSON-RPC method → `-32601`.47- **zero-egress** — the adapter imports no `net`/`net/http`/`os/exec`; a test parses the source to enforce it.48- v1 is **stdio-only**, **string payloads only** (the engine detects type); HTTP transport + `caveman mcp` subcommand are v2.49- **protocol negotiation must never error.** The adapter implements the 2024-11-05 contract and echoes that version back; a client asking for a newer one gets 2024-11-05 in the initialize result and decides for itself, per the MCP lifecycle. It previously answered `-32602: unsupported protocol version`, which made Claude Code (and every other current client) drop the server — and because `caveman wrap` reads recovery availability from an install-time marker rather than from the live agent, the proxy kept eliding content that no longer had a `caveman_retrieve` to expand it. Declining to echo an unimplemented version is right; refusing to speak is not.5051See ../../CLAUDE.md (root) · ../engine/CLAUDE.md5253## Retrieve anti-storm5455`caveman_retrieve` costs a whole agent turn: the model re-reads the entire conversation prefix, and everything a previous retrieve returned is part of that prefix from then on — so N retrieves cost N turns over a transcript each one grew. A 2026-08-10 read-only sweep of 229 local CaveBench stdout files found 34 recovery sessions and 534 assistant recovery-tool calls: buckets 1 / 2–5 / >5 contained 3 / 16 / 15 sessions, p95 was 118, and max was 143. Eight of the 15 >5-call sessions still passed their exact task grader. Only 3 of 534 normalized `(handle, trimmed query)` pairs repeated exactly; many calls used new handles or pointer chains. The batches mix arms, tasks, and repetitions, so this is descriptive call-shape evidence—not a same-task counterfactual, the managed gateway's final-result population, or validation of a universal cutoff.5657`EngineTools` therefore carries a per-process (= per-session) recovery ledger, and neither rule may ever withhold content the session has not already been given:58591. An identical `(handle, query)` returns a one-line pointer to the answer already verbatim in the transcript, not the bytes again.602. Past `retrieveStormThreshold` (5) distinct retrieves, the next one returns the handle's **full** stored original instead of a query-narrowed view, and says so. This is preserved historical policy intended to avoid later narrow paging; no paired experiment has validated the threshold, token effect, or task-outcome effect.6162A nil `*retrieveSession` is safe and disables both, so any caller without a session concept keeps the old semantics.63
One repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| JuliusBrussee/cavemanCLAUDE.md · 98k | CLAUDE.md | archgitdo-notagent-behaviour+1 | 73/100 | today | |
| JuliusBrussee/cavemanagents/AGENTS.md · 98k | AGENTS.md | agent-behaviour | 16/100 | today | |
| JuliusBrussee/cavemanagents/CLAUDE.md · 98k | CLAUDE.md | stylearchsecurityagent-behaviour | 64/100 | today | |
| JuliusBrussee/cavemanbrowse/CLAUDE.md · 98k | CLAUDE.md | testarch | 59/100 | today | |
| JuliusBrussee/cavemancacheengine/CLAUDE.md · 98k | CLAUDE.md | testarch | 73/100 | today | |
| JuliusBrussee/cavemanengine/AGENTS.md · 98k | AGENTS.md | stylearch | 66/100 | today | |
| JuliusBrussee/cavemanengine/CLAUDE.md · 98k | CLAUDE.md | stylearch | 58/100 | today | |
| JuliusBrussee/cavemanextension/AGENTS.md · 98k | AGENTS.md | buildteststylearch+1 | 73/100 | today | |
| JuliusBrussee/cavemanextension/CLAUDE.md · 98k | CLAUDE.md | buildteststylearch+1 | 73/100 | today | |
| JuliusBrussee/cavemanintegrations/CLAUDE.md · 98k | CLAUDE.md | stylearch | 55/100 | today | |
| JuliusBrussee/cavemanmcp/AGENTS.md · 98k | AGENTS.md | stylearch | 79/100 | today | |
| JuliusBrussee/cavemanmem/AGENTS.md · 98k | AGENTS.md | stylearchperformanceagent-behaviour | 67/100 | today | |
| JuliusBrussee/cavemanmem/CLAUDE.md · 98k | CLAUDE.md | stylearchperformanceagent-behaviour | 71/100 | today | |
| JuliusBrussee/cavemanpackages/agent/CLAUDE.md · 98k | CLAUDE.md | archtesting-strategysecuritydependencies+2 | 34/100 | today | |
| JuliusBrussee/cavemanpackages/cli/AGENTS.md · 98k | AGENTS.md | stylearchdependenciesmonorepo | 71/100 | today | |
| JuliusBrussee/cavemanpackages/cli/CLAUDE.md · 98k | CLAUDE.md | stylearchdependenciesmonorepo | 71/100 | today | |
| JuliusBrussee/cavemanpackages/create-caveman-agent/CLAUDE.md · 98k | CLAUDE.md | archdependenciesmonorepoagent-behaviour | 36/100 | today | |
| JuliusBrussee/cavemanpackages/graders/AGENTS.md · 98k | AGENTS.md | teststylearchtypes+3 | 75/100 | today | |
| JuliusBrussee/cavemanpackages/graders/CLAUDE.md · 98k | CLAUDE.md | teststylearchtypes+3 | 75/100 | today | |
| JuliusBrussee/cavemanpackages/kit/AGENTS.md · 98k | AGENTS.md | stylearchdependenciesmonorepo | 63/100 | today |
Same format, overlapping stack, ranked by quality.
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| stacklok/toolhiveCLAUDE.md · 2.0k | CLAUDE.md | buildteststylearch+4 | 100/100 | 14 days ago | |
| Adit-Jain-srm/NightmareNetCLAUDE.md · 46 | CLAUDE.md | buildtestlint-formatstyle+6 | 100/100 | 14 days ago | |
| microsoft/playwrightCLAUDE.md · 95k | CLAUDE.md | buildtestlint-formatstyle+7 | 100/100 | 7 days ago | |
| nimbalyst/nimbalystpackages/android/CLAUDE.md · 1.5k | CLAUDE.md | setupbuildstylearch+2 | 100/100 | 14 days ago | |
| dotCMS/corecore-web/CLAUDE.md · 949 | CLAUDE.md | teststylearchtesting-strategy+3 | 100/100 | 14 days ago | |
| tphakala/birdnet-goCLAUDE.md · 1.6k | CLAUDE.md | buildtestlint-formatstyle+8 | 100/100 | today | |
| tyrchen/geektime-bootcamp-aiw7/genslides/backend/CLAUDE.md · 230 | CLAUDE.md | testlint-formatstylearch+6 | 100/100 | 9 days ago | |
| bagisto/bagistoCLAUDE.md · 28k | CLAUDE.md | setupbuildteststyle+5 | 100/100 | 7 days ago |
A badge carrying the measured quality of the strongest agent config file in this repository, out of 100. It reads from this index every time somebody loads your page, so it changes when the measurement changes and there is nothing to keep up to date. Free, no account, and the value is not something you or we can set by hand.
[](https://rulestack.kynth.studio/configs/juliusbrussee-caveman-mcp-claude)Would rather not hotlink us? Every badge is also served in shields.io’s endpoint schema, so shields renders the image and your readers never talk to our domain:
Published by Toolproof, the masthead over this index and eight others. The method behind the number is at toolproof.kynth.studio/methodology, and the whole thing is readable as JSON with no key at /api.