ctx-sys has clear tool naming and structured schemas, but suffers from several definition gaps. All 5 tools are explicitly registered with names, descriptions, and input schemas in src/mcp/tool-registry.ts. Tool names are action-oriented (project, entity, index, graph, context_query), though not all follow strict verb_noun convention. Descriptions are present and moderately detailed (60-200 chars), but lack specific guidance on when to use each tool vs. alternatives. Parameter descriptions are generally present but vary in completeness, some parameters (e.g., 'depth' in index tool) lack specifics about range, format, or valid values. Output schemas are NOT documented in the source code, the handler implementations return results, but the expected response structure is not declared in tool definitions. Error handling logic is minimal; handlers throw generic errors without recovery guidance. The entity, index, graph, and context_query tools use polymorphic 'action' enums to combine multiple operations, increasing parameter complexity and reducing clarity.
Hybrid RAG (vector + FTS + graph). Actions: search (vector/keyword/hybrid), retrieve (assembled context), explain (why results match)
Manage entities. Actions: add (create entity), get (by ID or qualified name), search (text query), delete
Explore the entity relationship graph. Actions: query (find related), stats (graph metrics), traverse (multi-hop paths), visualize (export graph structure)
Index code and documents. Actions: codebase (full index), document (single doc), sync (git changes), status (check index state)
Manage projects. Actions: create (register a project), list (show all), set_active (set working project), delete (remove a project)
Output schemas are completely undocumented. Tool handlers return responses (seen in registerProjectTool handler returning {success, project}), but the expected response structure is not declared in tool definitions. LLMs cannot plan downstream tool calls or extract correct fields without knowing what fields to expect.
Polymorphic tool design: all 5 tools use a single 'action' enum combining 2-4 distinct operations. This forces LLMs to reason about which parameters apply to which action and increases the surface area for misuse. E.g., entity tool's 'add' action requires {name, content, summary}, while 'search' requires {query, limit}. No clear documentation of action-parameter dependencies.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 57 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 37 | - | v1 |
Many parameters lack type constraints and ranges. E.g., 'depth' in index tool is a string with no enum or description of valid values; 'limit' has no min/max bounds documented; 'ignore' array in index has no format specification (glob? regex?); 'relationship_type' in graph has no enum of valid types.
Tool names are not all action-oriented verbs. 'project', 'entity', 'graph', 'index' are nouns or unclear verbs. Better names: 'manage_project' (or split into 'create_project', 'list_projects', 'set_active_project', 'delete_project'), 'manage_entity', 'query_graph', 'index_code'.
Error handling is minimal. Handlers throw generic errors like 'Missing required parameter(s)' or 'Unknown tool'. No actionable error messages or recovery guidance in visible code.
Description completeness varies. Entity tool description ('Manage entities. Actions: add...') does not explain what entities are in this system (code symbols? documents? both?). Index tool lacks context on indexing purpose. Current descriptions read like API docs, not LLM-optimized prompts.