Local-first MCP code analyst: index your repo privately (embeddings + ripgrep-style search), then ask 'where does X break if I change Y' — zero cloud, zero config.
Six tools with complete Zod schemas and consistent descriptions. All parameters have types and descriptions. Tool names are action-oriented (index, search, impact, status, references, definition). Descriptions average ~100 chars, meeting baseline. However, descriptions lack WHEN/WHY guidance and dependency hints. No error handling guidance in descriptions. Output schemas are not documented, LLMs cannot predict response structure. No tool annotations (readOnlyHint). Missing composition guidance for multi-step workflows.
Locate the definition of a symbol in the codebase. Returns the file and line number where the symbol is defined.
Analyze the impact of changing a file or symbol. Shows which files and symbols would break if the target is modified.
Index a repository for code analysis. Scans files, extracts symbols, builds embeddings and dependency graphs.
Find all call sites and usages of a symbol. Returns locations where the symbol is referenced in the codebase.
Search the indexed repository using natural language, symbol names, or code fragments. Returns semantic and lexical matches.
Check the indexing status of a repository. Returns information about indexed files, symbols, and index freshness.
Output schemas not documented. LLMs cannot predict response structure (fields, types, pagination). Descriptions state WHAT tools do but not WHAT they return.
Descriptions lack WHEN/WHY guidance and dependency hints. E.g., 'search' does not explain when to call it vs 'definition' or 'references'. No guidance on multi-step workflows.
No error handling guidance in tool descriptions. LLMs cannot know what to do if index fails, search returns no results, or impact analysis times out.
Tool annotations missing. No readOnlyHint, destructiveHint, or idempotentHint. All tools are read-only but this is not declared in schema.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 52 | 2026-07-28+ | v2 |
'path' parameter defaults to '.' but descriptions say 'must match a previously indexed root'. Unclear if default is safe or if index() must be called first.