hardcover-mcp
This server lets an MCP-compatible AI assistant interact with a user's Hardcover book-tracking account and the broader Hardcover catalogue via 23 tools.
Identity: view the authenticated user's profile (
get_me)Search: search books, authors, series, users, lists, characters, publishers, and prompts
Books & editions: look up books by ID/slug, editions by title/ID/ISBN
Authors & series: view author profiles/bibliographies and ordered series book lists
Personal library: browse all books or filter by reading status, see reading progress and per-book status/rating/review
Statistics & history: get reading stats and books finished between dates
Goals: view reading goals with progress and targets
Activities: view the user's activity feed and activity on specific books
Other users: look up user profiles and their libraries by status
Lists: retrieve list details and contained books
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., "@hardcover-mcpShow me my reading progress and stats for this year."
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.
hardcover-mcp
โ ๏ธ Beta v0.1.1 โ This is an early release. The API surface, tool names, and query structure may change. Please report issues and feedback via GitHub Issues.
A Model Context Protocol (MCP) server for the Hardcover API โ the book-tracking platform that uses the same GraphQL API for its website, iOS, and Android apps.
Connect any MCP-compatible AI assistant (Claude Desktop, Cursor, Kiro, or any MCP client) directly to your Hardcover library, reading history, goals, and the full Hardcover book catalogue.
Contents
Related MCP server: hardcover-mcp
Features
๐ Search books, authors, series, users, lists, characters, publishers, and prompts
๐ Browse your library โ all statuses, filtered views, and paginated results
๐ Reading progress โ currently-reading books with page-level progress
๐ Reading statistics โ books read this month, this year, all time, with average ratings
๐ฏ Reading goals โ progress, state, and target for all your goals
๐๏ธ Books by date range โ list every book you finished between two dates
๐ Reading journal โ per-book session history
๐ค User profiles โ your profile and other users' libraries
๐ Lists โ retrieve any Hardcover list with its books
๐ Activity feed โ your recent activity and activity on specific books
๐ Editions โ look up by title, ID, or ISBN-10/13
โ๏ธ Authors โ profiles and bibliography
๐ Series โ ordered, deduplicated book lists
Tools Reference
Identity
Tool | Description |
| Authenticated user's profile: id, username, name, bio, location, books count, followers, flair, pro status |
Search
Tool | Arguments | Description |
|
| Search books, authors, series, users, lists, characters, publishers, or prompts |
Books
Tool | Arguments | Description |
|
| Full book details by Hardcover ID |
|
| Full book details by URL slug (e.g. |
|
| All editions matching an exact title |
|
| Single edition details |
|
| Look up edition by ISBN-10 or ISBN-13 (digits only) |
Authors
Tool | Arguments | Description |
|
| Author profile by ID |
|
| Author profile by slug (e.g. |
|
| Books by an author, ordered by popularity |
Series
Tool | Arguments | Description |
|
| Series metadata: name, description, book count |
|
| Ordered, deduplicated book list โ excludes partial books and compilations |
My Library
Tool | Arguments | Description |
|
| Full library, all statuses, paginated |
|
| Library filtered by reading status |
| โ | Currently-reading books with page progress |
|
| Your relationship with a book: status, rating, review, read sessions |
|
| Reading journal and session history for a book |
Status IDs: 1 Want to Read ยท 2 Currently Reading ยท 3 Read ยท 4 Paused ยท 5 Did Not Finish ยท 6 Ignored
Reading Statistics
Tool | Arguments | Description |
|
| All-time count + avg rating, and filtered count since a date ( |
|
| Books finished between two dates, ordered newest first |
Goals
Tool | Arguments | Description |
| โ | All reading goals with progress, target, state, and dates |
Activities
Tool | Arguments | Description |
|
| Your activity feed (books added, rated, reviewed, goals, lists) |
|
| Community activity for a specific book |
Other Users
Tool | Arguments | Description |
|
| Another user's library filtered by reading status |
Lists
Tool | Arguments | Description |
|
| List details and its books (up to 50) |
Requirements
Python 3.10 or later
uv (recommended) or pip
A Hardcover API key โ get yours at hardcover.app/account/api
Installation
With uv (recommended)
git clone https://github.com/muhyousri/hardcover-mcp
cd hardcover-mcp
uv syncWith pip
git clone https://github.com/muhyousri/hardcover-mcp
cd hardcover-mcp
pip install -e .From PyPI (once published)
uv pip install hardcover-mcp
# or
pip install hardcover-mcpConfiguration
Copy .env.example to .env and add your API key:
cp .env.example .envHARDCOVER_API_KEY=your_api_key_hereKeep your token private. Your Personal Access Token has access to your Hardcover account. Never commit it to version control, share it publicly, or embed it in client-side code.
Usage
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"hardcover": {
"command": "uv",
"args": [
"run",
"--with-editable",
"/path/to/hardcover-mcp",
"hardcover-mcp"
],
"env": {
"HARDCOVER_API_KEY": "your_api_key_here"
}
}
}
}Or if installed via pip/uv into a virtualenv:
{
"mcpServers": {
"hardcover": {
"command": "/path/to/venv/bin/hardcover-mcp",
"env": {
"HARDCOVER_API_KEY": "your_api_key_here"
}
}
}
}Kiro CLI
Add to ~/.kiro/settings/mcp.json:
{
"mcpServers": {
"hardcover": {
"command": "/path/to/uv",
"args": [
"run",
"--with-editable",
"/path/to/hardcover-mcp",
"hardcover-mcp"
],
"env": {
"HARDCOVER_API_KEY": "your_api_key_here"
},
"disabled": false,
"autoApprove": []
}
}
}Other MCP Clients
Point your client at the hardcover-mcp entrypoint (or python -m hardcover.server) with HARDCOVER_API_KEY set in the environment. The server communicates over stdio and is compatible with any MCP 1.0+ client.
Rate Limits & API Policy
Please read before building with this server. Hardcover's API is free to use but has firm limits. Hitting them unexpectedly can disrupt your workflow.
Rate Limits
Plan | Daily | Burst | Per Minute |
Free | 5,000 req/day | 10 req | 60 req/min |
Supporter | 50,000 req/day | 15 req | 60 req/min |
Daily limit: hard cap. Once reached, all requests return
429until midnight UTC.Burst limit: how many requests you can fire back-to-back before throttling. Refills continuously at the per-minute rate.
Per-minute limit: 60 req/min for all plans (token bucket).
Per-request limit: a single GraphQL request may contain at most 5 top-level queries. Exceeding this returns
403, not429.Personal Access Tokens get double the burst capacity vs. legacy JWT auth on the same plan.
This MCP server surfaces retry_after hints when a 429 is returned, so your AI assistant can back off gracefully.
Commercial Use
User-owned data (libraries, ratings, reviews, journal entries, lists, goals) may not be used in commercial products unless you are acting on behalf of a user who has explicitly granted access.
Aggregate, anonymised data (e.g. number of Hardcover readers, average Hardcover rating) may be used commercially if credited to Hardcover.
Images served from Hardcover are user-uploaded. If you display them publicly, you must have a DMCA takedown policy.
Prohibited Query Patterns
The following GraphQL operators are disabled by the API:
_like, _nlike, _ilike, _niregex, _nregex, _iregex, _regex, _nsimilar, _similar
Queries must run server-side
The Hardcover API may not be called from a browser. Your API key must be kept in a secure server environment.
For more details see the official Getting Started guide.
Disclaimer
This is a beta release (v0.1.0). It is independent, community-built software and is not affiliated with, endorsed by, or supported by Hardcover.
The Hardcover API is itself in beta and subject to breaking changes.
Tool names, query structure, and response shapes in this MCP server may change between versions.
Use in production or commercial contexts is entirely at your own risk.
By using the Hardcover API via this server, you agree to Hardcover's policies.
Development
git clone https://github.com/muhyousri/hardcover-mcp
cd hardcover-mcp
# Create virtualenv and install with dev deps
uv sync --extra dev
# or: pip install -e ".[dev]"
# Run tests
uv run pytest
# or: python -m pytest
# Run the server locally (needs HARDCOVER_API_KEY in environment)
HARDCOVER_API_KEY=your_key hardcover-mcpProject structure
hardcover-mcp/
โโโ hardcover/
โ โโโ __init__.py
โ โโโ client.py # GraphQL HTTP client, rate-limit handling, error mapping
โ โโโ queries.py # All GraphQL query strings
โ โโโ server.py # MCP server, tool definitions, dispatch
โโโ tests/
โ โโโ conftest.py # Shared fixtures
โ โโโ test_client.py # 30 client tests (HTTP errors, rate limits, response parsing)
โ โโโ test_server.py # 51 server tests (tool dispatch, error formatting)
โโโ .env.example
โโโ .gitignore
โโโ pyproject.toml
โโโ README.mdRunning tests
pytest # all tests
pytest tests/test_client.py # client only
pytest tests/test_server.py # server only
pytest -v # verboseContributing
Contributions are welcome. Please:
Open an issue first to discuss significant changes
Follow the existing code style
Add or update tests for any changed behaviour
Keep PRs focused โ one feature or fix per PR
License
MIT โ see LICENSE for details.
Available Tools
25 toolsget_author_booksA
Get books written by a specific author, ordered by popularity.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20) | |
| offset | No | Pagination offset (default 0) | |
| author_id | Yes | Author ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It explicitly states the ordering by popularity, which adds useful context, but it does not explain pagination behavior, the meaning of 'popularity', or any other side effects or constraints beyond the schema.
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, front-loaded sentence with no filler or repetition. Every pieceโresource, scope, orderingโadds value.
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 read tool with three parameters and full schema coverage, the description communicates the core purpose and ordering. It misses a precise definition of 'popularity' and an explicit description of the return payload, but overall it is sufficient for basic selection and 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 100%, so the parameter meanings are already fully documented. The description does not meaningfully add parameter detail beyond tying the endpoint to 'specific author'. Baseline 3 is appropriate.
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 ('Get') and resource ('books written by a specific author'), and adds ordering, which makes the tool's purpose easily identifiable. It is distinguishable from sibling tools like get_author_by_id or get_book_by_id conceptually, though it does not explicitly call out those alternatives.
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 the usage context: when you have an author_id and want that author's books. However, it does not provide explicit guidance on when not to use it, such as using search when the author is unknown, or using get_author_by_id when just the author profile is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_author_by_idA
Get an author's profile by Hardcover author ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Author ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of conveying behavior. 'Get' implies a read operation, but the description does not mention not-found behavior, response shape, or whether the profile is complete. For a simple getter this is a moderate gap rather than a serious one.
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, front-loaded sentence. It states the action, target, and identifier type with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one integer parameter and no nested structures, the description is nearly complete. It states what is fetched and what must be passed; only minor behavioral details like error handling are absent.
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 100%, so the baseline is 3. The description adds a useful semantic distinction by calling it a 'Hardcover author ID', helping the agent recognize the ID namespace and distinguish this from slug-based sibling lookups.
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 ('Get'), a concrete resource ('an author's profile'), and a precise identifier ('Hardcover author ID'). This clearly distinguishes it from sibling tools such as get_author_by_slug and get_author_books.
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 phrase 'by Hardcover author ID' provides clear context for when to use the tool: when the agent has an author ID available. It does not explicitly name alternatives like get_author_by_slug, but the key distinction is obvious enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_author_by_slugA
Get an author's profile by URL slug (e.g. 'brandon-sanderson').
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Author URL slug |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description must carry the full behavioral burden, but it discloses only the basic fetching action. It does not mention error behavior, not-found cases, response shape, or whether the profile is a summary or full profile.
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?
One tightly scoped sentence with the essential information and a useful example. No filler or redundancy; the purpose and input format are front-loaded.
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 single-parameter lookup tool, the basic context is present. However, without an output schema or annotations, details about expected return value and failure modes are absent, making it adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents 'slug' at 100% coverage, but the description enhances it by providing a realistic example ('brandon-sanderson') that clarifies the expected URL slug format. This adds value beyond the schema.
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 verb 'Get', the resource 'author's profile', and the lookup mechanism 'URL slug', with a concrete example. This distinguishes it from siblings like get_author_by_id and get_author_books by specifying the slug-based identity.
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 provided about when to use this tool versus alternatives such as get_author_by_id or get_author_books. The description gives no contexts, exclusions, or preference signals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_book_activitiesA
Get recent user activity for a specific book (ratings, reviews, status changes).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20) | |
| offset | No | Pagination offset (default 0) | |
| book_id | Yes | Hardcover book ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the nature of the returned data (ratings, reviews, status changes) and implies a read-only operation. However, it does not clarify whether 'user activity' means the current user's or all users' activity, nor does it mention authentication requirements or response shape. This ambiguity is a notable gap.
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, compact sentence that fronts the core purpose and adds the most important contextual detail (activity types). No redundant or extraneous content exists, making it highly efficient.
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 read-only list tool with no output schema and a well-documented input schema, the description covers the essential purpose and return content. However, the unresolved scope of 'user activity' and lack of clarification about the fill shape prevent it from being fully comprehensive for an agent that needs precise output expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameter semantics are fully documented in the input schema. The description adds the word 'recent' which implies a temporal filter relevant to the limit/offset parameters but provides no additional specific parameter guidance.
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 clear verb and resource: 'Get recent user activity for a specific book' and enumerates the content types (ratings, reviews, status changes). This differentiates it from most siblings, though it doesn't explicitly contrast with get_my_activities or other activity-focused tools.
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 context 'for a specific book' implies the primary use case, but the description does not explicitly state when to use this tool versus alternatives like get_my_activities. No exclusions or conditional guidance is provided, leaving the agent to infer appropriate selection from the name and siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_book_by_idB
Get full book details by Hardcover book ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Hardcover book ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only restates the operation and says 'full book details'; it does not explain what happens for nonexistent IDs, whether the call is read-only, or any authentication or error behavior.
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, tight sentence with no filler. It starts with the verb and resource, includes the key qualifier ('by Hardcover book ID'), and 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?
For a one-parameter tool, the description gives the essential call pattern and indicates the return (full book details). However, it lacks additional context such as the complete expected behavior for missing resources or clarification of when to select this over the get_book_by_slug sibling, so the context is only minimally sufficient.
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 100% and the only parameter `id` is already described as 'Hardcover book ID'. The description repeats this without adding extra meaning, so it does not elevate the baseline of 3.
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 precise verb+resource pattern: 'Get full book details' by 'Hardcover book ID'. The ID qualifier clearly distinguishes this from sibling tools like get_book_by_slug, get_editions_by_isbn, or get_author_by_id, so an agent can quickly understand the tool's focus.
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 about when to use this tool versus alternatives. There is no mention of preferring get_book_by_slug when only a slug is known, or using get_edition_by_id for edition-level requests, leaving the agent to infer usage from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_book_by_slugA
Get full book details by Hardcover URL slug (e.g. 'the-name-of-the-wind').
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Book URL slug |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description itself must convey behavior. It implies a safe read-only operation returning full details, but it does not disclose potential edge cases such as invalid or unknown slugs, response shape limitations, or whether any augmentation/fallback occurs.
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?
One compact sentence with an inline example; no wasted words and the key constraint ('by URL slug') is front-loaded.
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 single-parameter lookup tool, the description is largely complete and would let an agent call it correctly. It could be slightly richer about the returned object or error/absence behavior, but the complexity here is low.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers the slug parameter, and the description adds meaningful detail by explaining that it is a Hardcover URL slug and giving a realistic example. This supports correct parameter formatting and extraction.
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 action (get), resource (full book details), and lookup key (Hardcover URL slug), with a concrete example. It is easy to understand what the tool does, though it does not explicitly distinguish itself from get_book_by_id.
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 condition for use is clear: call this tool when you have a Hardcover URL slug and want full book details. It does not explicitly describe when to prefer get_book_by_id or other lookup tools, but the slug-based scope is evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_books_in_seriesA
Get the ordered, deduplicated list of books in a series. Merges duplicates, excludes partial books and compilations.
| Name | Required | Description | Default |
|---|---|---|---|
| series_id | Yes | Series ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavior disclosure. It adds meaningful detail: results are ordered, duplicates are merged, and partial books/compilations are excluded. This goes beyond a simple 'get list' and gives agents a realistic expectation of the output's scope, though it does not cover auth requirements or error cases.
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 is front-loaded with the action and target, followed by two essential behavioral clarifiers. Every word earns its place; no redundant filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (one integer parameter, no output schema), the description is nearly complete: it tells the agent what the output will be (list of books), the ordering, and the deduplication/filtering behavior. The only missing context is toward the exact structure of each returned book object, but this is not strictly necessary for a list of books and the lack of an output schema lowers the bar.
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 100% coverage with a description for series_id ('Series ID'). The tool description does not add any extra meaning about the parameter itself, so a baseline 3 is appropriate: the schema carries the parameter documentation without needing compensation from the description.
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 and resource 'Get the ordered, deduplicated list of books in a series', clearly separating this from siblings like get_series_by_id (which presumably returns series metadata) and get_author_books. The qualifiers 'ordered' and 'deduplicated' further define the exact scope.
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 strongly implies when to use the tool: whenever the agent needs the book-level contents of a series. However, it does not explicitly name alternatives or state when not to use it, leaving some room for the agent to confuse this with retrieving series metadata or author book lists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_books_read_betweenA
List books marked as Read with a finish date between two dates, ordered most-recent first.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 25) | |
| since | Yes | Start date YYYY-MM-DD (inclusive) | |
| until | Yes | End date YYYY-MM-DD (inclusive) | |
| offset | No | Pagination offset (default 0) | |
| user_id | Yes | Hardcover numeric user ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavior disclosure burden. It discloses filtering by Read status and finish date, plus the 'most-recent first' ordering. It does not mention response shape, authentication needs, or pagination behavior, but for a simple list operation this is a moderate rather than severe gap.
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 that states the action, the resource, the filtering criterion, and the ordering. There is no filler, and important selection details are front-loaded.
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 five-parameter tool with no output schema and no annotations, the description gives the main filtering logic and ordering but omits clarifying exclusions or sibling-tool distinctions. Overall this is adequate but not complete enough to guarantee ideal tool selection among closely related library/reading tools.
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 100%, so the schema already documents the meaning of since, until, user_id, limit, and offset. The description adds beta ordering and the date filter context, but does not add semantic detail beyond what the schema already provides.
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 an explicit verb and resource: 'List books marked as Read with a finish date between two dates.' It clearly identifies the filtering condition and the sort order. This makes the tool distinguishable from siblings like get_library_by_status, whose main criterion is status rather than finish-date range.
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 conveys an implied usage: use this tool when you want a date-bounded list of a user's finished books. However, it provides no explicit guidance on when not to use it or what sibling tools to prefer in closely related cases such as get_library_by_status or get_my_reading_journal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_edition_by_idA
Get detailed information about a specific edition by its ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Edition ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. The phrase 'detailed information' hints that it returns a full record rather than a summary, but the description does not disclose error behavior, return format, or permissions. This is a safe read operation by implication, but the description is still minimal in behavioral transparency.
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, front-loaded sentence that gets straight to the point. It has no fluff and conveys the key information efficiently, which is ideal for a simple ID lookup.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter lookup tool with no output schema, the description is complete enough in the sense that there is very little to explain. However, it does not clarify what fields are included in 'detailed information' or what happens when the edition is not found, leaving some room for ambiguity in downstream usage.
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?
Input schema coverage is 100% since the single parameter 'id' has a description ('Edition ID'), and the description merely says 'by its ID'. No additional parameter semantics are added beyond the schema, so the baseline of 3 is appropriate.
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 identifies the action ('Get'), the resource ('specific edition'), and the lookup mechanism ('by its ID'), which is precise and unambiguous. The wording 'specific edition' also differentiates it from sibling tools like get_book_by_id and get_editions_by_title, making the scope immediately clear.
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 the tool should be used when an edition ID is available, but it does not explicitly state when to use it over alternatives, nor does it mention any exclusions. With many sibling lookup tools, the lack of routing guidance leaves some selection burden to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_editions_by_isbnB
Look up an edition by ISBN-10 or ISBN-13.
| Name | Required | Description | Default |
|---|---|---|---|
| isbn | Yes | ISBN-10 or ISBN-13 (digits only, no dashes) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden, yet it only says 'look up an edition.' It does not disclose whether authentication is needed, how results are returned, what happens on invalid ISBNs, or which specific matching behavior is used.
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?
One short sentence contains the core action and input format. No filler or repeated schema content, and the key lookup target is front-loaded.
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 single-parameter lookup, the description is adequate on the surface, but the plural tool name and singular 'an edition' create ambiguity. Without an output schema or additional details on return structure, an agent may not know whether this returns one edition or many matches.
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 100% and the parameter description already specifies format and constraints. The description adds only ISBN-10/13 detail that is mostly redundant, so it stays at the baseline rather than adding new semantics.
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 names the operation ('Look up') and resource ('an edition by ISBN-10 or ISBN-13'), which distinguishes it from sibling lookup tools like get_edition_by_id or get_editions_by_title. It is slightly vague about whether one or many editions are returned, matching the plural function name.
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 phrase 'by ISBN-10 or ISBN-13' implies the primary use case: when an agent has an ISBN. However, there is no explicit guidance on when to choose this tool over alternatives, and no exclusions or fallback recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_editions_by_titleA
Get all known editions of a book by exact title match.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Exact edition title to look up |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It does convey two useful behaviors: matching is exact and the result set may contain multiple known editions. It does not disclose potential edge cases such as case sensitivity, empty results, authentication requirements, or whether the response is a list, relying instead on the word 'all' and the sibling names.
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?
One clean sentence with no filler. It front-loads the purpose and match semantics, and every word contributes to understanding the tool.
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 one-parameter lookup tool with no output schema, the description covers the core semantics adequately: it names the resource, the exact-match condition, and the plural result set. It could be richer by explicitly stating the return format or behavior when no match is found, but those are minor gaps for such a simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema description 'Exact edition title to look up' already captures the only parameter's semantics. The description repeats essentially the same idea, adding no meaning beyond the structured schema, so it meets the baseline but doesn't add value.
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 and resource: 'Get all known editions of a book by exact title match.' It clearly distinguishes this from the ISBN-based sibling (get_editions_by_isbn) and the single-edition lookups (get_edition_by_id), making the tool's scope immediately obvious.
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 'exact title match' qualifier hints at the appropriate use case, implying the caller must already know the exact title rather than a partial or fuzzy term. However, it does not explicitly contrast with siblings like search or get_editions_by_isbn, leaving the agent to infer when this tool should be preferred over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_library_by_statusA
Get the authenticated user's books filtered by reading status. Status IDs: 1=Want to Read, 2=Currently Reading, 3=Read, 4=Did Not Finish, 5=Owned.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 25) | |
| offset | No | Pagination offset (default 0) | |
| status_id | Yes | 1=Want to Read, 2=Currently Reading, 3=Read, 4=DNF, 5=Owned |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are present, the description carries the full burden of explaining behavior. It discloses the primary behavior and the exact status meanings, but does not go beyond that: no return format, ordering, pagination behavior, or auth requirements are mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentents convey scope, filtering, and the full status mapping with no filler. Each part 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?
For a simple filtered lookup, the definition plus complete schema diagram is sufficient to call the tool correctly. The only noteworthy gaps are lack of an output description and pagination behavior, but these are minr for such a tool.
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 100%, so the schema already documents limit, offset, and status_value. The enrichment repeats the status enum mapping rather than adding new parameter semantics, which keeps this at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb, resource, and scope: it retrieves the authenticated user's books and filters them by reading status. The status values are spelled out, making the operation unambiguous and easily distinguishable from broader library fetch tools.
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 descriptor makes clear this applies to the authenticated user's own books, which helps choose between this and user/social-lookup siblings. It does not explicitly mention when to prefer get_my_library or another tool, but the context is clear without stating exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_list_by_idA
Get a Hardcover list's details and its books (up to 50 books).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | List ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral weight. It does disclose the 'up to 50 books' limit, which is useful, but it does not describe what 'details' includes, how larger lists behave, or whether the operation is read-only beyond the 'Get' wording.
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, efficient sentence with no filler, front-loading the action and resource while adding only the notable 50-book limitation. Every word contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only tool with a fully documented schema, the description is nearly complete: it specifies the input concept, the output content, and a key limit. The main gap is the absence of a response shape description or output schema, but the tool's simplicity keeps this minor.
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?
There is exactly one parameter and schema coverage is 100%, so the schema already fully documents 'id' as the List ID. The description adds no additional meaning over that structured documentation, but it also does not need to, given the simplicity and high coverage.
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 names a specific verb ('Get'), a specific Hardcover resource ('list'), and the return content ('details and its books') with an explicit limit. This clearly distinguishes it from more than 20 sibling get_* tools, which target other resources like books, authors, users, or series.
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 states what the tool does but gives no explicit guidance on when to use it, when not to use it, or which alternative tool to select. With 23 sibling tools present, the lack of any selection guardrail is a meaningful gap, even though the resource type somewhat implies its use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_meA
Get the currently authenticated Hardcover user's profile (id, username, name, book counts).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does state this is a read-only retrieval of the current user and even enumerates returned fields. However, it says nothing about behavior when no user is authenticated, token validity, or error conditionsโvaluable context for a tool whose entire access depends on the session.
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?
One sentence, no filler, and the achievement framing ('get...profile') is front-loaded. Field preview follows close behind, and there is nothing extraneous to excise.
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 parameterless, single-resource tool with no output schema, the description is nearly complete, and the parenthetical list provides minimal return data. It could be more precise about what 'book counts' includes, but an agent could already decide whether to call this tool and roughly expect the result shape.
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?
There are zero parameters, so there is no ambiguity in the input schema. The description compensates by embedding the identity context ('currently authenticated', which is the effective input for selecting which profile is returned). Baseline of 4 for a parameterless tool is appropriate.
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 verb 'get' names a specific resourceโ'the currently authenticated Hardcover user's profile'โwith concrete fields (id, username, name, book counts). Reading the first clause makes it clear this is a self-profile lookup rather than a search or a lookup by arbitrary username, distinguishing it from get_user_by_username without any need to open the schema.
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 phrase 'currently authenticated' establishes the context: use this when the agent needs the signed-in user's identity rather than an arbitrary user. The contrast with sibling get_user_by_username is implicit but easy to infer, though the description does not explicitly state 'use X instead when the username is known or the user is not the authenticated one.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_my_activitiesA
Get a user's recent activity feed (books added, rated, reviewed, goals, lists). Requires the user's numeric ID.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20) | |
| offset | No | Pagination offset (default 0) | |
| user_id | Yes | Hardcover numeric user ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It does state that a numeric user ID is required and that the feed is recent, but it does not clarify visibility rules, ordering, or whether the feed is limited to the authenticated user, leaving the my/user ambiguity unresolved.
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 a clear action, a useful parenthetical list of content types, and a relevant requirement. Every word contributes to the tool definition.
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 straightforward read tool with fully documented parameters, this is sufficient to call it correctly. It could further clarify the return payload and the intended scope (current user vs any user), but the provided information is mostly adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so user_id, limit, and offset are already documented in the schema. The description adds little beyond repeating the numeric ID requirement and does not explain how limit/offset function together.
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 names a specific verb and resource ('Get a user's recent activity feed') and lists the content types included. It is distinguishable from other tools by the content categories, though the tool name 'my' vs 'a user' creates slight ambiguity.
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 the intent is for the overall user activity feed rather than a narrow sibling like get_my_goals or get_book_activities. It does not explicitly state when to choose this tool over alternatives or when to avoid it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_my_goalsA
Get the authenticated user's reading goals (progress, target, state, dates).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full behavioral disclosure burden. It makes the read-only and user-scoped nature clear ('Get the authenticated user's ...'), and reveals key response contents. However, it does not disclose error behavior, empty states, auth failure handling, or whether related goal metadata is omitted.
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 efficient sentence with the key resource and response facets front-loaded. Every word contributes: the resource is scoped to the authenticated user, and the parenthetical enumerates the meaningful goal fields without redundancy.
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 zero-parameter, no-output-schema getter, the description provides enough to invoke the tool correctly and know what domain data to expect. It could be more complete by describing the shape or semantics of the returned dates and state, but it is still sufficient for an initial agent decision.
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, and schema coverage is effectively 100%, so there are no parameter semantics for the description to clarify. The description's mention of 'progress, target, state, dates' refers to the response rather than inputs, which is acceptable since no parameters exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get') and a specific resource ('authenticated user's reading goals'), and clarifies the goal-related content as 'progress, target, state, dates.' This clearly distinguishes it from nearby sibling tools like get_reading_progress or get_reading_stats, despite no explicit sibling mention.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance about when to use this tool versus alternatives such as get_reading_progress, get_reading_stats, or get_my_reading_journal. The intended context is implied by 'reading goals,' but no exclusions or routes to siblings are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_my_libraryA
Get the authenticated user's full library (all statuses), paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 25) | |
| offset | No | Pagination offset (default 0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full behavioral burden. It discloses pagination, the authenticated-user scope, and that all statuses are included, but it does not mention response shape, auth requirements, or empty-library behavior. It is adequate for a simple retrieval operation but not rich.
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 one concise, front-loaded sentence containing all core signals: action, scope, resource, and pagination. It has no filler or redundancy.
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 two-parameter retrieval operation with no output schema, this is largely complete: action, scope, resource, and pagination are all stated. The only real gap is not explicitly directing the agent to status-filtered sibling tools when narrower results are needed.
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 100%, and both limit and offset are already well-defined with defaults. The description's mention of 'paginated' mildly reinforces the parameter semantics but adds no new detail beyond the schema.
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 identifies the action ('Get'), the resource ('full library'), and the scope ('authenticated user's'), explicitly noting it includes all statuses. This distinguishes it from sibling tools like get_user_library and get_library_by_status.
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?
Usage context is implied: use this when you want the full library across all statuses, rather than a status-filtered view. However, it does not explicitly name alternatives or state when not to use it, so an agent must infer the distinction from the description and sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_my_reading_journalB
Get reading journal entries and session history for a specific book.
| Name | Required | Description | Default |
|---|---|---|---|
| book_id | Yes | Hardcover book ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. 'Get' implies a read-only operation, but the description does not disclose any other behavioral traits such as authentication requirements, whether the journal is limited to the current user, output shape, or pagination. It basically states the tool purpose rather than explaining behavior beyond it.
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 concise and front-laoded: it names the verb, resource, and scope in one sentence. There is no wordy filler or unnecessary detail, making it easy for an agent to absorb.
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 single-parameter getter, the description is almost adequate, but there is a still some context missing: no output schema is present, and the description does not indicate what the session history looks like or whether the journal belongs to the authenticated user. Its relative incompleteness becomes more noticeable alongside the large sibling set.
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 100%, so the single book_id parameter is already documented as 'Hardcover book ID.' The description only restates that book-scoping without adding new knowledge about formats, constraints, or relationships between the journal entries and the 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 uses a clear verb and concrete resource: 'Get reading journal entries and session history for a specific book.' It clarifies that this is a book-scoped query, which distinguishes it from more general library or profile getters in the sibling list, though it does not explicitly contrast it with related tools like get_reading_progress or get_reading_stats.
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 when-to-use or when-not-to-use guidance. It implies the tool is for a specific book, but it does not clarify when to prefer this over sibling tools such as get_reading_progress, get_user_book, or get_readings_read_between.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reading_progressB
Get all books currently being read with their page-level progress.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It does say this is a getter and what it returns, but it does not clarify whose books are 'currently being read', whether pagination or ordering applies, or what exactly 'page-level progress' means.
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, short sentence that states the action and the primary output. All parts are relevant, and there is no redundant or filler content.
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 zero-parameter interface, the description is minimally sufficient, but it relies on the user/reader to infer important context like authentication scope, output shape, and page-level progress format. The absence of a scenario, ordering, or detail about the progress representation makes it adequate but not complete.
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, and the schema confirms no inputs are required. The description therefore does not need to document parameter semantics, and there is no parameter ambiguity to resolve.
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 what the tool returns: all books currently being read, along with their page-level progress. It does not fully differentiate itself among the many sibling get_* tools, though the phrase 'currently being read' gives meaningful contrast with history/stats tools.
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?
There is no guidance on when this tool should be preferred over alternatives such as get_library_by_status, get_my_library, get_reading_stats, or get_my_reading_journal. The description implies the obvious use case but provides no conditions, exclusions, or comparisons.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reading_statsA
Get reading statistics: total books read all-time AND since an optional date (e.g. '2026-01-01' for this year, '2026-08-01' for this month), plus average rating for each window. Requires the user's numeric ID (use get_me to find it).
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Optional YYYY-MM-DD start date to filter the 'filtered' count (e.g. 2026-01-01) | |
| user_id | Yes | Hardcover numeric user ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full transparency burden. It discloses what the tool computes, the all-time vs filtered distinction, the optional date window, average rating, and the need for a numeric user ID. It omits response-shape details, but the key behavioral information is present.
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 two sentences with no wasted words. The core computation is front-loaded, date examples are compact and illustrative, and the required-ID guidance is placed at the end. Every sentence 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?
For a two-parameter read tool with no output schema, the description explains what is returned, input semantics, and the prerequisite user look-up. It does not cover every potential edge case or return-value format, but what is provided is sufficient for a correct call.
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 already documents both parameters with full coverage, so the baseline is 3. The description adds value by explaining how the since parameter is used, giving concrete examples that map to this year vs this month, and clarifying that user_id is the numeric ID from get_me.
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 verb and resource: it gets reading statistics, specifically total books read all-time and since an optional date, plus average rating per window. It is clear and concrete, though it does not explicitly contrast itself with overlapping sibling tools like get_books_read_between.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear invocation prerequisite: the user's numeric ID, and it points to get_me to find that ID. It does not explicitly say when to prefer this tool over siblings, but the context is understandable and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_series_by_idA
Get series metadata (name, description, book count) by series ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Series ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It clearly indicates this is a read of series metadata, which is a basic behavioral signal. It does not discuss not-found behavior, authentication, or response shape, but for a simple lookup of metadata this is adequate.
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, compact sentence communicates the operation, resource, and returned fields with no filler. The most important scoping detail, that it is series metadata by ID, comes across immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter lookup tool with no output schema, the description covers the essential output fields and the lookup key. It does not specify behavior for a missing or invalid ID, but such error semantics are a minor gap for this low-complexity read flow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: the only parameter, id, is already fully described as 'Series ID'. The description merely repeats the 'by series ID' usage without adding new semantic details, so the baseline 3 applies.
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 names a specific resource, series metadata, and enumerates key returned fields (name, description, book count) via a concrete operation, 'get'. This is sufficient to distinguish it from siblings like get_books_in_series, which focus on the constituent books rather than series-level metadata.
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 you have a series ID and need the series' metadata, not its full book list. It does not explicitly mention alternatives or contrast with get_books_in_series, so the usage guidance is reasonable but implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_bookA
Get the authenticated user's relationship with a specific book (status, rating, review, read sessions).
| Name | Required | Description | Default |
|---|---|---|---|
| book_id | Yes | Hardcover book ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of behavioral disclosure. It discloses that this is a relationship read and outlines the data fields returned, but it does not explain failure behaviors such as a nonexistent book ID or unauthenticated context.
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 clear sentence, front-loaded with the resource and relationship scope, then compactly enumerates the relevant data fields. There is no wasted text.
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 this is a straightforward read operation with one well-documented parameter and no output schema, the description captures the essential context: what object is targeted, whose relationship, and what aspect of it. It lacks edge-case behavior but remains sufficiently complete for selecting and invoking the tool.
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 provides 100% documentation coverage for the single parameter, book_id, described as a Hardcover book ID. The description adds no extra meaning to the parameter beyond the schema.
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 and resource: it gets the authenticated user's relationship with a specific book. It names the concrete fields returned (status, rating, review, read sessions), which clearly differentiates it from siblings like get_book_by_id or get_books_read_between.
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 implicitly communicates when to use this tool: when you need the authenticated user's personal book relationship rather than book metadata. However, it gives no explicit guidance about when not to use it or which sibling tool should be chosen instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_by_usernameB
Look up a public Hardcover user profile by username.
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes | Hardcover username |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does convey that the profile is public and the lookup is read-oriented, but it does not describe what is returned, whether a missing username causes an error, or any other runtime behavior. This is minimal transparency.
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?
One clear sentence, front-loaded with action and resource, and no filler or repetition of the schema. It 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?
For a simple single-parameter lookup this is adequate, but with no annotations and no output schema, the agent is left to guess the return shape and error behavior. Adding one sentence about the returned profile data would make it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the single required parameter is already clearly documented as 'Hardcover username'. The description merely repeats 'by username' and adds no format, examples, or edge-case detail, matching the baseline for fully documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Look up a public Hardcover user profile by username.' The phrase 'public' and the explicit username lookup distinguish it from related tools like get_me or get_user_library, though it doesn't name a sibling explicitly.
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 using this tool when a username is known, but it gives no conditions, exclusions, or comparison with alternatives. With several sibling tools that also relate to users and profiles, the absence of when-to-use guidance is a real gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_libraryA
Get another user's library filtered by reading status. Status IDs: 1=Want to Read, 2=Currently Reading, 3=Read, 4=Did Not Finish, 5=Owned.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 25) | |
| offset | No | Pagination offset (default 0) | |
| user_id | Yes | Hardcover user ID | |
| status_id | Yes | 1=Want to Read, 2=Currently Reading, 3=Read, 4=DNF, 5=Owned |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It explains the action but does not mention response shape, pagination, read-only semantics, authentication needs, or any other behavioral constraints.
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?
One concise, front-loaded sentence plus a status mapping. It leans nothing irrelevant and a state can parse the key purpose in a single phrase.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a relatively simple four-parameter shape with good schema coverage, but no output schema and no annotations. The description is adequate for selecting the tool but not quite complete for behavior: it doesn't explain what exactly is returned or how pagination appears in the response.
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 already documents all four parameters and the status_ids mapping, so the schema is one hundred percent covered. The description adds the context that user_id refers to another user, but it does not add new field-level detail beyond that.
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 names a specific action and resource: getting another user's library, filtered by reading status. It clearly separates it from modern my own current-library style tools like get_my_library by explicitly saying 'another user's'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear intended scenario ('another user's library'), but it does not explicitly say when not to use this tool or name alternatives like get_my_library. The routing is implied rather than taught.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchA
Search Hardcover for books, authors, series, users, lists, characters, publishers, or prompts. Returns rich result objects from Typesense. query_type defaults to 'book'.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default 1) | |
| query | Yes | Search term | |
| per_page | No | Results per page (default 25) | |
| query_type | No | One of: book, author, series, user, list, character, publisher, prompt | book |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses that the tool queries Typesense and returns 'rich result objects', which is useful, but it does not explain whether results vary by query_type, how pagination behaves, sorting/relevance, or that this is a read-only operation. Some transparency is provided, but not comprehensive.
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 two sentences with no filler. Front-loads the purpose, lists the range of searchable entities, and adds the Typesense behavior efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich schema coverage and moderate complexity of searching across multiple entity types, the description covers invocation basics and result source. It could name the sibling lookup tools as alternatives or clarify output differences across query types, but overall it is sufficiently complete for selecting and calling the tool.
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 100%, so the parameters are already fully documented. The description only restates that query_type defaults to 'book', which duplicates the schema and adds no extra meaning about parameter behavior or constraints.
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 action ('Search') with a specific resource ('Hardcover') and enumerates all searchable entity types. It is clearly distinguished from the get_* sibling tools, which support direct lookups by ID or slug rather than free-text search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for the search use case and defaults query_type to book, but does not explicitly state when to choose this tool over a get_* tool, such as 'use get_book_by_slug if you already have a known identifier'. Usage is implied rather than fully specified.
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.
25 tool updates
v0.1.0- First observed
get_author_books - First observed
get_author_by_id - First observed
get_author_by_slug - First observed
get_book_activities - First observed
get_book_by_id - First observed
get_book_by_slug - First observed
get_books_in_series - First observed
get_books_read_between - First observed
get_edition_by_id - First observed
get_editions_by_isbn - First observed
get_editions_by_title - First observed
get_library_by_status - First observed
get_list_by_id - First observed
get_me - First observed
get_my_activities - First observed
get_my_goals - First observed
get_my_library - First observed
get_my_reading_journal - First observed
get_reading_progress - First observed
get_reading_stats - First observed
get_series_by_id - First observed
get_user_book - First observed
get_user_by_username - First observed
get_user_library - First observed
search
TDQS
Scored across 25 tools
Most tools map cleanly to distinct resources: books, editions, authors, series, users, libraries, progress, stats, and activities. The main minor ambiguities are the parallel id/slug lookups for books/authors and the broad `search` tool, but these are clearly separated by input type.
The overwhelming majority of tools follow a predictable `get_<resource>` or `get_<resource>_by_<key>` snake_case pattern. The single standalone `search` tool is a minor but logical exception, and it does not disrupt the overall consistency.
25 tools is at the boundary where a server starts to feel heavy, though each tool is a distinct read-only lookup in a rich book/reading domain. Some consolidation, especially around edition lookups and library/status variants, could reduce redundancy without losing functionality.
The read-only surface is strong: it covers books, editions, authors, series, users, libraries, reading progress, stats, lists, and activities. However, it offers no create/update/delete capabilities for library status, ratings, reviews, or lists, so users expecting a full reading-app workflow will hit dead ends.
Maintenance
Related MCP Connectors
Read and update your Everway trips and itineraries from any MCP-compatible AI assistant.
Automate 1,000+ services from any MCP-compatible AI agent: build Applets, run actions and queries.
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client โ Claude, ChatGPT, Cursor, Cline, Windsurf.
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
- AlicenseNot gradedqualityCmaintenanceProvides AI assistants with direct access to your ebook library, enabling listing books, reading chapters, and searching across books via the Model Context Protocol.MIT
- FlicenseAqualityCmaintenanceEnables AI assistants to interact with BookLore self-hosted libraries, allowing natural language queries to search books, manage reading status, ratings, series, authors, and highlights.71-