Self-maintaining codebase memory for AI coding agents: an AST index that answers which files matter, plus agent-written notes that flag themselves stale when the code changes. No embeddings, no API key. CLI + MCP.
Two tools with reasonable naming and visible schemas, but descriptions lack depth for LLM decision-making, and schema documentation is incomplete. The 'find' tool has a generic one-liner description (63 chars) that does not clearly state WHAT it returns, WHEN to use it vs 'gs', or what the 'domain_filter' parameter controls. The 'gs' tool description is more detailed (189 chars) and properly explains the symbol inspection workflow. Both tools lack documented output schemas, critical for LLM chaining. Parameter descriptions exist but some are vague: 'domain_filter' description says 'Alternative parameter name for query filter' without explaining what values it accepts or what domains are supported. The 'view' enum is well-defined for 'gs', but 'find' has no such clarity. Error handling is not visible in the tool definitions. No indication of pagination support, result limits, or recovery guidance. The tools appear to be READ_ONLY (good for safety), but this is not surfaced via toolAnnotations (missing feature).
Search the codebase by query. Shares ONE engine across transports: buildRichPage. The MCP `find` tool and the CLI `find`/`gs index` reader both call it. Same query in, same page out, regardless of transport. Everything heavy (grep-recall + AST precision against the live root) lives in find.ts; this is a thin shim.
Drill-down inspection of a file: symbols + imports + importers + per-symbol callers. Returns structured intermediate with display names, parent class indent, line ranges, extends/implements information, and caller references organized by symbol.
find tool description (63 chars) is too brief and does not explain what it returns or when to prefer it over 'gs'. LLMs cannot determine selection logic.
Output schemas are not documented for either tool. LLMs need to know what fields to expect so they can plan downstream calls and extract data correctly.
domain_filter parameter description is unclear ('Alternative parameter name for query filter'). Does not explain valid values, what domains exist, or when to use it instead of 'query'.
No toolAnnotations visible (readOnlyHint, destructiveHint, idempotentHint). Both tools are READ_ONLY but this safety property is not declared to the protocol.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
No pagination support documented. If 'find' or 'gs' return large result sets, LLMs have no way to request partial results or navigate through pages.
Error handling and recovery guidance not visible in tool definitions. LLMs cannot distinguish retryable failures from user-fixable ones.