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

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

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.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

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

Usage Guidelines4/5

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_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. 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.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityNo data
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
    49 PyPI
    8
    MIT
  • A
    license
    A
    quality
    A
    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