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
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- 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