Skip to content

Releases: abendrothj/retrieval-mcp

v0.1.6

Choose a tag to compare

@github-actions github-actions released this 17 Sep 04:38

retrieval-mcp v0.1.6

  • The handshake stops routing to tools the session refuses.
  • A Go call qualified by an imported package names that package's definition, not its neighbour.
  • --root is optional, and the recommended entry no longer carries a path.
  • search_concept rejects unknown fields, like every other tool.
  • The README has a shape contract, checked by check_docs.py.

Full entries in CHANGELOG.md. Offline evidence only: none of these 5
carries an agent-level measurement, and the published efficiency
numbers were measured on earlier binaries - the README says which.

v0.1.5

Choose a tag to compare

@github-actions github-actions released this 14 Sep 20:53

v0.1.5: publish the binstall manifest

cargo binstall retrieval-mcp had no pinned URL behind it: the metadata that
names the release archives landed after 0.1.4 was published, and crates.io
serves each version's manifest as it was at publish time. This release
publishes the manifest that carries it.

It is also the first release whose assets include the aggregate SHA256SUMS
that install.sh prefers. The per-archive .tar.gz.sha256 files are
still published for every target, and the installer accepts either, so nothing
about installing an earlier tag changes.

No functional change to the server: 0.1.4's five languages, four-tool default
surface and --version behaviour are unchanged.

v0.1.4

Choose a tag to compare

@github-actions github-actions released this 14 Sep 19:32

v0.1.4: --version answers

The argument parser knew --help and treated every other flag as one
needing a value, so retrieval-mcp --version replied missing value for --version. It has been wrong since 0.1.0, and it is the first question a
release script, a package manager or a user checking which build their
client launched asks. --version and -V now print the version and need
no --root, pinned by a test that runs the real binary.

Everything else is 0.1.3: Go, Java, C, C++ and JavaScript indexed as
language families, admitted on a pre-registered audit against an
independent reading of Cobra, Gson, Redis, LevelDB and ESLint.

v0.1.3

Choose a tag to compare

@github-actions github-actions released this 14 Sep 17:09

v0.1.3: five more languages, audited before advertising them

Go, Java, C, C++ and the JavaScript half of the ECMAScript family join
Rust, Python and TypeScript, matched as language families rather than by
file extension: a .js call site resolves against a .ts definition,
./util.js resolves to util.ts, a Go method is owned by its receiver
type, an out-of-line C++ method by the class in its qualified name, and a
function-like C macro is a definition because nothing else defines one.

Admitted on a pre-registered audit against an independent reading of
Cobra, Gson, Redis, LevelDB and ESLint: 99 of 100 definitions found,
caller precision 0.92-1.00, recall 0.93-1.00. The first confirmatory run
failed its own criteria and was not published as a pass.

Two defects fixed in languages that already shipped: a constructor
invocation is now a call site (new Table(rows) is a new_expression,
not a call expression), and a reference-returning C++ accessor is now a
definition.

No model ran: there is no agent-level claim for the new languages. The
end-to-end evidence remains Rust, Python and TypeScript.

v0.1.1 — full-repo coverage and honest failure semantics

Choose a tag to compare

@abendrothj abendrothj released this 12 Sep 09:56

Two user-visible correctness fixes. Both were found by measuring rather than by reading the code.

Fixes

  • Large repositories now index fully, and a truncated index says so. The record ceiling bound at roughly 900 files, so Django 5.1.4 indexed 883 of 2,787 eligible files and VS Code 975 of 5,195 — and nothing in the payload distinguished that from a complete index, because coverage.complete is always false for syntactic resolution. find_callers could return a fifth of a caller set with no distinct signal. Limits are now 20,000 files / 128 MiB / 2,000,000 records, sized so --timeout-seconds is what normally binds, and coverage carries eligible_files and budget_truncated. When truncated, the limitations string states that absence is not evidence of absence, and the routing instructions tell the model not to answer an exhaustive question from that snapshot as though absence were proven.
  • A request the server accepted is answered even if the client closes stdin. rmcp treats end of input as a shutdown signal and drains in-flight work for five seconds before abandoning it, so any handler slower than that — a cold structural call over VS Code takes eighteen seconds — finished internally while its response was discarded. Stdin now withholds end-of-input until accepted requests have drained.

Measured

repository supported files indexed before indexed now cold build
Django 5.1.4 2,787 883 2,786 6.2 s
VS Code 1.96 5,195 975 5,188 17.6 s

Roughly 3 ms and 150 KB resident per indexed file. Rebuilding is cheap enough that no persistence layer was added: a database would have bought seconds per session in exchange for cache invalidation, migrations and corruption modes.

Compatibility

Patch release. coverage gains fields and loses none; no flag, tool or response shape was removed. The default surface is unchanged: search_exact, read_source, find_callers, search_concept.

The held-out comparison in experiments/README.md was measured at tag heldout-freeze and is unaffected by these fixes.

v0.1.0 — measured default surface

Choose a tag to compare

@abendrothj abendrothj released this 12 Sep 09:24

Code retrieval for coding agents. Four tools over stdio; no index to build, no daemon, no API key.

Held-out result. 30 sealed questions, three arms, claude-sonnet-4-6, 90 trials, frozen grader:

native Read/Grep/Glob zvec-grep 0.2.2 retrieval-mcp
Correct / 30 28 29 29
Input tokens 1.15 M 1.00 M 764 k
Tool calls 147 78 78
Persistent context (tok·turns) 175 k 227 k 150 k
Answered without evidence 0 0 0

Quality against zvec is a tie — one discordant question each way — and is reported as one. The context saving is the result.

Default surface: search_exact, read_source, find_callers, search_concept. inspect_symbol, find_symbol and trace_dependencies are available via --tools but un-defaulted: each was given its own task class and its own arm, and none repaid the schema it costs on every turn. trace_dependencies was never called across three experiments, including on questions authored for it.

Reproduce it. experiments/reproduce_heldout.py rebuilds the pinned Django corpus from upstream and fails unless it matches byte for byte, then prints the run commands. The tree the comparison measured is tagged heldout-freeze.

Method, artifacts, caveats and a ledger of the sixteen measurement defects found along the way: experiments/README.md.