goodreads-mcp-ai
Provides read-only access to Goodreads public data, enabling users to search for books, retrieve book details, ratings, reviews, similar books, author bibliographies, series information, editions, Listopia lists, popular books, and public shelves.
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-aiSearch for books about time travel"
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, the __NEXT_DATA__ blob embedded in book pages, and the AppSync GraphQL backend the Goodreads website itself uses. No login, no cookies, no writes β public data only.
tools
tool | source / what it returns |
| JSON autocomplete endpoint (stable) β book_id, title, author, rating, cover; |
|
|
| GraphQL β paginated reader reviews (text, rating, likes, date, spoiler flag, permalink); |
| GraphQL β paginated "readers also enjoyed" recommendations; |
| GraphQL β paginated author bibliography, ranked by popularity, from any of their books, plus |
| GraphQL β paginated series books with reading-order placement; |
| GraphQL β paginated editions (format, ISBN, publisher, date); |
| GraphQL β paginated Listopia lists a book appears on (title, votes, size); |
| GraphQL β most popular books by release |
|
|
| shelf RSS feed (stable) β books on a public shelf; |
| best-effort HTML scrape of the public profile page β shelf names; raises |
Every tool is registered with MCP read-only annotations (read-only, non-destructive, idempotent).
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.
The five paginated discovery tools (similar_books, author_books, series_books, get_editions, book_lists) page in batches of 20 and accept a total limit up to 100; popular_books caps limit at 50. Responses include returned and has_more, keeping larger lookups useful without allowing unbounded traffic.
WAF and login 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. The review-list page (/review/list/{uid}) became login-only in Sep 2026; the client raisesLoginRequiredon a sign-in redirect for the same reason, andlist_shelvesreads the public profile page instead.
Related MCP server: goodreads-mcp
install
With pip:
cd goodreads-mcp
python3.10 -m venv .venv && .venv/bin/pip install -e .Or with uv, which is also what the Claude Desktop bundle uses:
cd goodreads-mcp
uv sync
uv run goodreads-mcpRequires Python β₯ 3.10.
Each date-numbered release is also published to PyPI as goodreads-mcp-ai (the goodreads-mcp name there belongs to an unrelated project) and listed on the official MCP registry as io.github.Danathar/goodreads-mcp-ai, from server.json. The listing carries a uvx runtime hint; a client that follows it runs uvx goodreads-mcp-ai, which you can also run yourself.
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. A config file that can't be read, isn't valid JSON, isn't a JSON object, or has a non-string user_id is ignored with a warning on stderr; the server still starts.
Claude Desktop config
Bundle. Each release carries a goodreads-mcp.mcpb. Releases come out monthly when the server itself changed, numbered by date (2026.10.0, 2026.10.1, 2026.11.0); 0.1.1 was the last of the old numbering, and every date-numbered release is newer than it. See CONTRIBUTING.md for how one is cut. Open the .mcpb in Claude Desktop to install. The bundle ships no dependencies β the manifest launches the server with uv run, and the host resolves pyproject.toml into a private environment on first launch β so one bundle runs on macOS, Windows and Linux with any Python β₯ 3.10. The bundle's optional "Goodreads User ID" setting (user_config.goodreads_user_id) is passed to the server as GOODREADS_USER_ID.
Manual. Add the server to claude_desktop_config.json β on macOS ~/Library/Application Support/Claude/claude_desktop_config.json, on Windows %APPDATA%\Claude\claude_desktop_config.json; in any version, Settings β Developer β Edit Config opens it:
{
"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
For an end-to-end example that chains the tools, see prompts/research-a-book.md.
tests
.venv/bin/pip install -e ".[test]" # pytest + pytest-cov
.venv/bin/pytest # offline parser/unit tests
GOODREADS_LIVE=1 .venv/bin/pytest # + live network smoke testsThe offline suite runs on fixtures; CI runs it with pytest-cov and enforces a coverage floor (--cov-fail-under in ci.yml). The live smoke tests are in tests/e2e/test_smoke_live.py and skip unless GOODREADS_LIVE=1 is set. The nightly compliance run runs the live suite against the real endpoints every night, so upstream drift shows up within a day.
documentation
docs/design.md β design notes: the data surfaces, WAF and login handling, politeness and concurrency
docs/roadmap.md β ideas not built yet
docs/maintenance.md β how this repository is maintained (Hive, ACMM L5, human review)
docs/quality.md β what the tests and numbers do and do not prove
docs/risk-tiers.md β the risk tier every pull request declares
docs/review-rubric.md β the review checklist
docs/metrics.md β outcome metrics
docs/reflections/ β lessons learned about this codebase
docs/SECURITY-AI.md β what AI agents may and may not touch
about this project
Work on this fork is done with AI assistance and should be treated cautiously.
This is a third-party tool. It is not an official Goodreads or Amazon product, is not sanctioned by either, and uses no official API β there hasn't been one since December 2020. "Goodreads" is a trademark of its owner and is used here only to say what this software talks to.
It reads public data only: no login, no cookies, no writes. It is provided as-is, with no promise that the endpoints it depends on will keep working or that using it is consistent with Goodreads' terms. Keep request volume modest. The maintainer is not responsible for rate limiting, blocking, data loss, or other consequences of using this software.
license
This fork is licensed under the GNU General Public License v3.0, version 3 only (GPL-3.0-only) β no automatic upgrade to later versions.
It incorporates code from shreeyachand/goodreads-mcp, Copyright (c) 2026 Shreeya Chand, released under the MIT License. That code remains under MIT; its licence text and copyright notice are preserved in LICENSE.MIT as the MIT licence requires. The combined work β upstream code together with this fork's changes β is distributed under GPL-3.0.
Available Tools
12 toolsauthor_booksARead-onlyIdempotent
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. Results paginate in batches and limit is capped at 100.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| book_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with annotations declaring read-only, open-world, and idempotent behavior, the description adds substantial value: it reveals that the tool resolves the primary author, ranks by popularity, returns specific fields, paginates results, and caps limit at 100. These are non-obvious behaviors an agent needs to predict output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the purpose appears in the first sentence, and the following two sentences add only high-value behavioral details. No filler, no repetition of annotations or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Combined with the annotations and output schema, the description covers input semantics, output contents, pagination, and the limit cap. There is nothing essential missing for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clarifies that book_id is a book identifier (not an author ID) and that limit is capped at 100 beyond its schema default. The id format and accepted values are not given, but core semantics are well covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and resource ('an author's works/bibliography') and makes the unique input clear ('given any of their books'). This distinguishes it from siblings like similar_books or series_books without needing to inspect their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The trigger condition 'given any of their books' is clear, but the description never mentions alternatives or exclusion criteria. An agent must infer when to prefer author_books over similar_books or series_books, so guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
book_listsARead-onlyIdempotent
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. Results paginate in batches and limit is capped at 100.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| book_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral detail beyond annotations: results are paginated in batches, the limit is capped at 100, and the ordering is by popularity. These are not inferable from the annotations or schema, making the description genuinely informative.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded. The first sentence states the core purpose and ordering, followed by a sentence on output fields and use cases, then a final sentence on pagination and cap. Each sentence earns its placeβno fluff or redundancyβand the structure allows an agent to quickly grasp what the tool does and its constraints.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with two parameters and an existing output schema, the description is thorough. It covers the result fields (title, votes, book count, URL), the use case, the pagination behavior, and the cap. It does not need to explain return formats because the output schema handles that, and the annotations already cover safety, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, placing the burden on the description. While the description implicitly references book_id (the book in question) and mentions that 'limit is capped at 100,' it does not explicitly explain that limit controls the number of lists returned per batch, nor does it mention the default value of 10. This is partial compensation but not complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the verb ('List'), the resource ('the Listopia lists a book appears on'), and the ordering ('by popularity'), with an example. This clearly distinguishes it from siblings like get_book (which fetches a single book) and similar_books (which suggest related works) without needing to open schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context on when to use the tool ('Good for "what kind of book is this / what's it grouped with" and for discovery'), which guides an agent toward appropriate scenarios. It does not explicitly name alternatives or state when not to use it, but the purpose is specific enough to avoid confusion with most siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_booksARead-onlyIdempotent
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.); more than 10 is refused rather than silently trimmed, so split the call.
| Name | Required | Description | Default |
|---|---|---|---|
| book_ids | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses the ranking logic (best-to-worst by average rating), the computed percentages (pct_positive, pct_critical), and the refusal behavior for >10 ids. These are operational details an agent could not infer from the annotations or schema. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each with a distinct job: purpose, return semantics, and call limits. The most important information is front-loaded. No sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only tool with an output schema already available, the description covers invocation limits, return semantics, and the source of ids. Nothing needed for a correct call is missing. The output schema removes the need to enumerate returned fields in prose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only provides a type and title for book_ids with 0% description coverage, so the description carries the explanatory burden. It supplies the valid count range (2-10), the refusal behavior, and the provenance ('from search_books etc.'). It does not define the exact id format, but for a single string-array param this is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence uses a specific verb ('Compare') and resource ('books') and immediately narrows the scope to rating and rating distribution. The second sentence specifies a ranked best-to-worst output, which differentiates it from sibling tools like get_book or similar_books. It even points at sibling search_books for id provenance, so an agent can select it confidently.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states the intended call pattern: pass 2-10 book ids, and gives a hard behavioral rule for exceeding that range ('more than 10 is refused rather than silently trimmed, so split the call'). It does not explicitly enumerate when-not-to-use alternatives, so it falls just short of a full 5. Still, the context for when this tool is appropriate is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bookARead-onlyIdempotent
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, all series memberships, and review-language breakdown β use get_reviews for the actual review text. review_language_limit controls how many languages are returned (default 5, maximum 25).
When you cite details or ratings from this book, link to its 'url'.
| Name | Required | Description | Default |
|---|---|---|---|
| book_id | Yes | ||
| review_language_limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and idempotent, so the safety profile is established. The description adds meaningful behavioral detail beyond annotations: it parses __NEXT_DATA__ JSON rather than scraping the DOM, which affects robustness, and it enumerates exactly what data is returned. This gives an agent useful expectations about how the tool behaves and why it is reliable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into three compact, purposeful sections: the core action, the notable behavior/content, and a citation instruction. Every sentence adds information; there is no filler or repetition of schema fields. The technical detail about __NEXT_DATA__ is justified because it explains robustness rather than being extraneous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich annotations, an output schema, and only two parameters, the description covers all necessary ground: it explains what data is included, how parameters behave, how the tool parses pages, and how to use the returned 'url'. Nothing an agent needs to invoke or interpret this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must fully explain parameters, and it does. It details the accepted book_id formats (numeric or numeric-slug with an example) and specifies review_language_limit's default and maximum. This compensates completely for the lack of schema-description text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get full details for a book by its Goodreads id.' It also disambiguates from siblings by listing what the tool includes (ratings histogram, series memberships, review-language breakdown) and explicitly hands off review text to get_reviews. This is enough for an agent to know exactly what this tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly directs agents to use get_reviews when actual review text is needed, which is a clear usage boundary. It also explains the effect of review_language_limit and instructs agents to link to the book's 'url' when citing details. It does not broadly cover when to choose this over search_books or similar_books, but the context is clear enough for typical selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_editionsARead-onlyIdempotent
List published editions of a book (formats, ISBNs, publishers, dates).
Useful for "which edition / format / ISBN" questions. Results paginate in batches and limit is capped at 100.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| book_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds behavioral detail beyond that: results paginate in batches and limit is capped at 100. This is useful operational context not present in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and followed by usage guidance and a pagination caveat. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety/idempotency and an output schema present, the description covers purpose, usage, and pagination behavior. Nothing critical is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage, so the description carries the burden. It clarifies that limit is capped at 100 and that results include formats/ISBNs/publishers/dates, which indirectly informs book_id output. However, it doesn't explicitly document the book_id parameter format or how limit interacts with pagination.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('List') and resource ('published editions of a book'), then enumerates the data fields (formats, ISBNs, publishers, dates). This clearly distinguishes it from sibling tools like get_book (single book metadata) and search_books (search).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states an explicit use case: 'which edition / format / ISBN' questions. It doesn't name alternatives or exclusions, but the context is clear enough for an agent to select this tool over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reviewsARead-onlyIdempotent
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, each 1-5, e.g. min_rating=4 for positive reviews, max_rating=2 for the critical ones. exclude_spoilers: drop reviews flagged as spoilers. Paging is capped, so a book whose reviews are mostly spoilers can return fewer than limit.
'has_more' is true when Goodreads has reviews this call did not read.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| book_id | Yes | ||
| max_rating | No | ||
| min_rating | No | ||
| exclude_spoilers | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds substantial behavioral context beyond annotations: true pagination allowing limit to exceed ~30, server-side star filters, spoiler exclusion behavior, the 'has_more' flag, and the cap at 100 to 'stay polite.' It also discloses that paging is capped and that spoiler-heavy books can return fewer than limit. This is rich, non-obvious behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening sentence, a paragraph on backend behavior, and a bullet-like breakdown of parameters. It is slightly longer than strictly necessary, but every sentence adds valueβpagination, ordering, aggregation, and parameter semantics are all covered. The front-loading of the core purpose ('actual review text, not just a score') is effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 params, 0% schema coverage, no enums), the description is remarkably complete. It covers what the tool returns, how pagination works, how filters behave, the meaning of 'has_more', and the cap on limit. The output schema exists, so return values don't need to be enumerated. An agent has everything needed to invoke this tool correctly and interpret its results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden of explaining parameters. It explains limit (max reviews, capped at 100), min_rating/max_rating (server-side star filters with examples like min_rating=4 for positive reviews), and exclude_spoilers (drop flagged reviews). It also explains the interaction between exclude_spoilers and pagination. This fully compensates for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get') and resource ('reader reviews for a book'), and immediately distinguishes itself from a mere score by noting it returns 'the actual review text, not just a score.' It also clarifies it fetches from Goodreads' GraphQL backend, aggregates across editions, and returns reviews in 'most relevant' order, which clearly differentiates it from siblings like get_book or get_editions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use this tool: when you need review text, not just a score. It explains pagination behavior, the 'has_more' flag, and the effect of filters like exclude_spoilers. It doesn't explicitly name sibling alternatives or state when not to use it, but the context is strong enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_shelfARead-onlyIdempotent
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 (pages start at 1). Defaults to the configured GOODREADS_USER_ID.
When you cite a book from a shelf, link it to its 'link' field.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| shelf | No | to-read | |
| user_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses the RSS feed source, ~100-item page size, page parameter behavior, default user configuration, and the 'link' field instruction. These are concrete execution details an agent needs and cannot infer from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise sentences with the core operation front-loaded. Every sentence adds useful information with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list operation with zero required parameters and an output schema present, this describes access constraints, pagination, defaults, and citation behavior. Nothing essential appears missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description compensates well by explaining shelf values, page numbering, and the default user. It leaves a small gap by not explicitly stating that user_id can override the configured default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific action 'List books on a shelf' and the access method 'via its RSS feed', which clearly distinguishes it from siblings like list_shelves. It does not explicitly name alternatives, but the resource and scope are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear operational context: public shelves only, no auth, common shelf names, pagination starting at 1, and the default user. It does not explicitly describe when to prefer this tool over sibling tools, so it does not reach a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_shelvesARead-onlyIdempotent
List a user's shelf names (scraped from their public profile page; best effort). Defaults to the configured user.
Covers the exclusive shelves (read, to-read, ...) and custom shelves; every name works as get_shelf's 'shelf' argument. Raises LoginRequired for a private profile. The profile page may cap a very long shelf list.
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and idempotent, and the description adds valuable behavior beyond that: the data is scraped and best-effort, private profiles raise LoginRequired, and very long shelf lists may be capped. These edge cases are non-obvious and useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core purpose is in the first sentence, followed by short, relevant caveats about scope, failure mode, and limitations. Every sentence adds unique information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple optional-parameter read-only tool with an output schema, the description covers purpose, default behavior, shelf scope, relation to get_shelf, failure behavior, and a known limitation. Nothing essential is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, user_id, has no schema description, so the description carries the burden. It explains the default behavior ('Defaults to the configured user') and implies that supplying user_id targets another profile. It does not spell out the expected user_id format, leaving a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List a user's shelf names.' It further clarifies scope by distinguishing exclusive shelves from custom shelves and ties the output to get_shelf's 'shelf' argument, making the tool's role distinct from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear operational context: defaults to the configured user, covers all shelf types, and explicitly connects the result to get_shelf. It does not explicitly state when not to use this tool or name alternatives, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
popular_booksARead-onlyIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | ||
| limit | No | ||
| month | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish safe read-only, idempotent behavior; the description adds the ranking metric (member-add counts), the page equivalent, the 50-item cap, and the return-field structure including chaining hints. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured: a lead sentence stating purpose, a concise explanation of the ranking logic, a compact parameter list, and a brief note on return fields. Every sentence adds value and there is no filler or tautology.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All three parameters are explained, the optional month behavior is clear, and the return content is summarized even though an output schema exists. An agent has enough information to call this tool correctly without consulting external documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the description fully compensates: it defines year as a 4-digit release year, month as an optional 1-12 value versus null for the whole year, and limit with its cap. This aligns perfectly with the schema's defaults and nullability.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific, non-generic purpose: ranking books/works by release date according to Goodreads member additions, and it names the exact page it mirrors. This clearly distinguishes it from sibling tools like search_books or get_shelf by centering on the popularity-by-date dimension.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use it: for a given release year, optionally narrowed to a single month, with a deterministic cap on result size. It doesn't name alternative tools or exclusions, but the conditions for calling it are unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_booksARead-onlyIdempotent
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.
max_results: how many to return. The autocomplete endpoint itself answers with at most ~5 matches, so a larger value returns what Goodreads sent, not more.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and idempotent; the description adds non-obvious implementation behaviors: 'JSON autocomplete endpoint (no auth, no HTML parsing)' and the hard cap of roughly '~5 matches' regardless of max_results. It also lists return fields, giving the agent accurate expectations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: purpose first, then implementation/return behavior, then the max_results caveat. Every sentence earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read-only search, the description covers auth, parsing behavior, return contents, and result cap. The presence of an output schema means return-value details do not need to be repeated, and no invocation-critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides no property descriptions, so the description must compensate. It gives query meaning ('by title/author/ISBN') and fully explains max_results, including that larger values do not increase results beyond the endpoint's ~5-match limit. This is sufficient, though query syntax could be more detailed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Search Goodreads for books by title/author/ISBN.' This clearly differentiates it from siblings like get_book (specific book) or author_books (author-scoped) by emphasizing broad search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It establishes a clear use case: finding books by title, author, or ISBN. It does not name alternatives or state when not to use it, but the context is sufficient for an agent to select it over more specific sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
series_booksARead-onlyIdempotent
List the books in a series (with reading-order placement), given any book in that series. When a book belongs to multiple series, pass the zero-based series_index from get_book's series_memberships order.
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. Results paginate in batches and limit is capped at 100.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| book_id | Yes | ||
| series_index | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds behavioral detail beyond annotations: pagination in batches, limit capped at 100, and semantics of returned fields (placement and is_primary). No contradiction with readOnly/idempotent annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact paragraphs, front-loaded with the core action and structured with parameter guidance and output details. No filler or redundant repetition of annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, disambiguation, output field semantics, and pagination constraints. With the output schema available and read-only annotations, an agent has everything needed to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage, but the description explains all three parameters: book_id is the input book in the series, series_index is zero-based and references get_book's series_memberships order, and limit is capped at 100. This fully compensates for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the precise verb 'List' with resource 'books in a series' and a distinguishing attribute: reading-order placement. Clearly distinguishes from sibling tools like author_books and similar_books by focusing on a given book's series membership.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains when to use it: given any book in a series, list its books; also gives a specific conditional: when a book belongs to multiple series, pass the zero-based series_index from get_book's series_memberships order. Does not explicitly rule out alternatives but provides clear context and a concrete workflow referencing get_book.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
similar_booksARead-onlyIdempotent
"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. Results paginate in batches and limit is capped at 100.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| book_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false. The description adds useful behavioral details beyond those: results paginate in batches, limit is capped at 100, and each result includes book_id/title/author/rating/url. This is meaningful context without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no wasted words. The purpose is front-loaded, and the additional details about result fields, chaining, pagination, and limit cap each earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read-only tool with an output schema, the description is complete. It covers the data source, result contents, chaining opportunities, pagination, and limit cap. Nothing essential is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the limit cap and pagination behavior, but does not elaborate on book_id semantics beyond 'the given one.' The default limit is already in the schema, so the description adds some but not full parameter clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns books similar to a given one, using Goodreads' own recommendation graph. This distinguishes it from web search and implies a specific resource and behavior. The 'Readers also enjoyed' framing makes the purpose immediately recognizable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to use the tool: when Goodreads' recommendation graph is needed, and notes that it is hard to reproduce via web search. It also suggests chaining into get_book or get_reviews, but does not explicitly name alternative sibling tools or when not to use them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
v2026.9.0- First observed
author_books - First observed
book_lists - First observed
compare_books - First observed
get_book - First observed
get_editions - First observed
get_reviews - First observed
get_shelf - First observed
list_shelves - First observed
popular_books - First observed
search_books - First observed
series_books - First observed
similar_books
TDQS
Scored across 12 tools
Each tool targets a distinct resource or action: search, book details, reviews, editions, series, author bibliography, similar books, shelves, list membership, popular charts, and comparison. Even the retrieval-heavy tools have clear boundaries, and descriptions reinforce when to use each.
Most tools follow a get_/list_/search_ verb_noun pattern, but several are noun-phrase names like book_lists, popular_books, author_books, similar_books, and series_books. The naming is still readable and predictable, with only minor convention mixing.
12 tools is well-scoped for a read-only Goodreads server. Each tool covers a meaningful part of the book discovery surface without redundancy or bloat.
The surface covers search, book details, reviews, editions, series, author works, shelves, similar books, lists, popular charts, and comparison. Minor gaps existβlike no direct author profile details or no way to browse the books inside a specific Listopia listβbut core workflows are complete.
Maintenance
Related MCP Connectors
Search books, authors and series, get recommendations, and manage your own reading shelves.
Search books and authors, fetch editions, browse subjects, and resolve cover images.
Search books and authors across Open Library, the Internet Archive open catalog.
Search Chinese books with Douban ratings, AI book guides and curated toplists. Free, no API key.
Related MCP Servers
- AlicenseBqualityAmaintenanceConnects AI assistants to the Hardcover book library, enabling natural language book searches, reading status updates, list management, and library exploration.3949 PyPI8MIT
- AlicenseAqualityAmaintenanceA read-only MCP server for Goodreads that enables LLMs to search for books, retrieve detailed book info with ratings and reviews, and explore recommendations, series, and author bibliographies using public data sources without requiring authentication.10122MIT
- AlicenseNot gradedqualityDmaintenanceEnables searching for books using the OpenLibrary API; provides a search_books tool for AI assistants to find books by title, author, or keywords.2Apache 2.0
- FlicenseAqualityDmaintenanceConnects AI assistants to the Open Library API for searching books and authors, retrieving metadata, and comparing works.12-