Skip to main content
Glama
CaseyRo

Readwise MCP HTTP Server

by CaseyRo

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

EPUB rendered by save_markdown_as_epub, opened in Readwise Reader. The CDIT brand stylesheet survives Reader's renderer: Strong Blue H1 underlines, Inter typography, the mint-rail "Note" preface block from the frontmatter note: field, and Reader's own TOC sidebar listing the auto-generated chapters.

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 Library

The 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.de

Calling 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 breaks

  • body { 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 EpubTooLargeError before 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

reading_status

Single-call snapshot — recent activity, evergreen top, current attention, junk drawer, signal density. Accepts window_days (default 7) and week_offset (default 0).

writing_material

Bundle highlights for drafting. Source-first (book_id / document_id / title_search) or topic-first (topic). Filters by min_engagement floor (default 0.7).

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

reader_list_documents

Cursor-paginated list of Reader documents, filterable by location / category / updated_after.

reader_get_by_url

Look up a single Reader document by its source URL.

Write

Tool

Description

save_url

Save a URL to Reader; Readwise fetches and parses. Synchronous.

save_markdown

Save a markdown blob to Reader as rendered HTML with category="epub" UI hint. Synchronous, returns ReaderDocument. Use this for lightweight notes you don't need as a real EPUB.

save_markdown_as_epub

The real-EPUB-via-email path described above. Async, returns EpubSendResult.

verify_epub_received

Confirm a save_markdown_as_epub send has landed. Time-aware retry guidance in the response note.

update_progress

Update reading progress (0.0–1.0).

create_highlight / update_highlight / delete_highlight

Highlight CRUD with note and tags.

Tags

Tool

Description

list_tags

List user-created custom tags.

create_tag / delete_tag

Tag CRUD.

tag_highlight

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)

save_url

sync

HTML article

none

Save markdown as HTML with epub-UX hint

save_markdown

sync

HTML with category="epub"

none

Save markdown as a real EPUB book

save_markdown_as_epub

async (1–5 min)

true EPUB 3 with TOC, chapter nav, brand styling

three env vars

Installation

uv sync

Pandoc 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

READWISE_TOKEN

Yes

Readwise API access token (get one)

MCP_API_KEY

When TRANSPORT=http

Bearer token for the MCP Portal auth

TRANSPORT

No

stdio

stdio or http

HOST

No

127.0.0.1

HTTP server host

PORT

No

8000

HTTP server port

READWISE_BASE_URL

No

https://readwise.io

Readwise API base URL

ENGAGEMENT_INDEX_TTL_SECONDS

No

1800

TTL for the engagement index cache

ENGAGEMENT_TAG_DENYLIST

No

(built-in)

Tags excluded from the annotation bonus

EPUB sender (optional, but all three required together)

READWISE_LIBRARY_EMAIL

Only for save_markdown_as_epub

Your <custom>@library.readwise.io

RESEND_API_KEY

Only for save_markdown_as_epub

Resend SMTP password

EPUB_FROM_ADDRESS

Only for save_markdown_as_epub

Verified Resend sender address

SMTP_HOST

No

smtp.resend.com

Override to use Postmark, SES, etc.

SMTP_PORT

No

587

EPUB_LANG

No

en

EPUB OPF dc:language metadata

EPUB_MAX_BYTES

No

20971520

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 -d

Health endpoint

GET /health

Returns 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:

  • raw ranks "current attention" (recency-weighted overall score)

  • intensity ranks "evergreen interests" (recency removed; pure depth)

  • recency small modifier from how recently the source was last highlighted

  • return_strength captures multi-year highlight clusters and recent Reader re-opens

Computed from a layered sum of:

  1. Base layerlegacy (v2-only Kindle/iBooks book), highlighted, finished_no_hl, reading, saved_warm, saved_cold

  2. Density — non-discarded highlight count

  3. Recency — last-highlight age, banded (30d / 1y / 5y)

  4. Annotation — does any highlight carry a user note, a non-structural tag, or is_favorite?

  5. 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 tools

Deployment

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 tools
create_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
book_idYes
noteNo
tagsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
textNo
noteNo
tagsNo
book_idNo
book_titleNo
book_authorNo
source_urlNo
highlighted_atNo
created_atNo
updated_atNo

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameYes

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
highlight_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tag_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
updated_afterNo
book_idsNo
cursorNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
next_cursorNo

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
book_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
titleNo
authorNo
categoryNo
sourceNo
num_highlightsNo
cover_image_urlNo
source_urlNo
created_atNo
updated_atNo

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
titleNo
authorNo
source_urlNo
categoryNo
locationNo
reading_progressNo
word_countNo
summaryNo
contentNo
tagsNo
created_atNo
updated_atNo

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
highlight_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
textNo
noteNo
tagsNo
book_idNo
book_titleNo
book_authorNo
source_urlNo
highlighted_atNo
created_atNo
updated_atNo

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNo
sourceNo
num_highlights_gteNo
updated_afterNo
pageNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
totalYes
next_pageNo

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
locationNo
categoryNo
updated_afterNo
pageNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
totalYes
next_pageNo

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
book_idNo
tagNo
updated_afterNo
pageNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
totalYes
next_pageNo

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
titleNo
tagsNo
locationNonew
notesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
titleNo
authorNo
source_urlNo
categoryNo
locationNo
reading_progressNo
word_countNo
summaryNo
contentNo
tagsNo
created_atNo
updated_atNo

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
search_typeNohybrid
book_idNo
tagsNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes
totalYes
next_pageNo

TDQS

A4.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
highlight_idYes
tagYes
actionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
highlight_idYes
textNo
noteNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
textNo
noteNo
tagsNo
book_idNo
book_titleNo
book_authorNo
source_urlNo
highlighted_atNo
created_atNo
updated_atNo

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_idYes
reading_progressYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
titleNo
authorNo
source_urlNo
categoryNo
locationNo
reading_progressNo
word_countNo
summaryNo
contentNo
tagsNo
created_atNo
updated_atNo

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

A4/5.0
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

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

Related MCP Servers

Latest Blog Posts

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