An MCP server that gives AI agents read-only access to a local research library (PDF, Markdown, BibTeX, RIS, ENW, XML).
Four tools with clear verb-noun naming (list_, search_, get_, search_in_). All have descriptions (avg 150 chars, within 10-1024 range). Input schemas present with type definitions and parameter descriptions. However, output schemas are not documented, responses are model_dump() calls with no schema visibility. Error handling exists (LibraryError wrapper) but lacks recovery guidance. No tool annotations (readOnlyHint, etc.). Composition is sound: tools chain well (search_papers → get_paper → search_in_paper). Missing: output schema documentation, per-parameter constraints (enums), and actionable error messages.
Return the metadata of one paper by id. Set include_text to also retrieve a truncated text preview; the full document is never returned in a single response.
List the top-level collection directories inside the library, with the number of papers each one holds.
Find occurrences of a query string inside a single paper. Each hit includes a snippet with the match highlighted by its character offset, plus the page number when available.
Search across the indexed research library. Matches against title, authors, collection and full text. Title hits are ranked highest; body hits are ranked by FTS relevance.
Output schemas not documented. Tools return model_dump() dicts with no visible schema definition for LLM planning.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All tools are read-only but this is not declared in schema.
Error handling returns LibraryError payload but lacks recovery guidance. LLM cannot determine if error is retryable or what to do next.
Parameter 'collection' in search_papers lacks enum constraint. Free-form string invites hallucinated collection names.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 60 | <=2025-11-25 | v2 |
No pagination guidance in search_papers or search_in_paper descriptions. Limit defaults to 10 but no mention of total count or next_cursor.