MCP server for ctxgraph — exposes graph memory to Claude and other LLMs
8 tools with complete input schemas and descriptions, but quality varies significantly. Tool names follow verb_noun convention well (add_episode, search, get_decision, traverse, find_precedents, list_entities, export_graph). Descriptions range 50-180 chars, mostly adequate but lack LLM-optimized guidance on WHEN to use each tool vs alternatives. Parameters have types and descriptions, but lack constraints (enums, ranges, patterns). Output schemas are not documented, LLMs cannot plan downstream calls. Error handling is minimal; no recovery guidance. Composition is reasonable (single responsibility per tool), but batch variant (traverse_batch) exists alongside single variant, creating potential LLM confusion.
Adds a new episode to the graph, computes and stores its embedding.
Export the entire knowledge graph in JSON format.
Find past episodes most semantically similar to a given context. Uses in-memory embedding cache for performance.
Retrieve a specific episode by ID with full context.
List all entities in the graph with optional filtering.
Fused FTS5 + semantic search via RRF. Falls back to FTS5-only if embed is unavailable.
Traverse the knowledge graph from an entity.
Output schemas not documented. LLMs cannot infer what fields to expect from tool responses, blocking downstream tool chaining and forcing exploratory calls.
Numeric parameters (limit, max_depth) lack min/max constraints. LLMs can pass unbounded values (limit=999999, max_depth=100) causing performance issues or API failures.
Descriptions lack WHEN-to-use guidance. 'Fused FTS5 + semantic search' is technical but doesn't tell LLM when to prefer search over find_precedents or traverse. No dependency hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Batch traverse the knowledge graph from multiple entities.
traverse and traverse_batch are near-duplicates. LLM must reason about which to call; batch variant should be the only one, or names should clarify the distinction (e.g., traverse_single vs traverse_multiple).
No error recovery guidance. If search returns 0 results or get_decision fails with 'not found', LLM has no hint on next steps (e.g., 'Try search() with broader query' or 'Call list_entities() to see available IDs').