Multi-server MCP suite for worldbuilding: R2R document search/ingestion, Obsidian vault graph navigation, and sourcebook lore retrieval
14 tools with consistent naming (verb_noun pattern) and basic descriptions. All tools have input schemas with type definitions and parameter descriptions. However, descriptions are generic (avg ~80 chars, below 194-char baseline), lack WHEN/WHY context, and output schemas are undocumented. No error handling guidance, no recovery paths, no actionable error messages. Missing tool annotations (readOnlyHint/destructiveHint). Composition is reasonable (single responsibility per tool), but parameter descriptions lack format constraints and validation rules. No pagination guidance despite list tools returning potentially large result sets.
Delete a document from R2R by its ID.
Retrieve the full text of a specific chapter from a source book.
Ingest a document into R2R.
List all worldbuilding source books in the library.
List all collections in R2R.
List documents in R2R, optionally filtered by collection.
Search R2R for documents matching a query.
Output schemas undocumented. Tools return unstructured text (e.g., search_lore returns markdown string) without declaring field structure. LLMs cannot plan downstream calls or extract structured data reliably.
No error handling guidance. Tools lack recovery hints (e.g., 'If search fails, try search_notes() with a simpler query'). Errors are not categorized as retryable, user-fixable, or fatal. LLMs cannot self-correct.
Missing tool annotations. No readOnlyHint, destructiveHint, or idempotentHint declared. Clients cannot determine which tools are safe to retry or which modify state without reading descriptions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Search worldbuilding lore across source books.
Show all notes that link to the given note.
Rank notes by connection count (degree centrality), with optional tag filter.
BFS from a note up to depth hops, showing outgoing and incoming connections per level.
Re-parse the vault, regenerate .graph.json, and reload the cache in one step.
Re-read .graph.json from disk without rebuilding it. Fast. Use after an external rebuild.
Search notes by name, tag, and/or type with AND logic.
Descriptions lack WHEN/WHY context. Generic descriptions (avg 80 chars vs 194-char baseline) do not explain when to use a tool vs similar alternatives. E.g., 'Search notes by name, tag, and/or type' does not explain when to call vault_search_notes vs vault_graph.
Parameter descriptions lack format constraints. E.g., 'note' parameter in vault_graph has no guidance on valid format (name pattern, case sensitivity, special chars). 'limit' parameters lack min/max bounds. LLMs pass invalid values.