The server exposes two READ_ONLY tools with complete input schemas and type definitions. Both tools have descriptions and properly constrained numeric parameters (limit 1-100, max_chars 200-8000). However, descriptions are minimal (under 100 chars each), lack context on when to use each tool and how they differ, and do not explain dependency relationships or recovery strategies. Output schemas are documented in code (ExcerptOutput, FulltextSearchOutput) but descriptions lack guidance on field meanings and chaining behavior. Error handling exists but is generic ('Excerpt retrieval failed: {type}') without actionable recovery hints. No tool annotations (readOnlyHint, idempotentHint) are visible, though the tools are clearly read-only. The naming is verb-forward (calibre_get_excerpt, calibre_fulltext_search) and unambiguous. Composition is sound, each tool has one clear responsibility, and both accept human-friendly inputs (ISBN, query string). Overall, the tools are functional and schema-complete, but descriptions and error messaging fall short of production-grade LLM-optimized tooling.
Return a short excerpt for a book identified by ISBN.
Return a short excerpt for a book identified by ISBN.
Tool descriptions are too brief (<100 chars) and lack context. 'Return a short excerpt for a book identified by ISBN' does not explain when to use calibre_get_excerpt vs calibre_fulltext_search, what 'around' parameter does, or what source_hint means in the output.
Error messages are generic and non-actionable. 'Excerpt retrieval failed: FileNotFoundError' tells the LLM nothing about how to recover or what precondition failed. Should include 'Calibre library metadata.db not found at configured path. Verify the library location is accessible.'
No tool annotations (readOnlyHint, idempotentHint) are declared in the tool definition, despite both tools being read-only and idempotent. This prevents clients from optimizing caching and retry strategies.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 54 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 46 | - | v1 |
Output field descriptions are missing. ExcerptOutput.source_hint and FulltextSearchHit.snippet are undocumented, LLMs cannot infer what these fields represent or how to use them.
No pagination support on calibre_fulltext_search despite potentially returning many results. The 'limit' parameter caps results but there is no offset/cursor or total count returned. A full-text query could match hundreds of books, returning only 10 by default without a way to fetch the next batch breaks agent workflows.
Parameter 'around' in calibre_get_excerpt is Optional[str] with a brief description. The description does not explain how the search works ('Find text matching this substring and return excerpt around it?'), what happens if the text is not found, or whether partial matches are supported.