An MCP server that provides code analysis tools for understanding repositories: dead code detection, dependency extraction, context packing around symbols, and change impact analysis.
Four tools with complete input schemas and detailed descriptions (194 - 250 chars, above baseline 194). All parameters typed and described. Tool names are action-oriented (context_pack, dead_code, deps, explain_diff). Schemas include constraints (max_tokens, max_distance, limit, precise, refresh). However, output schemas are not documented in the visible code, LLMs cannot see what fields to expect from responses. Error handling and recovery guidance are absent. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all being read-only operations. Parameter descriptions lack format/range details (e.g., 'max_tokens: approximate token budget' should specify typical range 1000 - 16000). No pagination or result-limiting guidance in tool descriptions.
Assembles a ranked, token-budgeted bundle of source snippets most relevant to a seed symbol or file — retrieval-augmented context WITHOUT an embedding model. Relevance is call-graph proximity to the seed, refined by centrality and git churn.
Surfaces callable definitions (functions and methods) that nothing in the indexed graph calls — a strong lead for code an autonomous build wrote but never wired in. It is a lead, not a verdict: the syntactic graph cannot see calls made via interface dispatch, reflection, framework/DI registration, build-tagged files, or external importers, so results are ranked by how likely they are to be truly dead.
Extract the external dependency graph from a repo's manifests (go.mod, package.json, requirements.txt, Cargo.toml, Terraform required_providers + lock files, external module sources) — direct dependencies with declared versions per manifest, optionally as a Mermaid flowchart. Facts read from manifests, not inferred. Use to ground a dependency diagram or answer 'what does this project depend on'.
Explain a branch/PR: the files it changed, the symbols inside the changed lines, and each one's blast radius (transitive callers + at-risk tests). Scopes onboarding to a change set so it can run on every PR, not just once. Defaults the base to the merge-base with the default branch; pass `base` to override. Blast radius is syntactic (pass precise:true for type-checked Go).
Output schemas not documented. LLMs cannot see what fields context_pack, dead_code, deps, and explain_diff return, forcing them to guess downstream field names and risk broken tool chains.
No tool annotations despite all four tools being read-only. Adding readOnlyHint=true to each tool's definition enables agents to safely retry and reason about side effects.
Parameter descriptions lack actionable constraints. 'max_tokens: approximate token budget' should specify typical range (e.g., 1000 - 16000). 'limit: max orphans to return' should state default and bounds (e.g., 1 - 500, default 50).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | 2026-07-28+ | v2 |
No error handling or recovery guidance documented. If context_pack fails to index a repo or explain_diff cannot find a merge-base, the tool description does not tell the LLM what to do next.
No pagination or result-limiting guidance. dead_code defaults to 50 results; deps and explain_diff default to 50 changed symbols. Tool descriptions should state these limits and explain when to use pagination or filtering.