A Cloudflare Workers-based MCP server that provides tools for searching and retrieving classic books from multiple sources including Project Gutenberg, Wikisource, OpenLibrary, LibriVox, Aozora Bunko, and Sacred Texts. Features multilingual support and OAuth authentication.
The server provides 10 well-intentioned read-only tools for accessing classic books across multiple sources (Gutenberg, Wikisource, OpenLibrary, LibriVox, Aozora Bunko, Sacred Texts). Tool names follow verb_noun conventions consistently (search*, get*). Descriptions are present and reasonably detailed (100-200 chars typically), exceeding baseline minimums. Input schemas are explicitly defined with types and descriptions. However, output schemas are NOT documented, callers cannot see what structure to expect from responses. Parameter descriptions lack formal constraints (enums, ranges, patterns). Error handling is present in code but not surfaced in tool definitions. The server appears to be a Cloudflare Worker with HTTP transport, which is positive for Protocol Readiness, but lack of documented output schemas and output validation against the 'include-chaining-ids' and 'strip-api-responses' patterns are significant gaps for agent composition.
Retrieve the full text of a work from Aozora Bunko by book ID. Decodes Shift-JIS encoded Japanese text.
Retrieve the daily poem from 今日诗词 (jinrishici) API.
Retrieve the full text of a page from Wikisource by language and page ID. Converts wikitext to plain text and extracts content.
Retrieve the full text of a page from zh.wikisource.org by exact page title. Converts wikitext to plain text.
Search for works in Aozora Bunko (青空文庫), a Japanese digital library. Returns work metadata including title, authors, and card URL.
Search for books in Project Gutenberg (Gutendex API) with multilingual support. Returns book metadata including title, authors, language, download count, cover URL, and subjects.
Search for audiobooks in LibriVox. Returns audiobook metadata including title, authors, language, duration, and download URLs.
Output schemas are not documented. The tool definitions show input schemas clearly, but there is no declaration of what fields/structure callers should expect in responses. This breaks the 'tool-chain' pattern, agents cannot plan downstream operations or extract required data.
Input parameters lack formal constraints (enums, min/max, regex patterns). For example, 'lang' parameter accepts language codes but the description lists them as prose; an enum constraint would be machine-parseable and prevent LLM hallucination of invalid codes.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 53 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Search for books in OpenLibrary. Returns book metadata including title, authors, publication year, languages, cover image URL, and subjects.
Search for texts in the Sacred Texts catalog. Searches across religious and philosophical texts including Buddhist, Hindu, Christian, Islamic, Jewish texts and more.
Search for texts in Wikisource with multilingual support. Returns search results with page titles, IDs, snippets, and language information.
No pagination support documented. Tools like searchGutenberg, searchWikisource, searchOpenLibrary, searchLibriVox, searchAozora, searchSacredTexts accept a 'limit' parameter but do not specify pagination tokens, offset, or total count. Large result sets will not scale.
getDailyPoem has minimal description (50 chars). It says 'Retrieve the daily poem from 今日诗词 (jinrishici) API' but does not explain what fields the response contains, whether it changes daily, or what language the poem is in. LLMs cannot determine if this tool is relevant to user intents.
Error handling is present in code (safeJson, fetchWithTimeout) but is not surfaced in tool definitions. Tool definitions do not declare which errors are retryable, which require user action, or what recovery steps agents should take.
Response fields are not described in tool definitions. For example, searchGutenberg returns {source, id, title, authors, language, download_count, cover_url, subjects}, but this structure is not declared in a schema. Agents cannot plan downstream operations (e.g., extracting subject fields) without guessing.