Readwise MCP HTTP Server
This server provides comprehensive read/write access to your Readwise and Readwise Reader library. Key capabilities include:
Highlights
Search using semantic (vector), full-text, or hybrid modes
List, get, create, update, and delete highlights
Bulk export highlights with cursor-based pagination
Books & Sources
List books/sources filtered by category, highlight count, or recency
Get a single book by ID with full metadata
Tags
List, create, and delete tags
Add or remove tags on highlights
Reader Documents
Save URLs to Reader (Readwise fetches and parses content automatically)
List documents filtered by location, category, or recency
Get a single document by ID
Update reading progress (0.0–1.0)
Markdown → EPUB (Advanced)
Convert markdown into a real, brand-styled EPUB 3 file delivered asynchronously to your Reader Library via email (1–5 min ingestion); supports YAML frontmatter, TOC, and chapter navigation
Verify EPUB receipt to confirm delivery
Insights
Access engagement-aware reading data including recent activity, evergreen interests, and writing material based on engagement scores
Provides access to Readwise highlights and documents through vector and full-text search capabilities, enabling retrieval and exploration of saved reading materials and annotations.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Readwise MCP HTTP Serversearch my highlights for notes about machine learning"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-readwise
MCP server for Readwise and Readwise Reader, built on FastMCP. Engagement-aware reads, the usual write tools, and one thing you can't easily do anywhere else: turn a markdown blob into a real, brand-styled EPUB and have it land in your Reader Library a minute later.
16 tools. Python 3.12. Deployed via Docker.
Why this exists
The most common source of "long markdown that needs a reading home" in 2026 is research output from Claude, OpenAI, and other agent loops. Deep-research mode produces 3000–8000 word briefs in a single tool turn. They arrive as markdown in a chat window, and they shouldn't stay there — they want chapter navigation, a TOC sidebar, downloadable export to a Kobo / Boox / Kindle, and most often the Readwise iOS and iPad apps, which are quietly the best long-form reading and highlighting clients on those devices.
This MCP server is the transporter for that markdown into Reader. An agent calls save_markdown_as_epub, the EPUB appears in your Library a minute later, and the chat window is no longer your reading place.
Related MCP server: Kiseki-Labs-Readwise-MCP
The niche-but-nice part: markdown → real EPUB in Reader

Readwise's Reader API has no file-upload endpoint — I verified this against their v3 docs and their own official CLI, which doesn't expose one either. The closest thing the API offers is "save URL" or "save HTML." Neither produces a true EPUB in Reader, which is the format with proper chapter nav, TOC, and downloadable export to Kobo / Boox / Kindle.
The one path that does produce a real EPUB is the email-to-library mechanism: every Reader account has a <custom>@library.readwise.io address that accepts EPUB attachments and ingests them properly. So save_markdown_as_epub automates that path:
markdown blob → pandoc renders to EPUB 3 (with CDIT brand styling)
→ aiosmtplib delivers via Resend SMTP
→ email lands at <custom>@library.readwise.io
→ Readwise ingest pipeline picks it up (1–5 min)
→ real EPUB appears in LibraryThe tool returns immediately after SMTP delivery — the ingest is async by nature. A companion tool verify_epub_received polls Reader to confirm the document landed, with time-aware retry guidance baked into the response so an LLM caller knows when to retry vs. when to surface a failure.
Setup
Three environment variables, all required (the server still boots without them — only save_markdown_as_epub refuses to run; every other tool, including verify_epub_received, works normally):
# Your custom Readwise Library email
# Find at: read.readwise.io → Account → Personalize email addresses
# Bearer credential — rotate via Readwise if it leaks.
READWISE_LIBRARY_EMAIL=casey-personal@library.readwise.io
# Resend API key, used as SMTP password (username is literal "resend")
RESEND_API_KEY=re_…
# Verified sender registered in Resend
EPUB_FROM_ADDRESS=mcp-readwise@cdit-dev.deCalling it
# From any MCP client (Claude, agents, scripts):
result = save_markdown_as_epub(
markdown="""---
title: Q2 Planning Brief
author: Casey
tags: [planning, brief]
note: Context for the team — read this before Thursday's call.
---
# Background
...
""",
idempotency_key="brief-2026-q2-v1", # optional — collapses retry duplicates
)
# → EpubSendResult(title=..., accepted_at=..., recipient=...,
# identifier_scheme="x-mcp-readwise-idempotency", ...)
# Wait 1–2 minutes, then:
verify = verify_epub_received(title=result.title, since=result.accepted_at)
# → VerifyResult(found=True, document=ReaderDocument(...),
# note="Found in Reader Library.")The docstring leads with the async contract loudly so LLM agents reading the schema know not to tell the human "done" until verify_epub_received confirms.
Brand stylesheet (CDIT)
EPUB output is styled by a hand-tuned CSS at mcp_readwise/assets/epub/cdit-style.css, inheriting the palette from cdit-works.de:
Carbon
#272f38(body text), Cloud Dancer#f0eee9(page background)Strong Blue
#1f5da0(links, H1 underline), Mint#5cc6c3(blockquote rail, Note preface)Inter weights 400 / 700 / 800 embedded as static woff2 subsets (latin + latin-ext, ~170KB)
Headings deliberately diverge from the website's display face: chapter heads use Inter weight 800 with tracking
-0.02em, not League Gothic — condensed display fonts fatigue across long-form chapter breaksbody { line-height: 1.7; text-align: left; hyphens: auto; }tuned for sustained reading
To customize, fork the CSS file. It's a first-class editable asset, not generated from Python.
Frontmatter
Both save_markdown and save_markdown_as_epub accept YAML frontmatter for self-describing markdown:
---
title: My Note
author: Casey
summary: A brief description.
tags: [research, draft]
note: Context for the reader.
published_date: 2026-05-11
image_url: https://example.com/cover.jpg
---
# Body starts here
Content with **markdown** features — tables, footnotes, fenced code, smart quotes
all render properly through the `extra` + `sane_lists` + `smarty` extensions.Title resolution (first non-empty wins): explicit title= param → frontmatter title: → first # H1 in body → "Untitled". Same precedence for other fields (without the H1 fallback).
Limits
EPUB ceiling: 20 MiB raw binary (Readwise's email ingest caps at 30 MB; base64 inflates ~33%, MIME adds ~1 MB, so 20 MiB fits with margin). Larger EPUBs raise
EpubTooLargeErrorbefore SMTP.Pandoc binary in the Docker image: ~150 MB. Accepted cost.
Inline images in markdown must use absolute HTTPS URLs — pandoc fetches them at build time; relative paths don't resolve.
The other 14 tools
Read (engagement-aware)
These two collapsed an earlier 7-tool read surface into intent-shaped calls. They're built on a per-source engagement score that joins Readwise v2 books with their Reader v3 documents, so books and articles, finished and saved, recent and legacy, all sit on one comparable axis.
Tool | Description |
| Single-call snapshot — recent activity, evergreen top, current attention, junk drawer, signal density. Accepts |
| Bundle highlights for drafting. Source-first ( |
Read (direct Reader lookup)
These bypass the engagement cache to browse or look up the full Reader library (e.g. archived docs the cache doesn't surface).
Tool | Description |
| Cursor-paginated list of Reader documents, filterable by |
| Look up a single Reader document by its source URL. |
Write
Tool | Description |
| Save a URL to Reader; Readwise fetches and parses. Synchronous. |
| Save a markdown blob to Reader as rendered HTML with |
| The real-EPUB-via-email path described above. Async, returns |
| Confirm a |
| Update reading progress (0.0–1.0). |
| Highlight CRUD with |
Tags
Tool | Description |
| List user-created custom tags. |
| Tag CRUD. |
| Add or remove a tag on a highlight. |
Three ways to save your own content into Reader
You want | Use | Sync / Async | Fidelity | Setup |
Save a URL (Readwise fetches & parses) |
| sync | HTML article | none |
Save markdown as HTML with epub-UX hint |
| sync | HTML with | none |
Save markdown as a real EPUB book |
| async (1–5 min) | true EPUB 3 with TOC, chapter nav, brand styling | three env vars |
Installation
uv syncPandoc is required for save_markdown_as_epub. It's baked into the Docker image; for local dev install it via brew install pandoc. Other tools work without it.
Configuration
Variable | Required | Default | Description |
| Yes | — | Readwise API access token (get one) |
| When | — | Bearer token for the MCP Portal auth |
| No |
|
|
| No |
| HTTP server host |
| No |
| HTTP server port |
| No |
| Readwise API base URL |
| No |
| TTL for the engagement index cache |
| No | (built-in) | Tags excluded from the annotation bonus |
EPUB sender (optional, but all three required together) | |||
| Only for | — | Your |
| Only for | — | Resend SMTP password |
| Only for | — | Verified Resend sender address |
| No |
| Override to use Postmark, SES, etc. |
| No |
| |
| No |
| EPUB OPF |
| No |
| 20 MiB ceiling before send |
Usage
# Local stdio mode (default — for direct MCP client use)
READWISE_TOKEN=… uv run mcp-readwise
# HTTP mode (for MCP Portal / Cloudflare deployment)
READWISE_TOKEN=… MCP_API_KEY=… TRANSPORT=http uv run mcp-readwise
# Docker
cp .env.example .env # fill in values
docker compose up -dHealth endpoint
GET /healthReturns build identifier, git commit, uptime, registered tool count, engagement index status, and the epub_sender configured flags (without ever exposing the API key or library email in plaintext).
{
"status": "healthy",
"version": "0.7.0",
"build": "0.7.0+6ec5b6b",
"tools": 16,
"engagement_index": { "built": true, "source_count": 152, "age_seconds": 312 },
"epub_sender": {
"configured": true,
"smtp_host": "smtp.resend.com",
"smtp_port": 587,
"from_address": "mcp-readwise@cdit-dev.de",
"library_email_set": true
}
}How the engagement score works
Every source — book or article, Reader-imported or legacy Kindle — gets a vector engagement score with four components:
rawranks "current attention" (recency-weighted overall score)intensityranks "evergreen interests" (recency removed; pure depth)recencysmall modifier from how recently the source was last highlightedreturn_strengthcaptures multi-year highlight clusters and recent Reader re-opens
Computed from a layered sum of:
Base layer —
legacy(v2-only Kindle/iBooks book),highlighted,finished_no_hl,reading,saved_warm,saved_coldDensity — non-discarded highlight count
Recency — last-highlight age, banded (30d / 1y / 5y)
Annotation — does any highlight carry a user note, a non-structural tag, or
is_favorite?Return signal — multi-year highlight clusters AND/OR Reader-era reopens
See openspec/changes/archive/2026-05-11-workflow-shaped-tools/design.md for the full formula and decision rationale.
Project structure
mcp_readwise/
server.py # FastMCP app, tool registration, /health
config.py # pydantic-settings configuration
client.py # Centralized httpx client (auth, retries, rate limits)
auth.py # Bearer token verifier for MCP Portal
engagement.py # The engagement index + scoring formula
markdown_render.py # Frontmatter parser + Markdown → HTML helper
epub_render.py # Pandoc wrapper + EPUB metadata builder
smtp_client.py # Async SMTP transport (aiosmtplib)
assets/epub/ # CDIT brand stylesheet + embedded Inter woff2 subsets
models/ # Pydantic response models
tools/
status.py, writing.py # Engagement-aware reads
markdown.py # save_markdown (HTML path)
epub_sender.py, epub_verifier.py # Real-EPUB-via-email path
reader.py, highlights.py, tags.py # Standard write toolsDeployment
Deployed via Komodo to ubuntu-smurf-mini, accessible through the Cloudflare MCP Portal at mcp-readwise.cdit-dev.de. Auto-deploys on push to main via GitHub webhook → Komodo listener.
License
MIT
Available Tools
17 toolscreate_highlightB
Create a new highlight on a book.
Requires the highlight text and the book_id it belongs to. Optionally add a note and tags. Returns the full created highlight.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| book_id | Yes | ||
| note | No | ||
| tags | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| text | No | |
| note | No | |
| tags | No | |
| book_id | No | |
| book_title | No | |
| book_author | No | |
| source_url | No | |
| highlighted_at | No | |
| created_at | No | |
| updated_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden for behavioral disclosure. It states this is a creation operation ('Create a new highlight') and mentions the return value, but lacks details on permissions, side effects, error conditions, or rate limits. For a mutation tool with zero annotation coverage, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core purpose. Each sentence adds value: the first states the action, the second covers required parameters, the third optional ones, and the fourth the return. It's efficient with minimal waste, though slightly verbose for such a simple tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a mutation tool with no annotations, 0% schema coverage, but an output schema exists, the description is moderately complete. It covers parameters and return value, but lacks behavioral context (e.g., auth needs, error handling). The output schema reduces the need to explain returns, but more guidance is needed for safe use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It effectively explains all 4 parameters: 'text' and 'book_id' as required, and 'note' and 'tags' as optional. This adds crucial meaning beyond the bare schema, though it doesn't specify formats or constraints (e.g., text length, tag structure).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Create a new highlight') and resource ('on a book'), which is specific and unambiguous. However, it doesn't explicitly differentiate from sibling tools like 'tag_highlight' or 'update_highlight', which also involve highlight manipulation, so it doesn't reach the highest score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'tag_highlight' or 'update_highlight'. It mentions required and optional parameters but doesn't specify use cases, prerequisites, or exclusions, leaving the agent to infer usage from context alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_tagB
Create a new tag.
Returns the created tag with its ID and name.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions that the tool returns the created tag with ID and name, which is helpful, but fails to address critical aspects like whether this is a mutating operation (implied by 'Create'), potential side effects, error conditions, or rate limits. This leaves significant gaps in understanding the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two sentences that are front-loaded and waste no words. The first sentence states the core action, and the second adds useful return information, making it efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (a creation operation with one parameter) and the presence of an output schema (which handles return values), the description is minimally adequate. However, it lacks details on usage context, parameter meaning, and behavioral traits, making it incomplete for safe and effective use without additional inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description must compensate. It does not mention the 'name' parameter at all, leaving its purpose and constraints undocumented. However, with only one parameter and an output schema present, the baseline is 3, as the description adds minimal value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Create a new tag') and resource ('tag'), making the purpose immediately understandable. However, it doesn't differentiate this tool from its sibling 'list_tags' or 'delete_tag' in terms of when to use each, which prevents a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'list_tags' or 'delete_tag', nor does it mention prerequisites such as authentication or permissions needed for creation. It simply states what the tool does without contextual usage instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_highlightB
Delete a highlight by ID.
Returns a confirmation with the deleted highlight's ID.
| Name | Required | Description | Default |
|---|---|---|---|
| highlight_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool deletes a highlight and returns a confirmation, which covers the basic operation. However, it lacks critical details like whether deletion is permanent/reversible, permission requirements, error handling (e.g., invalid ID), or side effects (e.g., impact on tagged highlights). For a destructive tool with zero annotation coverage, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise and front-loaded: the first sentence states the core purpose, and the second adds return value information. Every sentence earns its place with no wasted words, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's destructive nature, no annotations, and a simple input schema, the description is minimally adequate. It covers the basic operation and return confirmation, and the presence of an output schema means return values don't need explanation. However, for a deletion tool, it should ideally include more behavioral warnings or prerequisites to be fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaningful context for the single parameter by specifying it's an ID used to identify the highlight to delete. With 0% schema description coverage (the schema only defines 'highlight_id' as an integer with no description), this compensates well by clarifying the parameter's purpose. However, it doesn't detail ID format or sourcing (e.g., from 'list_highlights').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Delete') and resource ('a highlight by ID'), making the purpose immediately understandable. It distinguishes itself from siblings like 'delete_tag' by specifying the resource type. However, it doesn't explicitly differentiate from other destructive operations like 'update_highlight' that might also modify highlights.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing an existing highlight ID), exclusions, or compare it to siblings like 'update_highlight' or 'delete_tag'. The agent must infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_tagB
Delete a tag by ID.
Returns a confirmation with the deleted tag's ID.
| Name | Required | Description | Default |
|---|---|---|---|
| tag_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states the tool deletes a tag and returns a confirmation, which implies a destructive mutation. However, it lacks critical behavioral details: whether deletion is permanent, what permissions are required, if there are side effects (e.g., on tagged highlights), or error handling for invalid IDs. This is inadequate for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two sentences: the first states the purpose, and the second describes the return value. Every word earns its place, and it's front-loaded with the core action. No wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (destructive mutation with 1 parameter), lack of annotations, and an output schema (which covers return values), the description is minimally adequate. It states the action and return, but misses key context like prerequisites, side effects, and error cases, leaving gaps for safe usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It mentions 'tag_id' as the parameter, adding meaning beyond the bare schema. However, it doesn't explain what a tag ID is (e.g., from 'list_tags'), its format, or validation rules. This provides basic but incomplete semantic context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Delete') and the resource ('a tag by ID'), which is specific and unambiguous. However, it doesn't explicitly differentiate this tool from sibling tools like 'delete_highlight' or 'list_tags', which would be needed for a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., the tag must exist), when not to use it, or how it relates to siblings like 'list_tags' (to check IDs) or 'create_tag' (for creation).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_highlightsA
Bulk export highlights, optionally filtered by date or specific books.
Use cursor from a previous response to paginate through large exports. Each result includes the full highlight with book metadata attached.
This uses the export endpoint — use it for bulk data retrieval, not for interactive queries. For interactive use, prefer search_highlights or list_highlights instead.
| Name | Required | Description | Default |
|---|---|---|---|
| updated_after | No | ||
| book_ids | No | ||
| cursor | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | |
| next_cursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well by disclosing key behaviors: pagination support via cursor, inclusion of book metadata in results, and the tool's nature as an export endpoint for bulk operations. It doesn't cover all possible behaviors like rate limits or auth needs, but provides substantial context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, followed by usage details and alternatives in three concise sentences. Every sentence adds value without redundancy, making it efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (bulk export with pagination), no annotations, and an output schema present, the description is largely complete. It covers purpose, usage, key behaviors, and parameter semantics, though it could add more on error handling or response structure beyond metadata mention.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the purpose of parameters: filtering by date ('updated_after' implied) or specific books ('book_ids'), and pagination via cursor. However, it doesn't detail parameter formats or constraints, leaving some gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('bulk export highlights') and resource ('highlights'), distinguishing it from siblings like search_highlights or list_highlights by emphasizing bulk data retrieval. It explicitly mentions filtering capabilities by date or books, adding specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool ('for bulk data retrieval') and when not to ('not for interactive queries'), naming alternatives like search_highlights and list_highlights for interactive use. This clearly differentiates it from sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bookB
Get a single book/source by ID.
Returns full book metadata including title, author, category, source, highlight count, cover image URL, and source URL.
| Name | Required | Description | Default |
|---|---|---|---|
| book_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | No | |
| author | No | |
| category | No | |
| source | No | |
| num_highlights | No | |
| cover_image_url | No | |
| source_url | No | |
| created_at | No | |
| updated_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool returns full metadata, which is helpful, but lacks critical details like whether this is a read-only operation, potential error conditions (e.g., invalid ID), authentication requirements, or rate limits. For a retrieval tool with zero annotation coverage, this leaves significant gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly concise and well-structured, with two sentences that efficiently convey the core functionality and return data. Every sentence adds value without redundancy, making it easy to parse and understand quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (single parameter, no nested objects) and the presence of an output schema, the description is reasonably complete. It covers the purpose and return metadata adequately. However, it lacks usage guidelines and behavioral details, which are minor gaps in an otherwise solid description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the description compensates by specifying that the single parameter 'book_id' is used to get a book by ID. This adds meaningful context beyond the schema's type information. However, it doesn't detail format constraints or examples, preventing a perfect score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('Get') and resource ('a single book/source by ID'), making it easy to understand what the tool does. However, it doesn't explicitly differentiate from its sibling 'list_books' beyond the singular vs. plural distinction, which keeps it from a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like 'list_books' or 'get_document'. It mentions retrieving by ID but doesn't clarify prerequisites, such as needing a valid book ID from another operation, or when to choose this over other retrieval tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_documentA
Get a single Reader document by ID with full content.
Returns the complete document including title, author, content, summary, reading progress, tags, and source URL.
| Name | Required | Description | Default |
|---|---|---|---|
| document_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | No | |
| author | No | |
| source_url | No | |
| category | No | |
| location | No | |
| reading_progress | No | |
| word_count | No | |
| summary | No | |
| content | No | |
| tags | No | |
| created_at | No | |
| updated_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool returns 'complete document' with listed fields, which is useful behavioral context. However, it lacks details on error handling, permissions, or rate limits, leaving gaps for a read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose in the first sentence, followed by a concise list of returned fields. Every sentence adds value without redundancy, making it efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (1 parameter) and the presence of an output schema, the description is largely complete. It covers purpose and return fields adequately, though it could benefit from more behavioral details like error cases or prerequisites.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning by clarifying that 'document_id' is used to retrieve a 'single Reader document', which is not evident from the schema alone (0% coverage). It compensates well for the low schema coverage, though it doesn't specify ID format or constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Get a single Reader document by ID') and resource ('Reader document'), distinguishing it from siblings like 'list_documents' (which retrieves multiple) and 'get_book' (which targets a different resource). It precisely defines the scope with 'with full content'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by specifying 'by ID' and 'full content', suggesting it's for retrieving a specific document's details rather than listing or filtering. However, it does not explicitly state when to use alternatives like 'list_documents' or 'get_book', missing explicit exclusions or comparisons.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_highlightA
Get a single highlight by ID with book metadata included.
Returns the full highlight including text, note, tags, book title, book author, and source URL.
| Name | Required | Description | Default |
|---|---|---|---|
| highlight_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| text | No | |
| note | No | |
| tags | No | |
| book_id | No | |
| book_title | No | |
| book_author | No | |
| source_url | No | |
| highlighted_at | No | |
| created_at | No | |
| updated_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool returns data (not a mutation) and specifies the return fields (text, note, tags, book title, author, URL), which is useful behavioral context. However, it doesn't mention error handling, permissions, or rate limits, leaving gaps for a read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose in the first sentence and details return values in the second. Every sentence earns its place with no wasted words, making it highly efficient and well-structured for quick understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 1 parameter, no annotations, and an output schema (which handles return values), the description is mostly complete: it states the purpose, usage context, and key return fields. However, it lacks error cases or behavioral nuances (e.g., what happens if the ID doesn't exist), leaving minor gaps in context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 1 parameter with 0% description coverage, but the description compensates by clarifying that 'highlight_id' is used to 'Get a single highlight by ID'. This adds meaning beyond the bare schema, though it doesn't detail format constraints (e.g., integer range). Since there's only 1 parameter, the baseline is high.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Get a single highlight by ID') and resource ('highlight'), distinguishing it from siblings like 'list_highlights' (which returns multiple) and 'search_highlights' (which filters by criteria). It explicitly includes 'book metadata included' to differentiate from potentially simpler retrieval tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when needing a specific highlight by its ID, with context from 'single highlight by ID' suggesting it's for detailed retrieval rather than listing or searching. However, it doesn't explicitly state when not to use it (e.g., vs. 'list_highlights' for multiple items) or name alternatives, keeping it from a perfect score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_booksA
List books and sources with optional filtering.
category accepts: 'books', 'articles', 'tweets', 'podcasts', 'supplementals'. Use num_highlights_gte to filter to sources with at least N highlights. Use updated_after with an ISO 8601 date to get recently updated sources.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | ||
| source | No | ||
| num_highlights_gte | No | ||
| updated_after | No | ||
| page | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | |
| total | Yes | |
| next_page | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that filtering is optional and gives examples of filter usage, but it doesn't mention behavioral traits like pagination (implied by 'page' and 'limit' parameters), rate limits, authentication needs, or what the output contains. It adds some context but leaves gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded: the first sentence states the core purpose, followed by specific parameter guidance. Every sentence earns its place by providing essential information without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters with 0% schema coverage and no annotations, the description is incomplete—it only explains 3 parameters. An output schema exists, so return values needn't be described, but for a list tool with filtering, more parameter guidance would help. It's adequate but has clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds meaning for 3 parameters: 'category' (lists acceptable values), 'num_highlights_gte' (explains filtering purpose), and 'updated_after' (specifies ISO 8601 format). However, it doesn't cover 'source', 'page', or 'limit', leaving them undocumented. The value added is significant but incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'List books and sources with optional filtering.' It specifies the verb ('List') and resource ('books and sources'), though it doesn't explicitly differentiate from sibling tools like 'list_documents' or 'list_highlights' beyond the resource name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through parameter explanations (e.g., 'Use num_highlights_gte to filter...'), but it doesn't explicitly state when to use this tool versus alternatives like 'list_documents' or 'search_highlights'. It provides context for filtering but lacks sibling differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_documentsB
List documents in Readwise Reader with optional filters.
location accepts: 'new' (inbox), 'later', 'shortlist', 'archive', 'feed'. category accepts: 'article', 'email', 'rss', 'highlight', 'note', 'pdf', 'epub', 'tweet', 'video'. Use updated_after with an ISO 8601 date to get recently updated docs.
| Name | Required | Description | Default |
|---|---|---|---|
| location | No | ||
| category | No | ||
| updated_after | No | ||
| page | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | |
| total | Yes | |
| next_page | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It mentions filtering capabilities but doesn't disclose important behavioral traits like pagination behavior (implied by page/limit parameters but not explained), rate limits, authentication requirements, or what the output contains. The description adds some context about filter values but misses key operational details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with zero waste. The first states the purpose, the next two explain parameter semantics. It's appropriately sized and front-loaded with the core functionality. Could potentially integrate pagination mention for perfect structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters with 0% schema coverage and no annotations, the description does well on parameter semantics but misses behavioral context. The existence of an output schema reduces the need to describe return values, but for a list operation with pagination and filtering, more guidance on usage patterns and limitations would be beneficial.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate fully. It successfully explains the semantics of all three filter parameters (location, category, updated_after) by detailing acceptable values and formats. While it doesn't mention page and limit parameters, these are self-explanatory pagination controls, and the description covers the more complex filter semantics that would otherwise be undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and resource 'documents in Readwise Reader' with the scope of optional filters. It distinguishes from siblings like get_document (singular) and list_books/highlights/tags (different resources), but doesn't explicitly contrast with search_highlights which might overlap in functionality.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like search_highlights or get_document. The description mentions optional filters but doesn't provide context about typical use cases or when other tools might be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_highlightsA
List highlights with optional filtering by book, tag, or recency.
Use updated_after with an ISO 8601 date string to get recent highlights, e.g. '2024-01-01' or '2024-01-01T00:00:00Z'.
Returns highlights plus total count and next_page for pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| book_id | No | ||
| tag | No | ||
| updated_after | No | ||
| page | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | |
| total | Yes | |
| next_page | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses key behavioral traits: it returns paginated results (highlights plus total count and next_page) and supports filtering. However, it doesn't cover permissions, rate limits, error conditions, or whether it's read-only (though 'list' implies safe). The description doesn't contradict annotations, as none exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core purpose, followed by specific usage notes and return details. Every sentence adds value: the first states purpose, the second provides a concrete example for a parameter, and the third explains the return format. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (5 parameters, filtering, pagination) and no annotations, the description does a good job covering key aspects: purpose, parameter usage example, and return structure. With an output schema present, it doesn't need to detail return values. However, it could better address sibling differentiation and behavioral constraints like rate limits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds meaningful context for 'updated_after' (ISO 8601 date string with examples) and mentions filtering by 'book' and 'tag,' which map to 'book_id' and 'tag' parameters. It also implies pagination via 'page' and 'limit' through the return structure, though not explicitly naming them. This partially compensates for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose as 'List highlights with optional filtering by book, tag, or recency,' which specifies the verb (list) and resource (highlights). It distinguishes from siblings like 'get_highlight' (singular) and 'search_highlights' (likely full-text search), but doesn't explicitly differentiate from 'list_books' or 'list_tags' which list different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through the mention of filtering options (book, tag, recency) and pagination, suggesting it's for retrieving multiple highlights. However, it doesn't explicitly state when to use this vs. alternatives like 'search_highlights' or 'get_highlight,' nor does it mention prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tagsA
List all tags in your Readwise library.
Returns every tag with its ID and name. No pagination needed — tag collections are typically small.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and adds valuable behavioral context: it specifies the return format ('every tag with its ID and name') and a key operational trait ('No pagination needed — tag collections are typically small'). This discloses practical usage details beyond basic functionality.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose in the first sentence, followed by essential behavioral details in the second. Both sentences earn their place by providing critical information without any waste or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (0 parameters, no annotations, but with an output schema), the description is complete: it explains what the tool does, what it returns, and a key behavioral trait (no pagination). The output schema likely covers return values, so the description need not detail them further.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0 parameters with 100% coverage, so no parameter documentation is needed. The description appropriately focuses on behavior and output, not parameters, earning a baseline score of 4 for not adding unnecessary param info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('List all tags') and resource ('in your Readwise library'), distinguishing it from siblings like 'create_tag', 'delete_tag', or 'tag_highlight'. It precisely defines the scope and operation without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving all tags, but does not explicitly state when to use this tool versus alternatives like 'search_highlights' or 'list_highlights' that might involve tags. It provides clear context for tag retrieval but lacks explicit exclusions or comparisons to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_urlA
Save a URL to Readwise Reader.
This is the primary way to add content to Reader. The service fetches and parses the article automatically. Only http:// and https:// URLs are accepted.
location controls where it appears: 'new' (inbox), 'later', 'shortlist', or 'archive'. Default is 'new'.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| title | No | ||
| tags | No | ||
| location | No | new | |
| notes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | No | |
| author | No | |
| source_url | No | |
| category | No | |
| location | No | |
| reading_progress | No | |
| word_count | No | |
| summary | No | |
| content | No | |
| tags | No | |
| created_at | No | |
| updated_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the service 'fetches and parses the article automatically,' which is useful behavioral context. However, it lacks details on permissions, rate limits, error handling, or what the output contains (though an output schema exists). The description doesn't contradict any annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, followed by key constraints and parameter details. Every sentence adds value: the first states the action, the second explains automation and URL constraints, and the third clarifies the location parameter. No wasted words or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (5 parameters, 1 required) and the presence of an output schema (which handles return values), the description is largely complete. It covers the primary function, key constraints, and the most critical parameter. However, it lacks details on optional parameters (title, tags, notes) and behavioral aspects like error cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the 'location' parameter's purpose, enum values, and default, adding meaningful semantics beyond the schema. However, it does not cover the other four parameters (url, title, tags, notes), leaving gaps in understanding their roles and formats.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Save a URL') and target resource ('to Readwise Reader'), distinguishing it from sibling tools that handle highlights, tags, books, and documents. It explicitly positions this as 'the primary way to add content to Reader,' making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool ('the primary way to add content to Reader') and mentions constraints ('Only http:// and https:// URLs are accepted'). However, it does not explicitly state when not to use it or name alternatives among the sibling tools (e.g., for non-URL content).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_highlightsA
Search highlights using semantic (vector), full-text, or hybrid search.
Use 'semantic' for concept/meaning queries like 'ideas about habit formation'. Use 'fulltext' for exact phrase matching like 'atomic habits'. Use 'hybrid' (default) when unsure — combines both signals.
Returns highlights with book title, author, and source URL inline.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| search_type | No | hybrid | |
| book_id | No | ||
| tags | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | |
| total | Yes | |
| next_page | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It explains the search behavior (three search types) and return format (highlights with book title, author, URL). However, it doesn't mention pagination, rate limits, authentication needs, or error conditions that would be important for a search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured with two paragraphs: first explains the search methods, second provides usage guidelines with examples. Every sentence adds value with no wasted words, and key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters with 0% schema coverage and no annotations, the description does well explaining the search_type parameter and return format. Since an output schema exists, it doesn't need to detail return values. However, it leaves most parameters unexplained and doesn't cover behavioral aspects like error handling or performance characteristics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate. It explains the 'search_type' parameter thoroughly with examples for each enum value, adding significant meaning beyond the bare schema. However, it doesn't explain 'query', 'book_id', 'tags', or 'limit' parameters, leaving 4 of 5 parameters without semantic context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches highlights using three specific search methods (semantic, full-text, or hybrid). It distinguishes from siblings like 'list_highlights' by specifying search functionality rather than simple listing, and from 'get_highlight' by being a search rather than retrieval by ID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use each search_type: 'semantic' for concept queries, 'fulltext' for exact phrase matching, and 'hybrid' as default when unsure. This gives clear alternatives within the tool itself, though it doesn't compare to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tag_highlightA
Add or remove a tag on a highlight.
Use action='add' to tag a highlight (creates the tag if it doesn't exist). Use action='remove' to untag it. Returns the highlight's updated list of tag names.
| Name | Required | Description | Default |
|---|---|---|---|
| highlight_id | Yes | ||
| tag | Yes | ||
| action | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and does well: it discloses the mutation behavior (add/remove), the side effect of tag creation when adding, and the return value format. However, it doesn't mention error conditions (e.g., what happens if highlight_id doesn't exist), permission requirements, or rate limits, leaving some behavioral aspects uncovered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is perfectly front-loaded with the core purpose in the first sentence, followed by specific usage instructions and return value information. Every sentence earns its place with no wasted words, making it highly efficient and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a mutation tool with 3 parameters (0% schema coverage), no annotations, but with an output schema, the description is nearly complete: it covers purpose, usage, parameter semantics, and return format. The output schema likely handles return value details, so the description appropriately focuses on behavior. Minor gaps remain in error handling and permissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate fully, which it does excellently: it explains the meaning of the 'action' parameter with enum values ('add' vs 'remove'), clarifies that 'tag' refers to a tag name (with creation behavior), and implies 'highlight_id' identifies the target highlight. This adds crucial semantic context beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Add or remove a tag on a highlight') with the exact resource ('highlight'), distinguishing it from siblings like create_tag or delete_tag which handle tags independently. It precisely defines the tool's scope without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use each action ('Use action='add' to tag a highlight... Use action='remove' to untag it'), including the behavioral consequence ('creates the tag if it doesn't exist'). It clearly differentiates this from sibling tools like create_tag (which creates tags independently) or update_highlight (which modifies highlight content).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_highlightA
Update an existing highlight's text or note.
Only the provided fields are updated. Returns the full updated highlight.
| Name | Required | Description | Default |
|---|---|---|---|
| highlight_id | Yes | ||
| text | No | ||
| note | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| text | No | |
| note | No | |
| tags | No | |
| book_id | No | |
| book_title | No | |
| book_author | No | |
| source_url | No | |
| highlighted_at | No | |
| created_at | No | |
| updated_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It usefully states that 'Only the provided fields are updated' (partial update behavior) and 'Returns the full updated highlight' (output behavior), which are valuable beyond basic mutation. However, it doesn't cover important aspects like authentication needs, error conditions, rate limits, or whether the operation is idempotent/reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is perfectly concise with two sentences that each earn their place. The first sentence states the core purpose, and the second adds important behavioral details about partial updates and return values. There's zero wasted language, and information is front-loaded appropriately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a mutation tool with no annotations, 3 parameters, 0% schema coverage, but with an output schema, the description does reasonably well. It covers the partial update behavior and return value, and the output schema will handle return format details. However, for a mutation tool, it should ideally mention permission requirements or side effects that aren't covered by the structured data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, so the description must compensate. It meaningfully explains that parameters 'text' and 'note' correspond to updatable fields of a highlight, and that 'highlight_id' identifies which highlight to update. This adds crucial semantic context beyond the bare schema types. However, it doesn't clarify the meaning of null values for text/note (whether they clear the field or leave unchanged).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Update') and resource ('an existing highlight's text or note'), making the purpose immediately understandable. It distinguishes this from sibling tools like 'create_highlight' or 'delete_highlight' by specifying it's for modifying existing highlights rather than creating or deleting them. However, it doesn't explicitly differentiate from 'update_progress' which might be a related but different operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing an existing highlight ID), when not to use it (e.g., for creating new highlights), or direct alternatives among the sibling tools. The agent must infer usage from the tool name and description alone without explicit context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_progressA
Update the reading progress for a Reader document.
reading_progress is a float from 0.0 (unread) to 1.0 (finished). Returns the updated document.
| Name | Required | Description | Default |
|---|---|---|---|
| document_id | Yes | ||
| reading_progress | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| title | No | |
| author | No | |
| source_url | No | |
| category | No | |
| location | No | |
| reading_progress | No | |
| word_count | No | |
| summary | No | |
| content | No | |
| tags | No | |
| created_at | No | |
| updated_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states this is an update operation (implying mutation) and describes the return value, but doesn't mention permission requirements, rate limits, or whether the operation is reversible. The description adds some behavioral context but leaves important aspects unspecified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with just two sentences that each earn their place: the first states the purpose, the second explains the parameter semantics and return value. No wasted words, perfectly front-loaded with the core functionality.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (so return values don't need explanation in the description) and relatively simple parameters, the description covers the essential aspects well. It explains the parameter semantics that aren't in the schema and states what the tool returns. For a 2-parameter update tool with output schema, this is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate for the lack of parameter documentation. It provides crucial semantic information about reading_progress being 'a float from 0.0 (unread) to 1.0 (finished)', which explains the numeric range constraints that are only hinted at in the schema's min/max values. However, it doesn't explain document_id's purpose or format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Update the reading progress') and resource ('for a Reader document'), distinguishing it from sibling tools like update_highlight which handles different document aspects. It provides precise scope about what aspect of the document is being modified.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context by specifying it's for updating reading progress on documents, but doesn't explicitly state when to use this versus alternatives like update_highlight or other document-related tools. No explicit exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Every tool has a clearly distinct purpose targeting specific resources and actions. For example, create_highlight, get_highlight, update_highlight, and delete_highlight form a complete CRUD set for highlights, while list_highlights, search_highlights, and export_highlights serve different retrieval purposes with no overlap. Tools like save_url and update_progress address unique Reader-specific functions.
All tools follow a consistent verb_noun naming pattern throughout. The pattern is strictly maintained across all 17 tools, with clear action verbs (create, delete, export, get, list, save, search, tag, update) paired with specific nouns (highlight, tag, book, document, progress, url). There are no deviations in style or convention.
The 17 tools are well-scoped for the Readwise domain, covering both the core highlights library and Reader document management. Each tool earns its place by addressing distinct operations like CRUD for highlights/tags, listing/filtering books/documents, saving URLs, and updating reading progress. The count is appropriate for the comprehensive functionality offered.
The tool surface provides complete coverage for the Readwise domain. It includes full CRUD operations for highlights and tags, comprehensive listing and filtering for books, documents, and highlights, specialized search and export capabilities, and key Reader functions like saving URLs and updating progress. No obvious gaps exist—agents can perform all expected workflows without dead ends.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Search your Glasp web and Kindle highlights, notes, and AI memories from any MCP client. Read-only.
Search everything you save: YouTube, articles, podcasts, PDFs, Notion, Obsidian. API key or OAuth.
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
AI research library. Save, organise and reuse notes and webpages as clean markdown context.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceA Model Context Protocol server enabling LLMs to search, retrieve, and manage documents through Rememberizer's knowledge management API.35Apache 2.0
- FlicenseAqualityDmaintenanceA Model Context Protocol Server that enables language models to access and manipulate Readwise documents and highlights programmatically.49
- AlicenseAqualityCmaintenanceA Model Context Protocol server that connects MCP-compatible clients like Claude and VS Code to your Readwise Reader library, allowing them to list, retrieve, and update documents in your personal knowledge repository.711MIT

Readwise MCPofficial
AlicenseDqualityDmaintenanceA local Model Context Protocol server that connects LLM clients (like Claude) to Readwise, enabling AI assistants to access and interact with your saved reading content.172152MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/CaseyRo/mcp-readwise'
If you have feedback or need assistance with the MCP directory API, please join our Discord server