Local code search for AI coding agents: a CLI and MCP server with hybrid keyword + semantic search and SQL relevance-ranked aggregation over an index that lives in plain files. No accounts, no keys, no server.
Three tools with clear, domain-specific names (search, sql, reindex) and reasonable descriptions (avg 95 chars). All tools have input schemas with typed parameters and descriptions. However, output schemas are not documented in the visible code, responses are inferred from implementation details (took_ms, file results). Parameter descriptions are functional but minimal (avg 45 chars, below the 72-char baseline). The 'sql' tool accepts arbitrary SQL with optional embedding placeholders, which is powerful but lacks validation guidance in the description. Error handling is present (errorReporting=true) but recovery guidance is not visible in tool descriptions. No tool annotations (readOnlyHint/destructiveHint) despite clear risk profiles (search/sql are READ_ONLY, reindex is WRITE).
sync from the working tree; replies the moment keyword search is live and backfills vectors in-process
find code: exact terms AND meaning in one ranked pass
the power door: relevance-ranked aggregation over the search table functions (bm25_search / hybrid_search + GROUP BY)
Output schemas not documented. Tool descriptions do not specify what fields are returned (e.g., search returns ranked results with took_ms, but this is inferred from code, not declared). LLMs cannot plan downstream tool calls without knowing response structure.
Tool annotations missing. 'search' and 'sql' are READ_ONLY; 'reindex' is WRITE with side effects. Annotations (readOnlyHint, destructiveHint) are not present in tool definitions, forcing LLMs to infer safety from descriptions alone.
Parameter descriptions are minimal. 'query' (search), 'statement' (sql), and 'path' (all tools) lack guidance on format, constraints, or examples. 'statement' accepts arbitrary SQL with optional embedding placeholders but does not document valid table functions (bm25_search, hybrid_search) or syntax rules.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2026-07-28+ | v2 |
Error recovery guidance absent. Tool descriptions do not explain what to do if a query fails, if a repo is not indexed, or if reindex is already in flight. The code shows 'exclusive()' prevents concurrent mutations, but this is not documented for the user.
Default parameter 'k' (search) and 'path' (all tools) lack explicit constraints. 'k' defaults to 20 but no min/max is stated. 'path' is optional but behavior when omitted is not documented (defaults to startup root, but this is inferred from code).