MCP server that exposes lore's grounded retrieval and Q&A use cases as MCP tools, allowing any MCP client to query a private document corpus and get back cited answers
Lore demonstrates strong tool design with clear, action-oriented names (ask, query, get_chunks, list_collections, collection_status) and comprehensive descriptions (194 - 280 chars, well above the 34-char p10 baseline). All 5 tools have detailed parameter descriptions with constraints (e.g., 'at least one' for collections, 'default 8' for k). Input schemas are fully typed with jsonschema annotations. However, output schemas are inferred from Go struct tags rather than explicitly documented in the tool registration, and error handling lacks recovery guidance (no 'try X instead' patterns). Tool composition is excellent, each tool has one clear responsibility, and outputs chain well (ask/query return chunk_ids that feed into get_chunks). No security issues detected (no secrets in params). Minor gap: descriptions could explicitly state when tools are read-only (all are, but not stated in descriptions per pattern:command-tool).
Answer a question using ONLY the documents indexed in the named lore collection(s). Returns a grounded answer with citations to the exact source passages (each citation carries the chunk's text by default, so claims are verifiable without a second call). Use this when the user asks about the content of a specific document corpus rather than for general knowledge.
Show detailed status for one lore collection: its embedding model, dimensions, chunker, document count, and chunk count. Use this to inspect a single corpus in depth.
Fetch specific document chunks by their chunk_id from a lore collection — the exact passages cited by `ask` or returned by `query`. Use this to retrieve the full text behind a citation. Unknown chunk IDs are omitted from the result rather than erroring.
List the lore collections this server exposes, each with its document count, embedding model, dimensions, and chunker. Use this to discover which corpora are available before calling `ask` or `query`.
Retrieve the document chunks most semantically similar to a query from the named lore collection(s), WITHOUT synthesizing an answer. Returns the raw ranked passages (text, source, score, chunk_id, collection) so the caller can read or post-process the evidence itself. Use this when you want source material rather than a written answer.
Output schemas are inferred from Go struct tags, not explicitly documented in tool registration. LLMs cannot see Citation, AskOutput, or QueryOutput structure without reading implementation code.
Error handling lacks recovery guidance. Errors like 'errNoCollections' or 'errEmptyQuestion' are returned but do not tell the LLM what to do next (e.g., 'Call list_collections() to see available corpora').
Tool descriptions do not explicitly state that all tools are read-only. Per pattern:command-tool, state-modifying tools must declare it; read-only tools should too for clarity.
Parameter 'k' (number of chunks) lacks min/max bounds in description. Unbounded integers let LLMs pass absurd values (k=999999) that could timeout or exhaust memory.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | <=2025-11-25 | v2 |
No pagination support documented. If a collection has thousands of documents, list_collections and collection_status could return unbounded results, risking context window exhaustion.