luuuc / sense benchmark
Star
Code intelligence for AI agents · benchmark

Code Intelligence MCP Servers, Benchmarked

Four code-intelligence tools for AI coding agents, plus a no-MCP grep baseline, run through the same six end-to-end exploration scenarios on six real repositories. Two of the four MCP servers scored below plain grep. Here is the full scorecard, the method, and where every tool loses, including the one I built.

6 real repos Claude Code · Opus 4.7 · 1M ctx Open methodology Replayable Updated 2026-05-14

Disclosure, up front. I am the author of Sense, one of the five entries below. So the scorecard is built to be checked, not believed: open code, frozen held-out scenarios with hand-graded reference scores, a Spearman ≥ 0.85 anchor against my own grading, and a published list of every place Sense loses. Don't take my word for any single number. Audit the whole thing →

Aggregate leaderboard

Ranked by fairness: a weighted composite of answer quality, citation grounding, efficiency, and a keyword smoke test (formula below). Averaged across all six scenarios. Best value in each column is highlighted.

Rank Tool Fairness Judge quality Grounding Avg tokens Avg time Total cost vs baseline
🥇 #1 sensesymbol graph + embeddings over MCP 81.3% 85.4% 89.2% 10,896 141.5s $6.22 +17.8%
🥈 #2 probestateless tree-sitter + ripgrep 77.7% 84.8% 72.8% 12,119 162.7s $6.23 +17.7%
🥉 #3 baselineClaude Code · grep / find / Read · no MCP 77.2% 84.2% 80.8% 12,716 185.4s $7.57
#4 serenaLSP-driven symbol cache 75.2% below grep 83.4% 61.9% 14,800 191.4s $7.57 0.0%
#5 gitnexuscode knowledge graph · Cypher-style 74.9% below grep 84.5% 76.9% 12,964 173.8s $6.87 +9.2%

The finding that should give every team pause: attaching serena or gitnexus, as configured out of the box, made Claude Code worse than no MCP at all on the headline fairness score. An MCP server is not free. It has to earn back the friction it adds. Per-scenario tables for all six repos (axum, discourse, flask, gin, javalin, next.js) are in the full report.

The field

Five ways an AI agent can navigate an unfamiliar codebase. Same Claude Code harness, same six repos pinned at the same commits. Only the MCP configuration changes between runs.

sense · v0.84.1

Pre-built symbol graph plus embeddings, served over four MCP tools: search, graph (callers/callees), blast (impact), conventions. Local Go binary.

probe · v0.6.0

No index. Every query parses touched files on the fly with tree-sitter and ripgrep, with MCP scoping. Zero setup, stateless.

baseline · Claude Code

No MCP at all. grep, find, Read, the same primitives a human dev uses. The floor every real tool has to beat.

serena · v1.3.0

Spins up real language servers (Pyright, gopls, rust-analyzer), caches their symbol graphs, exposes find_symbol / find_references over MCP.

gitnexus · v1.6.3

Builds a graph database from the repo and exposes Cypher-like queries plus a cross-repo registry over MCP.

The field will grow. This is a living scorecard, and the harness can score any code-intel MCP that runs as a drop-in server in Claude Code. New tools get added as they appear.

How a tool earns its rank

One judge score is not a benchmark. The other axes exist to catch what a single quality score misses: a beautiful but unverifiable answer is penalized on grounding, a slow drift through grep is penalized on efficiency.

fairness = 0.10 · keyword_coverage # per-scenario smoke test + 0.55 · llm_quality # Opus-4.7 judge, per-step rubric — the headline + 0.15 · citation_grounding # every file:line verified against the pinned checkout + 0.20 · efficiency # half tokens, half wall-time, calibrated per repo

Citations verified, not trusted

Every file:line reference in an answer is checked against the repo at the pinned commit. A line past end-of-file is flagged as a hallucination, not paraphrase. Sense grounded 89.2% of its citations; serena, the lowest, 61.9%.

Adoption never feeds the rank

How often the agent reaches for the MCP is computed separately and never folded into fairness. Otherwise the no-MCP baseline takes a structural zero. That separation is how baseline can, and does, beat two of the MCP servers.

An anchor the tuning can't touch

Three held-out scenarios with hand-graded scores, SHA256-locked. The scoring is only trusted when it correlates above 0.85 (Spearman) with my own grading. Goodhart's Law applies to your own benchmark too.

Keyword checks read prose only

Keyword hits are searched in the agent's answer text, never its tool-call inputs. Otherwise grepping for a symbol would score a "hit" even when grep returned nothing, a tax on tools that don't use grep.

Full scoring definitions: SCORING.md.

Where each tool loses

No tool wins everywhere, including the one that wins on aggregate. If a benchmark only lists where the author's tool shines, it's a press release. This is the honest column.

sense#1 aggregate
Needs a one-time sense scan before the first query (minutes on most repos, about 20 on a 75k-symbol monorepo like Next.js). On tiny codebases where the agent can just read the file, the index earns nothing. Line numbers drifted on one Rust citation. The .sense/ index lives on disk per repo, worth sizing inside small CI containers.
probe#2
Roughly 11% more tokens and 15% more wall-time than sense. Lowest adoption of any MCP tool (0.30), agents keep reaching for grep alongside it. On harder scenarios it answers in prose more than file:line, so its citation count drops (15 of 40 on next.js).
baseline#3 · grep
Judge quality is competitive (within 1.2 points of the top), but it reads broadly: 21% more wall-time and about $1.35 more per six-scenario run than sense. Sometimes invents citations when it reasons from a file it didn't fully open.
serena#4 · below grep
Slowest tool overall (avg 191s) and the most tokens (avg 14,800). Lowest citation grounding of any tool, 61.9%: the LSP cache often points at the right symbol but the wrong line. Each language needs its own healthy language server running.
gitnexus#5 · below grep
Last on aggregate fairness. Spends more tokens than the baseline on three of six scenarios. On javalin its grounding collapsed to 0 of 6 citations: the graph schema doesn't seem to capture Java handler-registration patterns. Strong on Go and Ruby when configured well.

Run it yourself

Nothing here can drift from the raw data. Every cell is derived from per-run transcripts, scores, and judge outputs committed in the repo. The whole benchmark replays end to end.

# index/check all tools across the six repos bash bench/run.sh # score keyword + grounding + efficiency, then LLM-judge each step bash bench/score.sh && bash bench/judge.sh # render the report bash bench/report.sh --md