Skip to main content
Glama

CI Nightly compliance Ask DeepWiki Maintenance assisted by Hivecommons Hive ACMM L5 Semi-Autonomous AI assisted License: GPL-3.0

πŸ“š goodreads-mcp

Thank you, Shreeya Chand. This project is a fork of shreeyachand/goodreads-mcp, and it would not exist without that work. The core idea of reaching Goodreads without its retired API, and the tool set this server offers, come from Shreeya's project. We're grateful for it, and for the MIT licence that let us build on it. If this server is useful to you, please go star the original.

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

search_books

JSON autocomplete endpoint (stable) β€” book_id, title, author, rating, cover; max_results defaults to 10, but the endpoint returns about 5 matches at most

get_book

__NEXT_DATA__ via the .xml page (stable) β€” details, cover, ratings histogram, every series membership, review-language breakdown (review_language_limit, default 5, max 25)

get_reviews

GraphQL β€” paginated reader reviews (text, rating, likes, date, spoiler flag, permalink); limit default 10, capped at 100; server-side min_rating / max_rating (1–5, min ≀ max) and exclude_spoilers; reports has_more

similar_books

GraphQL β€” paginated "readers also enjoyed" recommendations; limit up to 100

author_books

GraphQL β€” paginated author bibliography, ranked by popularity, from any of their books, plus author_url; limit up to 100

series_books

GraphQL β€” paginated series books with reading-order placement; series_index (zero-based, in get_book's series_memberships order) picks the series; limit up to 100

get_editions

GraphQL β€” paginated editions (format, ISBN, publisher, date); limit up to 100

book_lists

GraphQL β€” paginated Listopia lists a book appears on (title, votes, size); limit up to 100

popular_books

GraphQL β€” most popular books by release year, or a single month (1–12), ranked; limit capped at 50

compare_books

get_book for each id (__NEXT_DATA__ via .xml) β€” ranks 1–10 books by rating with positive/critical share; more than 10 ids is refused; a book that fails comes back as an error entry

get_shelf

shelf RSS feed (stable) β€” books on a public shelf; page starts at 1, about 100 items per page; user_id overrides the configured user

list_shelves

best-effort HTML scrape of the public profile page β€” shelf names; raises LoginRequired for a private profile

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. book_id is a string on both sides ("54493401", or the slug form "54493401-title" on input), so a value copied out of one result is accepted as-is by the next call. 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_book routes 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 raises WAFChallenge with a clear message instead of a confusing parse error. The review-list page (/review/list/{uid}) became login-only in Sep 2026; the client raises LoginRequired on a sign-in redirect for the same reason, and list_shelves reads 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-mcp

Requires 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" }
EOF

Env 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:

  1. search_books("project hail mary") β€” should just work

  2. get_book("54493401") β€” confirms the .xml/WAF workaround; check the histogram is populated

  3. get_reviews("54493401") β€” should return real review text

  4. get_shelf("to-read") β€” checks your user_id + RSS

  5. list_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 tests

The 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

about this project

NOTE

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 tools
author_booksA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
book_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_listsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
book_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_booksA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
book_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_bookA
Read-onlyIdempotent

Get full details for a book by its Goodreads id (numeric, or numeric-slug like '11870085-the-fault-in-our-stars' or '2767052.The_Hunger_Games'). An ISBN is not a book id: find the book with search_books first.

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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
book_idYes
review_language_limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safe read profile (readOnly, idempotent, non-destructive), and the description goes further by disclosing the parsing strategy (__NEXT_DATA__/Apollo state rather than DOM), the payload contents (ratings histogram, series memberships, review-language breakdown), and the default/max on review_language_limit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the id contract and tightly organized into three short paragraphs, each with a distinct job. The closing citation instruction is slightly tangential but short enough to justify its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't enumerate return fields, yet it still names the notable payload sections. Combined with the id constraints, the alternative-tool routing, and the parameter semantics, nothing needed to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the load, and it does: it defines book_id formats (numeric, numeric-slug, dot-slug) and describes review_language_limit's purpose, default of 5, and maximum of 25.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get full details for a book') and immediately bounds the scope with the accepted id format. It also distinguishes itself from adjacent operations by clarifying that an ISBN is not a valid id and pointing to search_books.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when this tool is the right one, gives the prerequisite ('find the book with search_books first'), and routes a sibling use case ('use get_reviews for the actual review text'). The agent has no guesswork left.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_editionsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
book_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_reviewsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
book_idYes
max_ratingNo
min_ratingNo
exclude_spoilersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_shelfA
Read-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. Names are case-sensitive and must match a shelf the user has (list_shelves gives them); any other name raises ValueError. An empty name lists every shelf. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
shelfNoto-read
user_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/openWorld/non-destructive, and the description adds meaningful context beyond that: no authentication needed, the RSS page size (~100 items) and 1-based pagination, the ValueError failure mode, and the defaulting to the configured GOODREADS_USER_ID.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then constraints, pagination, and defaults in short sentences; the closing note about linking the 'link' field is a compact, useful output cue. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations covering the safety profile, the remaining agent-relevant details β€” auth, valid inputs, error behavior, pagination, defaults β€” are all supplied. Nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description carries the full burden and does: shelf (case-sensitive, must match a known shelf, empty = all shelves, defaults implied), page (1-based, ~100 items per page), and user_id (defaults to configured GOODREADS_USER_ID). All three parameters gain meaning not present in the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List books on a shelf') plus the mechanism ('via its RSS feed'), which cleanly separates it from siblings like search_books and get_book.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete operating conditions: public shelves need no auth, names are case-sensitive and must match a shelf from list_shelves or ValueError is raised, and an empty name lists all shelves. It points at the list_shelves sibling for valid inputs, though it does not explicitly contrast when to prefer this over search_books.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_shelvesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

search_booksA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_booksA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
book_idYes
series_indexNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_booksA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
book_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 12 tool updatesv2026.9.0
    • First observedauthor_books
    • First observedbook_lists
    • First observedcompare_books
    • First observedget_book
    • First observedget_editions
    • First observedget_reviews
    • First observedget_shelf
    • First observedlist_shelves
    • First observedpopular_books
    • First observedsearch_books
    • First observedseries_books
    • First observedsimilar_books

TDQS

A4.5/5.0

Scored across 12 tools

Disambiguation5/5

Each tool targets a distinct Goodreads resource or relation (search, book details, editions, lists, popular chart, shelves, reviews, similar/author/series books, compare). The 'related books' tools could superficially overlap, but descriptions clearly specify different data sources and use cases.

Naming Consistency4/5

All names use snake_case, but the set mixes verb_noun (get_book, search_books, compare_books, list_shelves) with noun_books (book_lists, popular_books, similar_books, author_books, series_books). The pattern is readable and largely predictable, with only minor stylistic drift.

Tool Count5/5

Twelve tools is a well-scoped set for a Goodreads MCP: enough to cover search, details, reviews, shelves, lists, editions, and related books without bloat. Each tool clearly earns its place.

Completeness4/5

Core read-only workflows are covered: book search/details, editions, reviews, similar/author/series discovery, shelves, Listopia, popular charts, and comparison. Minor gaps exist, such as direct author search by name or retrieving all books in a Listopia list, but agents can work around them via existing tools.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    A
    maintenance
    Connects AI assistants to the Hardcover book library, enabling natural language book searches, reading status updates, list management, and library exploration.
    39
    129 PyPI
    8
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    A 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.
    10
    12
    2
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables searching for books using the OpenLibrary API; provides a search_books tool for AI assistants to find books by title, author, or keywords.
    2
    Apache 2.0