Graft-MCP has 16 well-named tools with consistent verb_noun patterns (graft_query, graft_retrieve, graft_insert, graft_delete, etc.). All tools have descriptions (10 - 200 chars, within baseline 194 avg). Input schemas are present and properly typed with JSON Schema. However, output schemas are NOT documented, tools return raw CLI JSON without specifying expected fields. Parameter descriptions are present but minimal (e.g., 'Query text' vs. 'The text to search for in the cache; supports boolean operators'). Error handling is basic: tools raise RuntimeError or ToolError without recovery guidance. No pagination support despite tools like graft_retrieve returning potentially large result sets. Multi-tenant profile parameter is well-designed but adds cognitive load across 16 tools. Scope-based access control (_require_scopes) is implemented but not declared in tool descriptions.
Usage report: hit rate, hoarding ratio, top reused nodes, time saved.
Suggest keywords semantically related to `title`.
Remove a node from the graph by its 32-char hex id.
Beam search over the memory graph, conditioned on keywords.
Fetch a node by its 32-char hex id.
Save a new node. Idempotent on (title+body+sorted keywords).
Output schemas not documented. Tools return raw subprocess JSON without specifying expected response fields, making it impossible for LLMs to plan downstream calls or extract specific data.
No pagination support. graft_retrieve and graft_explore accept top_k/depth/beam but do not document result limits or provide next_cursor/offset for large result sets, risking context window exhaustion.
Scope requirements not declared in tool descriptions. _require_scopes() is enforced at runtime but LLMs cannot see which scopes each tool requires (READ_SCOPE, WRITE_SCOPE, ADMIN_SCOPE) without reading source code.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Create a new profile by name.
Show the currently active profile.
Backup a profile to a SQLite file at `path`.
Restore a .graftprofile file as a profile named `name`.
List all profiles and the active one.
Merge nodes/keywords/edges from a .graftprofile file into a profile.
Permanently delete a profile and all its data.
Cache lookup with multi-signal gating.
Top-k hybrid retrieval (lexical BM25 + semantic via RRF).
Inspect runtime metrics and similarity distributions.
Error handling lacks recovery guidance. RuntimeError and ToolError are raised without actionable next steps (e.g., 'graft CLI failed (rc=X)' tells the LLM nothing about whether to retry, check configuration, or ask the user).
Destructive operations (graft_delete, graft_profile_remove) lack confirmation/dry-run support. Agents can permanently delete nodes or profiles without a safety gate, risking data loss.