Kiseki-Labs-Readwise-MCP
Uses python-dotenv to load environment variables from a .env file, specifically for managing the Readwise API key
Used in the installation process to clone the repository
Mentioned as an example text editor for modifying configuration files
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., "@Kiseki-Labs-Readwise-MCPlist my recent book highlights from last week"
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.
Kiseki-Labs-Readwise-MCP
Overview
Kiseki-Labs-Readwise-MCP is a Model Context Protocol (MCP) Server designed to interact with the Readwise API.
It allows language models to access and manipulate your Readwise documents and highlights programmatically. This server is developed by Kiseki Labs.
Related MCP server: Unstructured Document Processor MCP
Installation
Clone the repository:
git clone <your-repository-url> cd readwise_mcpInitialise dependencies with uv (Assuming you have uv installed)
uv sync
Configuration
This server requires a Readwise API key to function.
Obtain your API key from Readwise.
Create a
.envfile in the root directory of the project.Add your API key to the
.envfile:READWISE_API_KEY=your_readwise_api_key_hereThe server uses
python-dotenvto automatically load this variable when run.
Available Tools
The server exposes the following tools for interaction:
find_readwise_document_by_name(document_name: str) -> Book | None: Finds a specific document in Readwise by its exact name.list_readwise_documents_by_filters(document_category: str = "", from_date: Optional[date] = None, to_date: Optional[date] = None) -> List[Book]: Lists documents based on category (e.g., 'books', 'articles') and/or a date range. Requires at least one filter.get_readwise_highlights_by_document_ids(document_ids: List[int]) -> List[Highlight]: Retrieves all highlights associated with a list of specific document IDs.get_readwise_highlights_by_filters(from_date: Optional[date] = None, to_date: Optional[date] = None, tag_names: List[str] = []) -> List[Highlight]: Fetches highlights based on a date range and/or a list of tags. Requires at least one filter.
(Note: Book and Highlight refer to the data structures defined in the readwise_mcp.types module.)
Running the Server
Development Mode
To run the MCP server in dev mode, execute the following command from the project's root directory:
uv run mcp dev server.pyThe dev server will start and become accessible online by default on http://127.0.0.1:6274/ if you haven't modified the host and port.
Installing the MCP Server with Claude
On MacBook open the file below in your favourite text editor:
~/Library/Application\ Support/Claude/claude_desktop_config.jsonFor instance using vim open this file you can run the command:
vim ~/Library/Application\ Support/Claude/claude_desktop_config.jsonThen add the appropriate entry under the mcpServers object, like in the example below:
"mcpServers": {
"Kiseki-Labs-Readwise-MCP": {
"command": "/Users/eddie/.pyenv/shims/uv",
"args": [
"run",
"--with",
"fastmcp",
"fastmcp",
"run",
"/Users/eddie/Development/AI/mcp_servers/readwise_mcp/server.py"
]
}
...Save the file with those changes.
Finally, restart Claude. After restart, the Kiseki-Labs-Readwise-MCP MCP Server should be available.
Available Tools
4 toolsfind_readwise_documents_by_namesB
Find documents in Readwise by a list of names.
Args:
document_names (List[str]): The names of the documents to search for in Readwise.
Returns:
Dict[str, Optional[Book]]: A dictionary where keys are the requested document names
and values are the corresponding Book objects if found, or None otherwise.
| Name | Required | Description | Default |
|---|---|---|---|
| document_names | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses the return format (dictionary with Book objects or None) but lacks critical behavioral details such as whether this is a read-only operation, error handling for invalid names, performance implications, or authentication needs. The description adds some value but is insufficient for a mutation-sensitive context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded: the first sentence states the purpose clearly, followed by structured Args and Returns sections. Every sentence adds value without redundancy, making it efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and low schema coverage, the description is moderately complete. It covers the basic purpose, parameter semantics, and return format, but gaps remain in behavioral transparency and usage guidelines. For a tool with one parameter and no complex outputs, it meets minimum viability but could be more comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds meaning by explaining that 'document_names' is a list of strings used to search for documents in Readwise, clarifying the parameter's role beyond the bare schema. However, it does not detail constraints like name formatting or case sensitivity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'find' and resource 'documents in Readwise', specifying it searches by 'a list of names'. It distinguishes from siblings that filter by IDs or other criteria, though not explicitly named. The purpose is specific but could be slightly more precise about differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when searching by document names, as opposed to siblings that use IDs or filters, but does not explicitly state when to use this tool versus alternatives. No exclusions or prerequisites are mentioned, leaving some ambiguity for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_readwise_highlights_by_document_idsB
Get highlights from Readwise by document ids.
Args:
document_ids (List[int]): The IDs of the documents to retrieve highlights for.
Returns:
List[Highlight]: A list of Highlight objects containing the highlights from the specified document.
Raises:
ValueError: If no document IDs are provided.
| Name | Required | Description | Default |
|---|---|---|---|
| document_ids | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. While it mentions the return type and a potential error case (ValueError for empty input), it lacks critical information such as whether this is a read-only operation, rate limits, authentication requirements, pagination behavior, or what happens with invalid document IDs. The description is insufficient for a tool with no annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is efficiently structured with clear sections (Args, Returns, Raises) and uses minimal, purposeful sentences. Every element adds value: the opening statement defines the tool, and the structured sections provide essential documentation without redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (1 parameter, no output schema, no annotations), the description covers the basics but has significant gaps. It explains the parameter and return type adequately but lacks behavioral context (e.g., read-only status, error handling beyond one case) and doesn't address sibling tool relationships. It's minimally viable but incomplete for optimal agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaningful context about the single parameter 'document_ids' by specifying it's 'The IDs of the documents to retrieve highlights for' and mentioning the ValueError case if none are provided. Since schema description coverage is 0%, this compensates well by explaining the parameter's purpose beyond the basic schema type definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('Get highlights') and resource ('from Readwise by document ids'), making it immediately understandable. However, it doesn't explicitly differentiate from sibling tools like 'get_readwise_highlights_by_filters', which appears to serve a similar purpose with different filtering criteria.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'get_readwise_highlights_by_filters' or explain the trade-offs between filtering by document IDs versus other criteria, leaving the agent without contextual usage information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_readwise_highlights_by_filtersA
Get highlights from Readwise by filters.
This function retrieves highlights from Readwise based on date range and/or tags.
At least one filter (from_date, to_date, or tag_names) must be provided.
Args:
duration_expression (Optional[str]): A duration expression to filter highlights by creation date.
Valid formats: "1w", "2h", "30m", etc.
from_date (Optional[date]): The start date to filter highlights (inclusive).
Highlights created on or after this date will be returned.
to_date (Optional[date]): The end date to filter highlights (inclusive).
Highlights created on or before this date will be returned.
tag_names (List[str]): List of tag names to filter highlights by.
Only highlights with at least one of these tags will be returned.
Returns:
List[Highlight]: A list of Highlight objects matching the specified filters.
Raises:
ValueError: If no filters are provided (all parameters are None or empty).
| Name | Required | Description | Default |
|---|---|---|---|
| duration_expression | No | ||
| from_date | No | ||
| to_date | No | ||
| tag_names | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and does well: it specifies the operation is a retrieval (not destructive), mentions validation requirements ('at least one filter'), and describes error conditions ('Raises: ValueError'). It doesn't cover rate limits or authentication needs, but provides solid behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear sections (purpose, requirements, Args, Returns, Raises). Every sentence adds value: the first states purpose, second specifies filtering approach, third gives critical constraint. No wasted words while maintaining completeness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter retrieval tool with no annotations and no output schema, the description provides excellent coverage: clear purpose, usage guidelines, detailed parameter semantics, behavioral constraints, and return format. The only minor gap is lack of output schema details, but the description specifies the return type adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate fully. It provides detailed parameter documentation in the Args section, explaining each parameter's purpose, format, constraints, and behavior (e.g., 'inclusive' for dates, 'at least one of these tags'). This adds substantial meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('retrieves') and resource ('highlights from Readwise') with specific filtering criteria ('based on date range and/or tags'). It distinguishes from sibling tools like 'get_readwise_highlights_by_document_ids' by focusing on date/tag filters rather than document IDs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('At least one filter must be provided') and when not to use ('If no filters are provided'). It distinguishes from alternatives by specifying the filtering approach (date/tags vs. document IDs or document names in sibling tools).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_readwise_documents_by_filtersA
List all documents in Readwise based on either category or date range At least one filter must be provided.
Args:
document_category (str, optional): The category of the documents to list in Readwise.
Allowed values are 'books', 'articles', 'tweets', 'podcasts', 'supplementals',
or simply empty string '' if no category is specified. Defaults to "".
duration_expression (Optional[str]): A duration expression to filter documents by creation date.
Valid formats: "1w", "2h", "30m", etc.
from_date (Optional[date]): The start date to filter documents (inclusive).
Documents created on or after this date will be returned.
to_date (Optional[date]): The end date to filter documents (inclusive).
Documents created on or before this date will be returned.
Returns:
List[Book]: A list of Book objects containing the documents from the specified category.
Raises:
ValueError: If no filters are provided (all parameters are None or empty).
| Name | Required | Description | Default |
|---|---|---|---|
| document_category | No | ||
| duration_expression | No | ||
| from_date | No | ||
| to_date | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses key behavioral traits: the requirement for at least one filter (with a 'Raises: ValueError' note), the return type ('List[Book]'), and input constraints (e.g., allowed values for 'document_category'). However, it lacks details on permissions, rate limits, pagination, or error handling beyond the ValueError. For a read operation with no annotations, this is adequate but has gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized and front-loaded: the first two sentences state the purpose and key requirement. It uses sections (Args, Returns, Raises) for structure, which aids readability. However, some redundancy exists (e.g., repeating 'optional' in the Args section when the schema already indicates optionality), and the 'Returns' section could be more concise. Overall, it's efficient with minimal waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (4 parameters, no annotations, no output schema), the description is fairly complete. It covers purpose, usage rules, parameter details, return values, and error conditions. However, it lacks information on behavioral aspects like pagination, rate limits, or authentication needs, which would be helpful for a tool with no annotations. Since there's no output schema, the 'Returns' section is necessary and provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate fully. It adds significant meaning beyond the input schema: it explains each parameter's purpose (e.g., 'document_category' with allowed values, 'duration_expression' with valid formats, 'from_date' and 'to_date' as inclusive filters), default values, and the 'At least one filter must be provided' rule. This comprehensively documents all 4 parameters where the schema provides only titles and types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'List all documents in Readwise based on either category or date range.' It specifies the verb ('List'), resource ('documents in Readwise'), and scope ('based on either category or date range'). However, it doesn't explicitly differentiate from sibling tools like 'find_readwise_documents_by_names' or 'get_readwise_highlights_by_document_ids', which handle different operations (finding by names vs. listing by filters, or retrieving highlights vs. documents).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for usage: 'At least one filter must be provided.' This sets a prerequisite for invoking the tool. It also implies usage by specifying filters (category or date range), but it doesn't explicitly state when to use this tool versus alternatives like 'find_readwise_documents_by_names' (for name-based searches) or 'get_readwise_highlights_by_filters' (for highlights). No misleading guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
4 tool updates
- First observed
find_readwise_documents_by_names - First observed
get_readwise_highlights_by_document_ids - First observed
get_readwise_highlights_by_filters - First observed
list_readwise_documents_by_filters
TDQS
Each tool has a clearly distinct purpose: finding documents by names, getting highlights by document IDs, getting highlights by filters, and listing documents by filters. There is no overlap in functionality, and the descriptions make it easy to differentiate between document-focused and highlight-focused operations.
The naming follows a consistent verb_noun_by_filters pattern for three tools (find_readwise_documents_by_names, get_readwise_highlights_by_document_ids, get_readwise_highlights_by_filters, list_readwise_documents_by_filters), with 'find' and 'list' being slightly different verbs but still semantically clear. The structure is predictable and readable throughout.
With 4 tools, the count is reasonable for a Readwise integration, covering core operations like retrieving documents and highlights. It might be slightly thin for a full-featured server, but it effectively handles key use cases without being overwhelming.
The toolset covers reading operations (finding and listing documents, retrieving highlights) but lacks create, update, or delete capabilities, which are common in CRUD workflows for a service like Readwise. This creates notable gaps that could limit agent functionality for managing documents or highlights.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
A Model Context Protocol server for Wix AI tools
Model Context Protocol server for Studex tools, notifications, and profile integrations
Enable secure connectivity between Sentry issues and debugging data, and LLM clients, using a Model Context Protocol (MCP) server.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceA Model Context Protocol server enabling LLMs to search, retrieve, and manage documents through Rememberizer's knowledge management API.35Apache 2.0
- FlicenseBqualityDmaintenanceA Model Context Protocol server that enables LLMs to extract and use content from unstructured documents across a wide variety of file formats.111-
- AlicenseAqualityCmaintenanceA Model Context Protocol server that connects MCP-compatible clients like Claude and VS Code to your Readwise Reader library, allowing them to list, retrieve, and update documents in your personal knowledge repository.711MIT

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