goodreads-mcp
A read-only MCP server for researching Goodreads books, ratings, and reviews without the official API.
Search & book details:
search_booksby title/author/ISBN;get_bookfor full details, covers, ratings histogram, series memberships, review-language breakdown, and publication dates.Reviews:
get_reviewsfetches paginated reader reviews with text, star rating, likes, date, spoiler flag, permalink, and server-side min/max rating filters.Discovery:
similar_books(readers also enjoyed),author_books(bibliography),series_books(reading-order placement),get_editions(formats/ISBNs/publishers),book_lists(Listopia lists).Popular & comparative analysis:
popular_booksranks books by release year/month;compare_booksranks multiple books by rating with positive/critical share and distribution.Shelves:
get_shelflists public shelves via RSS;list_shelvesscrapes a user's shelf names (best effort).Chaining: results include
book_id, title, author, rating, and url, so an agent can chain discovery tools into reviews/details for individual books.
Provides tools for searching books, retrieving book details (ratings, histogram, series, review languages), fetching paginated reader reviews with filters, finding similar books, author bibliographies, series books with reading order, published editions, and accessing public shelves — all from Goodreads public data.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@goodreads-mcp search for 'Project Hail Mary'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
📚 goodreads-mcp
A read-only MCP server for Goodreads — built without the Goodreads API, because there hasn't been one since December 2020. Lets an LLM find and research books, ratings, and reviews. Tools ride on RSS feeds, the JSON autocomplete endpoint, and the __NEXT_DATA__ blob embedded in book pages. No login, no cookies, no writes — public data only.
tools
tool | stability |
| stable (JSON endpoint) |
| stable ( |
| GraphQL — paginated reader reviews (text, rating, likes, date, spoiler flag, permalink) with server-side |
| GraphQL — paginated "readers also enjoyed" recommendations |
| GraphQL — paginated author bibliography (from any of their books) |
| GraphQL — paginated series books with reading-order placement; selectable membership for books in multiple series |
| GraphQL — paginated editions (format, ISBN, publisher, date) |
| GraphQL — paginated Listopia lists a book appears on (title, votes, size) |
| GraphQL — most popular books by release year (or year+month), ranked |
| takes several book ids, ranks them by rating with positive/critical share |
| stable (RSS) — public shelves |
| best effort (HTML) — public profiles |
The discovery tools all take a book_id and return results carrying book_id/title/author/rating/url, so an agent can chain them — e.g. similar_books → get_reviews on a recommendation. This is the structured book graph a general web search can't assemble.
GraphQL discovery tools page in batches of 20 and accept a total limit up to
100. Responses include returned and has_more, keeping larger lookups useful
without allowing unbounded traffic.
WAF note: Goodreads book HTML pages now sit behind an AWS WAF JavaScript challenge (HTTP 202) that plain HTTP clients can't solve.
get_bookroutes around it via the.xml-suffixed page, so it still works without a browser. If Goodreads ever extends the WAF to a path we depend on, the client raisesWAFChallengewith a clear message instead of a confusing parse error.
Related MCP server: anna-book-search
install
cd goodreads-mcp
python3.10 -m venv .venv && .venv/bin/pip install -e .Requires Python ≥ 3.10.
config (optional)
No login or cookies — everything is public data. The only setting is your numeric user_id, the default for the shelf tools. It's the number in goodreads.com/user/show/<ID>-yourname; you can also pass user_id to each shelf tool per call.
mkdir -p ~/.config/goodreads-mcp
cat > ~/.config/goodreads-mcp/config.json << 'EOF'
{ "user_id": "12345678" }
EOFEnv var GOODREADS_USER_ID overrides the file.
Claude Desktop config
~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"goodreads": {
"command": "/path/to/goodreads-mcp/.venv/bin/goodreads-mcp"
}
}
}Or for development, mcp dev goodreads_mcp/server.py gives you the Inspector UI to poke each tool.
first-run verification
The endpoints are unofficial, so verify in this order:
search_books("project hail mary")— should just workget_book("54493401")— confirms the.xml/WAF workaround; check the histogram is populatedget_reviews("54493401")— should return real review textget_shelf("to-read")— checks youruser_id+ RSSlist_shelves()— best-effort shelf-name scrape
tests
.venv/bin/pip install -e ".[test]"
.venv/bin/pytest # offline parser/unit tests
GOODREADS_LIVE=1 .venv/bin/pytest # + live network smoke testsdesign notes
Request-first, no browser automation. Everything is
httpxagainst JSON/RSS/embedded-JSON/GraphQL surfaces; the only HTML regex is inlist_shelvesand the GraphQL config discovery.GraphQL backbone (reviews).
get_reviewscalls Goodreads' AppSync GraphQL endpoint — the same backend the website uses. The web app injects a public read-only API key into page-level__NEXT_DATA__and keeps the production endpoint in its_appbundle; the client resolves both at runtime and caches them, so rotations self-heal (client.graphql_config). Legacy bundles that carry a paired key and endpoint are still supported. This is what enables real pagination (past the ~30 reviews a page embeds) and server-side rating filters. GraphQL partial-success is respected: a deleted review's sub-resource just comes backnullrather than failing the call.WAF-aware. Book pages sit behind an AWS WAF JS challenge;
get_bookuses the.xmlpath that isn't gated, and the client raisesWAFChallengeif it ever gets a challenge body so failures are loud, not silent. (The GraphQL endpoint is a separate AppSync host and isn't WAF-gated.)Polite client. Single persistent session, browser-faithful headers, exponential backoff on 429/503;
get_reviewscaps paging at 100 reviews.Caveats: all of this is unofficial and depends on markup/endpoints/keys that can drift.
shipped since v0.1
richer book data —
get_bookincludes covers, the ratings histogram, every series membership, normalized publication dates, and configurable review-language depth;series_bookscan traverse any listed membership, andget_reviewsreturns paginated, filterable reader reviews.author bibliography —
author_booksreturns an author's works (ranked by popularity) plus a link to their author page (author_url).bounded discovery pagination — similar books, bibliographies, series, editions, and Listopia memberships can return up to 100 results with
has_moremetadata.
ideas for v2
author page detail (bio, photo, follower count) — not currently exposed cleanly: the author page is legacy server-rendered HTML with no structured JSON, and there's no discoverable GraphQL contributor-detail query, so this would require brittle DOM scraping.
author_bookslinks to the page instead.caching layer for repeated lookups (the discovery tools each resolve the book first; a small TTL cache would cut duplicate GraphQL calls)
Available Tools
12 toolsauthor_booksA
List an author's works (bibliography), given any of their books.
Resolves the book's primary author, then returns their works ranked by popularity. Each result has book_id/title/author/rating/url. limit capped at 40.
Inputs: book_id (required), limit. Returns: object
book_listsA
List the Listopia lists a book appears on (e.g. "Best Dystopian Fiction"), ordered by popularity.
Each list has its title, total member votes, how many books it contains, and a 'url'. Good for "what kind of book is this / what's it grouped with" and for discovery. limit capped at 40.
Inputs: book_id (required), limit. Returns: object
compare_booksA
Compare several books side by side by rating and rating distribution.
Fetches each book and returns them ranked best-to-worst by average rating, with the ratings_histogram plus 'pct_positive' (share of 4-5 star) and 'pct_critical' (share of 1-2 star) so you can judge not just the average but how divisive each book is. Pass 2-10 book ids (from search_books etc.).
Inputs: book_ids (required). Returns: object
get_bookA
Get full details for a book by its Goodreads id (numeric, or numeric-slug like '11870085-the-fault-in-our-stars').
Parses the page's embedded NEXT_DATA JSON (Apollo state) rather than scraping the DOM, which survives markup changes. Includes the full ratings histogram, series/position, and review-language breakdown — use get_reviews for the actual review text.
When you cite details or ratings from this book, link to its 'url'.
Inputs: book_id (required). Returns: object
get_editionsA
List published editions of a book (formats, ISBNs, publishers, dates).
Useful for "which edition / format / ISBN" questions. limit capped at 40.
Inputs: book_id (required), limit. Returns: object
get_reviewsA
Get reader reviews for a book — the actual review text, not just a score.
Fetches from Goodreads' GraphQL backend with true pagination, so limit can exceed the ~30 shown on a page. Reviews come in "most relevant" order and aggregate across all editions of the work. Each review has the reviewer name, star rating (1-5), full text, like/comment counts, date, a spoiler flag, a 'url' permalink (use it to cite/link), and the reviewer's profile url.
limit: max reviews to return (capped at 100 to stay polite). min_rating / max_rating: server-side star filters, e.g. min_rating=4 for positive reviews, max_rating=2 for the critical ones. exclude_spoilers: drop reviews flagged as spoilers.
Inputs: book_id (required), limit, max_rating, min_rating, +1 more. Returns: object
get_shelfA
List books on a shelf via its RSS feed (public shelves; no auth).
Common shelves: 'read', 'currently-reading', 'to-read', plus any custom shelf name. RSS pages hold ~100 items; pass page=2,3,... for more. Defaults to the configured GOODREADS_USER_ID.
When you cite a book from a shelf, link it to its 'link' field.
Inputs: page, shelf, user_id. Returns: result
list_shelvesA
List a user's shelf names (scraped from their review-list page; best effort). Defaults to the configured user.
Inputs: user_id. Returns: result
popular_booksA
Most popular books by release date — Goodreads' "Popular by date" chart.
Ranks the books/works released in a given year (or a specific month of a year) by how many Goodreads members have added them. Mirrors the goodreads.com/book/popular_by_date/[/] page.
year: 4-digit release year. month: optional 1-12 for a single month; omit for the whole year. limit: how many to return (capped at 50).
Each entry has rank, count (members who added it), and the usual book_id/title/author/rating/url so you can chain into get_book/get_reviews.
Inputs: year (required), limit, month. Returns: object
search_booksA
Search Goodreads for books by title/author/ISBN.
Uses the JSON autocomplete endpoint (no auth, no HTML parsing). Returns book_id, title, author, rating info, and a cover URL.
Inputs: query (required), max_results. Returns: result
series_booksA
List the books in a series (with reading-order placement), given any book in that series.
Each entry has the series 'placement' (e.g. '1', '0.5' for a prequel), 'is_primary' (a main-sequence entry vs companion), and the usual book_id/title/author/rating/url. limit capped at 40.
Inputs: book_id (required), limit. Returns: object
similar_booksA
"Readers also enjoyed" — books similar to the given one.
Goodreads' own recommendation graph (hard to reproduce with web search). Each result has book_id/title/author/rating/url so you can chain into get_book or get_reviews. limit capped at 40.
Inputs: book_id (required), limit. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 12 tools
Most tools target clearly distinct resources: search_books, get_book, get_reviews, get_editions, similar_books, author_books, series_books, compare_books, popular_books, book_lists, and get_shelf are all identifiable by purpose. The main ambiguity is between list_shelves and get_shelf—both involve shelves—but descriptions clarify one returns shelf names and the other returns books on a shelf.
The naming follows a loose verb_noun pattern for many tools (search_books, get_book, get_reviews, get_editions, get_shelf, compare_books, list_shelves), but several tools drop the verb entirely and use bare noun phrases like book_lists, similar_books, author_books, series_books, and popular_books. This mixed convention is readable but not fully consistent.
Twelve tools form a well-scoped set for a Goodreads data-access server. Each tool covers a meaningful, distinct aspect of book discovery and reading data without feeling padded or redundant.
The tool surface covers the major Goodreads information needs: search, full book details, reviews, editions, related books, author bibliographies, series membership, Listopia lists, popularity charts, comparison, and shelf contents. There are no obvious dead ends for a read-only book-data server; result payloads include ids and URLs for chaining into further lookups.
Maintenance
Related MCP Connectors
MCP server for Russian books search, details, and recommendation candidates.
Read-only MCP server for verified book recommendations and reading lists.
MCP server for Project Gutenberg: 78,000+ public-domain ebooks with full plain-text retrieval.
Read-only MCP server exposing a user ORANO library to their own AI agent.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceMCP server that provides book recommendation tools, allowing an AI agent to search and filter books by genre, page count, and ratings using the Goodreads dataset.1-
- AlicenseNot gradedqualityCmaintenanceSelf-hosted MCP server for searching and discovering books using Anna's Archive and Goodreads datasets, enabling full-text search, ISBN/md5 lookup, similarity matching, and optional download URL retrieval.12 npm4MIT
- AlicenseAqualityDmaintenanceAn MCP server that lets an LLM browse, search, and download books from OPDS catalogs (e.g., Project Gutenberg, Standard Ebooks) using tools for feed navigation, full-text search, and acquisition link downloads.41AGPL 3.0
- FlicenseAqualityDmaintenanceRead-only MCP server that provides tools to search books, get book details, list authors, and view library statistics from a PostgreSQL database.5-