Local code indexer with MCP-based semantic search
Three tools with basic schemas and descriptions, but significant gaps in parameter documentation and output schema clarity. search_code has reasonable parameter descriptions (query, language, file_path_contains, top_k), but lacks output schema documentation. index_repo and get_index_status have minimal parameter detail. No tool descriptions explain error cases, prerequisites, or recovery paths. Naming is verb-forward (search_, index_, get_) which is good, but descriptions are generic (194-char baseline suggests these are below average). No tool annotations (readOnlyHint/destructiveHint) despite index_repo being a WRITE operation. Output structures not documented, LLMs cannot plan downstream calls or extract chaining IDs.
Check the current state of the code index
Index or re-index the configured code repository
Search the indexed code repository for relevant code chunks using semantic similarity
Output schemas not documented. search_code returns results but structure is not specified, LLMs cannot extract file paths, line numbers, or relevance scores for downstream use.
index_repo (WRITE operation) lacks error handling guidance. No description of what happens on failure, whether it's retryable, or how to recover. Agents cannot distinguish transient failures from fatal ones.
Missing tool annotations. index_repo should declare destructiveHint=true (modifies index state). search_code and get_index_status should declare readOnlyHint=true. Agents cannot reason about side effects.
get_index_status description is vague ('Check the current state'). Does it return file count, last index time, error status, or all three? Ambiguous descriptions force LLMs to guess.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 51 | <=2025-11-25 | v2 |
search_code top_k parameter lacks validation guidance. Description says 'max: 50' but no mention of minimum, default behavior if omitted, or what happens if user requests 1000. Unbounded reasoning invites invalid values.