book-recommendations
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@book-recommendationsrecommend a book like Dune, something epic and mind-bending"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Book Recommendations — "What Should I Read Next?" MCP 📚🎲
Book recommendations for AI agents: "what should I read next?" answered from millions of works — topic recommendations, blind-date serendipity spins hooked by the book's actual first sentence, and free public-domain classics you can start reading right now. Zero API keys.
Ask any agent "what should I read next?", "books like Dune", or "surprise
me with a book" — book-recommendations is the tool that answers.
Why this exists
LLMs recommend the same 50 canon books for every ask. This fishes OpenLibrary's millions of works — including a blind-date spin that picks a random subject shelf at random depth, deliberately off the bestseller lists, and hooks you with the book's actual first sentence before the reveal.
Read-now intelligence on every card:
read_nowsays when a book is freely readable at archive.org (public) or borrowable (free loan) — instant reading beats a shopping link.Free classics via Project Gutenberg (fail-soft: when the Gutenberg index is down, the error itself points at archive.org alternatives).
Honest attribution: every card says why_picked — how the book was actually chosen. Discovery you can trust.
Related MCP server: hardcover-mcp
Tools
Tool | What it does |
| Book recommendations by topic/mood/"books like X", with ratings, subjects, first sentences, read-now flags |
| Serendipity spin: random shelf, random depth, first-sentence hook, two-beat reveal |
| Public-domain books with read-now URLs (Gutenberg, fail-soft) |
| Updatable playbooks (presentation, error recovery) |
Plus the prompt: what-should-i-read-next.
Quickstart
# 1-Line Universal Installer (auto-configures Claude Desktop, Cursor, Claude Code, VS Code, ...)
curl -fsSL "https://book-recommendations.builditwithai.xyz/install" | bash
# Or run directly via your preferred runtime:
uvx book-recommendations
npx -y book-recommendationsExample
User: surprise me with a book
blind_date()
→ picks: [{
first_sentence: "The lighthouse kept its own counsel…",
subjects: ["lighthouses", "islands", "solitude"], first_published: 1962,
why_picked: "blind date: fished the “lighthouses” shelf at depth 3 — picked
for serendipity, not sales rank",
title: "…", author: "…", read_now: "borrowable at archive.org",
openlibrary_url: "https://openlibrary.org/works/…" }]Present the hook first, then the reveal — the two-beat structure is the product.
Telemetry & privacy
Anonymous usage telemetry (no PII, no queries, no paths) via the fleet
standard (schema v2, dual-endpoint fallback). Opt out any time:
BOOK_RECOMMENDATIONS_TELEMETRY=false or DO_NOT_TRACK=1.
Development
uv venv && uv pip install -e ".[dev]"
DO_NOT_TRACK=1 .venv/bin/python -m pytest tests/ -q # unit + live + e2eLive tests hit the real OpenLibrary API and self-skip offline.
License
MIT
Available Tools
5 toolsblind_dateBlind date with a bookCRead-only
Serendipity spin: a random shelf at random depth — present the first sentence first, then the reveal
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No | ||
| count | No | ||
| intent | No | ||
| exclude | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, openWorldHint=true, and idempotentHint=false, covering safety and unpredictability. The description adds the behavioral detail of 'present the first sentence first, then the reveal', which is a unique two-step presentation mechanic not inferable from annotations. However, it does not disclose other behaviors like whether the random selection is truly uniform, whether exclude is respected, or how seed affects results. Given annotation coverage, the additional context warrants a 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, so it is concise in length. However, it is more poetic than informative, using 'serendipity' and 'shelf at random depth' without concrete grounding. It front-loads an evocative label rather than a functional statement. While it wastes no words, it also does not earn its place by conveying actionable information. Under-specification is closer to a 2 than a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 4 parameters, no output schema, and 0% schema coverage, the description must carry the full burden of explaining what the tool does, what it returns, and how parameters affect results. It does none of this. The metaphor of 'shelf' and 'depth' is undefined, and the reveal mechanic is not operationalized. The description is severely inadequate for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 4 parameters (seed, count, intent, exclude) with 0% description coverage. The description entirely ignores these parameters, providing zero hints about their purpose, defaults, or allowed values. The agent has no way to know what seed controls, what intent means, or how exclude works. This is a severe gap that the description must compensate for, and it fails to do so.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses metaphorical language ('Serendipity spin: a random shelf at random depth — present the first sentence first, then the reveal') to convey the concept of a blind-date-with-a-book tool. It implies a random book pick with a reveal mechanic, but does not explicitly state the core function (e.g., 'returns a random book suggestion'). It distinguishes from siblings only through the serendipity/randomness angle, which is implicit rather than explicit. Not tautological, but vague enough to score a 3.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus siblings like recommend or free_classics. The description does not mention alternatives, conditions, or exclusions. The 'serendipity' notion implies a use case, but it is left entirely to the agent to infer. No explicit 'use this when...' or 'avoid when...' is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
free_classicsFree classicsCRead-onlyIdempotent
Public-domain classics from Project Gutenberg, readable in full right now
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| topic | No | ||
| intent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, covering safety and idempotency. The description adds 'readable in full right now', which communicates that content is immediately accessible without paywalls or restrictions—a useful behavioral detail. However, it does not clarify response format or how results are presented, so it adds limited value beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly written sentence that immediately communicates the core value proposition. It is front-loaded with the key information (public-domain, Project Gutenberg, readable in full) and contains no filler. While it could add a bit more detail without becoming verbose, its brevity is a strength.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has three optional parameters and no output schema, the description is notably incomplete. It does not mention what the tool returns (e.g., a list of titles, metadata, links), how the parameters influence results, or any edge cases like limits or error behavior. An agent has insufficient information to call this tool effectively, especially as the schema lacks parameter descriptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fails to explain any of the three parameters (count, topic, intent). Since the schema provides no descriptions, the tool description is the only source of parameter meaning, but it remains silent. Agents must guess what 'count' (number of results?), 'topic' (subject filter?), and 'intent' (user's goal?) mean, which is nearly impossible without external knowledge. The description does not compensate at all for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: providing public-domain classics from Project Gutenberg, readable in full. It specifies a distinct resource and action, making the tool's function understandable. However, it does not differentiate from sibling tools like 'recommend' or 'blind_date' that might also involve books, so it doesn't fully distinguish itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus the listed siblings. There is no mention of preferred contexts, alternative tool suggestions, or exclusions. The tool's optional parameters (count, topic, intent) hint at filtering, but no explicit usage conditions are stated, leaving the agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommendRecommend booksBRead-onlyIdempotent
Book recommendations by topic, mood, or 'books like X' — millions of works, free-read flags included
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| topic | Yes | ||
| intent | No | ||
| exclude | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, and idempotentHint=true, covering safety and determinism. The description adds context about the scale ('millions of works') and the presence of free-read flags, which is useful supplemental information. However, it does not disclose any other behavioral traits such as result ordering, pagination, or handling of ambiguous topics. This is a modest addition beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the core purpose ('Book recommendations') and elaborates on input modes. Every phrase adds value and there is no redundancy or fluff. Excellent structural efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 4 parameters, 0% schema coverage, and no output schema, the description is under-sized. It provides a high-level gist but omits critical details like parameter mapping, expected output format, handling of missing or ambiguous inputs, and any constraints or defaults (e.g., count default). An agent would need to guess parameter meanings and result structure, making the description insufficiently complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate by explaining parameters. It mentions 'topic, mood, or books like X', which hints that 'topic' maps to the topic parameter, 'mood' might map to intent, and 'books like X' could involve topic and exclude, but no explicit mapping is given. The description fails to clarify the meaning of 'count', 'intent', or 'exclude' adequately, leaving the agent to infer parameter usage from the schema's bare names. This is insufficient for seamless invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('recommend') and resource ('books') and lists three input modes (topic, mood, 'books like X'). It does not explicitly distinguish itself from sibling tools like blind_date or free_classics, though the mention of 'free-read flags' hints at one differentiator. Overall purpose is clear but sibling differentiation is absent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (when recommendations based on topic/mood/similarity are needed) but offers no explicit guidance on when not to use it or how it compares to alternatives. No exclusions or alternative tool mentions are provided, so the usage context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skill_readRead a skillARead-onlyIdempotent
Fetch the full content of one skill by name (from skills_list)
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety and repeatability profile is known. The description adds minimal behavioral context beyond purpose—it says 'full content' (return size) and references the source of the name. It does not contradict annotations and adds small value without redundancy.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler. The core action is front-loaded ('Fetch the full content of one skill'), followed by the key constraint ('by name') and the source. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple, read-only tool with one parameter and no output schema. The description tells the agent what it returns ('full content') and where the name comes from. Combined with annotations, the agent has everything needed to call it correctly. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does by specifying that the 'name' parameter is the skill name taken from skills_list. This adds meaning beyond the bare schema property, telling the agent how to obtain a valid value. It does not define format, but the source is sufficient for a single string parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch'), a resource ('full content of one skill'), and the key parameter ('by name'). It also references the source of the name ('from skills_list'), which distinguishes it from sibling tools like skills_list that list all skills. This is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context: you need a skill name, and that name comes from skills_list. It does not explicitly name alternatives or when-not-to-use, but the reference to skills_list gives clear guidance on where names originate. This provides enough context without being explicit about exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skills_listList skillsARead-onlyIdempotent
List available skills (guidance playbooks) for using this server well — read one with skill_read
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, covering the safety profile. The description adds meaningful context by defining what skills are (guidance playbooks) and their purpose (using the server well). It does not contradict annotations and provides useful domain context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the core action ('List available skills'), immediately defines the resource, and ends with an actionable pointer to the sibling tool. Every word earns its place; there is no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, parameterless, read-only listing tool, the description is complete. It tells the agent what the tool returns (a list of skills), what those skills are, and how to proceed (skill_read). No output schema exists, but the simplicity makes that acceptable. The annotations cover safety, so nothing is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing to document. Per the rubric, a baseline of 4 applies for 0 params. The description adds no parameter information because none exists, and the schema correctly shows an empty properties object.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a resource ('available skills'), clarifies they are 'guidance playbooks', and directly distinguishes from the sibling tool skill_read by pointing to it as the next step. This is a precise, unambiguous purpose statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool (to see the list of skills) and when to use the alternative skill_read ('read one with skill_read'), providing clear routing between the two related tools. This matches the standard of the get_calls example.
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.
5 tool updates
v0.1.0- First observed
blind_date - First observed
free_classics - First observed
recommend - First observed
skill_read - First observed
skills_list
TDQS
Scored across 5 tools
Each tool serves a clearly distinct purpose: recommend provides targeted recommendations, blind_date offers random serendipity, free_classics surfaces public-domain works, and skills_list/skill_read manage usage guidance. No overlap or ambiguity exists between the tools.
Tool names follow no consistent pattern: 'recommend' is a bare verb, 'blind_date' and 'free_classics' are noun phrases, while 'skills_list' is a noun-noun compound and 'skill_read' reverses the typical verb-object order. This mixed convention could cause confusion about expected behavior.
With just 5 tools, the server is tightly scoped for its domain. Each tool adds distinct value without redundancy, and the count is well within the ideal range for a focused MCP server.
The core recommendation workflows are covered: tailored recommendations, serendipitous discovery, and access to classics. However, missing operations like fetching book details or saving favorites create minor gaps, though agents can likely work around them for most use cases.
Maintenance
Related MCP Connectors
The media memory layer for AI agents and their humans. Your AI client gets 29 tools to search your collection, add items, update ratings, preview music, and find patterns across everything you've read, watched, and listened to.
- LeafleOAuthnet.nanosheep
Personalised book recommendations, filtered to what's on your public library's shelf right now.
Book discovery using an AI-curated book catalog that eliminates hallucinations and surfaces lesser-known titles.
AI-curated book catalog that eliminates hallucinations and surfaces lesser-known titles.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to help users manage their reading experience by searching books, tracking reading progress, managing bookmarks, and generating personalized recommendations and summaries.-
- AlicenseBqualityAmaintenanceConnects AI assistants to the Hardcover book library, enabling natural language book searches, reading status updates, list management, and library exploration.396MIT
- FlicenseAqualityCmaintenanceConnects AI assistants to the Open Library API for searching books and authors, retrieving metadata, and comparing works.12-
- AlicenseNot gradedqualityCmaintenanceEnables natural language interaction with e-books, supporting EPUB and PDF formats. Provides APIs for metadata extraction, table of contents, and content retrieval for AI-powered reading and learning.Apache 2.0