ReadingRate
REMOTE · MCP.READINGRATE.COM
Book difficulty, reading times and ranked lists, plus your reading log, quotes and clubs.
Available components
Last scanned (1 hour ago)
Scores higher than 45% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Entertainment and Games
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security57
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (get_reading_trajectory). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability79
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 11230 tokens (~229/item across 49 items; 45 tools + 4 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management10
- Stability observed for 3 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 47 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities47
- Spec-recency check failed: implements MCP spec 2024-11-05; the latest is 2026-07-28. See how to fix → Fail
- Supports UI / widget rendering.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 4 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.
- 3 Nov 26 0
- Stability: unverified → 0.03 ▲ functional
- New tool “list_quote_links” functional
- New tool “save_quote_link” functional
- New tool “suggest_quote_link” functional
- 2 Nov 26 63
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://mcp.readingrate.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=readingrate.com | CN=WE1,O=Google Trust Services,C=US | 19 Sept 2026 | 18 Dec 2026 | ECDSA 256 | ECDSA-SHA256 | 1b5ff0426d3306f31333b8213b855932 |
| SANs: readingrate.com, *.readingrate.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of mcp.readingrate.com. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| readingrate.com. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| content-security-policy | default-src 'none'; frame-ancestors 'none' |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://mcp.readingrate.com/mcp | Verified | 200 | |
| http (plaintext) | http://mcp.readingrate.com/mcp | HTTPS enforced | 301 | https://mcp.readingrate.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
add_book_to_library Add a book to the library ~431
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"}
| Name | Type | Req | Description |
|---|---|---|---|
| book_id | string | – | The book's ReadingRate id, from another ReadingRate tool's results |
| date_finished | string | – | Finish date, YYYY-MM-DD, for a book added as read (default: today) |
| 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 |
| title_author | object | – | The book's title and author. Close spellings match. |
| Name | Type | Req | Description |
|---|---|---|---|
| book | object | – | The book |
| date_finished | string | – | Finish date, when the book went in as read |
| date_started | string | – | Start date, when the book went in as reading |
| existing_status | string | – | The shelf the book was already on, when it was already in the library |
| is_new_catalog_entry | boolean | – | True when the book was not in the catalog and was added to it |
| message | string | yes | Human-readable result |
| new_status | string | – | The shelf the book went on, when a status was given |
| rating | number | – | The rating recorded, when the book went in as read |
| reading_time_estimate | string | – | Estimated reading time at an average pace |
| status_change_failed | boolean | – | The book was added but the status asked for did not take |
| success | boolean | yes | True when the book was added; false when it was already in the library |
| tbr_count | number | – | Want-to-read list size after adding |
No examples provided.
add_matched_books_to_library Add matched books to the library ~238
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"}
| Name | Type | Req | Description |
|---|---|---|---|
| book_ids | array | yes | ReadingRate book ids, as lookup_books_batch returns them (max 40) |
| status | string | – | The shelf to put every newly added book on instead of want-to-read |
| Name | Type | Req | Description |
|---|---|---|---|
| added | array | – | Books added, with id and title, plus reason when a book went in but its status did not |
| already_there | array | – | Books already in the library, with id, title and the shelf they are on; they were not changed |
| failed | array | – | Books that could not be added, with id and reason |
| message | string | yes | Human-readable result |
| success | boolean | yes | True unless no book could be added |
No examples provided.
annotate_poem_line Annotate a poem line ~149
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."}
| Name | Type | Req | Description |
|---|---|---|---|
| anchor | string | yes | The line's anchor as get_poem or search_poems returns it |
| note | string | yes | The reader's note |
| Name | Type | Req | Description |
|---|---|---|---|
| anchor | string | yes | – |
| created_at | string | – | ISO 8601 |
| id | string | – | The saved note |
| line | string | – | The line the note is attached to |
| note | string | yes | – |
| poet | – | – | – |
| success | boolean | yes | – |
| title | string | – | – |
No examples provided.
compare_books Compare books ~221
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"]}
| Name | Type | Req | Description |
|---|---|---|---|
| aspects | array | – | What to compare (default: difficulty, themes, length) |
| book_ids | array | yes | Two or three ReadingRate book ids or slugs |
| Name | Type | Req | Description |
|---|---|---|---|
| books | array | yes | – |
| summary | – | – | – |
No examples provided.
delete_reading_insight Delete a saved reading insight ~133
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>"}
| Name | Type | Req | Description |
|---|---|---|---|
| insight_id | string | yes | The saved insight's id, as get_reading_notes or save_reading_insight returned it |
| Name | Type | Req | Description |
|---|---|---|---|
| conversation_deleted | boolean | – | True when a conversation record attached to the insight was deleted too |
| deleted | boolean | yes | True when the insight was deleted |
| insight_id | string | yes | – |
| note | string | – | – |
| summary | string | – | The summary that was deleted |
No examples provided.
find_related_passages Find related passages ~242
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}
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The id of the quote or note to start from |
| limit | number | – | Maximum number of related passages (default 5, max 20) |
| threshold | number | – | Lowest similarity to include, 0 to 1 (default 0.42) |
| type | string | – | What the id is: "quote" for a saved quote, "marginalia" for a note (default "marginalia") |
| Name | Type | Req | Description |
|---|---|---|---|
| connections | array | – | The reader's own quotes and notes closest in meaning, closest first |
| connections_count | number | – | Number of related passages found |
| message | string | – | Human-readable note when the entry cannot be compared yet |
| source_id | string | – | Id of the quote or note searched from |
| source_type | string | – | quote or marginalia (a note) |
No examples provided.
get_award_winners Browse award winners ~498
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"}
| Name | Type | Req | 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. |
| category | string | – | Only winners, only the shortlist, or only the longlist |
| limit | number | – | Maximum number of books (default 20, max 50) |
| 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. |
| year_max | number | – | Latest prize year to include |
| year_min | number | – | Earliest prize year to include |
| Name | Type | Req | Description |
|---|---|---|---|
| awards | array | yes | Award results grouped by year, most recent first |
| filters_applied | object | yes | Echo of the filters used (award, year_min, year_max, category, source_type); only set filters appear |
| total_count | number | yes | Total number of recognitions returned |
| truncated | boolean | yes | True when more matching recognitions exist than were returned; narrow the year range or raise the limit to see more |
No examples provided.
get_book_club Get a book club ~104
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>"}
| Name | Type | Req | Description |
|---|---|---|---|
| club_id | string | yes | The club's id, from list_book_clubs |
| Name | Type | Req | Description |
|---|---|---|---|
| club | object | – | The club: id, name, description, cover_image_url, max_members, created_at |
| member_count | number | – | Number of members |
| members | array | – | Members by username and role; is_you marks the reader |
| recent_reads | array | – | Up to 5 most recent club books |
No examples provided.
get_book_club_current_read Get a book club's current read ~106
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>"}
| Name | Type | Req | Description |
|---|---|---|---|
| club_id | string | yes | The club's id, from list_book_clubs |
| Name | Type | Req | Description |
|---|---|---|---|
| message | string | – | Human-readable note when the club has no current book |
| milestone_count | number | – | Number of milestones |
| milestones | array | – | Milestones in order |
| read | object | – | The club's current book |
No examples provided.
get_book_details Get book details ~426
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}
| Name | Type | Req | Description |
|---|---|---|---|
| book_id | string | – | The book's ReadingRate id, from another ReadingRate tool's results |
| 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) |
| slug | string | – | The book's ReadingRate slug, e.g. "crime-and-punishment" |
| title_author | object | – | The book's title and author. Close spellings match. |
| Name | Type | Req | Description |
|---|---|---|---|
| authors | array | yes | – |
| awards | array | – | – |
| cover_url | – | – | – |
| difficulty | object | yes | – |
| genres | array | – | – |
| id | string | – | Work UUID, for book_id arguments of other tools |
| reading_time_minutes | – | – | – |
| regard_overall | – | – | – |
| slug | string | yes | – |
| taught_in | array | – | School curricula and exam boards that set the book (not awards) |
| title | string | yes | – |
| word_count | – | – | – |
| year | – | – | – |
No examples provided.
get_currently_reading Get books in progress ~109
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| books | array | – | Books in progress, with progress and time estimates |
| count | number | – | Number of books in progress |
| poem_count | number | – | Number of poems in the poems array |
| poems | array | – | Poems the reader has read again recently, most recent first. return_count is how many times each was read. |
| summary | object | – | Totals: total_books, total_pages_remaining, total_hours_remaining, reading_velocity_used |
No examples provided.
get_daily_reading_connections Get today's reading connections ~130
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| connections | array | – | The connected passages |
| generated_at | string | – | When today's connections were made |
| message | string | – | Why there is nothing today, when there is not |
| reflection_prompt | string | – | A question for the reader to reflect on |
| theme | string | – | The theme connecting today's passages |
No examples provided.
get_monthly_reading_summary Get a monthly reading summary ~144
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}
| Name | Type | Req | Description |
|---|---|---|---|
| month | integer | yes | The month, 1 to 12 |
| year | integer | yes | The year, e.g. 2026 |
| Name | Type | Req | Description |
|---|---|---|---|
| created_at | string | – | When the summary was made |
| data | object | – | The summary: hero, books_read, cognitive_terrain, highlights, year_so_far, growth, daily_words |
| message | string | – | Why there is no summary, when there is none |
No examples provided.
get_passages_near_reading_position Get passages near the reader's position ~258
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"}
| Name | Type | Req | Description |
|---|---|---|---|
| book_id | string | – | The book: its ReadingRate id or library entry id (default: the book the reader read most recently) |
| topic | string | – | What the reader wants help with, e.g. "narrative voice"; focuses the passages returned |
| Name | Type | Req | Description |
|---|---|---|---|
| book | object | yes | The book and the user's reading position |
| note | string | yes | Guidance on how to use the passages (or why none were found) |
| passages | array | yes | Text passages from near the user's reading position |
| passages_found | number | yes | Number of passages returned |
No examples provided.
get_personalized_recommendations Get personalized recommendations ~211
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"]}
| Name | Type | Req | Description |
|---|---|---|---|
| count | number | – | Number of recommendations (default 5, max 20) |
| difficulty_stretch | boolean | – | Include books a little harder than the reader usually reads |
| exclude_genres | array | – | Genres to leave out |
| from_tbr | boolean | – | Recommend only from the reader's want-to-read list |
| Name | Type | Req | Description |
|---|---|---|---|
| based_on | object | yes | Profile data the recommendations were derived from |
| options_used | object | yes | Echo of the request options (from_tbr, exclude_genres, difficulty_stretch) |
| recommendations | array | yes | Recommended books, highest match score first |
No examples provided.
get_poem Get poem ~210
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}
| Name | Type | Req | Description |
|---|---|---|---|
| identifier | string | yes | The poem's anchor, "poet/poem" such as "wyatt/whoso-list-to-hunt", or its slug alone, such as "whoso-list-to-hunt" |
| section | number | – | Section number, for a work in sections only. Omit to get the list of sections. |
| Name | Type | Req | Description |
|---|---|---|---|
| lines | array | – | The text, in order. Apparatus lines are marked and carry no line number. |
| note | string | – | How to fetch a section, when sections were returned |
| poem | object | yes | Identity of the work, and the anchor every line hangs off |
| section | – | – | Section ordinal, when one was asked for |
| sections | array | – | Returned instead of lines when the work is sectioned and no section was named |
No examples provided.
get_poetic_form_mastery Get poetic form mastery ~78
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| by_form | array | – | Mastery by poetic form (sonnet, ode, ...) |
| by_period | array | – | Mastery by era (Classical Antiquity, Medieval, ... Contemporary, Undated) |
| by_poet | array | – | Mastery by poet |
No examples provided.
get_poetry_reading_stats Get poetry reading stats ~149
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}
| Name | Type | Req | Description |
|---|---|---|---|
| half_life_days | number | – | Days for a read to count half as much in the ranking (default 30) |
| limit | number | – | Maximum number of poems in the ranking (default 20) |
| Name | Type | Req | Description |
|---|---|---|---|
| depth_signature | object | – | Breadth (distinct poems read) against depth (median rereads within the rotation) |
| lines_by_heart | number | – | Distinct poem lines the reader knows by heart |
| rotation | array | – | Poems ranked by how often and how recently the reader read them, highest first |
| rotation_half_life_days | number | – | The half-life used for recency |
No examples provided.
get_reading_days Get reading days ~289
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}
| Name | Type | Req | Description |
|---|---|---|---|
| book_id | string | yes | The book's ReadingRate id or its library entry id |
| reading_number | number | – | Which reading: 1 for the first, 2 for a reread. Default: the latest |
| timezone | string | – | IANA time zone the days are counted in, for example "Europe/London" |
| Name | Type | Req | Description |
|---|---|---|---|
| book | object | yes | The book: id, slug, title, authors |
| current_page | – | – | – |
| current_page_label | – | – | current_page as the book prints it, e.g. "liv" or "10" |
| days | array | yes | One entry per day with a page change, oldest first |
| end_date | – | – | – |
| front_matter_pages | – | – | Roman-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 |
| logged_since | – | – | When the first page change of this reading was recorded; days before it are not known |
| note | string | – | What the days do and do not cover |
| reading_number | number | – | Which reading of the book: 1 for the first, 2 for a reread |
| reverse_numbering | boolean | – | The book counts down to page 1: its furthest page each day is the lowest |
| start_date | – | – | – |
| status | string | – | read | reading | want_to_read | stopped | dnf |
| timezone | string | – | The time zone the days are counted in |
| total_pages | – | – | Printed pages in the reader's copy, without a roman-numbered introduction; percent counts the whole copy |
No examples provided.
get_reading_domain Get a reading domain ~113
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>"}
| Name | Type | Req | Description |
|---|---|---|---|
| domain_id | string | yes | The domain's id, from list_reading_domains |
| Name | Type | Req | Description |
|---|---|---|---|
| axis | string | – | genre | cultural | period | thematic | compound | user |
| description | – | – | – |
| domain_id | string | – | – |
| is_focused | boolean | – | Whether the reader made this a focus domain |
| mastery_stage | string | – | newcomer | exploring | well_read | analytical | expert |
| metrics | object | – | Progress metrics |
| name | string | – | – |
| next_stage | – | – | The next stage, or null at expert |
| next_stage_boosts | – | – | Optional signals that speed up the next stage, each { current, required, met }. Each one met lowers the requirements by 10%, up to 30% |
| next_stage_requirements | – | – | Books and weighted words needed for the next stage, each { current, required, met }, already reduced by met boosts |
| requirement_reduction | number | – | Fraction (0-0.3) the met boosts currently take off the requirements |
| slug | string | – | – |
| stage_progress | number | – | Progress toward the next stage |
| work_count | number | – | Books in the catalog in this domain |
No examples provided.
get_reading_goals Get reading goal progress ~119
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.
| Name | Type | Req | Description |
|---|---|---|---|
| year | number | – | The goal year (default: the current year) |
| Name | Type | Req | Description |
|---|---|---|---|
| goal | object | – | target_books, books_read, progress_percent, books_remaining, days_remaining, pace_needed_per_month, on_track, projected_finish |
| goal_set | boolean | – | Whether the reader has set a goal for the year |
| monthly_breakdown | array | – | Books finished per month: month, books_read |
| status | string | – | One-line summary of progress |
| suggestion | string | – | A goal suggested from past reading, when none is set |
| year | number | – | The goal year |
No examples provided.
get_reading_history Get reading history ~163
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.
| Name | Type | Req | Description |
|---|---|---|---|
| include_sessions | boolean | – | Include the reading sessions logged for each book (default false) |
| limit | number | – | Maximum number of books (default 50, max 100) |
| status | string | – | Only books with this status. Omit for all. |
| Name | Type | Req | Description |
|---|---|---|---|
| filter | object | – | The filters applied: status, limit, include_sessions |
| history | array | – | Books in the reader's library, newest activity first |
| stats | object | – | Summary counts: total_books, by_status |
No examples provided.
get_reading_notes Get reading notes ~210
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"}
| Name | Type | Req | Description |
|---|---|---|---|
| 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 |
| limit | number | – | Maximum number of highlights and notes (default 10, max 50) |
| Name | Type | Req | Description |
|---|---|---|---|
| bookContext | object | – | When book_id is given: title, author, pagesRead, totalPages, startedAt |
| conversation_insights | array | – | Reading 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… |
| insight_query | string | – | The insight_query used, when one was given |
| insights | array | – | Insights ReadingRate generated about the reader's reading, newest first |
| quotes | array | – | The reader's highlights and notes, newest first (one book's when book_id is given) |
| readingProfile | object | – | quoteCount, lastQuoteAt |
No examples provided.
get_reading_stats Get reading statistics ~82
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| difficulty_comfort_zone | object | – | min, max, average, description |
| genre_preferences | array | – | Top genres with count, percentage, average_rating |
| rating_distribution | array | – | Counts and percentages per 1-5 rating |
| reading_pace | object | – | books_per_month, pages_per_day, most_active_period |
| theme_preferences | array | – | Recurring themes with count, appeal_score |
| total_books_read | number | – | Number of finished books |
| velocity | object | – | pages_per_hour, words_per_minute, confidence, description |
No examples provided.
get_reading_trajectory Get reading-pattern insights ~156
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| insight_count | number | – | Number of insights returned |
| insights | array | – | Insights about the reader's patterns, newest first |
| message | string | – | Why there are no insights, when there are none |
No examples provided.
get_top_books Top-ranked books ~706
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} - {}
| Name | Type | Req | Description |
|---|---|---|---|
| author_gender | string | – | Only books by women, or only books by men |
| 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,… |
| 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 di… |
| 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, biog… |
| language | string | – | The original language, e.g. "French". These have list pages: French, Spanish, Russian, German, Chinese, Italian, Japanese, Polish. |
| limit | number | – | How many books from the top of the list (default 10, max 100) |
| 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 eno… |
| Name | Type | Req | Description |
|---|---|---|---|
| books | array | yes | The top of the list, in rank order |
| count | number | yes | Number of books returned |
| filters_applied | object | yes | Each filter as it was matched, e.g. country: Japan; only set filters appear |
| list | object | yes | The list the books come from |
| note | string | – | Present when the list is short, empty, or has no page |
No examples provided.
list_book_clubs List book clubs ~84
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| club_count | number | – | Number of clubs the reader belongs to |
| clubs | array | – | The reader's clubs with their role and each club's current book |
| message | string | – | Human-readable note when the reader is in no club |
No examples provided.
list_quote_links List quote links ~181
Lists the links the reader has drawn between their own saved quotes in ReadingRate, newest first: the two quotes each link joins, with book and page, and the reader's line on why they belong together. Can be narrowed to the links of one quote, and can include links suggested to the reader that they have not accepted yet. Use when the reader asks what a quote is linked to, which quotes they have connected, or before suggesting a link, to avoid suggesting one they already have. Example: {"quote_id": "<quote id>"}
| Name | Type | Req | Description |
|---|---|---|---|
| include_suggestions | boolean | – | Also list suggested links the reader has not accepted yet (default false) |
| limit | number | – | Maximum number of links (default 20, max 50) |
| quote_id | string | – | Only links of this quote: its id, from list_saved_quotes |
| Name | Type | Req | Description |
|---|---|---|---|
| link_count | number | – | – |
| links | array | – | Links, newest first |
| message | string | – | Human-readable note when there are no links |
No examples provided.
list_quotes_due_for_review List quotes due for review ~121
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}
| Name | Type | Req | Description |
|---|---|---|---|
| limit | number | – | Maximum number of items (default 5, max 20) |
| Name | Type | Req | Description |
|---|---|---|---|
| due_count | number | – | Number of quotes and passages due |
| lines_by_heart | number | – | Distinct poem lines the reader currently knows by heart, across memorized passages in good standing |
| message | string | – | Human-readable note when nothing is due |
| quotes | array | – | Quotes and poem passages due for review, earliest due first |
No examples provided.
list_reading_domains List reading domains ~126
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| domains | array | – | Up to 50 domains, focus domains first, then by books completed |
| message | string | – | Human-readable note when the reader has no domain progress yet |
| note | string | – | Present when some domains were left out |
| total_domains | number | – | Number of domains with progress |
No examples provided.
list_saved_quotes List saved quotes ~139
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"}
| Name | Type | Req | Description |
|---|---|---|---|
| book_id | string | – | Only quotes from this book: its ReadingRate book id or library entry id |
| limit | number | – | Maximum number of quotes (default 50, max 100) |
| search | string | – | Only quotes containing these words |
| Name | Type | Req | Description |
|---|---|---|---|
| count | number | – | Number of quotes returned |
| quotes | array | – | Saved quotes, newest first |
No examples provided.
log_poem_read Log poem read ~181
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}
| Name | Type | Req | Description |
|---|---|---|---|
| identifier | string | yes | The poem's anchor ("poet/poem") or slug, as for get_poem |
| section | number | – | Section number; required for a work in sections |
| Name | Type | Req | Description |
|---|---|---|---|
| anchor | string | yes | What was logged: the whole work, or one section of it |
| poem | object | – | – |
| read_at | string | – | ISO 8601 |
| read_count | number | yes | Times the reader has now read this poem |
| success | boolean | yes | – |
No examples provided.
log_reading_session Log a reading session ~531
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."}
| Name | Type | Req | Description |
|---|---|---|---|
| book_id | string | yes | The book's ReadingRate id or its library entry id |
| 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 |
| notes | string | – | The reader's note on today's reading, added to today's journal entry |
| 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" |
| Name | Type | Req | Description |
|---|---|---|---|
| book | object | – | The book: id, slug, title, authors |
| estimate | – | – | hours_remaining and description; null when the total pages are unknown |
| message | string | yes | Human-readable result |
| progress | object | – | current_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… |
| status_changed | – | – | Set when the book moved from want-to-read to reading |
| success | boolean | yes | Whether the session was logged |
| velocity_used | number | – | Pages per hour used for the estimate |
No examples provided.
lookup_books_batch Look up a list of books ~246
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"}]}
| Name | Type | Req | Description |
|---|---|---|---|
| books | array | yes | The books to identify. Give each one an isbn, a title, or a title and author. |
| Name | Type | Req | Description |
|---|---|---|---|
| matched | array | yes | Queries matched to ReadingRate books |
| summary | object | yes | Counts for the batch |
| unmatched | array | yes | Queries with no catalog match |
No examples provided.
record_quote_review Record a quote review ~214
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}
| Name | Type | Req | Description |
|---|---|---|---|
| quality | integer | yes | How well the reader recalled it, from 0 (not at all) to 5 (perfectly) |
| quote_id | string | yes | The quote's id, from list_quotes_due_for_review |
| Name | Type | Req | Description |
|---|---|---|---|
| next_due_quote | – | – | The next quote due for review, or null when none is |
| schedule | object | – | The quote's schedule after this review |
No examples provided.
save_poem_line Save a poem line ~171
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"}
| Name | Type | Req | Description |
|---|---|---|---|
| anchor | string | yes | The line's anchor as get_poem or search_poems returns it, e.g. "wyatt/whoso-list-to-hunt/13" |
| note | string | – | The reader's note on the line |
| Name | Type | Req | Description |
|---|---|---|---|
| anchor | string | – | – |
| id | string | – | The saved quote |
| message | string | – | Why nothing was saved, when success is false |
| poet | – | – | – |
| settings_url | string | – | Where the reader can allow saving quotes from assistants |
| success | boolean | yes | – |
| text | string | – | The line as saved |
| title | string | – | – |
| total_lines_saved_for_poem | number | – | – |
No examples provided.
save_quote Save a quote ~237
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}
| Name | Type | Req | Description |
|---|---|---|---|
| book_id | string | yes | The book the quote is from: its ReadingRate book id or library entry id |
| notes | string | – | The reader's note on the quote (max 2000 characters) |
| page_number | number | – | Page the quote is on |
| quote_text | string | yes | The words of the quote |
| speaker | string | – | The character who says it, for dialogue (max 200 characters) |
| themes | array | – | Themes the quote touches (max 10, each max 100 characters) |
| Name | Type | Req | Description |
|---|---|---|---|
| book | object | – | Book the quote belongs to: id, slug, title, authors |
| message | string | – | Human-readable result |
| quote | object | – | The saved quote: id, text, page, speaker, notes, themes |
| settings_url | string | – | Settings link, returned when the reader has turned off saving quotes from assistants |
| success | boolean | – | Whether the quote was saved |
| total_quotes_for_book | number | – | Total quotes saved for this book |
No examples provided.
save_quote_link Save a quote link ~185
Links two of the reader's saved quotes in ReadingRate, with an optional line on why they belong together. The link is two-way and shows on both quotes in the app. Linking two quotes that are already linked changes nothing. Use only when the reader asks to link two quotes, or says yes to linking them. To propose a link the reader has not asked for, use suggest_quote_link. Example: {"quote_id": "<quote id>", "linked_quote_id": "<quote id>", "note": "Both ask how wide the present is."}
| Name | Type | Req | Description |
|---|---|---|---|
| linked_quote_id | string | yes | The other quote: its id, from list_saved_quotes |
| note | string | – | Optional: one line on why the two belong together, at most 280 characters |
| quote_id | string | yes | One of the two quotes: its id, from list_saved_quotes |
| Name | Type | Req | Description |
|---|---|---|---|
| already_linked | boolean | – | True when the two were already linked; nothing changed |
| link | object | – | – |
| message | string | – | – |
No examples provided.
save_reading_insight Save a reading insight ~339
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"]}
| Name | Type | Req | Description |
|---|---|---|---|
| book_ids | array | yes | 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 | yes | The takeaways, one sentence or two each (1 to 10) |
| summary | string | yes | What the reader wants to keep, in 2 to 4 sentences (20 to 1000 characters) |
| topics | array | – | Themes the insight is about, e.g. "unreliable narration" (up to 20) |
| Name | Type | Req | Description |
|---|---|---|---|
| insight | object | yes | The saved insight |
| message | string | yes | Human-readable confirmation naming the books |
| success | boolean | yes | True when the insight was saved |
| synced_to_notion | boolean | yes | True when a copy was written to the reader's Notion |
| view_url | string | yes | Where the reader can see the insight in ReadingRate |
No examples provided.
search_book_content Search book content ~441
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"}
| Name | Type | Req | Description |
|---|---|---|---|
| book_id | string | – | The book to search: its ReadingRate id or library entry id. Give this or poem_id. |
| limit | number | – | Maximum number of passages (default 5, max 10) |
| poem_id | string | – | The poem to search: its anchor or slug, as for get_poem. Give this or book_id. |
| query | string | yes | What to look for, in words, e.g. "passages about memory" |
| 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| filtered_to_book | object | – | Present when book_id was provided: the resolved book |
| message | string | – | Present when no passages were found: explains why |
| passages | array | yes | Matching passages ordered by relevance |
| query | string | yes | The search query that was run |
| results_count | number | yes | Number of passages returned |
| spoiler_protection | object | – | Present when spoiler protection was applied or explicitly requested |
No examples provided.
search_books Search books ~444
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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) |
| genres | array | – | Only books in any of these genres |
| limit | number | – | Maximum number of results (default 10, max 50) |
| 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. |
| query | string | – | Words from a title or an author's name. Close spellings match. |
| themes | array | – | Only books with any of these themes, e.g. 'grief', 'war', 'identity', 'memory' |
| Name | Type | Req | Description |
|---|---|---|---|
| books | array | yes | – |
| count | number | yes | – |
| locale | string | – | Locale the localized fields are in |
No examples provided.
search_poems Search poems ~244
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"}
| Name | Type | Req | Description |
|---|---|---|---|
| limit | number | – | Maximum number of results (default 10, max 25) |
| poem_id | string | – | Search one poem only: its anchor or slug, as for get_poem |
| query | string | yes | A line, a phrase, or the words remembered |
| Name | Type | Req | Description |
|---|---|---|---|
| note | string | – | Guidance when the query could not match (e.g. written in a non-English script) |
| results | array | yes | Matching passages, most similar first. Empty when nothing matched. |
No examples provided.
How do I install the ReadingRate MCP server?
ReadingRate is a hosted endpoint at https://mcp.readingrate.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · mcp.readingrate.com
claude mcp add --transport http com-readingrate-readingrate 'https://mcp.readingrate.com/mcp'
What is the ReadingRate MCP server?
ReadingRate is an MCP server listed in the public MCP registry as com.readingrate/readingrate. Book difficulty, reading times and ranked lists, plus your reading log, quotes and clubs. This page covers its hosted endpoint (https://mcp.readingrate.com/mcp).
Is the ReadingRate MCP server safe to use?
ReadingRate scores 64 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the ReadingRate MCP server expose?
ReadingRate exposes 45 tools: search_books, get_book_details, compare_books, get_award_winners, get_top_books, and 40 more. Their descriptions and schemas cost roughly 10,319 tokens of context every time the server is loaded.
Does the ReadingRate MCP server require authentication?
No. We connected to ReadingRate without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the ReadingRate MCP server still maintained?
ReadingRate is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.