Skip to main content
Glama

ReadingRate

Server Details

Book difficulty, reading times and ranked lists, plus your reading log, quotes and clubs.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP · MCP 2024-11-05
URL
Repository
simonsbookclub/readingrate-plugin
GitHub Stars
0

TDQS

A3.8/5.0

Scored across 42 tools

Disambiguation3/5

Most tools have a clearly distinct purpose and the descriptions actively cross-reference alternatives (e.g. get_book_details vs compare_books vs search_books), which helps a lot. However, there are dense clusters of near-parallel tools — six stats/progress tools (get_reading_stats, get_reading_trajectory, get_reading_domain, list_reading_domains, get_poetic_form_mastery, get_poetry_reading_stats) and three stats flavours of reading progress (get_currently_reading, get_reading_history, get_reading_days) — where an agent can plausibly pick the wrong one at first pass.

Naming Consistency4/5

Names are uniformly snake_case with a leading verb (add_, get_, list_, search_, log_, save_, update_, record_, delete_), which is highly predictable. Minor wobble from near-synonymous verbs — search_books vs lookup_books_batch vs find_related_passages, and get_currently_reading reading as a phrase — but the convention itself never breaks.

Tool Count2/5

42 tools is well past the 25-tool threshold and the surface spans many sub-domains (library CRUD, book analysis, catalog search, poetry, quotes/review, clubs, goals, summaries, insights), so the set is heavy even for a broad reading app. Several tools occupy narrow slices of the same feature area, which inflates the count beyond what an agent can hold comfortably.

Completeness3/5

Core lifecycle coverage is good: books can be added, status/rating updated, sessions logged, quotes and insights saved and deleted, and reviews graded. But there are real gaps — no way to remove a book from the library, no tool to set a reading goal (get_reading_goals explicitly only reads), no deletion/editing of saved quotes or logged sessions, and no club creation or discussion posting.

Available Tools

42 tools
add_book_to_libraryAdd a book to the libraryA
Idempotent
Inspect

Adds one book to the reader's ReadingRate library. It goes on the want-to-read list unless a status is given: "reading" for a book they are reading now, "read" for one they have finished (with an optional rating and finish date), or "stopped".

Use when the user asks to add a book to their library or reading list, or says they are reading or have finished a book that is not in their library yet. Identify the book with exactly one of book_id, isbn or title_author.

A book already in the library is left where it is, and the result says which shelf it is on; to move it, use update_book_status. A book added as read also goes on the reader's ReadingRate activity feed; other readers see that they finished it while the reader's profile is public and shows finished books (new accounts start private, and finished books start hidden). A book given by title and author that is not in the ReadingRate catalog is looked up in Google Books and added to the catalog, which is public, and ReadingRate then analyzes it; so add a book named by title only once the reader has confirmed the title.

Examples:

  • {"title_author": {"title": "The Great Gatsby", "author": "F. Scott Fitzgerald"}}

  • {"isbn": "9780140449136", "status": "read", "rating": 5}

  • {"book_id": "", "status": "reading"}

NameRequiredDescriptionDefault
isbnNoISBN-10 or ISBN-13
ratingNoRating from 1 to 5, for a book added as read
statusNoThe shelf to put the book on instead of want-to-read
book_idNoThe book's ReadingRate id, from another ReadingRate tool's results
title_authorNoThe book's title and author. Close spellings match.
date_finishedNoFinish date, YYYY-MM-DD, for a book added as read (default: today)

Output Schema

NameRequiredDescription
bookNoThe book
ratingNoThe rating recorded, when the book went in as read
messageYesHuman-readable result
successYesTrue when the book was added; false when it was already in the library
tbr_countNoWant-to-read list size after adding
new_statusNoThe shelf the book went on, when a status was given
date_startedNoStart date, when the book went in as reading
date_finishedNoFinish date, when the book went in as read
existing_statusNoThe shelf the book was already on, when it was already in the library
is_new_catalog_entryNoTrue when the book was not in the catalog and was added to it
status_change_failedNoThe book was added but the status asked for did not take
reading_time_estimateNoEstimated reading time at an average pace

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare non-readOnly, openWorld, idempotent, non-destructive, so the bar is lower, but the description adds substantial context beyond them: an already-present book is left in place and the result reports its shelf, read status triggers an activity feed entry with privacy caveats, and title/author misses fall back to Google Books which makes the catalog entry public. It does not spell out auth needs or rate limits, so 4 rather than 5.

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

Conciseness4/5

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

Front-loaded with the core action and the status variants, then routing, then side effects, then examples. Every sentence carries distinct information, though the side-effect paragraph is dense and the description runs long for a 6-param tool with full schema coverage.

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

Completeness5/5

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

With an output schema present the description needn't document return values, yet it still tells the agent the result reports which shelf the book landed on. Combined with the fallback behavior, privacy defaults and exclusivity rule, nothing an agent needs to call this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description contributes a constraint the schema lacks entirely: identify the book with exactly one of book_id, isbn or title_author. It also explains that status overrides the default want-to-read shelf and that rating/date_finished apply only to read status, adding real meaning on top of the enum.

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

Purpose5/5

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

States a specific verb and resource (adds one book to the reader's library) and immediately scopes it against the closest sibling by naming update_book_status for moving and implying add_matched_books_to_library is the batch variant. An agent can distinguish it without opening the schema.

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

Usage Guidelines5/5

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

Explicitly states when to use (user asks to add a book, or says they are reading/finished a book not in their library), the alternative for the move case (update_book_status), and a prerequisite (confirm the title before adding a title-only book). Nothing is left to inference.

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

add_matched_books_to_libraryAdd matched books to the libraryA
Idempotent
Inspect

Adds up to 40 books to the reader's ReadingRate library in one call, by ReadingRate book id, all on the same shelf (want-to-read unless a status is given). Books already in the library are left where they are and listed.

Use after lookup_books_batch has matched a photographed shelf or a list, and the reader has said which of the matched books to add. Books added as read also go on the reader's ReadingRate activity feed; other readers see that they finished them while the reader's profile is public and shows finished books (new accounts start private, and finished books start hidden). It takes ids only, so it never adds a book to the catalog; a book lookup_books_batch could not match is added with add_book_to_library once the reader confirms its title.

Example: {"book_ids": ["", ""], "status": "read"}

NameRequiredDescriptionDefault
statusNoThe shelf to put every newly added book on instead of want-to-read
book_idsYesReadingRate book ids, as lookup_books_batch returns them (max 40)

Output Schema

NameRequiredDescription
addedNoBooks added, with id and title, plus reason when a book went in but its status did not
failedNoBooks that could not be added, with id and reason
messageYesHuman-readable result
successYesTrue unless no book could be added
already_thereNoBooks already in the library, with id, title and the shelf they are on; they were not changed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations cover safety hints (idempotent, non-destructive), and the description adds genuinely non-obvious behavior: the 40-book cap, the want-to-read default, that already-present books are left in place and reported back, and that 'read' books publish to the activity feed subject to profile privacy defaults. Nothing contradicts the annotations; the idempotent hint is consistent with 'left where they are'.

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

Conciseness4/5

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

Front-loaded with purpose and cap, then selection guidance, then side effects, then an example — a sensible order with no filler. The activity-feed/privacy sentence is long and heavily nested, which costs a little readability.

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

Completeness5/5

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

An output schema exists, so return values need no explanation; the description still covers inputs, cap, default shelf, duplicate handling, downstream visibility, and the sibling alternative. For a 2-parameter mutation tool this is complete enough to call correctly on first try.

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

Parameters4/5

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

Schema coverage is 100% (including the status enum and the 40-max on book_ids), so the baseline is 3, but the description adds that status applies uniformly to every newly added book and that absent status means want-to-read. The concrete JSON example reinforces the shapes. Minor gap: it does not explain what happens when book_ids exceeds 40.

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

Purpose5/5

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

The first sentence states a specific verb (adds), resource (books to the reader's library), scope limit (up to 40, one call), keying (by ReadingRate book id), and default shelf behavior. It is clearly distinguishable from add_book_to_library (single, unmatched books) and lookup_books_batch (matching, not adding), both of which it names.

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

Usage Guidelines5/5

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

Explicit routing: use after lookup_books_batch has matched a shelf or list and the reader has chosen which books to add; unmatched books go through add_book_to_library once the title is confirmed. It also states the tool never adds to the catalog, an explicit when-not condition.

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

annotate_poem_lineAnnotate a poem lineAInspect

Writes the reader's note on one line of a poem to their ReadingRate notes: a reading, a connection, a reaction. The line is not saved as a quote.

Use when the reader wants to record a thought about a specific line of a poem. To save the line itself as a quote, use save_poem_line. Each call adds a new note.

Example: {"anchor": "wyatt/whoso-list-to-hunt/13", "note": "The hunt as courtship, and its exhaustion."}

NameRequiredDescriptionDefault
noteYesThe reader's note
anchorYesThe line's anchor as get_poem or search_poems returns it

Output Schema

NameRequiredDescription
idNoThe saved note
lineNoThe line the note is attached to
noteYes
poetNo
titleNo
anchorYes
successYes
created_atNoISO 8601

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, and the description adds real value on top: 'Each call adds a new note' spells out the append/non-idempotent behavior in plain terms, and 'The line is not saved as a quote' clarifies the side-effect boundary. It stops short of describing failure modes or what happens on a bad anchor, so not a 5.

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

Conciseness5/5

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

Front-loaded purpose sentence, then usage, then the alternative, then a compact example. Every sentence carries a distinct fact (destination, exclusion, append semantics, format) with no repetition.

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

Completeness5/5

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

For a 2-parameter write tool with an output schema and full annotation coverage, this covers what an agent needs: where the note goes, that it is not a quote save, that calls accumulate, and a concrete anchor example. Return values are handled by the output schema, so no further detail is required.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the worked example {"anchor": "wyatt/whoso-list-to-hunt/13", "note": "..."} goes beyond the schema by demonstrating the concrete anchor format, which the schema only describes abstractly as 'as get_poem or search_poems returns it'. The note parameter itself gets no extra semantic guidance.

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

Purpose5/5

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

States a specific verb (writes) and resource (the reader's note on one line of a poem) plus the destination (ReadingRate notes). It also names the adjacent concept it is not — 'The line is not saved as a quote' — and points at save_poem_line, so an agent can distinguish it from siblings without opening schemas.

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

Usage Guidelines5/5

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

Gives an explicit trigger ('Use when the reader wants to record a thought about a specific line of a poem') and an explicit alternative with its selecting condition ('To save the line itself as a quote, use save_poem_line'). Nothing is left to inference.

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

compare_booksCompare booksA
Read-onlyIdempotent
Inspect

Sets two or three books side by side and shows them as a comparison grid. Aspects: "difficulty" (overall and per-dimension scores, and each book's hardest and easiest dimensions), "themes" (shared and distinct), "length" (word count and reading time), "style" (primary genre and literary regard) and "awards".

Use when the user asks to compare specific books, which of them is harder or longer, or which to read first. For a single book, use get_book_details. To find books, use search_books.

Default aspects: difficulty, themes, length.

Examples:

  • {"book_ids": ["crime-and-punishment", "the-brothers-karamazov"]}

  • {"book_ids": ["1984", "brave-new-world", "fahrenheit-451"], "aspects": ["themes", "difficulty"]}

NameRequiredDescriptionDefault
aspectsNoWhat to compare (default: difficulty, themes, length)
book_idsYesTwo or three ReadingRate book ids or slugs

Output Schema

NameRequiredDescription
booksYes
summaryNo

TDQS

A4.8/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false), so the bar is lower. The description still adds useful behavior: the output is a comparison grid, the input is capped at two or three books, and it declares the default aspects. It does not discuss pagination, rate limits, or failure behavior for unknown slugs, keeping it short of a 5.

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

Conciseness5/5

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

Front-loaded with the core action, then aspects, then usage routing, then compact examples — each block has a distinct job. No sentence is redundant, and the aspect glossary replaces what would otherwise be vague enumeration.

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

Completeness5/5

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

An output schema exists so return values need no explanation, and the description closes the remaining gaps: the 2–3 book limit, defaults, aspect meanings, and sibling routing. For a two-parameter read-only compare tool this is fully sufficient to invoke correctly.

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

Parameters5/5

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

Schema coverage is already 100%, yet the description goes well beyond it by defining what each aspect actually yields: 'difficulty' includes overall and per-dimension scores plus hardest/easiest dimensions, 'themes' splits shared vs distinct, 'length' gives word count and reading time, 'style' covers genre and literary regard. Two concrete call examples show the id-array shape and default-vs-explicit aspects.

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

Purpose5/5

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

States a specific verb and resource ('Sets two or three books side by side and shows them as a comparison grid') and enumerates exactly what is compared via the five named aspects. It is immediately distinguishable from sibling read tools like get_book_details and search_books.

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

Usage Guidelines5/5

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

Explicitly states when to use it ('compare specific books, which of them is harder or longer, or which to read first') and routes to the correct alternatives for adjacent intents: get_book_details for a single book, search_books to find books. Nothing is left to inference.

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

delete_reading_insightDelete a saved reading insightA
DestructiveIdempotent
Inspect

Permanently deletes one reading insight the reader saved in ReadingRate, with the conversation record attached to it. It cannot be undone. A copy the reader's Notion already received stays in their Notion, and the result says so.

Use when the reader asks to delete or forget an insight they saved. Find its id with get_reading_notes, and confirm with the reader which insight they mean before deleting.

Example: {"insight_id": ""}

NameRequiredDescriptionDefault
insight_idYesThe saved insight's id, as get_reading_notes or save_reading_insight returned it

Output Schema

NameRequiredDescription
noteNo
deletedYesTrue when the insight was deleted
summaryNoThe summary that was deleted
insight_idYes
conversation_deletedNoTrue when a conversation record attached to the insight was deleted too

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, yet the description adds non-obvious semantics annotations cannot convey: irreversibility, that the attached conversation record is deleted too, and that a copy already sent to the reader's Notion survives outside ReadingRate. That partial-deletion behavior is exactly the kind of context an agent needs before confirming a destructive call.

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

Conciseness5/5

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

The destructive verb and irreversibility lead, followed by the Notion caveat, then usage guidance and an example. Four short sentences, each carrying distinct information, with nothing repeated.

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

Completeness5/5

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

An output schema exists so return values need no elaboration, and the description still notes that the result reports the surviving Notion copy. For a destructive single-parameter tool it covers impact, prerequisite lookup, and confirmation, leaving no gap an agent would need to guess at.

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

Parameters3/5

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

Schema coverage is 100% and the schema description already explains that the id comes from get_reading_notes or save_reading_insight, so the description largely restates it. The inline example {"insight_id": "<insight id>"} adds a little formatting guidance but no new semantic depth, which matches the baseline 3 for a fully documented single parameter.

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

Purpose5/5

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

Opens with a specific verb and resource ("Permanently deletes one reading insight the reader saved in ReadingRate") and immediately scopes the blast radius ("with the conversation record attached to it"). It is unambiguously distinct from save_reading_insight and get_reading_notes among the siblings.

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

Usage Guidelines5/5

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

Gives an explicit trigger ("when the reader asks to delete or forget an insight they saved"), an explicit prerequisite lookup path ("Find its id with get_reading_notes"), and an explicit safety step ("confirm with the reader which insight they mean before deleting"). No inference required.

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

get_award_winnersBrowse award winnersA
Read-onlyIdempotent
Inspect

Lists the winners, shortlists and longlists of the literary prizes ReadingRate tracks, grouped by year, newest first. The prizes include the Booker Prize, the International Booker Prize, the Pulitzer Prize for Fiction, the National Book Award, the Nobel Prize in Literature, the Women's Prize for Fiction, and the Hugo and Nebula awards. It also holds canonical lists, such as the Modern Library 100, and the set texts of national school curricula and exam boards. Each book links to its ReadingRate analysis.

Use when the user asks who won or was shortlisted for a literary prize, for prize-winning books from a range of years, or which books a list or a school syllabus names. It holds results only, not news about a prize or the organization behind it.

source_type picks the kind of source: "award" for prizes, "list" for canonical lists and publisher series, "curriculum" for school curricula and exam boards. Without it, prizes and lists come back and curricula do not. Each book's award_type and award_kind say which kind of source it came from. A curriculum sets a book for study; it is not a prize the book won.

Examples:

  • {"award": "Booker Prize", "category": "winner", "limit": 10}

  • {"award": "Pulitzer", "year_min": 2020, "year_max": 2024}

  • {"year_min": 2023, "year_max": 2023, "category": "winner"}

  • {"award": "AQA", "source_type": "curriculum"}

NameRequiredDescriptionDefault
awardNoPrize, list or syllabus name, or part of it, e.g. "Booker Prize", "Pulitzer", "Nobel", "Hugo", "AQA". When one source's name matches exactly, only that source is returned.
limitNoMaximum number of books (default 20, max 50)
categoryNoOnly winners, only the shortlist, or only the longlist
year_maxNoLatest prize year to include
year_minNoEarliest prize year to include
source_typeNoOnly prizes ("award"), only canonical lists and publisher series ("list"), or only school curricula and exam boards ("curriculum"). Leave it out for prizes and lists together, without curricula.

Output Schema

NameRequiredDescription
awardsYesAward results grouped by year, most recent first
truncatedYesTrue when more matching recognitions exist than were returned; narrow the year range or raise the limit to see more
total_countYesTotal number of recognitions returned
filters_appliedYesEcho of the filters used (award, year_min, year_max, category, source_type); only set filters appear

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the read-only, idempotent annotations, the description adds meaningful behavior: results are grouped by year newest first, source_type defaults omit curricula unless explicitly requested, each book carries award_type and award_kind, and curricula are study sets not prizes won. It also adds the linkage to ReadingRate analysis, which is external context the annotations cannot provide.

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

Conciseness5/5

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

The definition is front-loaded with what the tool returns, followed by usage guidance, parameter nuances, and examples. The prize enumeration and examples are dense but each earns its place by helping the agent recognize and route relevant queries without scanning the schema.

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

Completeness5/5

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

For a six-parameter, read-only browsing tool with full schema coverage, rich annotations, and an output schema, the description covers purpose, usage triggers, exclusions, default filtering behavior, source-type distinctions, and examples. Nothing essential is missing for correct invocation.

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

Parameters4/5

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

Schema coverage is 100%, so the parameter descriptions already carry the baseline semantics. The description adds value by explaining the default source_type behavior ('prizes and lists come back and curricula do not') and by providing concrete examples that clarify how award, year bounds, and source_type combine.

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

Purpose5/5

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

The description opens with a specific verb and resource: lists winners, shortlists, and longlists of tracked literary prizes, grouped by year newest first. It names the covered prizes and clarifies that each book links to its ReadingRate analysis, so the agent can distinguish this from book-detail or search tools without opening schemas.

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

Usage Guidelines4/5

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

It clearly states the triggering use cases: asking who won or was shortlisted, finding prize-winning books across years, or identifying books named by a list or syllabus. It also excludes news about prizes or organizations, but does not name a sibling alternative when a user needs general book search instead.

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

get_book_clubGet a book clubA
Read-onlyIdempotent
Inspect

Describes one of the reader's ReadingRate book clubs: its description, how many members it has and their usernames and roles, and its five most recent books.

Use when the reader asks about a particular club of theirs: who is in it, or what it has read. Get club_id from list_book_clubs.

Example: {"club_id": ""}

NameRequiredDescriptionDefault
club_idYesThe club's id, from list_book_clubs

Output Schema

NameRequiredDescription
clubNoThe club: id, name, description, cover_image_url, max_members, created_at
membersNoMembers by username and role; is_you marks the reader
member_countNoNumber of members
recent_readsNoUp to 5 most recent club books

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds real behavioral value by bounding the response (exactly five most recent books, member usernames and roles) and by naming the required upstream call for club_id. It omits any note on what happens for invalid or inaccessible club ids, which keeps it below a 5.

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

Conciseness5/5

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

Three compact sentences plus one example, front-loaded with the capability statement before usage and invocation details. Every sentence carries distinct information: what it returns, when to call it, and where the id comes from.

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

Completeness5/5

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

A single-parameter read tool with an output schema, full schema coverage, and rich annotations needs little more. The description still tells the agent what the payload contains and how to obtain the required id, leaving nothing essential unstated.

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

Parameters3/5

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

The single parameter has 100% schema description coverage and the schema already says 'from list_book_clubs,' which the description simply restates. The added JSON example shows the call shape but conveys no new meaning about the parameter's format, source, or failure modes. Baseline 3 is correct when the schema does the work.

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

Purpose5/5

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

Opens with a specific verb and resource ('Describes one of the reader's ReadingRate book clubs') and then enumerates exactly what is returned: description, member count, usernames and roles, and the five most recent books. That enumeration also implicitly separates it from list_book_clubs (ids only) and get_book_club_current_read (current book only), so an agent can pick it without opening the schema.

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

Usage Guidelines4/5

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

Explicit trigger: 'Use when the reader asks about a particular club of theirs: who is in it, or what it has read,' plus the prerequisite chain 'Get club_id from list_book_clubs.' It does not state when NOT to use it or name get_book_club_current_read as the alternative when only the in-progress book is wanted, so it stops short of full routing guidance.

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

get_book_club_current_readGet a book club's current readA
Read-onlyIdempotent
Inspect

Returns the book one of the reader's ReadingRate clubs is reading now, with its reading schedule: each milestone's pages, due date and discussion questions.

Use when the reader asks what their club is reading, how far they should be by now, or for the discussion questions. Get club_id from list_book_clubs.

Example: {"club_id": ""}

NameRequiredDescriptionDefault
club_idYesThe club's id, from list_book_clubs

Output Schema

NameRequiredDescription
readNoThe club's current book
messageNoHuman-readable note when the club has no current book
milestonesNoMilestones in order
milestone_countNoNumber of milestones

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds useful behavioral context by describing the returned schedule shape (milestones with pages, due dates, discussion questions) and the dependency on a club id from another tool, though it says nothing about what happens when a club has no active read or an invalid id.

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

Conciseness5/5

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

Three short sentences plus an example, with the return contents front-loaded and the prerequisite last. Nothing is redundant or padded.

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

Completeness5/5

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

With a full output schema present, the description need not explain return values, yet it still summarizes the payload well enough for the agent to know when this tool answers the user's question. One required parameter, documented provenance, and a usage example leave no meaningful gap.

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

Parameters3/5

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

The single parameter already has 100% schema description coverage ("The club's id, from list_book_clubs"), so the schema does the heavy lifting. The description largely repeats that provenance and adds only a minimal call example, which is marginal value over the structured fields.

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

Purpose5/5

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

The description names a specific verb and resource ("Returns the book one of the reader's ReadingRate clubs is reading now") and enumerates exactly what comes back: each milestone's pages, due date and discussion questions. That content profile cleanly separates it from the broader get_book_club sibling without needing to mention it by name.

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

Usage Guidelines5/5

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

It gives three concrete triggering questions ("what their club is reading, how far they should be by now, or for the discussion questions") plus the prerequisite routing instruction "Get club_id from list_book_clubs", which names the exact sibling that supplies the required argument.

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

get_book_detailsGet book detailsA
Read-onlyIdempotent
Inspect

Gives one book's full ReadingRate analysis and shows its difficulty profile as a radar chart: nine difficulty dimensions and four literary-regard dimensions, each scored 0 to 100 with a written reason, plus the book's description, genres, themes, word count, reading time, authors, awards and editions. awards holds prizes and canonical lists; taught_in holds the school curricula and exam boards that set the book, which are not awards.

Use when the user asks how hard a specific book is, what makes it difficult, how long it takes to read, whether it has won prizes, or for details about it. To find books that match a description, use search_books. To set two or three books side by side, use compare_books.

Identify the book with exactly one of book_id, slug or title_author.

Difficulty dimensions: vocabulary_complexity, syntactic_complexity, abstraction_level and information_density (how hard the prose is); narrative_indirection, symbolic_density, ironic_distance, resolution_withholding and structural_complexity (how hard the meaning is). Regard dimensions: canonical_status, critical_acclaim, literary_influence, author_standing.

Examples:

  • {"slug": "crime-and-punishment"}

  • {"title_author": {"title": "The Great Gatsby", "author": "Fitzgerald"}}

  • {"slug": "beloved", "include_similar": true}

  • {"slug": "war-and-peace", "include_time_estimate": true}

NameRequiredDescriptionDefault
slugNoThe book's ReadingRate slug, e.g. "crime-and-punishment"
book_idNoThe book's ReadingRate id, from another ReadingRate tool's results
title_authorNoThe book's title and author. Close spellings match.
include_similarNoAlso list books similar to this one
include_time_estimateNoAlso estimate how long the book takes to read at the average reader's pace (the reader's own pace is in get_currently_reading)

Output Schema

NameRequiredDescription
idNoWork UUID, for book_id arguments of other tools
slugYes
yearNo
titleYes
awardsNo
genresNo
authorsYes
cover_urlNo
taught_inNoSchool curricula and exam boards that set the book (not awards)
difficultyYes
word_countNo
regard_overallNo
reading_time_minutesNo

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare the tool as read-only, idempotent, and non-destructive. The description adds valuable context about the return content (e.g., radar chart scores with written reasons, awards vs. taught_in distinction) and includes examples of parameter usage, though it does not discuss error cases or rate limits.

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

Conciseness4/5

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

The description is well-structured with front-loaded purpose, followed by usage guidance, identification rules, dimension explanations, and examples. While comprehensive, the list of difficulty and regard dimensions is somewhat lengthy; however, each part serves a clear purpose in helping the agent understand the tool's output.

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

Completeness5/5

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

Given the tool's complexity (many dimensions, nested parameters) and the presence of an output schema, the description provides ample context about what the tool does and when to use it, including all necessary constraints and alternatives. Nothing critical for correct invocation is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the schema describes each parameter. The description adds the crucial constraint that exactly one of book_id, slug, or title_author must be provided, which is not enforced by the schema (none are required). It also implies the optionality of include_similar and include_time_estimate through examples but doesn't elaborate beyond schema descriptions.

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

Purpose5/5

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

The description clearly states the tool provides a book's full ReadingRate analysis, including a difficulty profile as a radar chart with nine difficulty and four literary-regard dimensions, plus metadata like description, genres, word count, etc. It distinguishes itself from siblings by explicitly naming search_books for finding books and compare_books for side-by-side comparison.

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

Usage Guidelines5/5

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

It gives explicit usage scenarios: when the user asks about difficulty, reading time, awards, or details about a specific book. It also names alternatives (search_books for discovery, compare_books for comparison) and states the identification constraint (exactly one of book_id, slug, or title_author).

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

get_currently_readingGet books in progressA
Read-onlyIdempotent
Inspect

Lists the books the reader is reading now, from their ReadingRate library: current page, percent complete, pages left, and the hours left at their own logged reading pace. Also lists poems they have recently read again, with how many times.

Use when the user asks what they are reading, how far along they are in a book, or how long a book they are reading will take them to finish.

For books they have finished or want to read, use get_reading_history.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
booksNoBooks in progress, with progress and time estimates
countNoNumber of books in progress
poemsNoPoems the reader has read again recently, most recent first. return_count is how many times each was read.
summaryNoTotals: total_books, total_pages_remaining, total_hours_remaining, reading_velocity_used
poem_countNoNumber of poems in the poems array

TDQS

A4.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, so the safety profile is covered by structured data. The description's added value is modest but real: it says the pace basis is the user's own logged reading speed and that the result is scoped to their ReadingRate library. It says nothing about what happens with no books in progress (empty list vs error) or about pagination/result size.

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

Conciseness5/5

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

Three short blocks in a deliberate order: what it returns, when to call it, when to call something else. Every clause carries information, including the pace qualifier, and there is no filler or restatement of the title.

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

Completeness5/5

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

Zero parameters, an output schema that documents the return shape, and annotations covering idempotency and read-only safety mean the description only has to explain scope, contents and routing — all of which it does. An agent has everything needed to select and call it correctly.

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

Parameters4/5

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

The tool takes zero parameters, so there is no parameter semantics to explain and the baseline of 4 applies. The description's implicit scoping (the caller's own library) is consistent with there being no filtering inputs.

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

Purpose5/5

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

States a specific verb and resource ('Lists the books the reader is reading now') and enumerates exactly what comes back: current page, percent complete, pages left, and hours left at the reader's own logged pace. It also discloses a non-obvious inclusion (recently re-read poems with counts) and explicitly names the sibling it is not (get_reading_history), so an agent can separate it from the many other reading tools.

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

Usage Guidelines5/5

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

Gives three concrete user-intent triggers ('what they are reading', 'how far along', 'how long ... to finish') and an explicit exclusion plus alternative: 'For books they have finished or want to read, use get_reading_history.' Nothing about routing is left to inference.

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

get_daily_reading_connectionsGet today's reading connectionsA
Idempotent
Inspect

Returns today's connections in the reader's reading: passages from different books they are reading, and from their saved quotes and notes, that share a theme, with the theme named and a question to reflect on. The first call each day creates them: ReadingRate sends a few of those passages to its AI provider to name the theme and write the question, then stores the result in the reader's account and counts it against their ReadingRate AI usage. Later calls the same day return the same connections.

Use when the reader asks what connects their recent reading, or for today's reading connections or reflection prompt.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
themeNoThe theme connecting today's passages
messageNoWhy there is nothing today, when there is not
connectionsNoThe connected passages
generated_atNoWhen today's connections were made
reflection_promptNoA question for the reader to reflect on

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing the non-obvious write behavior: the first call each day sends passages to an AI provider, generates and stores the result in the reader's account, and counts against their AI usage quota, while later calls return the same data. This explains exactly why readOnlyHint=false while idempotentHint=true, and pre-empts surprises about quota consumption.

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

Conciseness5/5

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

Front-loaded with the return value, followed by the side-effect/idempotency fact, then a final usage sentence. Every clause carries information absent from the schema or annotations; the AI-provider detail, though wordy, is precisely the hidden cost an agent needs.

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

Completeness5/5

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

An output schema exists, so the description need not enumerate return fields, yet it still characterizes the shape (theme plus question). Combined with the disclosed first-call generation and quota counting, an agent has everything needed to decide whether to call and what to expect.

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

Parameters4/5

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

The tool takes no parameters, so there is nothing to disambiguate beyond confirming the implicit 'today' scoping, which the description does make clear. The zero-parameter baseline of 4 applies; no additional per-argument meaning is possible.

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

Purpose5/5

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

States a specific verb and resource ('returns today's connections in the reader's reading') and then concretely describes the payload: passages from different books, saved quotes, a named theme, and a reflection question. This is distinguishable from siblings like find_related_passages or compare_books, which operate on explicit inputs rather than the reader's current multi-book state.

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

Usage Guidelines4/5

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

Explicitly names the trigger: 'Use when the reader asks what connects their recent reading, or for today's reading connections or reflection prompt.' That is a clear usage context, but it stops short of naming alternatives or exclusions (e.g., when to prefer find_related_passages for a targeted passage lookup).

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

get_monthly_reading_summaryGet a monthly reading summaryA
Read-onlyIdempotent
Inspect

Returns ReadingRate's summary of one calendar month of the reader's reading: books finished, time and pages read, the difficulty of what they read, highlights, and how the month compares with the year so far. Summaries are made after each month ends.

Use when the reader asks how a particular month of reading went. For any other range of dates, such as a year or a season, use summarize_reading_period.

Example: {"year": 2026, "month": 9}

NameRequiredDescriptionDefault
yearYesThe year, e.g. 2026
monthYesThe month, 1 to 12

Output Schema

NameRequiredDescription
dataNoThe summary: hero, books_read, cognitive_terrain, highlights, year_so_far, growth, daily_words
messageNoWhy there is no summary, when there is none
created_atNoWhen the summary was made

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description still adds genuinely useful behavior the annotations cannot express: 'Summaries are made after each month ends', which warns the agent that a not-yet-complete month may have no summary. It stops short of saying what is returned when no summary exists yet.

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

Conciseness5/5

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

Three short units — what it returns, the availability caveat, when to use it and what to use instead — front-loaded with the scoping constraint. The example is compact and every sentence earns its place.

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

Completeness5/5

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

With an output schema present, the description needn't explain return structure, and it still summarizes the payload. Combined with rich annotations and full parameter documentation, an agent has everything needed to choose and call this correctly.

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

Parameters3/5

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

Schema description coverage is 100% (both year and month are documented with ranges and formats), so the baseline is 3. The description only restates the shape in an example call ({"year": 2026, "month": 9}), which illustrates usage but adds no semantics beyond the schema.

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

Purpose5/5

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

States a specific verb and resource ('Returns ReadingRate's summary of one calendar month of the reader's reading') and enumerates the contents: books finished, time/pages, difficulty, highlights, and year-to-date comparison. That scope statement plus the named alternative makes it unmistakable against summarize_reading_period 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.

Usage Guidelines5/5

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

Explicitly gives the selecting condition ('Use when the reader asks how a particular month of reading went') and names the sibling plus the condition that selects it ('For any other range of dates, such as a year or a season, use summarize_reading_period'). No inference required.

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

get_passages_near_reading_positionGet passages near the reader's positionA
Read-onlyIdempotent
Inspect

Returns passages of text from a book the reader is reading, taken from the pages just before their current position in ReadingRate, with their progress in the book. It finds the book and the page itself, so the reader does not have to name the chapter. With a topic, it returns the passages near their position that are closest to that topic.

Use when the reader asks for help with what they just read: the last chapter, a passage they did not understand, or what the author meant in the part they have reached. To search a whole book for a topic, use search_book_content.

Text is available only for books the reader uploaded their own copy of in the ReadingRate app. For other books the result says the text is not available; the book's scores and analysis are in get_book_details.

Examples:

  • {}

  • {"book_id": "", "topic": "the argument about metempsychosis"}

NameRequiredDescriptionDefault
topicNoWhat the reader wants help with, e.g. "narrative voice"; focuses the passages returned
book_idNoThe book: its ReadingRate id or library entry id (default: the book the reader read most recently)

Output Schema

NameRequiredDescription
bookYesThe book and the user's reading position
noteYesGuidance on how to use the passages (or why none were found)
passagesYesText passages from near the user's reading position
passages_foundYesNumber of passages returned

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive behavior. The description adds meaningful non-obvious context: text availability is limited to books the reader uploaded, and unavailable text is reported in the result with book analysis routed to get_book_details.

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

Conciseness4/5

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

Front-loaded with what it returns, then usage guidance, then availability constraints and examples. It is somewhat verbose, but the structure is clear and each paragraph serves a distinct purpose.

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

Completeness5/5

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

Complete for an agent: it covers retrieval scope, automatic position detection, topical filtering, when to use it versus a sibling, data availability limits, and fallback behavior. An output schema exists, so return-value detail is not required.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters are already documented in the schema. The description adds useful framing about automatic book/page discovery and topical focusing, but does not add format or edge-case detail beyond the schema.

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

Purpose5/5

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

States a specific verb and resource: returns text passages near the reader's current position in ReadingRate. It also distinguishes itself from search_book_content and get_book_details by explaining what it does versus those siblings.

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

Usage Guidelines5/5

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

Explicitly says when to use it: when the reader asks about what they just read, a recent passage they did not understand, or the part they have reached. It also names the alternative, search_book_content, for whole-book topical search.

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

get_personalized_recommendationsGet personalized recommendationsA
Read-onlyIdempotent
Inspect

Recommends books from the ReadingRate catalog for this reader, matched to the difficulty range they usually read, the genres and themes they return to, and their reading pace, with the reasons for each pick and a reading-time estimate at their pace. Books they have already finished are left out. It can draw only from their want-to-read list, leave out genres, or reach a little above their usual difficulty.

Use when the reader asks what to read next, or which books would suit them.

Examples:

  • {}

  • {"from_tbr": true}

  • {"difficulty_stretch": true, "exclude_genres": ["Horror"]}

NameRequiredDescriptionDefault
countNoNumber of recommendations (default 5, max 20)
from_tbrNoRecommend only from the reader's want-to-read list
exclude_genresNoGenres to leave out
difficulty_stretchNoInclude books a little harder than the reader usually reads

Output Schema

NameRequiredDescription
based_onYesProfile data the recommendations were derived from
options_usedYesEcho of the request options (from_tbr, exclude_genres, difficulty_stretch)
recommendationsYesRecommended books, highest match score first

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, closed-world, non-destructive, so the safety bar is low; the description earns credit by adding real behavior beyond that — finished books are excluded, each pick arrives with reasons and a pace-based reading-time estimate, and the pool is the catalog. It does not mention latency, cost, or fallback behavior if the reader has too little history.

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

Conciseness4/5

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

The matching criteria are front-loaded in the first sentence, followed by constraints and a usage cue, with compact examples that demonstrate parameter combinations rather than restating the schema. The first sentence is dense with a long list, but no sentence is redundant.

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

Completeness4/5

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

With a full output schema and complete annotations, the return-shape burden is off the description, and what remains — personalization signals, exclusions, the three mode flags — is covered. The one missing piece is a pointer to when a plain catalog search is the better call, which matters given how many search/read siblings exist.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the prose adds nuance the schema lacks, specifically that difficulty_stretch reaches only 'a little above' the usual range, that from_tbr restricts the candidate pool rather than ranking it, and the examples demonstrate combinations. The count/default-max is left to the schema, which is fine.

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

Purpose5/5

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

The description opens with a specific verb and resource ('Recommends books from the ReadingRate catalog') and immediately scopes it to 'this reader' with named matching signals (difficulty range, genres/themes, reading pace). That clearly separates it from the catalog-search sibling search_books, which has no reader-personalization framing.

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

Usage Guidelines4/5

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

'Use when the reader asks what to read next, or which books would suit them' gives a clear triggering intent, and the three examples show default, TBR-only, and stretch/exclusion configurations. It stops short of naming alternatives (e.g., search_books for a keyword lookup) or stating when not to use it, so it is clear but not exhaustive.

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

get_poemGet poemA
Read-onlyIdempotent
Inspect

Returns the text of a poem in the ReadingRate collection, with numbered lines. Titles, epigraphs, dedications and stage directions are marked apart from the verse. A long work in sections, such as an epic, returns its list of sections unless a section number is given.

Use when the user asks to read or see a specific poem, or part of one. It returns only poems already in the collection; it does not write, continue or translate poems.

Examples:

  • {"identifier": "wyatt/whoso-list-to-hunt"}

  • {"identifier": "milton/paradise-lost", "section": 1}

NameRequiredDescriptionDefault
sectionNoSection number, for a work in sections only. Omit to get the list of sections.
identifierYesThe poem's anchor, "poet/poem" such as "wyatt/whoso-list-to-hunt", or its slug alone, such as "whoso-list-to-hunt"

Output Schema

NameRequiredDescription
noteNoHow to fetch a section, when sections were returned
poemYesIdentity of the work, and the anchor every line hangs off
linesNoThe text, in order. Apparatus lines are marked and carry no line number.
sectionNoSection ordinal, when one was asked for
sectionsNoReturned instead of lines when the work is sectioned and no section was named

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive, closed-world), so the lower bar is met and the description adds genuinely non-obvious behavior: numbered-line output, titles/epigraphs/dedications/stage directions separated from verse, and the rule that a multi-section work yields a section index unless a section number is supplied.

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

Conciseness5/5

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

Front-loaded with the return behavior, then usage, then two compact examples. Every sentence carries information (formatting, section logic, scope limits) with no filler.

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

Completeness5/5

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

With an output schema present, the description needn't restate return fields, and it correctly focuses on behavior an agent can't infer: section-index fallback and content-type marking. Annotations plus schema plus description leave no material gap for correct invocation.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; the description still adds value by tying `identifier` formats to concrete, real-looking examples and by showing the combined identifier+section call. It does not add syntax or constraints beyond the schema, so it stops short of a 5.

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

Purpose5/5

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

Opens with a specific verb and resource ("Returns the text of a poem") and immediately scopes it to the ReadingRate collection. It draws a clear boundary against the sibling search/annotation tools by stating it returns only existing collection poems and does not write, continue or translate.

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

Usage Guidelines5/5

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

Gives an explicit trigger ("when the user asks to read or see a specific poem, or part of one") and explicit exclusions (no writing, continuing or translating). The section-vs-list behavior is also flagged as a usage condition, so the agent knows when to pass `section`.

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

get_poetic_form_masteryGet poetic form masteryA
Read-onlyIdempotent
Inspect

Shows how widely the reader has read poetry in ReadingRate, by poetic form (sonnet, ode, ...), by era and by poet: distinct poems read, total reads and a mastery stage for each.

Use when the reader asks which forms of poetry they have read, or how their poetry reading spreads across eras and poets.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
by_formNoMastery by poetic form (sonnet, ode, ...)
by_poetNoMastery by poet
by_periodNoMastery by era (Classical Antiquity, Medieval, ... Contemporary, Undated)

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, closed-world and non-destructive, so the safety profile is covered. Beyond that the description adds genuine value by disclosing the aggregation axes and that a computed 'mastery stage' is returned per bucket — a non-obvious derived field. No auth, caching, or scope caveats are mentioned, which keeps it short of a 5.

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

Conciseness5/5

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

Two sentences, zero filler. The output shape is front-loaded first and the invocation trigger second, which matches how an agent reads a definition.

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

Completeness4/5

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

With an output schema present and annotations covering safety, the description need not explain return structure, and it is adequate for correct invocation. The one remaining hole is the unresolved boundary with the sibling poetry-stats tool, which could still cause a wrong tool pick.

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

Parameters4/5

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

The tool takes no parameters, so there is no per-parameter meaning to convey; baseline 4 applies. The description correctly implies a single implicit scope (the current reader) without adding confusing pseudo-parameters.

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

Purpose4/5

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

States a specific verb and resource ('shows how widely the reader has read poetry... by poetic form, by era and by poet') and enumerates the returned metrics (distinct poems read, total reads, mastery stage). An agent knows exactly what data this produces. It does not, however, differentiate itself from the close sibling get_poetry_reading_stats, which likely overlaps in subject matter.

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

Usage Guidelines4/5

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

The second sentence gives an explicit trigger: when the reader asks which forms of poetry they have read, or how their poetry reading spreads across eras and poets. That is clear positive guidance, but no exclusion is given against the near-neighbour get_poetry_reading_stats or the broader get_reading_domain, leaving an overlap the agent must guess through.

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

get_poetry_reading_statsGet poetry reading statsA
Read-onlyIdempotent
Inspect

Summarizes the reader's poetry reading in ReadingRate: the poems they keep returning to, ranked by how often and how recently they read each one, with read counts and last-read dates; how many lines they know by heart; and whether they read widely or reread deeply.

Use when the reader asks which poems they keep coming back to, how much poetry they read, or how many lines they know by heart.

Example: {"limit": 10}

NameRequiredDescriptionDefault
limitNoMaximum number of poems in the ranking (default 20)
half_life_daysNoDays for a read to count half as much in the ranking (default 30)

Output Schema

NameRequiredDescription
rotationNoPoems ranked by how often and how recently the reader read them, highest first
lines_by_heartNoDistinct poem lines the reader knows by heart
depth_signatureNoBreadth (distinct poems read) against depth (median rereads within the rotation)
rotation_half_life_daysNoThe half-life used for recency

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/openWorld=false, so safety is covered; the description adds real value by spelling out what the output contains (ranked poems with read counts and last-read dates, breadth-vs-depth judgement). It doesn't explain that half_life_days tunes the recency weighting, which is the one behavioral knob a caller might misjudge.

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

Conciseness4/5

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

Front-loaded with the core verb and output inventory, then a distinct trigger sentence and a compact JSON example — every element earns its place. The first sentence runs long with semicolons, but no content is padding.

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

Completeness4/5

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

With a rich output schema and full annotation coverage, the description need not explain return values or safety, and it appropriately focuses on scope and triggers. The only gap is that the recency-weighting parameter, which shapes the ranking it promises, is left to the schema alone.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters (limit, half_life_days) are already fully documented and the baseline is 3. The description contributes only a small example ({"limit": 10}) and never clarifies half_life_days' effect on ranking, so it adds no meaning beyond the schema.

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

Purpose4/5

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

Uses a specific verb and resource ('Summarizes the reader's poetry reading in ReadingRate') and enumerates the concrete outputs: poems ranked by frequency and recency, heart-known line counts, and breadth-vs-depth. It's clearly differentiated in substance from generic siblings like get_reading_stats or get_top_books, though it never names those siblings explicitly to make the boundary unmistakable.

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

Usage Guidelines4/5

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

The 'Use when the reader asks...' sentence gives three concrete, quotable trigger scenarios (which poems they return to, how much poetry they read, how many lines they know by heart). It stops short of stating when NOT to use it or naming alternatives such as get_reading_stats for prose or general reading.

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

get_reading_daysGet reading daysA
Read-onlyIdempotent
Inspect

Lists the page the reader reached on each day of one reading of a book in their ReadingRate library: for each day, the furthest page, the page they left off at, the pages read and the percent of their copy.

Use when the user asks how far they got each day, how many pages they read on which days, how long a book took them day by day, or wants a chart of their progress through a book. For the books themselves, their status and dates, use get_reading_history.

ReadingRate records each change of page from the time this history began, so days before logged_since are unknown, not unread. Days are counted in timezone: give the reader's IANA time zone when known (for example "Europe/London"); otherwise their notification setting is used, else UTC.

Examples:

  • {"book_id": ""}

  • {"book_id": "", "timezone": "Europe/London"}

  • {"book_id": "", "reading_number": 1}

NameRequiredDescriptionDefault
book_idYesThe book's ReadingRate id or its library entry id
timezoneNoIANA time zone the days are counted in, for example "Europe/London"
reading_numberNoWhich reading: 1 for the first, 2 for a reread. Default: the latest

Output Schema

NameRequiredDescription
bookYesThe book: id, slug, title, authors
daysYesOne entry per day with a page change, oldest first
noteNoWhat the days do and do not cover
statusNoread | reading | want_to_read | stopped | dnf
end_dateNo
timezoneNoThe time zone the days are counted in
start_dateNo
total_pagesNoPrinted pages in the reader's copy, without a roman-numbered introduction; percent counts the whole copy
current_pageNo
logged_sinceNoWhen the first page change of this reading was recorded; days before it are not known
reading_numberNoWhich reading of the book: 1 for the first, 2 for a reread
reverse_numberingNoThe book counts down to page 1: its furthest page each day is the lowest
current_page_labelNocurrent_page as the book prints it, e.g. "liv" or "10"
front_matter_pagesNoRoman-numbered pages at the front of the reader's copy (an introduction numbered i–lx is 60). When set, every page here counts from page i, and the *_label fields give the page as printed

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, yet the description still adds real operational context: history only exists from when logging began, so days before logged_since are unknown rather than unread, and the timezone resolution chain (explicit IANA zone → notification setting → UTC). That is meaningful disclosure beyond the annotations, though it never says what happens if the book_id has no recorded readings.

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

Conciseness4/5

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

Front-loaded with what is returned, then when-to-use, then the data-availability caveat, then examples — a sensible ordering with no filler sentences. The third example is arguably redundant with the schema's default note, but the two non-trivial ones earn their space.

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

Completeness4/5

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

With an output schema present, return-value exposition is unnecessary and correctly omitted; the description covers scope, alternatives, timezone resolution, and the log-start data gap. The only loose thread is that `logged_since` is referenced without being defined, and behavior for an out-of-range `reading_number` is unaddressed.

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

Parameters4/5

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

Schema coverage is already 100%, so the schema documents the three params; the description still adds value by explaining the fallback behavior behind `timezone` and by exemplifying its format. The `reading_number` default (latest) is only stated in the schema, so the description adds no extra there.

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

Purpose5/5

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

States a specific verb and resource — per-day page/progress records for a single reading of one book — and enumerates the exact fields returned (furthest page, page left off, pages read, percent). It explicitly routes the reader to get_reading_history for the book-level metadata, so it is unmistakable against siblings like get_reading_stats or get_reading_trajectory.

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

Usage Guidelines5/5

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

Gives four concrete trigger questions ('how far they got each day', 'how many pages on which days', 'how long a book took day by day', 'wants a chart of their progress') and names the alternative tool plus the condition that selects it. No inference required.

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

get_reading_domainGet a reading domainA
Read-onlyIdempotent
Inspect

Describes the reader's progress in one reading domain in ReadingRate: their mastery stage, books, words and hours read, quotes and reflections, and what the next stage requires.

Use when the reader asks about their progress in a particular genre, culture, period or theme, or what it takes to reach the next stage. Get domain_id from list_reading_domains.

Example: {"domain_id": ""}

NameRequiredDescriptionDefault
domain_idYesThe domain's id, from list_reading_domains

Output Schema

NameRequiredDescription
axisNogenre | cultural | period | thematic | compound | user
nameNo
slugNo
metricsNoProgress metrics
domain_idNo
is_focusedNoWhether the reader made this a focus domain
next_stageNoThe next stage, or null at expert
work_countNoBooks in the catalog in this domain
descriptionNo
mastery_stageNonewcomer | exploring | well_read | analytical | expert
stage_progressNoProgress toward the next stage
next_stage_boostsNoOptional signals that speed up the next stage, each { current, required, met }. Each one met lowers the requirements by 10%, up to 30%
requirement_reductionNoFraction (0-0.3) the met boosts currently take off the requirements
next_stage_requirementsNoBooks and weighted words needed for the next stage, each { current, required, met }, already reduced by met boosts

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world, so the safety profile is fully covered and an output schema exists for return values. The description's added value is the domain-id provenance for list_reading_domains and the shape of what's returned, which is mild — it doesn't mention scoping, empty/unstarted domains, or behavior for an invalid id.

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

Conciseness4/5

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

Front-loaded with the purpose sentence, then usage, then prerequisite, then a compact example — no wasted prose. The example JSON duplicates information already implied by the schema, a minor redundancy.

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

Completeness4/5

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

An output schema and rich annotations are present, and the description supplies trigger context and id provenance, so an agent has what it needs to call it correctly. The only remaining gap is routing vs. get_poetic_form_mastery / get_reading_stats for overlapping progress questions.

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

Parameters3/5

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

Schema coverage is 100% for the single parameter, and the schema text itself already says 'from list_reading_domains', so the description's provenance hint is largely redundant. The inline example call adds only marginal clarity. Baseline 3 is appropriate when the schema does the work.

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

Purpose4/5

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

States a specific verb and resource (describes the reader's progress in one reading domain) and enumerates the payload: mastery stage, books, words/hours, quotes, reflections, next-stage requirements. That clearly separates it from list_reading_domains (enumerates domains) and get_reading_stats (aggregate stats). It doesn't explicitly distinguish itself from the adjacent get_poetic_form_mastery, which covers a similar mastery concept, so not a full 5.

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

Usage Guidelines4/5

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

Gives an explicit trigger ('when the reader asks about their progress in a particular genre, culture, period or theme, or what it takes to reach the next stage') plus the prerequisite that domain_id comes from list_reading_domains. No when-not guidance or explicit alternative for aggregate stats, so short of 5.

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

get_reading_goalsGet reading goal progressA
Read-onlyIdempotent
Inspect

Shows the reader's yearly book goal from ReadingRate and their progress toward it: books finished, books left, whether they are on track, the pace needed, and books finished per month. When no goal is set, it says so and suggests one from their past reading. It does not set a goal.

Use when the user asks how they are doing on their reading goal, whether they are on track, or how many books they have read this year.

NameRequiredDescriptionDefault
yearNoThe goal year (default: the current year)

Output Schema

NameRequiredDescription
goalNotarget_books, books_read, progress_percent, books_remaining, days_remaining, pace_needed_per_month, on_track, projected_finish
yearNoThe goal year
statusNoOne-line summary of progress
goal_setNoWhether the reader has set a goal for the year
suggestionNoA goal suggested from past reading, when none is set
monthly_breakdownNoBooks finished per month: month, books_read

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so safety is covered; the description adds real behavior beyond that: what happens when no goal exists (it says so and proposes one from past reading) and that the tool is non-mutating. It does not mention auth or rate limits, but for a local read-only tool those are minor.

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

Conciseness4/5

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

Front-loaded with what the tool returns, then the no-goal fallback, then the usage trigger — a sensible ordering with no filler. The enumerated return fields partially duplicate the output schema, which is the only wasted space.

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

Completeness4/5

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

With an output schema present, the description needn't explain return values, and annotations cover the safety profile; the single optional param is fully documented in schema. What remains is that year-scoping behavior (e.g., querying a past year's goal) is never addressed in prose.

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

Parameters3/5

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

Only one parameter and schema coverage is 100%, with the default (current year) documented in the schema itself. The description never mentions the year parameter, so it adds no semantics beyond the schema — baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource (yearly book goal + progress) and enumerates exactly what is reported: books finished, books left, on-track status, required pace, books per month. It also draws a hard boundary — 'It does not set a goal' — which separates it from any goal-mutation tool, and the yearly-goal framing distinguishes it from get_reading_stats and get_reading_trajectory.

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

Usage Guidelines4/5

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

The 'Use when...' sentence gives three concrete user phrasings (how am I doing on my goal, am I on track, how many books this year) that map cleanly to invocation. The exclusion 'It does not set a goal' is stated, but no sibling is named as the alternative for adjacent questions like general reading stats or monthly summaries.

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

get_reading_historyGet reading historyA
Read-onlyIdempotent
Inspect

Lists the books in the reader's ReadingRate library with their status (read, reading, want to read, stopped), rating, start and finish dates, and the reader's own reflection, newest activity first.

Use when the user asks what they have read or finished, what is on their want-to-read list, how they rated a book, or which of a set of books they have already read.

Filter with status. Set include_sessions to add the reading sessions logged for each book.

NameRequiredDescriptionDefault
limitNoMaximum number of books (default 50, max 100)
statusNoOnly books with this status. Omit for all.
include_sessionsNoInclude the reading sessions logged for each book (default false)

Output Schema

NameRequiredDescription
statsNoSummary counts: total_books, by_status
filterNoThe filters applied: status, limit, include_sessions
historyNoBooks in the reader's library, newest activity first

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world, so safety is covered. The description adds genuinely new behavioral context beyond that: results are ordered by newest activity, status is an optional filter with 'omit for all' semantics, and include_sessions toggles an expansion per book. Pagination cursor behaviour is not mentioned, but limit is schema-documented.

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

Conciseness5/5

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

Three short paragraphs: what it returns first, when to call it second, how to shape the response third. No filler words, no restatement of the title, and the most decision-relevant information is front-loaded.

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

Completeness5/5

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

With a full output schema and rich annotations carrying safety, defaults, and closed-world semantics, the description only needs to add ordering, use cases, and filter intent, all of which it does. Nothing an agent needs in order to call this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns a point by framing status as an optional filter (omit for all) and clarifying that include_sessions expands each book with its logged sessions rather than filtering results. It does not add format or syntax detail beyond the schema, but it clarifies intent, not just restates names.

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

Purpose5/5

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

The first sentence names a specific verb (lists) and resource (books in the reader's library) and enumerates the returned fields: status, rating, start/finish dates, reflection, plus ordering (newest activity first). This distinguishes it clearly from get_reading_stats, get_top_books, and get_currently_reading, which summarize rather than enumerate library entries.

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

Usage Guidelines4/5

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

The 'Use when' paragraph gives four concrete trigger scenarios (what they've read, want-to-read list, ratings, whether specific books were read), which is strong positive routing. It never names an alternative sibling or a 'when not to use' boundary, so an agent must still infer when to prefer get_currently_reading over this tool.

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

get_reading_notesGet reading notesA
Read-onlyIdempotent
Inspect

Returns what the reader has noted about their reading in ReadingRate: their highlights and notes, insights ReadingRate generated about their reading, and the reading insights they saved, each with its id. Pass book_id for one book's notes, or insight_query to get the saved insights closest to a topic, from any book.

Use when the reader asks what they thought or noted about a book, for their highlights, what they concluded in an earlier discussion, or which saved insight to delete. To search the text of a book, use search_book_content.

Examples:

  • {"book_id": ""}

  • {"insight_query": "unreliable narrators"}

NameRequiredDescriptionDefault
limitNoMaximum number of highlights and notes (default 10, max 50)
book_idNoOnly this book: its ReadingRate id or library entry id
insight_queryNoA topic; returns the saved insights closest to it in meaning, from any book

Output Schema

NameRequiredDescription
quotesNoThe reader's highlights and notes, newest first (one book's when book_id is given)
insightsNoInsights ReadingRate generated about the reader's reading, newest first
bookContextNoWhen book_id is given: title, author, pagesRead, totalPages, startedAt
insight_queryNoThe insight_query used, when one was given
readingProfileNoquoteCount, lastQuoteAt
conversation_insightsNoReading insights the reader saved (with save_reading_insight or in the app). Newest first, or closest to insight_query when it is given. Scoped to the book when book_id is given and insight_query is not.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, so the safety profile is covered. The description adds value by describing the shape of the result (items 'each with its id'), which is what enables the agent to chain into delete_reading_insight, and by explaining that insight_query searches across books. Pagination/limit defaults are left to the schema, which is acceptable.

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

Conciseness4/5

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

Front-loaded with the return content, then usage guidance, then the alternative, then examples — a sensible ordering with little waste. The example block is mildly redundant with the sentence above it, but short enough not to be bloat.

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

Completeness5/5

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

An output schema exists, so return fields need no re-explanation, yet the description still summarizes what is returned and why the ids matter. Combined with the routing guidance and the zero-required-parameter flexibility (both filters optional), an agent has everything needed to call this correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns extra by explaining the semantic difference between the two filters ('Pass book_id for one book's notes, or insight_query to get the saved insights closest to a topic, from any book') and by giving two concrete example payloads. It does not discuss how the two parameters interact if both are supplied, which keeps it from a 5.

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

Purpose5/5

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

The first sentence names the specific resource (the reader's highlights, notes, generated insights, and saved insights) with their ids, so the agent knows exactly what data is returned. It is clearly distinguishable from search_book_content (searches book text) and delete_reading_insight (deletes one), which are the two closest siblings.

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

Usage Guidelines5/5

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

Explicit 'Use when the reader asks what they thought or noted about a book...' clause names the triggering intent, and the closing sentence names the alternative ('To search the text of a book, use search_book_content'). The mention of 'which saved insight to delete' also routes the agent toward the delete flow.

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

get_reading_statsGet reading statisticsA
Read-onlyIdempotent
Inspect

Summarizes the reader's ReadingRate reading record: reading speed from their logged sessions, the difficulty range they usually read, their most-read genres and themes, books per month, and how they rate books.

Use when the user asks how fast they read, what difficulty suits them, what genres or themes they read most, or how their ratings are spread.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
velocityNopages_per_hour, words_per_minute, confidence, description
reading_paceNobooks_per_month, pages_per_day, most_active_period
total_books_readNoNumber of finished books
genre_preferencesNoTop genres with count, percentage, average_rating
theme_preferencesNoRecurring themes with count, appeal_score
rating_distributionNoCounts and percentages per 1-5 rating
difficulty_comfort_zoneNomin, max, average, description

TDQS

A3.9/5.0
Behavior3/5

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

The annotations already establish that this is a read-only, idempotent, non-destructive, closed-world operation. The description adds useful scope by naming the metrics summarized, but it does not disclose whether the record is all-time or filtered, how fresh the data is, or any behavioral limits beyond what the annotations and output schema likely provide.

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

Conciseness5/5

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

The description is two sentences with no wasted framing. The purpose and metric list come first, and the usage guidance follows immediately, making it well front-loaded for quick agent parsing.

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

Completeness4/5

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

With no parameters, rich annotations, and an output schema, the description is largely complete for invocation. The remaining gap is sibling differentiation: it does not clarify how this differs from poetry reading stats, monthly reading summaries, or reading trajectory tools, which could matter for an agent selecting among similar statistics tools.

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

Parameters4/5

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

The tool takes no parameters, so there are no parameter semantics to explain. Per the rubric, a zero-parameter tool receives a baseline of 4; the description does not need to compensate for an input schema gap.

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

Purpose4/5

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

The description uses a specific verb (summarizes) and resource (the reader's ReadingRate reading record), then enumerates the concrete metrics covered: reading speed, difficulty range, genres/themes, books per month, and rating distribution. It is clear what the tool produces, but it does not explicitly distinguish itself from close siblings such as get_poetry_reading_stats, get_monthly_reading_summary, or get_reading_trajectory.

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

Usage Guidelines4/5

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

The second sentence gives clear contextual triggers: use when the user asks how fast they read, what difficulty suits them, what genres or themes they read most, or how their ratings are spread. It does not name alternatives or state when not to use it, but the usage context is explicit enough for an agent to recognize the intended calls.

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

get_reading_trajectoryGet reading-pattern insightsA
DestructiveIdempotent
Inspect

Returns written insights about how the reader's reading has been changing: genres they are exploring, authors they return to, their pace, and how their themes are shifting. When none are current, ReadingRate generates them first: it sends the reader's past year of finished books (titles, authors, genres, themes, ratings and dates) to its AI provider, stores the new insights in the reader's account for seven days in place of the earlier ones, and counts the generation against the reader's ReadingRate AI usage. Generating takes several seconds and happens at most once a day.

Use when the reader asks about their reading patterns, trends or trajectory. For numbers such as pace and genres, use get_reading_stats.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
messageNoWhy there are no insights, when there are none
insightsNoInsights about the reader's patterns, newest first
insight_countNoNumber of insights returned

TDQS

A4.9/5.0
Behavior5/5

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

The description goes well beyond the annotations by explaining that insights may be generated on demand using the reader's past year of finished books, sent to an AI provider, stored for seven days in place of earlier insights, and counted against AI usage. It also warns that generation takes several seconds and occurs at most once per day, which aligns with the destructiveHint=true and readOnlyHint=false annotations.

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

Conciseness5/5

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

The purpose is front-loaded, followed by operational context and a clear alternative route. The extra detail about generation cost and frequency is valuable rather than redundant, and no sentence is wasted.

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

Completeness5/5

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

The description covers purpose, usage conditions, generation behavior, side effects, cost, cadence, and the best sibling alternative. With an output schema present, it does not need to describe return values, and the annotations are reinforced rather than repeated.

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

Parameters4/5

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

The tool has zero input parameters and an empty schema, so there are no parameter semantics to clarify. The description appropriately focuses on behavior rather than input details.

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

Purpose5/5

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

The description states a specific verb and resource: it returns written insights about how the reader's reading has been changing across genres, authors, pace, and themes. It also distinguishes itself from the closest sibling by saying that numeric pace and genre data belong to 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.

Usage Guidelines5/5

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

It explicitly says when to use the tool: when the reader asks about reading patterns, trends, or trajectory. It also names the alternative for numeric data, get_reading_stats, giving a clear routing rule.

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

get_top_booksTop-ranked booksA
Read-onlyIdempotent
Inspect

Returns the top of one of the ranked book lists published on readingrate.com: the highest-ranked books from a country, in an original language, of a genre or on a subject, by women or by men, or at a difficulty. With no filter it returns ReadingRate's curated canon of 100, ranked by hand. Every other list is computed from literary-regard scores (canonical status, critical acclaim and influence), not readers' votes. Each answer gives the list's page address.

Use when the user asks for the top, greatest or most important books of a country, a language, a genre, a period or a theme, for a ranked reading list, or for the hardest or easiest great books. For books matching a search, use search_books; for prize results, use get_award_winners.

Filters combine: {"country": "Japan", "author_gender": "female"} ranks books by Japanese women. A country or language with no list page is still ranked when the catalog holds books from it, and the answer says how many books the list holds.

Examples:

  • {"country": "Japan", "limit": 10}

  • {"country": "Nigeria"}

  • {"language": "Russian", "genre": "short-fiction"}

  • {"subject": "death-mortality"}

  • {"subject": "victorian-19th-century-literature", "author_gender": "female"}

  • {"difficulty": "hardest", "limit": 5}

  • {}

NameRequiredDescriptionDefault
genreNoA genre: literary-fiction, historical-fiction, romance, fantasy, science-fiction, mystery-crime, thriller, horror, satire-humor, coming-of-age, short-fiction, war-fiction, poetry, drama, memoir, biography, essays, philosophy, history, science, politics-society, psychology-self, religion, childrens, young-adult, graphic-novels, lgbtq, nonfiction
limitNoHow many books from the top of the list (default 10, max 100)
countryNoThe authors' country, e.g. "Japan", "United States", "Nigeria". These have list pages: Italy, Russia, France, Japan, the United States, Britain, Ireland, Germany, Canada, Spain, Poland, India, China, Australia, Norway, Sweden, Nigeria, Austria, South Africa. Another country is ranked from the books the catalog holds by its authors.
subjectNoA period, theme, region or movement, by name or slug, e.g. "death-mortality", "war-conflict", "victorian-19th-century-literature", "magical-realism", "african-literature". A word from the name is enough when it names one ("gothic"). An unknown subject returns the full list of subjects.
languageNoThe original language, e.g. "French". These have list pages: French, Spanish, Russian, German, Chinese, Italian, Japanese, Polish.
difficultyNoA difficulty band ("easy" under 45 of 100, "moderate" 45 to 64, "challenging" 65 and over), still ranked by literary regard; or "hardest" for the hardest books with high literary regard, ranked by difficulty
author_genderNoOnly books by women, or only books by men

Output Schema

NameRequiredDescription
listYesThe list the books come from
noteNoPresent when the list is short, empty, or has no page
booksYesThe top of the list, in rank order
countYesNumber of books returned
filters_appliedYesEach filter as it was matched, e.g. country: Japan; only set filters appear

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, openWorld=false), and the description adds real behavioral context beyond them: that every non-canon list is computed from literary-regard scores rather than readers' votes, that a country or language lacking a list page is still ranked from catalog holdings, that the answer reports how many books the list holds, and that an unknown subject returns the full subject list. These are non-obvious behaviors an agent could not infer from 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.

Conciseness4/5

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

Well front-loaded: purpose first, then usage and alternatives, then combination semantics, then examples. The seven examples are somewhat redundant with the 100%-covered schema and push the definition long, but each sentence in the prose section carries information.

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

Completeness5/5

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

An output schema exists, so return values need not be explained, yet the description still notes that each answer gives the list's page address and list size. With zero required parameters, an open filter model, and a documented default (curated canon of 100), an agent has everything needed to call this correctly.

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

Parameters4/5

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

Schema coverage is 100%, so per-parameter meaning is already documented in detail (enumerated genres, difficulty bands, which countries/languages have list pages). The description's added value is the combination rule ('Filters combine: {country: Japan, author_gender: female} ranks books by Japanese women') and the fallback for unknown subjects, which the schema does not state. The examples demonstrate valid cross-parameter combinations but repeat values already in the schema.

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

Purpose5/5

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

Opens with a specific verb and resource ('Returns the top of one of the ranked book lists published on readingrate.com') and immediately enumerates the axes (country, language, genre, subject, gender, difficulty) plus the no-filter default of the curated canon of 100. An agent can distinguish this from search_books and get_award_winners without opening any schema.

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

Usage Guidelines5/5

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

Explicitly states when to use it ('top, greatest or most important books of a country, a language, a genre, a period or a theme... or for the hardest or easiest great books') and names both alternatives with their selecting conditions ('For books matching a search, use search_books; for prize results, use get_award_winners'). The worked examples reinforce the routing.

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

list_book_clubsList book clubsA
Read-onlyIdempotent
Inspect

Lists the ReadingRate book clubs the reader belongs to, with their role in each and the book each club is reading now.

Use when the reader asks about their book clubs or what their clubs are reading. For one club's members and past books, use get_book_club; for its current book's schedule and discussion questions, use get_book_club_current_read.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
clubsNoThe reader's clubs with their role and each club's current book
messageNoHuman-readable note when the reader is in no club
club_countNoNumber of clubs the reader belongs to

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so safety is covered. The description contributes scope behavior ('the reader belongs to' — membership-limited, personal view) and previews what each entry carries (role, current book). It doesn't mention empty-state behavior or whether clubs the reader merely follows are included, which keeps it from a 5.

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

Conciseness5/5

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

Two sentences: one defines the return, one routes the agent. The core definition is front-loaded and every clause earns its place, with no restatement of the title.

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

Completeness5/5

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

A parameterless read with an output schema, so return structure needn't be spelled out; the description still summarizes the payload (role per club, current book). Combined with full annotation coverage, an agent has everything needed to call it correctly.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate; the 4 baseline applies. No misleading hints about filtering or pagination are introduced.

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

Purpose5/5

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

States a specific verb+resource ('Lists the ReadingRate book clubs the reader belongs to') and adds scope details: the reader's role in each and each club's current book. That scope wording alone separates it from get_book_club and get_book_club_current_read without opening a schema.

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

Usage Guidelines5/5

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

Explicit trigger ('Use when the reader asks about their book clubs or what their clubs are reading') followed by two named alternatives with the exact condition that selects each. Nothing about routing is left to inference.

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

list_quotes_due_for_reviewList quotes due for reviewA
Read-onlyIdempotent
Inspect

Lists the reader's saved quotes and memorized poem passages that are due for review today in ReadingRate's spaced-repetition practice, earliest first, with how many poem lines they know by heart.

Use when the reader asks to be quizzed on their quotes or passages, what is due for review, or how many lines they know by heart. After the reader answers, grade each one with record_quote_review.

Example: {"limit": 5}

NameRequiredDescriptionDefault
limitNoMaximum number of items (default 5, max 20)

Output Schema

NameRequiredDescription
quotesNoQuotes and poem passages due for review, earliest due first
messageNoHuman-readable note when nothing is due
due_countNoNumber of quotes and passages due
lines_by_heartNoDistinct poem lines the reader currently knows by heart, across memorized passages in good standing

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so safety is covered. The description adds non-obvious behavioral context beyond that: result ordering ('earliest first'), that each item carries a known-lines-by-heart figure, and that grading is a separate mutation via record_quote_review. It does not discuss empty-result behavior or pagination beyond the limit, keeping it short of a 5.

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

Conciseness5/5

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

Two tight sentences plus a compact example, with the scoping and ordering facts front-loaded and the follow-up tool named last in workflow order. No sentence is filler.

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

Completeness4/5

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

For a read-only, single-optional-param tool with an output schema and full annotations, the description covers purpose, trigger, ordering, and the next step, so an agent can invoke it correctly. Minor omissions (what an empty due-list looks like, whether limit truncates silently) are low-risk given the output schema.

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

Parameters3/5

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

With 100% schema description coverage and a single optional 'limit' param already documented as default 5 / max 20, the schema does the heavy lifting. The description's only addition is an illustrative call, {"limit": 5}, which adds marginal clarity but no new semantics; baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb ('Lists') and a precisely scoped resource: saved quotes and memorized poem passages that are due for review today in spaced-repetition practice, ordered earliest first, with known-lines counts. The 'due for review today' qualifier cleanly separates it from list_saved_quotes, so an agent can route correctly without opening either schema.

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

Usage Guidelines5/5

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

Gives explicit trigger conditions ('reader asks to be quizzed... what is due for review... how many lines they know by heart') and names the follow-up tool, record_quote_review, with the condition that selects it ('after the reader answers'). Both when-to-use and the alternative path are stated, not implied.

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

list_reading_domainsList reading domainsA
Read-onlyIdempotent
Inspect

Lists the reading domains (genres, cultures, periods and themes) the reader has made progress in through ReadingRate, with their mastery stage in each (newcomer, exploring, well read, analytical, expert), books completed and time spent. Up to 50 domains, the deepest first.

Use when the reader asks what areas they have read deeply in, what they know most about, or how their domain progress looks. For one domain's full metrics and what the next stage needs, use get_reading_domain. For poetic forms, use get_poetic_form_mastery.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
noteNoPresent when some domains were left out
domainsNoUp to 50 domains, focus domains first, then by books completed
messageNoHuman-readable note when the reader has no domain progress yet
total_domainsNoNumber of domains with progress

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already establish that this is a safe, read-only, idempotent operation, and the description adds useful behavioral scope: up to 50 domains, deepest first. It does not discuss pagination or truncation beyond the 50-item cap, but that is a minor gap for this kind of list tool.

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

Conciseness5/5

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

The description is front-loaded with the core resource and contents, then follows with usage guidance and alternatives. Every sentence adds distinct information with no repetition or filler.

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

Completeness5/5

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

With a full output schema, complete annotations, zero parameters, and clear alternatives, the description supplies everything needed to choose and invoke the tool correctly. Its remaining omissions are minor and not necessary for correct use.

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

Parameters4/5

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

The tool takes zero parameters, so there is no parameter semantics for the description to explain. The baseline for a parameterless tool is 4, and the description correctly does not invent parameter details.

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

Purpose5/5

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

States a specific verb and resource: lists the reader's reading domains, including what is reported in each and the ordering. It clearly distinguishes this aggregate list from get_reading_domain and get_poetic_form_mastery.

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

Usage Guidelines5/5

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

Explicitly names when to use it: when the reader asks what areas they have read deeply in, know most about, or how domain progress looks. It also names two alternatives and the conditions that select them.

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

list_saved_quotesList saved quotesA
Read-onlyIdempotent
Inspect

Lists the quotes and passages the reader has saved in ReadingRate, newest first, with page, speaker, notes and themes. Can be narrowed to one book or to quotes containing given words.

Use when the user asks for their saved quotes or highlights, or for what they saved from a particular book.

Example: {"book_id": "", "search": "memory"}

NameRequiredDescriptionDefault
limitNoMaximum number of quotes (default 50, max 100)
searchNoOnly quotes containing these words
book_idNoOnly quotes from this book: its ReadingRate book id or library entry id

Output Schema

NameRequiredDescription
countNoNumber of quotes returned
quotesNoSaved quotes, newest first

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description's job is to add ordering and scope – which it does with 'newest first' and the two narrowing modes. Defaults and pagination limits are only in the schema, which is an acceptable but minor gap.

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

Conciseness4/5

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

Three tight elements: capability, use case, example – front-loaded and waste-free. The example string is slightly redundant with a fully documented schema, but it usefully illustrates combining book_id and search.

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

Completeness4/5

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

With an output schema present, return values needn't be enumerated; the description nonetheless previews page, speaker, notes and themes, which helps the agent decide whether the result answers the user's question. What remains unstated – default limit behavior, whether search is full-text or substring – is minor for a simple read tool.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description adds value by explaining that narrowing can be to one book OR to quotes containing given words, and by supplying a combined example with two parameters. That gives an agent a sense of how filters compose beyond the per-field schema text.

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

Purpose4/5

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

States a specific verb and resource ('lists the quotes and passages the reader has saved'), plus ordering ('newest first') and returned fields. It is clear what the tool returns, but it never names or contrasts the closest sibling (list_quotes_due_for_review), leaving that distinction to be inferred.

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

Usage Guidelines4/5

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

'Use when the user asks for their saved quotes or highlights, or for what they saved from a particular book' gives a concrete trigger and scope. It stops short of stating exclusions (e.g., that review-queue quotes belong to list_quotes_due_for_review), so it is clear guidance without full routing.

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

log_poem_readLog poem readAInspect

Records that the reader read a poem from the ReadingRate collection, adding one read to its count. Poems the reader returns to often rank higher in get_poetry_reading_stats, and recent reads can feature in their daily reading connections. A work in sections, such as an epic, is logged one section at a time.

Use when the reader says they read or reread a poem, or asks to mark one as read. Each call adds one more read.

Examples:

  • {"identifier": "wyatt/whoso-list-to-hunt"}

  • {"identifier": "milton/paradise-lost", "section": 1}

NameRequiredDescriptionDefault
sectionNoSection number; required for a work in sections
identifierYesThe poem's anchor ("poet/poem") or slug, as for get_poem

Output Schema

NameRequiredDescription
poemNo
anchorYesWhat was logged: the whole work, or one section of it
read_atNoISO 8601
successYes
read_countYesTimes the reader has now read this poem

TDQS

A4.5/5.0
Behavior4/5

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

Goes beyond the annotations by naming downstream effects: reads feed get_poetry_reading_stats rankings and daily reading connections. 'Each call adds one more read' reinforces the non-idempotent behavior declared in annotations with a concrete consequence. It stops short of describing failure modes (e.g., unknown identifier) for a mutation, so not a 5.

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

Conciseness5/5

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

Front-loaded with the core action, then usage trigger, then behavioral consequence, then compact examples. Every sentence carries information and nothing is redundant.

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

Completeness5/5

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

For a 2-parameter mutation with full annotations and an output schema, the definition covers what it does, when to invoke it, side effects, and the section handling rule. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so 3 is the baseline; the description earns above that by giving worked examples of both the identifier-only and identifier+section call shapes, clarifying the 'poet/poem' anchor format by reference to get_poem.

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

Purpose5/5

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

Specific verb and resource: 'Records that the reader read a poem from the ReadingRate collection, adding one read to its count.' This clearly separates it from log_reading_session (session-level) and save_poem_line (saving a line rather than a read event).

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

Usage Guidelines4/5

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

Explicit trigger conditions: 'Use when the reader says they read or reread a poem, or asks to mark one as read,' plus the constraint that multi-section works are logged one section at a time. It does not explicitly name an alternative sibling (e.g., log_reading_session) for contrast, so a 4 rather than 5.

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

log_reading_sessionLog a reading sessionA
Destructive
Inspect

Logs reading for a book in the reader's ReadingRate library: pages read, the page they reached, or a note. It sets the book's current page, adds the pages to today's entry in their reading journal, and adds the note to that entry. One journal entry per book per day: a second call the same day extends that day's pages and appends the note. A book on the want-to-read list moves to reading.

Use when the user says how many pages they read, which page they are on, or wants a thought about today's reading saved with it. For a book not yet in their library, use add_book_to_library first.

Give pages_read (pages read since the last log), current_page (the arabic page reached) or roman_page (a page of an introduction or preface numbered in roman numerals), only one of them; a note can be sent alone. Each call logs again, so do not repeat a call that succeeded.

Introductions numbered i, ii, iii… count. When the reader says their copy's introduction runs to a roman page (for example lx), send front_matter_ends_on with it, alone or with the page; the copy keeps it, and later arabic pages count after it. "0" means the copy has none, or the reader skipped it, which takes its pages back out.

Examples:

  • {"book_id": "", "pages_read": 30}

  • {"book_id": "", "current_page": 150}

  • {"book_id": "", "front_matter_ends_on": "lx", "roman_page": "liv"}

  • {"book_id": "", "notes": "The argument only lands once you have read the footnotes."}

NameRequiredDescriptionDefault
notesNoThe reader's note on today's reading, added to today's journal entry
book_idYesThe book's ReadingRate id or its library entry id
pages_readNoPages read in this session, added to the current page
roman_pageNoThe page the reader is now on in the book's roman-numbered introduction or preface, such as "liv"
current_pageNoThe page the reader is now on, as printed in arabic numerals
front_matter_ends_onNoThe last roman-numbered page of the reader's copy, such as "lx" (or 60); "0" when it has none or they skipped it

Output Schema

NameRequiredDescription
bookNoThe book: id, slug, title, authors
messageYesHuman-readable result
successYesWhether the session was logged
estimateNohours_remaining and description; null when the total pages are unknown
progressNocurrent_page (the stored position, counted from page i when the copy has roman front matter), page_label (the page as the book prints it, e.g. "liv" or "10"), front_matter_pages, total_pages (printed pages of the reader's copy, without a roman introduction: show page_label of total_pages), percent_complete and pages_remaining (over the whole copy)
velocity_usedNoPages per hour used for the estimate
status_changedNoSet when the book moved from want-to-read to reading

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations, the description discloses concrete state effects: one journal entry per book per day, second call extends that day's pages and appends notes, want-to-read books transition to reading, and front_matter_ends_on is persisted so later arabic pages count after it. It reinforces the non-idempotent annotation with an explicit caution against repeating successful calls.

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

Conciseness4/5

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

Front-loaded with purpose, then usage, then parameter rules, then compact JSON examples — a sensible ordering. It is dense but nearly every sentence carries a rule; only minor overlap exists between the prose about setting the current page and the parameter descriptions.

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

Completeness5/5

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

With an output schema present, the description needn't explain return values, and it covers the remaining ground: triggers, prerequisites, mutual exclusivity, roman-numeral edge cases, and duplicate-call risk. Nothing an agent needs to invoke this mutation correctly is missing.

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

Parameters5/5

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

Schema coverage is 100%, but the description adds rules the schema does not encode: pages_read/current_page/roman_page are mutually exclusive ('only one of them'), a note may be sent alone, and roman numbering for introductions must be recorded via front_matter_ends_on with special '0' semantics that removes those pages. These are real constraints, not restatements.

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

Purpose5/5

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

Specific verb and resource ('Logs reading for a book in the reader's ReadingRate library') plus a precise enumeration of side effects: sets current page, adds pages to today's journal entry, appends note, and moves want-to-read books to reading. This clearly separates it from siblings like update_book_status or save_reading_insight, which do not log session pages.

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

Usage Guidelines5/5

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

'Use when the user says how many pages they read, which page they are on, or wants a thought about today's reading saved with it' gives an explicit trigger condition. It also names the prerequisite alternative ('For a book not yet in their library, use add_book_to_library first') and a negative instruction ('do not repeat a call that succeeded').

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

lookup_books_batchLook up a list of booksA
Read-onlyIdempotent
Inspect

Matches a list of books to the ReadingRate catalog in one call, from ISBNs, titles, or titles with authors, and returns each match's ReadingRate analysis with a confidence level (exact, high, medium, low). Matching tolerates misspellings, such as titles read off book spines in a photo. A book the catalog does not hold is looked up in Open Library, a public book database, and comes back unmatched with what Open Library knows about it.

Use when the user gives several books at once, such as a photographed bookshelf or a pasted list, and wants them identified, ranked or compared. For a single book, use get_book_details.

Takes up to 20 books per call, more on some accounts; a longer list returns an error that gives the limit, so split it.

Example: {"books": [{"isbn": "9780140449136"}, {"title": "Crime and Punishment", "author": "Dostoevsky"}, {"title": "The Brothers Karamazov"}]}

NameRequiredDescriptionDefault
booksYesThe books to identify. Give each one an isbn, a title, or a title and author.

Output Schema

NameRequiredDescription
matchedYesQueries matched to ReadingRate books
summaryYesCounts for the batch
unmatchedYesQueries with no catalog match

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (readOnly/openWorld/idempotent), the description discloses fuzzy-match tolerance for misspellings, the confidence-level taxonomy (exact/high/medium/low), the Open Library fallback for books not in the catalog with an 'unmatched' return shape, and the ~20-book cap with its error behavior. That is real behavioral context an agent cannot get from structured fields.

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

Conciseness5/5

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

Front-loaded with the core verb and return shape, then usage, then limits, then an example. Every paragraph serves a distinct purpose and none repeats the schema verbatim.

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

Completeness5/5

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

Output schema exists, so return values needn't be re-explained, yet the description still characterizes the result (analysis + confidence, or unmatched with Open Library data). Input forms, batch limits, and sibling routing are all covered for a one-parameter read tool.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description adds value with a concrete JSON example showing all three item shapes and the batch size ceiling. It doesn't state whether isbn/title/author may be combined arbitrarily or which form matches best, so it stops short of a 5.

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

Purpose5/5

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

States a specific verb and resource ('Matches a list of books to the ReadingRate catalog in one call') and enumerates the accepted input forms (ISBN, title, title+author) plus what each result contains (analysis + confidence level). It also distinguishes itself from the single-book sibling get_book_details by name.

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

Usage Guidelines5/5

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

Gives explicit when-to-use conditions ('several books at once', 'photographed bookshelf or a pasted list') and names the alternative for the single-book case. It even pre-empts the failure mode by saying a longer list returns an error stating the limit and should be split.

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

record_quote_reviewRecord a quote reviewA
Destructive
Inspect

Records how well the reader recalled one saved quote or poem passage during review, on a 0 to 5 scale, and reschedules its next review: good recall pushes the next review further out, poor recall brings it back soon. It replaces the item's previous schedule.

Use when the reader has answered a review question from list_quotes_due_for_review and says, or it is clear, how well they remembered it. Grades: 0 no memory at all; 1 wrong, but remembered on seeing it; 2 wrong, but it felt familiar; 3 right with serious difficulty; 4 right after hesitation; 5 perfect.

Each call records one review, so grade an item once per review.

Example: {"quote_id": "", "quality": 4}

NameRequiredDescriptionDefault
qualityYesHow well the reader recalled it, from 0 (not at all) to 5 (perfectly)
quote_idYesThe quote's id, from list_quotes_due_for_review

Output Schema

NameRequiredDescription
scheduleNoThe quote's schedule after this review
next_due_quoteNoThe next quote due for review, or null when none is

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare a non-readonly, non-idempotent, destructive mutation, and the description earns credit by explaining the actual behavior: the previous schedule is replaced and recall quality directly drives how far out the next review moves. It also addresses non-idempotency by stating each call records one review. It does not clarify whether prior review history is lost when the schedule is replaced, which is the main destructive question left open.

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

Conciseness4/5

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

It is front-loaded with purpose and behavior before the rubric, and every sentence is load-bearing. The grade enumeration and the JSON example are somewhat redundant with each other and with the schema, which keeps it from a 5.

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

Completeness5/5

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

Given an output schema exists, return values need not be explained. The description still covers the scheduling consequence, the grading scale, the once-per-review constraint, and the sibling dependency, which is everything an agent needs to invoke this correctly.

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

Parameters4/5

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

Schema coverage is 100%, so both parameters are already documented, but the description adds real value by spelling out the full 0–5 grade rubric with concrete anchors (0 no memory, 3 right with serious difficulty, 5 perfect) and by giving a literal call example. Only the quote_id sourcing is a restatement of the schema.

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

Purpose5/5

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

The description states a specific verb-and-resource pair: it records recall quality for one saved quote/passage on a 0–5 scale and reschedules the next review. It also names the sibling it pairs with (list_quotes_due_for_review), so an agent can place it in the workflow without inspecting the schema.

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

Usage Guidelines4/5

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

It gives a clear trigger condition: use when the reader has answered a review question from list_quotes_due_for_review and has stated or made clear how well they remembered it. It also warns to grade an item once per review. There is no explicit when-not case beyond that, so it stops short of a 5.

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

save_poem_lineSave a poem lineAInspect

Saves one line of a poem to the reader's ReadingRate quotes, tied to its exact place in the poem, with an optional note. Saved lines appear with their other quotes and come up in quote review.

Use when the reader asks to save, keep or remember a line of a poem. To write a note about a line without saving it as a quote, use annotate_poem_line. Each call saves the line again, so save a line once.

Example: {"anchor": "wyatt/whoso-list-to-hunt/13"}

NameRequiredDescriptionDefault
noteNoThe reader's note on the line
anchorYesThe line's anchor as get_poem or search_poems returns it, e.g. "wyatt/whoso-list-to-hunt/13"

Output Schema

NameRequiredDescription
idNoThe saved quote
poetNo
textNoThe line as saved
titleNo
anchorNo
messageNoWhy nothing was saved, when success is false
successYes
settings_urlNoWhere the reader can allow saving quotes from assistants
total_lines_saved_for_poemNo

TDQS

A4.7/5.0
Behavior5/5

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

Goes beyond the annotations by explaining downstream consequences (saved lines surface alongside other quotes and appear in quote review) and by spelling out the practical meaning of idempotentHint=false: 'Each call saves the line again.' That is exactly the kind of duplicate-accumulation warning an agent needs for a non-idempotent write.

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

Conciseness5/5

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

Front-loads what gets saved and where, then usage rules, then a copy-ready example call. Every sentence carries distinct information; nothing is repeated from the schema apart from a harmless field mention.

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

Completeness5/5

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

Annotations cover the safety profile, an output schema exists, and the description supplies the remaining agent-relevant context: where saved lines appear, the review workflow they feed, and the duplicate-save hazard. Nothing needed to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both parameters and the anchor format are already documented in the schema, including the same example anchor. The description adds only a light restatement ('with an optional note'), so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Saves one line of a poem') plus the destination ('the reader's ReadingRate quotes') and the anchoring constraint. It is clearly separable from sibling writes like save_quote and annotate_poem_line without opening any schema.

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

Usage Guidelines5/5

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

Gives an explicit trigger ('Use when the reader asks to save, keep or remember a line of a poem') and names the alternative for the adjacent-but-different intent ('To write a note about a line without saving it as a quote, use annotate_poem_line'). The 'save a line once' rule closes the remaining ambiguity.

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

save_quoteSave a quoteAInspect

Saves a passage the reader asks to keep to their ReadingRate quotes, under a book in their library, with optional page, speaker, notes and themes. Saved quotes also appear in the ReadingRate app and in quote review.

Use when the user asks to save, keep or remember a quote or passage from a book. For a line of a poem, use save_poem_line.

Each call adds a new quote, so calling twice saves it twice.

Example: {"book_id": "", "quote_text": "124 was spiteful.", "page_number": 1}

NameRequiredDescriptionDefault
notesNoThe reader's note on the quote (max 2000 characters)
themesNoThemes the quote touches (max 10, each max 100 characters)
book_idYesThe book the quote is from: its ReadingRate book id or library entry id
speakerNoThe character who says it, for dialogue (max 200 characters)
quote_textYesThe words of the quote
page_numberNoPage the quote is on

Output Schema

NameRequiredDescription
bookNoBook the quote belongs to: id, slug, title, authors
quoteNoThe saved quote: id, text, page, speaker, notes, themes
messageNoHuman-readable result
successNoWhether the quote was saved
settings_urlNoSettings link, returned when the reader has turned off saving quotes from assistants
total_quotes_for_bookNoTotal quotes saved for this book

TDQS

A4.7/5.0
Behavior4/5

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

The annotations already declare this is a non-readonly, non-idempotent, non-destructive mutation. The description adds useful behavioral context by stating that saved quotes appear in the ReadingRate app and quote review, and that repeated calls create duplicate saves; this reinforces non-idempotency in plain language.

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

Conciseness5/5

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

The description is front-loaded with the main action and destination, followed by usage guidance, duplicate-save warning, and a compact example. Every sentence contributes practical information without excessive length.

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

Completeness5/5

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

For a six-parameter mutation tool with full schema coverage, annotations, and an output schema, the description covers the key gaps: what it creates, where it appears, when to use it, the sibling alternative, and duplicate-save behavior.

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

Parameters4/5

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

Schema description coverage is already 100%, so the schema carries most parameter meaning. The description still adds value by summarizing optional fields (page, speaker, notes, themes) and providing a concrete call example with book_id and quote_text.

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

Purpose5/5

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

The description gives a precise verb and resource: saves a passage the reader asks to keep to ReadingRate quotes, under a library book. It also names the sibling save_poem_line for poem lines, so an agent can distinguish this tool from nearby save operations.

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

Usage Guidelines5/5

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

It explicitly states when to use the tool: when the user asks to save, keep, or remember a quote or passage from a book. It also gives a clear exclusion/alternative for poem lines via save_poem_line.

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

save_reading_insightSave a reading insightAInspect

Saves a reading insight to the reader's ReadingRate account: a short summary and the key takeaways, in the reader's terms, about one or more books in their library, with optional topics. It is stored with those books, appears in their ReadingRate journal, comes back in later conversations through get_reading_notes, and is copied to the reader's Notion if they have connected Notion to ReadingRate. Only the fields below are sent; nothing else from the conversation is.

Use only when the reader asks to save or keep something from the discussion. Show them the summary and takeaways first and save once they agree. Each call saves a new insight, so save a discussion once; the reader can remove one with delete_reading_insight.

Example: {"book_ids": [""], "summary": "Humbert's eloquence works on the reader as a defense brief.", "key_insights": ["The prose's beauty is a manipulation", "The reader is cast as the jury"], "topics": ["unreliable narration"]}

NameRequiredDescriptionDefault
topicsNoThemes the insight is about, e.g. "unreliable narration" (up to 20)
summaryYesWhat the reader wants to keep, in 2 to 4 sentences (20 to 1000 characters)
book_idsYesThe books the insight is about: ReadingRate book ids or library entry ids (1 to 20), books in the reader's library
key_insightsYesThe takeaways, one sentence or two each (1 to 10)

Output Schema

NameRequiredDescription
insightYesThe saved insight
messageYesHuman-readable confirmation naming the books
successYesTrue when the insight was saved
view_urlYesWhere the reader can see the insight in ReadingRate
synced_to_notionYesTrue when a copy was written to the reader's Notion

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare non-readonly, non-idempotent, non-destructive, and open-world behavior; the description adds substantive side effects the annotations cannot convey — persistence with the books, surfacing in the journal, retrieval via get_reading_notes, and an external copy to Notion. It also states the privacy boundary ('Only the fields below are sent'). The non-idempotent hint is reinforced rather than contradicted.

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

Conciseness4/5

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

Front-loads the effect, then the usage rule, then the example — a sensible order with no filler sentences. Slightly dense (three stacked clauses in the opening sentence), but every element adds usable information.

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

Completeness5/5

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

For a mutation tool with rich annotations and an output schema, the description covers trigger conditions, side effects, deduplication, and downstream visibility, leaving nothing an agent needs before calling it. Return-value details are correctly delegated to the output schema.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline would be 3; the description goes beyond it with a worked example showing how book_ids, summary, key_insights, and topics combine, plus the framing of takeaways 'in the reader's terms'. It does not restate the length limits, which properly remain in the schema.

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

Purpose5/5

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

States a specific verb+resource ('Saves a reading insight to the reader's ReadingRate account') and enumerates exactly what the insight contains (summary, key takeaways, books, optional topics). It clearly distinguishes itself from adjacent tools by naming get_reading_notes as the retrieval path and delete_reading_insight as the removal path.

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

Usage Guidelines5/5

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

Explicit trigger ('Use only when the reader asks to save or keep something from the discussion'), a required confirmation workflow ('Show them the summary and takeaways first and save once they agree'), and a de-duplication rule ('Each call saves a new insight, so save a discussion once'). It also names the alternative for removal.

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

search_book_contentSearch book contentA
Read-onlyIdempotent
Inspect

Searches the text of one book or one poem for passages about a topic, by meaning rather than exact words, and returns the passages with page and chapter (books) or the line and its neighbours (poems), plus a relevance score.

Use when the user asks to find a passage, a scene, or what a book or poem says about something, in a book or poem already identified by id (from search_books, get_reading_history or get_currently_reading). For the text around the page the reader has reached, without a topic, use get_passages_near_reading_position.

Book text is available only for books the reader uploaded their own copy of in the ReadingRate app; for other books the result says the text is not available. Poems are always searchable.

Spoiler protection is on by default for books: for a book on the reader's want-to-read list no passages are returned, and for a book they are reading only pages up to their logged position are searched. If no position is logged, the whole book is searched, unless spoiler_protection is set to true, in which case passages are withheld and the result says so. Finished books are searched in full. Set spoiler_protection to false to search the whole book.

Examples:

  • {"query": "marriage", "book_id": ""}

  • {"query": "the hunt", "poem_id": "whoso-list-to-hunt"}

NameRequiredDescriptionDefault
limitNoMaximum number of passages (default 5, max 10)
queryYesWhat to look for, in words, e.g. "passages about memory"
book_idNoThe book to search: its ReadingRate id or library entry id. Give this or poem_id.
poem_idNoThe poem to search: its anchor or slug, as for get_poem. Give this or book_id.
spoiler_protectionNoSearch only pages the reader has reached (default true). With no logged position, true withholds passages and the default searches the whole book. Not used for poems.

Output Schema

NameRequiredDescription
queryYesThe search query that was run
messageNoPresent when no passages were found: explains why
passagesYesMatching passages ordered by relevance
results_countYesNumber of passages returned
filtered_to_bookNoPresent when book_id was provided: the resolved book
spoiler_protectionNoPresent when spoiler protection was applied or explicitly requested

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover safety (readOnlyHint, idempotent, non-destructive), and the description goes well beyond them with substantive behaviors: book text exists only for self-uploaded copies while poems are always searchable, and a detailed spoiler-protection policy keyed to want-to-read / currently-reading / finished status and logged position. Those are exactly the conditions an agent cannot infer from structured fields and that would otherwise cause wrong or empty calls.

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

Conciseness4/5

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

Purpose and return shape are front-loaded, then eligibility, then spoiler rules, then examples – a sensible escalation. It is longer than most definitions and the spoiler paragraph is dense and partly duplicates the schema, but every section carries actionable information rather than filler.

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

Completeness5/5

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

An output schema exists so return values need no prose, and the description still covers everything else that governs success: id sourcing, per-format eligibility, spoiler gating across reading states, and worked examples for both a book and a poem call. Nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents query, book_id, poem_id, limit and spoiler_protection, including the default-with-no-position edge case. The description mostly restates this (the spoiler paragraph mirrors the spoiler_protection schema text) and adds only usage examples, so baseline 3 applies.

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

Purpose5/5

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

Opens with a specific verb and resource ("Searches the text of one book or one poem") and adds the key differentiator, "by meaning rather than exact words." It also states what is returned (passages with page/chapter or line plus neighbours, plus relevance score), so the agent can separate it from search_books and search_poems without reading schemas.

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

Usage Guidelines5/5

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

Explicit trigger ("Use when the user asks to find a passage, a scene, or what a book or poem says about something") plus the prerequisite that the book/poem is already identified by id, naming where those ids come from (search_books, get_reading_history, get_currently_reading). It also names the sibling to use instead when there is no topic (get_passages_near_reading_position), covering the when-not case.

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

search_booksSearch booksA
Read-onlyIdempotent
Inspect

Searches the ReadingRate book catalog by title, author, genre, theme or difficulty, and shows the results as book cards. Each result carries a difficulty score from 0 to 100, built from nine scored dimensions of how hard the prose and the meaning are.

Use when the user asks to find books by an author, on a subject, in a genre, or within a difficulty range. For one book's full analysis, use get_book_details. For prize winners, use get_award_winners. For many titles at once, such as a pasted list or a photographed shelf, use lookup_books_batch. Results do not say whether the user has read a book; get_reading_history does.

Returns: title, authors, publication year, difficulty score, literary regard score, genres, description, awards, cover image.

Examples:

  • {"query": "Toni Morrison"}

  • {"genres": ["Literary Fiction"], "difficulty_max": 50}

  • {"query": "war", "genres": ["Historical Fiction"], "difficulty_min": 40, "difficulty_max": 70}

  • {"query": "Преступление и наказание", "locale": "ru"}: answer in Russian using title_localized and description_localized. Difficulty scores do not depend on language.

NameRequiredDescriptionDefault
limitNoMaximum number of results (default 10, max 50)
queryNoWords from a title or an author's name. Close spellings match.
genresNoOnly books in any of these genres
localeNoThe reader's language. "ru" adds each book's Russian title and description (title_localized, description_localized) beside the English ones. Set automatically when the query is in Cyrillic.
themesNoOnly books with any of these themes, e.g. 'grief', 'war', 'identity', 'memory'
difficulty_maxNoHighest difficulty score to include (0-100; higher is harder to read)
difficulty_minNoLowest difficulty score to include (0-100; lower is easier to read)

Output Schema

NameRequiredDescription
booksYes
countYes
localeNoLocale the localized fields are in

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, closed-world and non-destructive, so safety is covered; the description adds real behavioral context beyond that — results are presented as cards, difficulty is a 0-100 composite of nine prose/meaning dimensions, and results carry no indication of whether the user has read the book. It stops short of describing ordering, empty-result behavior, or what happens when limit exceeds the catalog, leaving minor gaps.

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

Conciseness4/5

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

Front-loaded with purpose, then usage routing, then returns, then examples — a clean progression with no filler sentences. The explicit 'Returns:' enumeration is partly redundant given an output schema exists, which keeps it off a 5.

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

Completeness4/5

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

For a 7-parameter, zero-required search tool with an output schema, the description supplies everything needed to call it correctly, including the read-history caveat that prevents a wrong inference from results. The only room left is behavioral detail on ordering and pagination past the 50-item cap.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the four worked examples demonstrate how parameters combine (query + genres + a difficulty band, and genre-only with difficulty_max), which the schema cannot express. The Russian example also clarifies the cross-cutting rule that localized fields are added while difficulty scores stay language-independent, going beyond the schema's note about Cyrillic auto-detection.

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

Purpose5/5

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

States a specific verb (searches) plus the resource (ReadingRate book catalog) and enumerates the searchable facets (title, author, genre, theme, difficulty). It also names the concrete output shape (book cards with a 0-100 difficulty score built from nine dimensions), so an agent can distinguish it from content search, award lookups, and batch lookups without opening a schema.

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

Usage Guidelines5/5

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

Gives an explicit when-to-use clause ('asks to find books by an author, on a subject, in a genre, or within a difficulty range') and then routes four alternatives by condition: get_book_details for one book's analysis, get_award_winners for prizes, lookup_books_batch for pasted lists or photographed shelves, get_reading_history for read status. This is the full when/when-not/alternatives pattern.

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

search_poemsSearch poemsA
Read-onlyIdempotent
Inspect

Searches the words of every poem in the ReadingRate collection and returns the matching lines, the lines around each, and each poem's anchor, which get_poem, save_poem_line and annotate_poem_line accept.

Use when the user half-remembers a line, or wants poems that mention an image or a subject, such as "the poem about the shattered statue in the desert". It returns only poems already in the collection; it does not write, continue or translate poems.

It matches words, so a remembered phrase works better than a paraphrase. The poems are in English: for a reader writing in another language, search with the English words a poem would use, explain in the reader's language, and quote the poem's lines in the original English rather than in a translation of your own.

Example: {"query": "the woods are lovely dark and deep"}

NameRequiredDescriptionDefault
limitNoMaximum number of results (default 10, max 25)
queryYesA line, a phrase, or the words remembered
poem_idNoSearch one poem only: its anchor or slug, as for get_poem

Output Schema

NameRequiredDescription
noteNoGuidance when the query could not match (e.g. written in a non-English script)
resultsYesMatching passages, most similar first. Empty when nothing matched.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent/closed-world, and the description adds real behavioral context on top: word-level (not semantic) matching, the consequence that paraphrases fail, that only in-collection poems are returned, and a cross-language policy for non-English readers. The anchor-return contract with three sibling tools is exactly the kind of cross-tool behavior annotations cannot express.

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

Conciseness4/5

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

Front-loaded with purpose and return shape, then usage, then matching semantics, then a copyable example — a sound ordering with no filler. The cross-language sentence is the longest in the block and is the one an agent is least likely to need on every call, so it is slightly over-weighted for the 10% dimension.

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

Completeness4/5

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

An output schema exists, so return values needn't be explained, and the hard parts (matching mode, collection scope, language policy) are covered. It says nothing about result ordering, how the surrounding lines are bounded, or how limit interacts with truncation, which are the remaining unknowns for a search tool.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning for the required query parameter ("It matches words, so a remembered phrase works better than a paraphrase") and clarifies what an anchor is and who consumes it. limit and poem_id are left entirely to their schema text.

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

Purpose5/5

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

Specific verb+resource ("Searches the words of every poem in the ReadingRate collection") with the result shape named (matching lines, surrounding lines, anchor). The scope word "poem" plus the note that the returned anchor feeds get_poem/save_poem_line/annotate_poem_line lets an agent separate it from prose-oriented siblings like search_book_content or search_books without opening a schema.

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

Usage Guidelines4/5

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

Gives a concrete trigger ("when the user half-remembers a line, or wants poems that mention an image or a subject") with a worked example, and draws a clear negative boundary ("does not write, continue or translate poems"). It stops short of naming the sibling an agent should pick instead for prose or for fetching a known poem, so it lands at 4 rather than 5.

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

summarize_reading_periodSummarize a reading periodA
DestructiveIdempotent
Inspect

Builds a summary of the reader's reading between two dates, up to a year apart: books finished, time and pages read, the difficulty of what they read and highlights. ReadingRate computes it from the reader's records and saves it in their account, where it replaces any summary saved earlier for the same dates.

Use when the reader asks for a review of a period that is not one calendar month, such as a year in review or a season. For a single calendar month, use get_monthly_reading_summary.

Example: {"start_date": "2025-01-01", "end_date": "2025-12-31", "period_label": "2025"}

NameRequiredDescriptionDefault
end_dateYesLast day, YYYY-MM-DD, at most 366 days after the first
start_dateYesFirst day, YYYY-MM-DD
period_labelNoA name for the period, e.g. "Summer 2026" (max 60 characters)

Output Schema

NameRequiredDescription
dataNoThe summary: hero, books_read, cognitive_terrain, highlights, year_so_far, growth, daily_words
successNoWhether the summary was made

TDQS

A4.9/5.0
Behavior5/5

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

Goes beyond the annotations by explaining what the destructiveHint actually means in practice: the summary is persisted to the reader's account and "replaces any summary saved earlier for the same dates," which also explains why the call is idempotent. The one-year date-span limit adds a constraint no structured field conveys.

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

Conciseness5/5

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

Front-loaded with the action and data produced, then routing guidance, then a compact example. No sentence is redundant — even the side note about replacement semantics carries behavioral weight.

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

Completeness5/5

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

An output schema exists, so return shape needn't be described; the description covers scope, persistence side effects, date constraints, and the sibling alternative. Everything an agent needs to select and invoke this correctly is present.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns above it by restating the year-apart constraint in prose and providing a concrete worked example with all three parameters, including a period_label pattern the schema only gestures at with a max length.

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

Purpose5/5

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

States a specific verb and resource ("Builds a summary of the reader's reading between two dates") and enumerates the content covered: books finished, time/pages read, difficulty, highlights. It is immediately distinguishable from get_monthly_reading_summary by the arbitrary-date-range scope.

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

Usage Guidelines5/5

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

Explicitly says when to use it ("a review of a period that is not one calendar month, such as a year in review or a season") and names the alternative for the excluded case: "For a single calendar month, use get_monthly_reading_summary." Both routing directions are covered.

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

update_book_statusChange a book's statusA
DestructiveIdempotent
Inspect

Moves a book that is already in the reader's ReadingRate library to another status: "reading" (sets the start date if there is none), "read" (sets the finish date, with an optional rating), "stopped", or "want_to_read" (clears the finish date). It replaces the book's current status, and for "read" its rating and finish date. Marking a book read also adds it to the reader's ReadingRate activity feed. Other readers see that they finished it while the reader's profile is public and shows finished books (new accounts start private, and finished books start hidden): on the profile, and for people who follow the reader in their feed and on the book's page.

Use when the user says they started, finished, stopped or gave up a book in their library, wants to rate a finished book, or wants a book back on their want-to-read list. For a book not yet in their library, use add_book_to_library.

Examples:

  • {"book_id": "", "status": "reading"}

  • {"book_id": "", "status": "read", "rating": 5}

NameRequiredDescriptionDefault
ratingNoRating from 1 to 5, only with status "read"
statusYesThe new status
book_idYesThe book's ReadingRate id or its library entry id
date_finishedNoFinish date, YYYY-MM-DD, only with status "read" (default: today)

Output Schema

NameRequiredDescription
bookNoThe book: id, slug, title, authors
ratingNoThe rating recorded, when finishing
messageYesHuman-readable result
successYesWhether the status changed
new_statusNoThe status after the change
old_statusNoThe status before the change
date_startedNoStart date, when the status is reading
date_finishedNoFinish date, when the status is read

TDQS

A4.6/5.0
Behavior4/5

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

Despite annotations already flagging destructiveHint=true and idempotentHint=true, the description adds real substance: what gets replaced (current status, and for 'read' the rating and finish date), that 'want_to_read' clears the finish date, and the activity-feed/profile-visibility consequences of marking a book read. It doesn't state auth requirements, but for a mutation with full annotation coverage this is well above the bar.

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

Conciseness4/5

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

Structure is strong: purpose and per-status effects first, then usage triggers and the alternative, then examples. The profile-visibility paragraph is dense and runs long relative to its weight, which trims a point, but nothing is truly redundant.

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

Completeness5/5

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

For a destructive mutation with an output schema present, the description covers what changes, what is overwritten, conditional parameter behavior, downstream visibility effects, and routing to the sibling tool. An agent could call this correctly without further information.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; the description earns above that by explaining the conditional semantics the schema only hints at – 'reading' sets a start date if none exists, 'read' sets finish date plus optional rating, 'want_to_read' clears the finish date. It doesn't clarify the book_id dual-id nuance beyond the schema, keeping it from a 5.

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

Purpose5/5

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

The opening sentence names a specific verb (moves) and resource (a book already in the reader's library), enumerates all four target statuses, and spells out the per-status side effects (start date, finish date, clearing finish date). It is unambiguously separable from add_book_to_library, which is named explicitly for the out-of-library case.

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

Usage Guidelines5/5

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

The second paragraph gives concrete trigger phrases (started, finished, stopped, gave up, wants to rate, back on want-to-read) and names the alternative tool plus the condition that selects it (book not yet in library). Both the when-to-use and the when-not-to-use cases are covered.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 42 tool updates
    • First observedadd_book_to_library
    • First observedadd_matched_books_to_library
    • First observedannotate_poem_line
    • First observedcompare_books
    • First observeddelete_reading_insight
    • First observedfind_related_passages
    • First observedget_award_winners
    • First observedget_book_club
    • First observedget_book_club_current_read
    • First observedget_book_details
    • First observedget_currently_reading
    • First observedget_daily_reading_connections
    • First observedget_monthly_reading_summary
    • First observedget_passages_near_reading_position
    • First observedget_personalized_recommendations
    • First observedget_poem
    • First observedget_poetic_form_mastery
    • First observedget_poetry_reading_stats
    • First observedget_reading_days
    • First observedget_reading_domain
    • First observedget_reading_goals
    • First observedget_reading_history
    • First observedget_reading_notes
    • First observedget_reading_stats
    • First observedget_reading_trajectory
    • First observedget_top_books
    • First observedlist_book_clubs
    • First observedlist_quotes_due_for_review
    • First observedlist_reading_domains
    • First observedlist_saved_quotes
    • First observedlog_poem_read
    • First observedlog_reading_session
    • First observedlookup_books_batch
    • First observedrecord_quote_review
    • First observedsave_poem_line
    • First observedsave_quote
    • First observedsave_reading_insight
    • First observedsearch_book_content
    • First observedsearch_books
    • First observedsearch_poems
    • First observedsummarize_reading_period
    • First observedupdate_book_status

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to help users manage their reading experience by searching books, tracking reading progress, managing bookmarks, and generating personalized recommendations and summaries.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables shared reading between humans and AI assistants, including book import, chunked reading, margin annotations, reading progress tracking, and note exchange.
    2
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables managing your Luku book library and reading activity from Claude, including shelves, sessions, progress, goals, bookmarks, statistics, book search, and import/export.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.