Patch release. Six targeted accuracy/UX fixes to MCP tool responses surfaced by a 3-round smoke test covering the full tool matrix (7 visible + 5 hidden + 4 management + 2 alias names). All changes are additive or remove false-positive warnings; no schema changes, no behavior regressions.
Fixes
semantic_code_search — compression estimator aligned to actual output
The compression trigger estimated token cost from context_string (often 2k+ chars) but the actual result JSON only carries code_content capped at 500 chars. Small top_k queries (3, 5) were being forced into compressed_nodes mode unnecessarily, losing relevance and signature fields. Estimator now mirrors the output; small top_k responses return full arrays again.
semantic_code_search — match_confidence + low_confidence_warning
Compressed responses (compressed_nodes / compressed_files / compressed_directories) now include a rounded match_confidence float. When < 0.5, a low_confidence_warning explains the results are likely vector-similarity noise and advises using concrete identifiers or ast_search.
FTS sparsity and source-intersection penalties previously over-fired on precision queries (single-identifier FTS hits). The penalty now requires fts_search.len() >= 5; below that, the query is treated as precision-mode and not penalized. When any top-5 candidate's name or qualified_name equals the query (case-insensitive), the warning is suppressed.
find_references — type_definition_note for type symbols
When the target is a struct / enum / trait / type / interface / class, the response now includes a type_definition_note explaining that the edge index captures explicit imports/inherits/implements and struct-literal instantiation, but NOT method-qualified calls (Type::method()), field access, or type annotations. Guides callers to audit each method via module_overview for complete rename coverage.
get_index_status — embedding_coverage_pct floor
When embedding is in progress with a small fraction done (e.g. 2/1052), the integer percent rounded to 0 and looked stuck. Now floors to 1 whenever vectors_done > 0.
get_ast_node(node_id) — explanatory not-found error
Node N not found replaced with a message that explains node_ids are rebuild-scoped and suggests re-resolving via get_ast_node(symbol_name, file_path) or semantic_code_search.
Validated
- 43
mcp::serverunit tests green - Routing bench P@1 = 19/20 = 95.0% (threshold 70%) via OpenRouter
anthropic/claude-sonnet-4.5; single miss is a semantic-neighbor pick, unrelated to this release cargo +1.95.0 clippy --no-default-featurescleancargo +1.95.0 clippy --all-targetsclean- CI baseline green (last 3 main runs all success)
Upgrade
# Claude Code plugin: auto-updates on next SessionStart via plugin-auto-update
# Manual via npm
npm install -g @sdsrs/code-graph@0.14.1
# or npx
npx @sdsrs/code-graph@0.14.1 serve