MCP server for the Bookrack library management system, providing tools for book reference lookup, metadata management, and library operations
Bookrack provides 7 tools with consistent naming (verb_noun pattern: reference.lookup, query.search, library.list, etc.) and basic descriptions. All tools have input schemas with typed parameters and descriptions. However, descriptions are terse (10-50 chars), lacking context on WHEN to use each tool or what downstream actions they enable. Output schemas are not documented. Error handling is minimal, no recovery guidance or actionable error messages. Parameter descriptions lack format constraints (e.g., 'id' doesn't specify format). No tool annotations (readOnlyHint/destructiveHint) despite clear risk distinctions (READ_ONLY vs WRITE). Composition is sound, tools chain naturally (search → get → overlay_set), but descriptions don't guide this flow.
Queue a book file for ingestion into the library
Get the status of an ingest job
Get detailed information about a specific book
List all books in the library
Search the library catalog for books matching query criteria
Look up a reference entry by identifier in the reference book store
Set or update an overlay property on a reference entry
Descriptions are too brief (10 - 50 chars) and lack context. 'Look up a reference entry by identifier' doesn't explain WHEN to call this vs other lookup tools, what the entry contains, or what downstream tools expect. LLMs cannot infer intent from minimal docstrings.
No output schemas documented. Tools return data but LLMs don't know what fields to expect. This breaks downstream tool chaining, e.g., does library.list return book_id or id? Does query.search return a total_count for pagination?
No tool annotations (readOnlyHint/destructiveHint/idempotentHint) despite clear risk labels. reference.overlay_set and ingest.queue are WRITE operations, should be marked destructiveHint=true to warn agents of side effects.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
Parameter descriptions lack format constraints. 'id' parameter doesn't specify format (UUID, alphanumeric, etc.). 'path' in ingest.queue doesn't clarify if it's absolute, relative, or a URI. LLMs guess and pass invalid values.
No error handling guidance. If reference.lookup fails (entry not found), the tool doesn't suggest recovery steps (e.g., 'Try query.search to find the entry first'). Agents hit dead ends without actionable next steps.