
Query p50
14ms
Rust compiler Β· 320K symbols
Token reduction
15β30Γ
vs Read/Grep/Glob on exploration
Index freshness
<1s
563 ms warm re-index
Languages
9
graph-aware Β· Rust, Python, TS, JS, Go, Java, C, C++
01 β Where it runs
Drops into the agents you already use.
recon init --mcp <ide> writes the IDE's MCP config and a strict-policy agent rules file so the agent uses recon's code_* tools before Read/Grep/Glob by default.
cc
Claude Code
recon init --mcp cc
MCP: ./.mcp.json Rules: ./CLAUDE.md
oc
OpenCode
recon init --mcp oc
MCP: ./opencode.jsonc Rules: ./AGENTS.md
cur
Cursor
recon init --mcp cursor
MCP: ./.cursor/mcp.json Rules: ./.cursor/rules/recon.mdc
win
Windsurf
recon init --mcp windsurf
MCP: ~/.codeium/windsurf/mcp_config.json Rules: ./.windsurf/rules/recon.md
ki
Kiro
recon init --mcp kiro
MCP: ./.kiro/settings/mcp.json Rules: ./AGENTS.md
zed
Zed
recon init --mcp zed
MCP: ./.zed/mcp.json Rules: ./.zed/rules/recon.md
vscode
VS Code
recon init --mcp vscode
MCP: ./.vscode/mcp.json Rules: ./.vscode/rules/recon.md
cline
Cline
recon init --mcp cline
MCP: ./.cline/mcp_settings.json Rules: ./.cline/rules/recon.md
roo
Roo Code
recon init --mcp roo
MCP: ./.roo/mcp.json Rules: ./.roo/rules/recon.md
codex
OpenAI Codex
recon init --mcp codex
MCP: ~/.codex/config.toml Rules: ./AGENTS.md
02 β Tools
Twenty tools that speak symbols, not strings.
Twenty tools β symbol-and-text primitives, graph-aware traversal for "how does X reach Y?" and "what breaks if I change this?", and telemetry so you can prove the savings.
code_outline(path)
One line per symbol β kind, name, line. Skim a 2000-line file in a single screen.
β³ Read~13 ms
code_skeleton(path)
Signatures and docs only; bodies collapse to β¦. About 10Γ compression vs. full read.
β³ Read~11 ms
code_read_symbol(β¦)
Pull a single function, its signature, doc, body β and every caller β without loading the file.
β³ Read<10 ms
code_find_symbol(name)
Three-tier resolver: exact SQLite β Tantivy BM25 β FTS5 trigram with nucleo fuzzy rescore.
β³ Grep~8 ms
code_find_refs(β¦)
Reference count and the top-k call sites for any symbol in the repo.
β³ Grep~12 ms
code_search(query, mode)
Exact Β· regex Β· hybrid. Tantivy-first, grep fallback. Filter DSL: type:rust !test.
β³ Grep~33 ms
code_list(glob?)
Structured file listing with symbol counts β single GROUP BY query, not per-file.
β³ Glob~57 ms
code_repo_map(budget)
PageRank-ranked repo overview, cached in SQLite, invalidated on reindex.
β~19 ms
code_find_strings(β¦)
Search string literals and comments separately from identifiers. Grep, but narrower.
β<30 ms
code_multi_find(patterns[])
Fan out several patterns through the TextSearcher trait in a single call.
β<30 ms
code_reindex()
Agent-triggered re-index. Clears map cache, rebuilds incrementally.
βvaries
code_path(src, dst)
Shortest call-graph path from src to dst. Bidirectional BFS, capped at 8 hops.
β³ chained refs<5 ms
code_callers(sym, depth)
Transitive callers up to N rings (default 1, max 6). Cycle-safe; per-tier fan-out cap 50; total-visit cap 50 000.
β³ chained refs<10 ms
code_callees(sym, depth)
Mirror of callers β what does sym call (directly and transitively)? Same caps, same shape.
code_context(sym, budget)
One-shot bundle: signature, body, callers, callees, types, tests. Replaces the canonical understand-X loop.
β³ 4-call loop~12 ms
code_impact(sym, depth)
Blast radius: transitive callers + reachable tests. Use before refactors to answer "what might break?"
β<15 ms
code_subsystems(limit?)
Weakly-connected components of the reference graph, ranked by hub. Architectural orientation, no directory lore.
β<15 ms
code_subsystem(id, budget)
Drill into one subsystem from code_subsystems. Skeleton-style summary within a token budget.
β<10 ms
code_activate_repo(path)
Switch the active repository for subsequent stateful tools. Tier-limit aware via RepoRouter; persists the loaded set across recon serve restarts.
β³ multi-repo<5 ms
code_list_repos()
Loaded repos with files, symbols, and an active flag. Pairs with code_activate_repo for discovery before switching.
β³ multi-repo<1 ms
Token-savings telemetry runs alongside every call β per-call measured against the in-process Read/grep equivalent for the 8 direct file/grep tools, conservativestatic estimates for the remaining 12 tools. Operator surfaces:recon stats and recon savings show in the CLI; daily rollups on the dashboard.
03 β The difference
An agent reading code shouldn't burn the context window doing it.
Without recon Read Β· Grep Β· Glob
// agent wants to understand render_map Glob("crates/**/*.rs") β 312 paths Β· ~12,000 tokens
Read("crates/recon-search/src/map.rs") β 412 lines Β· ~6,800 tokens
Grep("render_map", "crates/**") + context β 34 matches Γ 3-line window Β· ~28,000 tokens
Read("crates/recon-search/tests/map_test.rs") β 142 lines Β· ~2,300 tokens
Read 4 callers (server.rs, handler.rs, β¦) β 1,847 lines Β· ~31,000 tokens
Read("crates/recon-search/src/page_rank.rs") β 218 lines Β· ~3,600 tokens
Read("crates/recon-search/src/lib.rs") β 312 lines Β· ~5,100 tokens
Read 6 more files for orientation β 2,170 lines Β· ~27,600 tokens
subtotal β 116,400 tokens
tokens burned116,400
With recon code_* Β· graph-aware
// same question, symbol-first + graph-aware code_find_symbol("render_map") β exact match Β· ~90 tokens
code_outline("crates/recon-search/src/map.rs") β 14 symbols, one line each Β· ~210 tokens
code_read_symbol("render_map") β signature, body, every caller Β· ~860 tokens
code_context("render_map", budget=2000) β callers, callees, types, tests Β· ~1,520 tokens
code_impact("render_map", depth=3) β blast radius: 12 callers, 4 tests Β· ~450 tokens
code_repo_map(focus="β¦/map.rs", budget=1500) β pageranked overview Β· ~1,100 tokens
code_list("crates/**/*.rs") β 312 files, symbol counts per file Β· ~680 tokens
code_context("render_map", budget=2000) β signature + body + callers + tests Β· ~1,300 tokens
subtotal β 6,210 tokens
tokens burned6,210 Β· ~19Γ less
04 β What you save
A benchmark that doesn't round up.
Headline multiples like 35Γ are real for fresh input tokens . Anthropic's prompt caching already absorbs most of the obvious savings on warm sessions, so the number that actually hits your bill is smaller. Here's the honest breakdown from an independent third-party measurement (grepai vs Claude Code, 155K-LOC TypeScript repo, 5 questions Γ 5 runs):
Fresh input tokens
-97%
51,147 β 1,326
Tool calls
-55%
139 β 62
Subagents
-100%
5 β 0 launched
Billed $ cost
-27%
$6.78 β $4.92
The gap between β97% fresh-input and**β27% billed cost** is prompt caching doing its job. Savings dominate on cold sessions,large repos, andtasks where the agent would otherwise spawn subagents. They shrink on warm sessions and on repos small enough that the agent would read the whole thing anyway.
05 β Principles
Built on four small, stubborn ideas.
I
Symbols first, bytes last.
Everything tree-sitter can name is a first-class citizen. Everything else is noise the agent should never pay for.
II
Five output shapes. No more.
Every tool response is one of five canonical shapes in recon-core::shapes. Predictable for the model, cheap to parse.
III
Incremental by default.
gix ColdStart skips reparse on unchanged HEAD. A blake3 Merkle tree reindexes only what moved. First keystroke to queryable: under a second.
IV
Secrets stay redacted.
Every tool response passes through secret redaction β AWS keys, PEM blocks, API tokens are stripped before they reach the agent. Per-key tenant isolation.
06 β Benchmarks
Tested on real codebases. Not toy repos.
Zed
EDITOR Β· RUST
github β
LOC 1.3M
SYMBOLS 80K
COLD INDEX 28s
QUERY P50 13ms
find 13ms skeleton 19ms search 15ms refs 13ms map 13ms
Rust compiler
COMPILER Β· RUST
github β
LOC 3.8M
SYMBOLS 320K
COLD INDEX 55s
QUERY P50 14ms
find 14ms skeleton 17ms search 36ms refs 15ms map 24ms
All numbers: release build Β· warm cache Β· mimalloc Β· fat LTO Β· lock-free ReadPool Β· CSR PageRank Β· 25 MB binary
07 β Install
One signed binary. Your code stays local.
Step 01
Sign up with GitHub
Free. No credit card.
Sign in with GitHub β
Step 02
Install the binary
Signed with cosign. Only your license key touches the network.
Linux macOS Windows
curl -fsSL https://mcprecon.pages.dev/install.sh | bash
iwr https://mcprecon.pages.dev/install.ps1 | iex
recon login sk-recon-xxx
Step 03
Wire it into your agent
recon init --mcp <ide> writes the IDE's MCP config and a strict agent-rules file so the agent uses code_* tools by default.
recon init --mcp cc # Claude Code recon init --mcp oc # OpenCode recon init --mcp cursor # Cursor recon init --mcp windsurf # Windsurf recon init --mcp kiro # Kiro recon init --mcp zed # Zed recon init --mcp vscode # VS Code recon init --mcp cline # Cline recon init --mcp roo # Roo Code recon init --mcp codex # OpenAI Codex
Step 04
Hit a limit? Upgrade.
Free Β· 1 repo Β· 250 files Β· 10K LOC Pro $3/mo Β· 10 repos Β· 5K files Β· 200K LOC Team $7/mo Β· 25 repos Β· 50K files Β· 4M LOC
View pricing β
08 β Questions
Things security-minded buyers ask us first.
Does recon see any of my code?
No. Indexing, search, and every tool response runs on your machine. The only outbound call is a short HTTPS check to validate your license key β no paths, no queries, no source, no metadata.
Can I run it offline or air-gapped?
Yes, once activated. recon login caches a signed license locally; after that, the CLI runs with no network at all. Enterprise keys can be issued offline end-to-end.
How do I verify the binary is the one you built?
Every release ships a SHA256SUMS.txt signed with cosign keyless sigstore, attested by our GitHub Actions release workflow. The installer verifies digest + signature before extracting. You can re-verify by hand with cosign verify-blob.
Which IDEs and agents work with recon?
Any MCP-compatible client. recon init writes config for Claude Code, OpenCode, Cursor, Windsurf, Kiro, Zed, VS Code Copilot MCP, Cline, Roo Code, and OpenAI Codex out of the box. Anything that speaks the MCP stdio spec will work too.
What happens when my subscription ends?
Your on-disk indexes stay. The CLI declines new tool calls until you renew β nothing is uploaded, nothing is deleted. You can keep the binary; you just can't run it against a licensed tier until you re-login.
Do you store anything server-side?
Only what's needed to issue and bill a license: your GitHub email, your tier, and a hashed key prefix. No repo names, no file paths, no symbols. Our worker is open to inspection on request for enterprise accounts.
βThe agent should spend its tokens thinking, not reading. recon gives back the context window β and most of the wall-clock β that Read and Grep quietly took. And it does it without ever sending a line of your code over the wire.β
β design note, recon-core Β· v0.3.1
This tool doesn't publish a standard install command β the repository README on GitHub covers its setup.
No common issues documented yet. If you hit a problem, the repository's GitHub Issues page is the best place to look.