$npx -y skills add readwiseio/readwise-skills --skill readwise-mcpHow to use the Readwise MCP tools — access highlights, documents, and your entire reading library via MCP
| 1 | # Readwise MCP |
| 2 | |
| 3 | Use the Readwise MCP tools to access the user's Readwise highlights and Reader documents. Readwise has two products: |
| 4 | |
| 5 | - **Readwise** — highlights from books, articles, podcasts, and more. Includes daily review and spaced repetition. |
| 6 | - **Reader** — a read-later app for saving and reading articles, PDFs, EPUBs, RSS feeds, emails, tweets, and videos. |
| 7 | |
| 8 | ## Setup |
| 9 | |
| 10 | Add the Readwise MCP server to your client's configuration: |
| 11 | |
| 12 | ```json |
| 13 | { |
| 14 | "readwise": { |
| 15 | "type": "http", |
| 16 | "url": "https://mcp2.readwise.io/mcp" |
| 17 | } |
| 18 | } |
| 19 | ``` |
| 20 | |
| 21 | The server handles authentication via OAuth — the user will be prompted to authorize on first use. |
| 22 | |
| 23 | ## Tool Reference |
| 24 | |
| 25 | All tools are prefixed with `mcp__readwise__`. Each tool name maps directly to a Readwise or Reader API action. |
| 26 | |
| 27 | ## Reader Tools |
| 28 | |
| 29 | ### Searching documents |
| 30 | |
| 31 | ``` |
| 32 | reader_search_documents(query="spaced repetition") |
| 33 | ``` |
| 34 | |
| 35 | Hybrid search (semantic + keyword) across all saved documents. Combine with filters to narrow results: |
| 36 | |
| 37 | ``` |
| 38 | # Search articles saved for later |
| 39 | reader_search_documents(query="machine learning", category_in=["article"], location_in=["later", "shortlist"]) |
| 40 | |
| 41 | # Search by author |
| 42 | reader_search_documents(query="AI agents", author_search="Simon Willison") |
| 43 | |
| 44 | # Search within a date range |
| 45 | reader_search_documents(query="transformers", published_date_gt="2024-01-01") |
| 46 | |
| 47 | # Search by tags |
| 48 | reader_search_documents(query="productivity", tags_in=["research"]) |
| 49 | ``` |
| 50 | |
| 51 | Other filters: `title_search`, `summary_search`, `note_search`, `url_search`, `source_search`, `document_id`, `limit` (default 20, max 100). |
| 52 | |
| 53 | ### Browsing documents |
| 54 | |
| 55 | ``` |
| 56 | # List 10 most recent inbox items with minimal fields |
| 57 | reader_list_documents(location="new", limit=10, response_fields=["title", "author", "summary", "word_count", "category", "saved_at"]) |
| 58 | |
| 59 | # Archived articles with a specific tag |
| 60 | reader_list_documents(location="archive", tag=["research"], category="article") |
| 61 | |
| 62 | # Unseen inbox items |
| 63 | reader_list_documents(location="new", seen=false) |
| 64 | |
| 65 | # RSS feed items |
| 66 | reader_list_documents(location="feed", limit=20, response_fields=["title", "author", "summary", "site_name"]) |
| 67 | |
| 68 | # Get a specific document by ID |
| 69 | reader_list_documents(id="<document_id>") |
| 70 | |
| 71 | # Paginate through results |
| 72 | reader_list_documents(location="later", limit=10, page_cursor="<cursor_from_previous_response>") |
| 73 | ``` |
| 74 | |
| 75 | Locations: `new` (inbox), `later`, `shortlist`, `archive`, `feed`. When the user says "inbox", use `new`. Only use `feed` when the user explicitly asks about RSS/feeds. |
| 76 | |
| 77 | Use `response_fields` to limit returned data and save tokens. The `id` field is always included. Available fields: `url`, `title`, `author`, `source`, `category`, `location`, `tags`, `site_name`, `word_count`, `reading_time`, `created_at`, `updated_at`, `published_date`, `summary`, `image_url`, `content`, `source_url`, `notes`, `parent_id`, `reading_progress`, `first_opened_at`, `last_opened_at`, `saved_at`, `last_moved_at`, `html_content`, `is_deleted`. |
| 78 | |
| 79 | Tip: unseen documents have `first_opened_at=null`. Mark as seen via `reader_bulk_edit_document_metadata`. |
| 80 | |
| 81 | ### Reading and highlighting |
| 82 | |
| 83 | ``` |
| 84 | # Get full document details including Markdown content |
| 85 | reader_get_document_details(document_id="<id>") |
| 86 | |
| 87 | # Get all highlights on a document |
| 88 | reader_get_document_highlights(document_id="<id>") |
| 89 | |
| 90 | # Create a highlight — html_content must match the document's HTML exactly |
| 91 | # Get the HTML via reader_list_documents with response_fields=["html_content"] |
| 92 | reader_create_highlight(document_id="<id>", html_content="<p>The exact passage to highlight</p>") |
| 93 | |
| 94 | # Highlight with a note and tags |
| 95 | reader_create_highlight(document_id="<id>", html_content="<p>Key insight</p>", note="Connects to spaced repetition", tags=["review", "concept"]) |
| 96 | ``` |
| 97 | |
| 98 | ### Saving documents |
| 99 | |
| 100 | ``` |
| 101 | # Save a URL — Reader scrapes it automatically |
| 102 | reader_create_document(url="https://example.com/article") |
| 103 | |
| 104 | # Save with metadata and tags |
| 105 | reader_create_document(url="https://example.com", title="Great Article", tags=["research", "ai"], notes="Recommended by Alice") |
| 106 | |
| 107 | # Save raw Markdown content (provide a unique URL as identifier) |
| 108 | reader_create_document(title="Meeting Notes", markdown="# Notes from today...", url="https://me.com#notes-march-2025") |
| 109 | ``` |
| 110 | |
| 111 | ### Organizing |
| 112 | |
| 113 | ``` |
| 114 | # Move documents between locations (max 50 per call) |
| 115 | reader_move_documents(document_ids=["<id1>", "<id2>"], location="archive") |
| 116 | |
| 117 | # Bulk mark documents as seen |
| 118 | reader_bulk_edit_document_metadata(documents=[{"document_id": "<id>", "seen": true}]) |
| 119 | |
| 120 | # Bulk update metadata |
| 121 | reader_bulk_edit_document_metadata(documents=[{"document_id": "<id>", "title": "Better Title", "tags": ["ai", "research"]}]) |
| 122 | ``` |
| 123 | |
| 124 | Note: `reader_move_documents` and `reader_bulk_edit_document_metadata` share a rate limit of 20 calls/minute. Batch document IDs into fewer calls. |
| 125 | |
| 126 | ### Tags |
| 127 | |
| 128 | ``` |
| 129 | # List all tags |
| 130 | reader_list_tags() |
| 131 | |
| 132 | # Add tags to a document |
| 133 | reader_add_tags_to_document(doc |