ndxr provides 10 well-structured tools with complete JSON schemas and descriptions. All tools have clear verb-noun naming (run_pipeline, get_context_capsule, search_memory, etc.) and detailed parameter documentation. However, descriptions are often technical and lengthy (200+ chars), optimized for developers rather than LLM selection. Output schemas are documented in code but not exposed in tool definitions. Error handling guidance is minimal, tools lack recovery hints for common failure modes. No tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications in metadata.
Get a context capsule for a search query
Analyze transitive callers and callees of a symbol
Get index statistics and metadata
Get observations from the current or specified session
Render file skeletons (signature-only structural outlines)
List all sessions with their metadata
Trigger a full re-index of the workspace
Run the full indexing and search pipeline for a task description
No tool annotations (readOnlyHint/destructiveHint/idempotentHint) despite clear risk metadata. save_observation and reindex_workspace are marked WRITE but lack destructiveHint annotation for LLM safety.
Descriptions are technical and lengthy (150-250 chars), optimized for developers. LLM selection would benefit from shorter, action-oriented descriptions (50-100 chars) that clarify WHEN to use each tool vs. similar ones.
Error handling lacks recovery guidance. Tools do not document what to do on failure (e.g., 'If symbol not found, try search_memory() with a partial name'). Errors are likely raw exceptions without actionable next steps.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | <=2025-11-25 | v2 |
Save an observation to the session memory
Search observations in the session memory
Output schemas documented in code (SkeletonResult, ImpactNode structs) but not exposed in tool definitions. LLMs cannot see what fields to expect without reading source.
get_index_status has empty input schema (no parameters). Description is minimal (60 chars). Unclear what this tool returns or when to call it vs. list_sessions.