AI-readable code documentation — Rust + TypeScript indexer surfaced over LSP and MCP. Workspace-wide symbol graph with cold start indexing, live watching, and query re-exports.
Two well-named tools with strong descriptions (194 - 250 chars, above baseline 194 avg). Input schemas present with proper JSON Schema types and constraints (depth: 1 - 2, limit: 1 - 100). Parameter descriptions are clear and actionable. Output schemas are NOT documented, critical gap for LLM planning. No error handling guidance (recovery paths, retryability classification). Tool composition is sound (single responsibility, chainable via FQDN). Naming follows verb_noun pattern (get_context, find_symbol). No security issues detected (read-only operations, no secrets). Missing: output field documentation, error recovery hints, pagination metadata (total count, next_cursor).
Full-text search across the workspace index over symbol names and FQDNs. Returns ranked matches as a JSON array. `limit` defaults to 20 and is capped at 100 server-side. Use this to discover symbols when you only know a fragment of the name; follow up with `get_context` to drill into a specific FQDN.
Aggregate context for a symbol identified by its fully-qualified name (FQDN). Returns the symbol's signature, descriptions and four pre-grouped neighbor lists (callers, callees, imports, imported_by). `depth=1` returns neighbor FQDNs only — cheap, suited to graph exploration. `depth=2` enriches each resolved neighbor with its full RawSymbol — suited to reasoning. Day-1 hard-clamped to 1..=2.
Output schemas not documented. LLMs cannot plan downstream calls or extract required fields (e.g., does get_context return neighbor FQDNs as array? What fields in RawSymbol?). Breaks tool chaining.
No error handling guidance. If FQDN not found or query returns 0 results, LLM has no recovery path. Missing: 'If symbol not found, try find_symbol() with a partial name.' or 'Returns empty array if no matches.'
find_symbol lacks pagination metadata. Returns 'ranked matches as JSON array' but no total count or next_cursor. If 100+ symbols match, agent cannot discover all results.
Parameter descriptions lack format/constraint details. 'fqdn' description says 'Match RawSymbol::fqdn' but does not explain format (e.g., 'crate::module::function' or 'crate::module::Type::method'?). 'query' description mentions 'FTS5' and 'tokenization' but not example queries.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
No tool annotations (readOnlyHint, idempotentHint). Both tools are read-only and idempotent, declaring this via annotations helps agents optimize retry logic and caching.