A single-user WeRead MCP server for ChatGPT, deployed on Cloudflare Workers.
WeRead MCP server demonstrates solid tool design with 14 well-structured tools, all with explicit schemas and descriptions. Naming follows verb_noun convention (weread_get_*, weread_search_*). All tools include input schemas with proper type definitions and required fields. Descriptions are substantive (100-250 chars typical), explaining WHAT the tool does and WHEN to use it. Tool annotations (readOnlyHint, idempotentHint) are correctly applied. However, output schemas are minimal (only declared for 'search' and 'fetch'; others omitted), limiting downstream tool chaining visibility. Parameter descriptions are generally good but some lack constraint details (e.g., 'bookId' has no format guidance). Error handling is present but recovery guidance is sparse.
OpenAI data-only compatibility tool. Fetch full details for a WeRead search result id returned by search, for example book:3300045871.
OpenAI data-only compatibility tool. Search WeRead bookstore results by keyword. Use fetch with an returned id like book:<bookId> to retrieve full book details.
Get popular highlights for a book or chapter. The WeRead community's most-underlined passages.
Get the chapter table of contents for a WeRead book. chapterUid values can be used with underlines and best bookmark tools.
Get personal highlight text for a book via /book/bookmarklist. This endpoint returns highlights (type=1) and not bookmark-position content.
Get basic metadata for one WeRead book by bookId, including title, author, intro, category, publisher, ISBN, rating, and open links.
Output schemas missing for 12 of 14 tools. Only 'search' and 'fetch' declare outputSchema; others omit it entirely. This prevents LLMs from understanding response structure and planning downstream tool chains.
Parameter 'bookId' and 'chapterUid' lack format/constraint guidance. Descriptions say 'WeRead book ID' but do not specify format (numeric string? alphanumeric?), length, or validation rules. LLMs cannot self-correct invalid IDs.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2025-06-18+ | v2 |
Composite tool: fetch personal highlights and personal thoughts/reviews for a book, then return both in one response. Bookmarks are only available as counts from weread_get_notebooks and are not exported as content.
Get the authenticated user's personal thoughts and reviews for a book via /review/list/mine, including highlight thoughts, chapter comments, and whole-book reviews.
Get the authenticated user's WeRead bookshelf summary. The total shelf count is books.length + albums.length + one article collection entry when mp exists.
Get underline heat statistics for one chapter. This contains ranges, counts, scores, and types, but not highlight text.
Get the user's notebook overview: books with personal note counts. Total note count per book is reviewCount + noteCount + bookmarkCount. Pagination uses lastSort, not offset/limit.
Composite profile overview based on the WeRead skill profile workflow: bookshelf summary, recent book reading progress, optional monthly/weekly/yearly/overall reading stats, notebook overview, and optional highlight counts for recent books.
Get the authenticated user's reading progress for a book. progress is 0-100 percent; 1 means 1%, not 100%.
Search the WeRead store. Use this when the user provides a book title, author, keyword, or asks for a bookId. scope defaults to 10 for ebooks; use 0 for all tabs, 14 for audiobooks, 6 for authors, 12 for full-text, etc.
Error handling present but recovery guidance sparse. Tools sanitize WeRead errors (sanitizeWeReadError) but responses do not include actionable next steps. E.g., 'Book not found' should suggest 'Try weread_search_books() to find the correct bookId.'
Tool composition: 'weread_get_book_notes' is a composite of highlights + reviews. While useful, it duplicates functionality of separate tools. Consider whether agents benefit from the combined call or if separate tools offer better composability.
Pagination parameters inconsistent across tools. 'weread_search_books' uses 'maxIdx' (offset); 'weread_get_notebooks' uses 'lastSort' (cursor); 'weread_get_book_reviews_mine' uses 'synckey' (cursor). Inconsistent naming confuses LLMs about pagination semantics.