goodreads-mcp
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 "Install 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-mcpsearch 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 — "readers also enjoyed" recommendations |
| GraphQL — an author's bibliography (from any of their books) |
| GraphQL — books in a series with reading-order placement |
| GraphQL — published editions (format, ISBN, publisher, date) |
| 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.
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: zotero-mcp
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 ships a public read-only API key in its JS bundle; the client scrapes the endpoint + key from that bundle at runtime and caches them, so a key rotation self-heals (client.graphql_config). A hardcoded pair is kept as a fallback. 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.
ideas for v2
richer book data: series, similar books, top reviews from the Apollo state
author pages / bibliography
caching layer for repeated lookups
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/shreeyachand/goodreads-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server