Book difficulty, reading times and ranked lists, plus your reading log, quotes and clubs.
Maintained byreadingrate.com(verified)Also a maintainer?
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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": "<book id>", "status": "reading"}
ISBN-10 or ISBN-13
Rating from 1 to 5, for a book added as read
The shelf to put the book on instead of want-to-read
The book's ReadingRate id, from another ReadingRate tool's results
The book's title and author. Close spellings match.
Finish date, YYYY-MM-DD, for a book added as read (default: today)
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http readingrate https://mcp.readingrate.com/mcp
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": "<book id>", "status": "reading"}
| Argument | Type | Description |
|---|---|---|
| isbn | string | ISBN-10 or ISBN-13 |
| rating | number | Rating from 1 to 5, for a book added as read |
| status | string | The shelf to put the book on instead of want-to-read |
| book_id | string | The book's ReadingRate id, from another ReadingRate tool's results |
| title_author | object | The book's title and author. Close spellings match. |
| date_finished | string | Finish date, YYYY-MM-DD, for a book added as read (default: today) |
{
"type": "object",
"required": [],
"properties": {
"isbn": {
"type": "string",
"description": "ISBN-10 or ISBN-13"
},
"rating": {
"type": "number",
"description": "Rating from 1 to 5, for a book added as read"
},
"status": {
"enum": [
"reading",
"read",
"stopped"
],
"type": "string",
"description": "The shelf to put the book on instead of want-to-read"
},
"book_id": {
"type": "string",
"description": "The book's ReadingRate id, from another ReadingRate tool's results"
},
"title_author": {
"type": "object",
"required": [
"title",
"author"
],
"properties": {
"title": {
"type": "string",
"description": "Book title"
},
"author": {
"type": "string",
"description": "Author's name"
}
},
"description": "The book's title and author. Close spellings match.",
"additionalProperties": false
},
"date_finished": {
"type": "string",
"description": "Finish date, YYYY-MM-DD, for a book added as read (default: today)"
}
},
"additionalProperties": false
}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": ["<book id>", "<book id>"], "status": "read"}
| Argument | Type | Description |
|---|---|---|
| status | string | The shelf to put every newly added book on instead of want-to-read |
| book_ids* | array | ReadingRate book ids, as lookup_books_batch returns them (max 40) |
{
"type": "object",
"required": [
"book_ids"
],
"properties": {
"status": {
"enum": [
"reading",
"read",
"stopped"
],
"type": "string",
"description": "The shelf to put every newly added book on instead of want-to-read"
},
"book_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "ReadingRate book ids, as lookup_books_batch returns them (max 40)"
}
},
"additionalProperties": false
}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."}
| Argument | Type | Description |
|---|---|---|
| note* | string | The reader's note |
| anchor* | string | The line's anchor as get_poem or search_poems returns it |
{
"type": "object",
"required": [
"anchor",
"note"
],
"properties": {
"note": {
"type": "string",
"description": "The reader's note"
},
"anchor": {
"type": "string",
"description": "The line's anchor as get_poem or search_poems returns it"
}
},
"additionalProperties": false
}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"]}
| Argument | Type | Description |
|---|---|---|
| aspects | array | What to compare (default: difficulty, themes, length) |
| book_ids* | array | Two or three ReadingRate book ids or slugs |
{
"type": "object",
"required": [
"book_ids"
],
"properties": {
"aspects": {
"type": "array",
"items": {
"enum": [
"difficulty",
"themes",
"length",
"style",
"awards"
],
"type": "string"
},
"description": "What to compare (default: difficulty, themes, length)"
},
"book_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Two or three ReadingRate book ids or slugs"
}
},
"additionalProperties": false
}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": "<insight id>"}
| Argument | Type | Description |
|---|---|---|
| insight_id* | string | The saved insight's id, as get_reading_notes or save_reading_insight returned it |
{
"type": "object",
"required": [
"insight_id"
],
"properties": {
"insight_id": {
"type": "string",
"description": "The saved insight's id, as get_reading_notes or save_reading_insight returned it"
}
},
"additionalProperties": false
}Finds the quotes and notes in the reader's ReadingRate collection that are closest in meaning to one of their saved quotes or notes, across all their books, with each passage's book, author, page and a similarity score from 0 to 1. Use when the reader asks what else they have saved that connects to a particular quote or note, or for related passages in their collection. Get the id from list_saved_quotes (a quote) or get_reading_notes (a note). Examples: - {"id": "<quote id>", "type": "quote"} - {"id": "<note id>", "limit": 10, "threshold": 0.35}
| Argument | Type | Description |
|---|---|---|
| id* | string | The id of the quote or note to start from |
| type | string | What the id is: "quote" for a saved quote, "marginalia" for a note (default "marginalia") |
| limit | number | Maximum number of related passages (default 5, max 20) |
| threshold | number | Lowest similarity to include, 0 to 1 (default 0.42) |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The id of the quote or note to start from"
},
"type": {
"enum": [
"marginalia",
"quote"
],
"type": "string",
"description": "What the id is: \"quote\" for a saved quote, \"marginalia\" for a note (default \"marginalia\")"
},
"limit": {
"type": "number",
"description": "Maximum number of related passages (default 5, max 20)"
},
"threshold": {
"type": "number",
"description": "Lowest similarity to include, 0 to 1 (default 0.42)"
}
},
"additionalProperties": false
}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"}
| Argument | Type | Description |
|---|---|---|
| award | string | Prize, 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. |
| limit | number | Maximum number of books (default 20, max 50) |
| category | string | Only winners, only the shortlist, or only the longlist |
| year_max | number | Latest prize year to include |
| year_min | number | Earliest prize year to include |
| source_type | string | Only 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. |
{
"type": "object",
"required": [],
"properties": {
"award": {
"type": "string",
"description": "Prize, 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."
},
"limit": {
"type": "number",
"description": "Maximum number of books (default 20, max 50)"
},
"category": {
"enum": [
"winner",
"shortlist",
"longlist"
],
"type": "string",
"description": "Only winners, only the shortlist, or only the longlist"
},
"year_max": {
"type": "number",
"description": "Latest prize year to include"
},
"year_min": {
"type": "number",
"description": "Earliest prize year to include"
},
"source_type": {
"enum": [
"award",
"list",
"curriculum"
],
"type": "string",
"description": "Only 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."
}
},
"additionalProperties": false
}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": "<club id>"}
| Argument | Type | Description |
|---|---|---|
| club_id* | string | The club's id, from list_book_clubs |
{
"type": "object",
"required": [
"club_id"
],
"properties": {
"club_id": {
"type": "string",
"description": "The club's id, from list_book_clubs"
}
},
"additionalProperties": false
}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": "<club id>"}
| Argument | Type | Description |
|---|---|---|
| club_id* | string | The club's id, from list_book_clubs |
{
"type": "object",
"required": [
"club_id"
],
"properties": {
"club_id": {
"type": "string",
"description": "The club's id, from list_book_clubs"
}
},
"additionalProperties": false
}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}
| Argument | Type | Description |
|---|---|---|
| slug | string | The book's ReadingRate slug, e.g. "crime-and-punishment" |
| book_id | string | The book's ReadingRate id, from another ReadingRate tool's results |
| title_author | object | The book's title and author. Close spellings match. |
| include_similar | boolean | Also list books similar to this one |
| include_time_estimate | boolean | Also estimate how long the book takes to read at the average reader's pace (the reader's own pace is in get_currently_reading) |
{
"type": "object",
"required": [],
"properties": {
"slug": {
"type": "string",
"description": "The book's ReadingRate slug, e.g. \"crime-and-punishment\""
},
"book_id": {
"type": "string",
"description": "The book's ReadingRate id, from another ReadingRate tool's results"
},
"title_author": {
"type": "object",
"required": [
"title",
"author"
],
"properties": {
"title": {
"type": "string",
"description": "Book title"
},
"author": {
"type": "string",
"description": "Author's name"
}
},
"description": "The book's title and author. Close spellings match.",
"additionalProperties": false
},
"include_similar": {
"type": "boolean",
"description": "Also list books similar to this one"
},
"include_time_estimate": {
"type": "boolean",
"description": "Also estimate how long the book takes to read at the average reader's pace (the reader's own pace is in get_currently_reading)"
}
},
"additionalProperties": false
}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.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}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.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}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}
| Argument | Type | Description |
|---|---|---|
| year* | integer | The year, e.g. 2026 |
| month* | integer | The month, 1 to 12 |
{
"type": "object",
"required": [
"year",
"month"
],
"properties": {
"year": {
"type": "integer",
"description": "The year, e.g. 2026"
},
"month": {
"type": "integer",
"description": "The month, 1 to 12"
}
},
"additionalProperties": false
}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": "<book id>", "topic": "the argument about metempsychosis"}
| Argument | Type | Description |
|---|---|---|
| topic | string | What the reader wants help with, e.g. "narrative voice"; focuses the passages returned |
| book_id | string | The book: its ReadingRate id or library entry id (default: the book the reader read most recently) |
{
"type": "object",
"required": [],
"properties": {
"topic": {
"type": "string",
"description": "What the reader wants help with, e.g. \"narrative voice\"; focuses the passages returned"
},
"book_id": {
"type": "string",
"description": "The book: its ReadingRate id or library entry id (default: the book the reader read most recently)"
}
},
"additionalProperties": false
}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"]}
| Argument | Type | Description |
|---|---|---|
| count | number | Number of recommendations (default 5, max 20) |
| from_tbr | boolean | Recommend only from the reader's want-to-read list |
| exclude_genres | array | Genres to leave out |
| difficulty_stretch | boolean | Include books a little harder than the reader usually reads |
{
"type": "object",
"required": [],
"properties": {
"count": {
"type": "number",
"description": "Number of recommendations (default 5, max 20)"
},
"from_tbr": {
"type": "boolean",
"description": "Recommend only from the reader's want-to-read list"
},
"exclude_genres": {
"type": "array",
"items": {
"type": "string"
},
"description": "Genres to leave out"
},
"difficulty_stretch": {
"type": "boolean",
"description": "Include books a little harder than the reader usually reads"
}
},
"additionalProperties": false
}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}
| Argument | Type | Description |
|---|---|---|
| section | number | Section number, for a work in sections only. Omit to get the list of sections. |
| identifier* | string | The poem's anchor, "poet/poem" such as "wyatt/whoso-list-to-hunt", or its slug alone, such as "whoso-list-to-hunt" |
{
"type": "object",
"required": [
"identifier"
],
"properties": {
"section": {
"type": "number",
"description": "Section number, for a work in sections only. Omit to get the list of sections."
},
"identifier": {
"type": "string",
"description": "The poem's anchor, \"poet/poem\" such as \"wyatt/whoso-list-to-hunt\", or its slug alone, such as \"whoso-list-to-hunt\""
}
},
"additionalProperties": false
}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.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}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}
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of poems in the ranking (default 20) |
| half_life_days | number | Days for a read to count half as much in the ranking (default 30) |
{
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "number",
"description": "Maximum number of poems in the ranking (default 20)"
},
"half_life_days": {
"type": "number",
"description": "Days for a read to count half as much in the ranking (default 30)"
}
},
"additionalProperties": false
}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>"} - {"book_id": "<book id>", "timezone": "Europe/London"} - {"book_id": "<book id>", "reading_number": 1}
| Argument | Type | Description |
|---|---|---|
| book_id* | string | The book's ReadingRate id or its library entry id |
| timezone | string | IANA time zone the days are counted in, for example "Europe/London" |
| reading_number | number | Which reading: 1 for the first, 2 for a reread. Default: the latest |
{
"type": "object",
"required": [
"book_id"
],
"properties": {
"book_id": {
"type": "string",
"description": "The book's ReadingRate id or its library entry id"
},
"timezone": {
"type": "string",
"description": "IANA time zone the days are counted in, for example \"Europe/London\""
},
"reading_number": {
"type": "number",
"description": "Which reading: 1 for the first, 2 for a reread. Default: the latest"
}
},
"additionalProperties": false
}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": "<domain id>"}
| Argument | Type | Description |
|---|---|---|
| domain_id* | string | The domain's id, from list_reading_domains |
{
"type": "object",
"required": [
"domain_id"
],
"properties": {
"domain_id": {
"type": "string",
"description": "The domain's id, from list_reading_domains"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| year | number | The goal year (default: the current year) |
{
"type": "object",
"required": [],
"properties": {
"year": {
"type": "number",
"description": "The goal year (default: the current year)"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of books (default 50, max 100) |
| status | string | Only books with this status. Omit for all. |
| include_sessions | boolean | Include the reading sessions logged for each book (default false) |
{
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "number",
"description": "Maximum number of books (default 50, max 100)"
},
"status": {
"enum": [
"read",
"reading",
"want_to_read",
"stopped"
],
"type": "string",
"description": "Only books with this status. Omit for all."
},
"include_sessions": {
"type": "boolean",
"description": "Include the reading sessions logged for each book (default false)"
}
},
"additionalProperties": false
}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": "<book id>"} - {"insight_query": "unreliable narrators"}
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of highlights and notes (default 10, max 50) |
| book_id | string | Only this book: its ReadingRate id or library entry id |
| insight_query | string | A topic; returns the saved insights closest to it in meaning, from any book |
{
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "number",
"description": "Maximum number of highlights and notes (default 10, max 50)"
},
"book_id": {
"type": "string",
"description": "Only this book: its ReadingRate id or library entry id"
},
"insight_query": {
"type": "string",
"description": "A topic; returns the saved insights closest to it in meaning, from any book"
}
},
"additionalProperties": false
}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.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}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.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}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} - {}
| Argument | Type | Description |
|---|---|---|
| genre | string | A 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 |
| limit | number | How many books from the top of the list (default 10, max 100) |
| country | string | The 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. |
| subject | string | A 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. |
| language | string | The original language, e.g. "French". These have list pages: French, Spanish, Russian, German, Chinese, Italian, Japanese, Polish. |
| difficulty | string | A 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_gender | string | Only books by women, or only books by men |
{
"type": "object",
"required": [],
"properties": {
"genre": {
"type": "string",
"description": "A 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"
},
"limit": {
"type": "number",
"description": "How many books from the top of the list (default 10, max 100)"
},
"country": {
"type": "string",
"description": "The 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."
},
"subject": {
"type": "string",
"description": "A 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."
},
"language": {
"type": "string",
"description": "The original language, e.g. \"French\". These have list pages: French, Spanish, Russian, German, Chinese, Italian, Japanese, Polish."
},
"difficulty": {
"enum": [
"easy",
"moderate",
"challenging",
"hardest"
],
"type": "string",
"description": "A 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_gender": {
"enum": [
"female",
"male"
],
"type": "string",
"description": "Only books by women, or only books by men"
}
},
"additionalProperties": false
}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.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}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}
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of items (default 5, max 20) |
{
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "number",
"description": "Maximum number of items (default 5, max 20)"
}
},
"additionalProperties": false
}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.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}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": "<book id>", "search": "memory"}
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of quotes (default 50, max 100) |
| search | string | Only quotes containing these words |
| book_id | string | Only quotes from this book: its ReadingRate book id or library entry id |
{
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "number",
"description": "Maximum number of quotes (default 50, max 100)"
},
"search": {
"type": "string",
"description": "Only quotes containing these words"
},
"book_id": {
"type": "string",
"description": "Only quotes from this book: its ReadingRate book id or library entry id"
}
},
"additionalProperties": false
}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}
| Argument | Type | Description |
|---|---|---|
| section | number | Section number; required for a work in sections |
| identifier* | string | The poem's anchor ("poet/poem") or slug, as for get_poem |
{
"type": "object",
"required": [
"identifier"
],
"properties": {
"section": {
"type": "number",
"description": "Section number; required for a work in sections"
},
"identifier": {
"type": "string",
"description": "The poem's anchor (\"poet/poem\") or slug, as for get_poem"
}
},
"additionalProperties": false
}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": "<book id>", "pages_read": 30} - {"book_id": "<book id>", "current_page": 150} - {"book_id": "<book id>", "front_matter_ends_on": "lx", "roman_page": "liv"} - {"book_id": "<book id>", "notes": "The argument only lands once you have read the footnotes."}
| Argument | Type | Description |
|---|---|---|
| notes | string | The reader's note on today's reading, added to today's journal entry |
| book_id* | string | The book's ReadingRate id or its library entry id |
| pages_read | number | Pages read in this session, added to the current page |
| roman_page | string | The page the reader is now on in the book's roman-numbered introduction or preface, such as "liv" |
| current_page | number | The page the reader is now on, as printed in arabic numerals |
| front_matter_ends_on | string | The last roman-numbered page of the reader's copy, such as "lx" (or 60); "0" when it has none or they skipped it |
{
"type": "object",
"required": [
"book_id"
],
"properties": {
"notes": {
"type": "string",
"description": "The reader's note on today's reading, added to today's journal entry"
},
"book_id": {
"type": "string",
"description": "The book's ReadingRate id or its library entry id"
},
"pages_read": {
"type": "number",
"description": "Pages read in this session, added to the current page"
},
"roman_page": {
"type": "string",
"description": "The page the reader is now on in the book's roman-numbered introduction or preface, such as \"liv\""
},
"current_page": {
"type": "number",
"description": "The page the reader is now on, as printed in arabic numerals"
},
"front_matter_ends_on": {
"type": "string",
"description": "The last roman-numbered page of the reader's copy, such as \"lx\" (or 60); \"0\" when it has none or they skipped it"
}
},
"additionalProperties": false
}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"}]}
| Argument | Type | Description |
|---|---|---|
| books* | array | The books to identify. Give each one an isbn, a title, or a title and author. |
{
"type": "object",
"required": [
"books"
],
"properties": {
"books": {
"type": "array",
"items": {
"type": "object",
"properties": {
"isbn": {
"type": "string",
"description": "ISBN-10 or ISBN-13"
},
"title": {
"type": "string",
"description": "Book title"
},
"author": {
"type": "string",
"description": "Author's name; improves matching alongside a title"
}
},
"additionalProperties": false
},
"description": "The books to identify. Give each one an isbn, a title, or a title and author."
}
},
"additionalProperties": false
}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": "<quote id>", "quality": 4}
| Argument | Type | Description |
|---|---|---|
| quality* | integer | How well the reader recalled it, from 0 (not at all) to 5 (perfectly) |
| quote_id* | string | The quote's id, from list_quotes_due_for_review |
{
"type": "object",
"required": [
"quote_id",
"quality"
],
"properties": {
"quality": {
"type": "integer",
"description": "How well the reader recalled it, from 0 (not at all) to 5 (perfectly)"
},
"quote_id": {
"type": "string",
"description": "The quote's id, from list_quotes_due_for_review"
}
},
"additionalProperties": false
}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"}
| Argument | Type | Description |
|---|---|---|
| note | string | The reader's note on the line |
| anchor* | string | The line's anchor as get_poem or search_poems returns it, e.g. "wyatt/whoso-list-to-hunt/13" |
{
"type": "object",
"required": [
"anchor"
],
"properties": {
"note": {
"type": "string",
"description": "The reader's note on the line"
},
"anchor": {
"type": "string",
"description": "The line's anchor as get_poem or search_poems returns it, e.g. \"wyatt/whoso-list-to-hunt/13\""
}
},
"additionalProperties": false
}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": "<book id>", "quote_text": "124 was spiteful.", "page_number": 1}
| Argument | Type | Description |
|---|---|---|
| notes | string | The reader's note on the quote (max 2000 characters) |
| themes | array | Themes the quote touches (max 10, each max 100 characters) |
| book_id* | string | The book the quote is from: its ReadingRate book id or library entry id |
| speaker | string | The character who says it, for dialogue (max 200 characters) |
| quote_text* | string | The words of the quote |
| page_number | number | Page the quote is on |
{
"type": "object",
"required": [
"book_id",
"quote_text"
],
"properties": {
"notes": {
"type": "string",
"description": "The reader's note on the quote (max 2000 characters)"
},
"themes": {
"type": "array",
"items": {
"type": "string"
},
"description": "Themes the quote touches (max 10, each max 100 characters)"
},
"book_id": {
"type": "string",
"description": "The book the quote is from: its ReadingRate book id or library entry id"
},
"speaker": {
"type": "string",
"description": "The character who says it, for dialogue (max 200 characters)"
},
"quote_text": {
"type": "string",
"description": "The words of the quote"
},
"page_number": {
"type": "number",
"description": "Page the quote is on"
}
},
"additionalProperties": false
}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": ["<book id>"], "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"]}
| Argument | Type | Description |
|---|---|---|
| topics | array | Themes the insight is about, e.g. "unreliable narration" (up to 20) |
| summary* | string | What the reader wants to keep, in 2 to 4 sentences (20 to 1000 characters) |
| book_ids* | array | The books the insight is about: ReadingRate book ids or library entry ids (1 to 20), books in the reader's library |
| key_insights* | array | The takeaways, one sentence or two each (1 to 10) |
{
"type": "object",
"required": [
"book_ids",
"summary",
"key_insights"
],
"properties": {
"topics": {
"type": "array",
"items": {
"type": "string"
},
"description": "Themes the insight is about, e.g. \"unreliable narration\" (up to 20)"
},
"summary": {
"type": "string",
"description": "What the reader wants to keep, in 2 to 4 sentences (20 to 1000 characters)"
},
"book_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "The books the insight is about: ReadingRate book ids or library entry ids (1 to 20), books in the reader's library"
},
"key_insights": {
"type": "array",
"items": {
"type": "string"
},
"description": "The takeaways, one sentence or two each (1 to 10)"
}
},
"additionalProperties": false
}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": "<book id>"} - {"query": "the hunt", "poem_id": "whoso-list-to-hunt"}
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of passages (default 5, max 10) |
| query* | string | What to look for, in words, e.g. "passages about memory" |
| book_id | string | The book to search: its ReadingRate id or library entry id. Give this or poem_id. |
| poem_id | string | The poem to search: its anchor or slug, as for get_poem. Give this or book_id. |
| spoiler_protection | boolean | Search 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. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "number",
"description": "Maximum number of passages (default 5, max 10)"
},
"query": {
"type": "string",
"description": "What to look for, in words, e.g. \"passages about memory\""
},
"book_id": {
"type": "string",
"description": "The book to search: its ReadingRate id or library entry id. Give this or poem_id."
},
"poem_id": {
"type": "string",
"description": "The poem to search: its anchor or slug, as for get_poem. Give this or book_id."
},
"spoiler_protection": {
"type": "boolean",
"description": "Search 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."
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of results (default 10, max 50) |
| query | string | Words from a title or an author's name. Close spellings match. |
| genres | array | Only books in any of these genres |
| locale | string | The 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. |
| themes | array | Only books with any of these themes, e.g. 'grief', 'war', 'identity', 'memory' |
| difficulty_max | number | Highest difficulty score to include (0-100; higher is harder to read) |
| difficulty_min | number | Lowest difficulty score to include (0-100; lower is easier to read) |
{
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "number",
"description": "Maximum number of results (default 10, max 50)"
},
"query": {
"type": "string",
"description": "Words from a title or an author's name. Close spellings match."
},
"genres": {
"type": "array",
"items": {
"enum": [
"Literary Fiction",
"Historical Fiction",
"Science Fiction",
"Fantasy",
"Mystery",
"Thriller",
"Horror",
"Romance",
"Biography & Memoir",
"History",
"Science & Nature",
"Philosophy",
"Essays",
"Poetry",
"Drama",
"Short Stories",
"Graphic Novel",
"Young Adult",
"Children's"
],
"type": "string"
},
"description": "Only books in any of these genres"
},
"locale": {
"enum": [
"en",
"ru"
],
"type": "string",
"description": "The 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."
},
"themes": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only books with any of these themes, e.g. 'grief', 'war', 'identity', 'memory'"
},
"difficulty_max": {
"type": "number",
"description": "Highest difficulty score to include (0-100; higher is harder to read)"
},
"difficulty_min": {
"type": "number",
"description": "Lowest difficulty score to include (0-100; lower is easier to read)"
}
},
"additionalProperties": false
}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"}
| Argument | Type | Description |
|---|---|---|
| limit | number | Maximum number of results (default 10, max 25) |
| query* | string | A line, a phrase, or the words remembered |
| poem_id | string | Search one poem only: its anchor or slug, as for get_poem |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "number",
"description": "Maximum number of results (default 10, max 25)"
},
"query": {
"type": "string",
"description": "A line, a phrase, or the words remembered"
},
"poem_id": {
"type": "string",
"description": "Search one poem only: its anchor or slug, as for get_poem"
}
},
"additionalProperties": false
}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"}
| Argument | Type | Description |
|---|---|---|
| end_date* | string | Last day, YYYY-MM-DD, at most 366 days after the first |
| start_date* | string | First day, YYYY-MM-DD |
| period_label | string | A name for the period, e.g. "Summer 2026" (max 60 characters) |
{
"type": "object",
"required": [
"start_date",
"end_date"
],
"properties": {
"end_date": {
"type": "string",
"description": "Last day, YYYY-MM-DD, at most 366 days after the first"
},
"start_date": {
"type": "string",
"description": "First day, YYYY-MM-DD"
},
"period_label": {
"type": "string",
"description": "A name for the period, e.g. \"Summer 2026\" (max 60 characters)"
}
},
"additionalProperties": false
}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": "<book id>", "status": "reading"} - {"book_id": "<book id>", "status": "read", "rating": 5}
| Argument | Type | Description |
|---|---|---|
| rating | number | Rating from 1 to 5, only with status "read" |
| status* | string | The new status |
| book_id* | string | The book's ReadingRate id or its library entry id |
| date_finished | string | Finish date, YYYY-MM-DD, only with status "read" (default: today) |
{
"type": "object",
"required": [
"book_id",
"status"
],
"properties": {
"rating": {
"type": "number",
"description": "Rating from 1 to 5, only with status \"read\""
},
"status": {
"enum": [
"want_to_read",
"reading",
"read",
"stopped"
],
"type": "string",
"description": "The new status"
},
"book_id": {
"type": "string",
"description": "The book's ReadingRate id or its library entry id"
},
"date_finished": {
"type": "string",
"description": "Finish date, YYYY-MM-DD, only with status \"read\" (default: today)"
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 2, 2026.