co-reading-mcp
This MCP server enables token-efficient co-reading of books with an AI, supporting chunked reading, persistent progress, notes, and annotations.
Import books (
.txt,.epub, or raw text): Auto-split into chapter-sized, token-optimized chunks (~6000 chars), preserving EPUB chapter boundaries.List books / chunks: View all imported books with chunk counts and last-read positions, or browse a book's chapter breakdown without loading full text.
Read chunks: Read sequentially (auto-continuing from last position) or by specifying a chunk ID. Progress is tracked automatically.
Search: Case-insensitive substring search across all chunks, returning matches with surrounding context.
Track progress (
get_progress/set_progress): Inspect or manually jump to any reading position.Notes (
read_notes/append_notes): Timestamped discussion notes per book for cheap context restoration between sessions.Annotations (
add_annotation/list_annotations): Margin annotations anchored to exact quoted passages, tagged byhumanorclaude, shown inline when reading.Shared cards (
list_cards): Automatically created when both human and Claude annotate overlapping passages, highlighting mutually interesting sections.Remote/mobile access: Can run as an HTTP server with HTTPS, OAuth 2.0 shim for mobile app integration, and a mobile-friendly drag-and-drop web upload page protected by HTTP Basic Auth.
Local storage: Data stored in a configurable local directory, minimizing token usage by loading only the current chunk and notes.
Click on "Deploy 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., "@co-reading-mcpread next chunk of 'The Hobbit'"
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.
co-reading-mcp
A local MCP server for low-token co-reading: import a book, split it into chapter-sized chunks, read it chunk by chunk, and keep notes so a session can resume without re-reading the whole book.
Why
Sending a whole novel into the conversation burns through context immediately and has to be repeated every turn. This server keeps the book on disk and only loads the chunk currently being read, plus a small notes file to restore context between sessions.
Related MCP server: Co Reading Kit
Setup
npm install
npm startConfigure as a stdio MCP server (e.g. in Claude Desktop/Code config):
{
"mcpServers": {
"co-reading": {
"command": "node",
"args": ["/absolute/path/to/co-reading-mcp/src/server.js"]
}
}
}Data is stored under data/ (override with CO_READING_DATA_DIR).
Remote mode (e.g. for the mobile app)
The Claude mobile app can't run a local stdio process — it needs an HTTPS endpoint added as a custom connector. Run the remote HTTP transport instead:
MCP_AUTH_TOKEN=<a long random secret> PUBLIC_BASE_URL=https://your-domain.com PORT=3000 npm run start:remoteThis serves MCP over Streamable HTTP at http://<host>:3000/mcp. Requests
must include Authorization: Bearer <MCP_AUTH_TOKEN>; without a token set,
auth is disabled (fine for local testing, not for a public VPS).
The server also exposes a minimal single-user OAuth 2.0 shim
(/.well-known/oauth-authorization-server, /register, /authorize,
/token) so it can be added via Claude's official "Add custom connector" UI,
which requires an OAuth-capable remote MCP server. There's no real login —
anyone who can reach the server is handed the configured MCP_AUTH_TOKEN.
Set PUBLIC_BASE_URL to the externally-reachable HTTPS URL (no trailing
slash) so the OAuth metadata points to the right host.
To deploy on a VPS:
Copy the repo to the VPS and
npm install.Run
start:remotebehind a process manager (e.g.pm2 start npm --name co-reading -- run start:remote) so it survives disconnects/reboots.Put a reverse proxy (Caddy or Nginx) in front of it for HTTPS — the mobile app requires
https://. A minimal Caddyfile:your-domain.com { reverse_proxy localhost:3000 }In the Claude mobile app, go to Settings → Connectors → Add custom connector, and enter
https://your-domain.com/mcpwith the bearer token.
Web upload page
Besides the MCP tools, the remote server also serves a small mobile-friendly
web page at https://your-domain.com/ for uploading .txt/.epub files by
drag-and-drop or file picker (handy for adding books straight from your
phone without going through the chat). It's protected with HTTP Basic Auth
using the same MCP_AUTH_TOKEN as the password (any username works) so
strangers can't use it to fill up your VPS. Uploaded books go through the
same import pipeline as import_book and immediately show up in
list_books.
Tools
import_book— import a.txtor.epubfile (byfilePath) or rawtext, auto-split into chapters and size-bounded chunks (~6000 chars, to stay under MCP read truncation limits). EPUB chapter boundaries (spine order) are preserved; title defaults to the EPUB's own metadata title.list_books— list imported books with chunk counts and last-read position.list_chunks— list a book's chunks (chapter/part breakdown) without text.read_chunk— read one chunk; omitchunkIdto continue from the last-read position. Updates progress automatically.get_progress/set_progress— inspect or manually move the reading position.read_notes/append_notes— read/append timestamped discussion notes, used to restore context cheaply between sessions instead of re-reading the book.add_annotation/list_annotations— margin annotations anchored to a quoted passage within a chunk, tagged by author (human/claude); shown inline when reading a chunk. When both authors annotate an overlapping quote, a shared card is created automatically.list_cards— list shared cards (passages both human and claude annotated) for a book or chunk.search_book— case-insensitive substring search across all chunks, returning matches with context.
Chapter detection
Chapters are detected by heading patterns (第X章, Chapter N, numbered
headings). Text without recognizable chapter markers is imported as a single
chapter and split purely by size.
Available Tools
12 toolsadd_annotationAdd a margin annotationA
Add an annotation anchored to a quoted passage within a chunk. author should be 'human' or 'claude'. If the other author already has an overlapping annotation on the same quote, a shared card pairing both notes is created automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| bookId | Yes | ||
| chunkId | Yes | ||
| quote | Yes | Short exact quote from the chunk text that the annotation anchors to | |
| comment | Yes | The annotation content | |
| author | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, description discloses key behavior of automatic shared card creation on overlapping annotations. Does not mention if annotations are overwritten or other side effects, but provides useful context beyond basic purpose.
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?
Two concise sentences: first states core purpose, second adds constraints and key side effect. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers main action and important side effect (shared card creation). Lacks description of return value or confirmation, but for a simple mutation tool this is adequate.
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 low (40%). Description adds meaning for 'quote' (short exact quote) and 'author' (enum values), but two parameters (bookId, chunkId) remain undocumented in both schema and description.
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?
Clear verb 'add' and resource 'annotation' anchored to quoted passage within a chunk. Distinct from sibling tools like list_annotations which only list annotations.
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?
Provides explicit constraint that author must be 'human' or 'claude', and describes automatic card creation if overlapping annotation exists. However, does not explicitly state when to use this tool vs alternatives like append_notes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
append_notesAppend reading notesB
Append a timestamped note entry (clues, reasoning, thoughts) for a book.
| Name | Required | Description | Default |
|---|---|---|---|
| bookId | Yes | ||
| content | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description bears full responsibility for behavioral disclosure. It mentions 'timestamped' but does not explain side effects, prerequisites (e.g., book existence), or whether appending appends to a list or overwrites. Significant gaps for a write operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no wasted words. It is appropriately concise, though a bit more structure (e.g., separating purpose and details) could improve clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 required params, no output schema), the description is adequate but incomplete. It does not explain return behavior, error cases, or what happens after appending. For a simple tool, this is minimally viable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, so the description must compensate. It adds 'timestamped' as context but does not clarify what 'bookId' represents (e.g., ISBN) or the expected format of 'content'. The description adds minimal meaning beyond the parameter names.
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 'append', the resource 'note entry', and qualifies it with 'timestamped' and 'for a book'. It distinguishes the tool from siblings like 'add_annotation' and 'read_notes' by specifying the action and content type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like 'add_annotation' or 'read_notes'. The description lacks any 'when to use' or 'when not to use' context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_progressGet reading progressA
Get the last-read chunk id for a book.
| Name | Required | Description | Default |
|---|---|---|---|
| bookId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must convey behavioral traits. It indicates a read operation ('get') but does not disclose potential errors, authentication needs, or side effects. It is adequate but could be more informative.
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 a single, clear sentence with no unnecessary words. It is perfectly concise and front-loaded with the essential information.
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?
The tool is simple with one parameter and no output schema. The description identifies what is retrieved (last-read chunk id) but does not specify the return format or what to expect in the response, leaving some ambiguity for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, yet the description only mentions the context ('for a book') without explaining the 'bookId' parameter's format, constraints, or semantics. This leaves the agent without sufficient guidance on how to specify the book.
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 explicitly states the verb 'get' and the target resource 'last-read chunk id' in the context of a book. This clearly differentiates it from sibling tools like 'set_progress' (write) and 'read_chunk' (read full chunk).
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 could be inferred from the name and description that it's for retrieving progress, but there is no explicit mention of scenarios or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_bookImport a bookA
Import a book by file path (.txt or .epub) or raw text, split it into chapters and size-bounded chunks, and register it for chunked reading. EPUB chapter boundaries (spine order) are preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Book title; defaults to the EPUB's own title when importing an EPUB | |
| filePath | No | Absolute path to a .txt or .epub file to import | |
| text | No | Raw plain-text book content, used if filePath is not given |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description discloses splitting into chapters and size-bounded chunks, and EPUB spine order preservation. It does not mention side effects like overwriting, but the tool name suggests creation. No contradictions.
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?
Two sentences are concise and front-loaded. Every sentence adds meaningful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the import process and splitting behavior, sufficient for a tool with no output schema. It is complete given the sibling tools that handle reading and listing.
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 coverage is 100%. The description adds value by specifying file extension constraints and the title default behavior for EPUBs, going beyond the schema descriptions.
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 states it imports a book from file path or raw text, splits into chapters and chunks, and registers for reading. It clearly distinguishes from siblings like list_books and read_chunk by focusing on the import action.
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 specifies input formats (.txt, .epub, raw text) and EPUB behavior, implying when to use this tool. It lacks explicit when-not-to-use or alternatives but provides sufficient context given the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_annotationsList annotationsB
List annotations for a book, optionally filtered to one chunk.
| Name | Required | Description | Default |
|---|---|---|---|
| bookId | Yes | ||
| chunkId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must convey behavior. It indicates a read operation with optional filtering, but omits details like return format, pagination, or ordering.
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?
Single sentence, no redundancy, front-loaded with core purpose.
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 output schema and no annotations, the description is minimal but adequate for a simple list operation. Missing details like what fields are returned or error conditions.
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 coverage is 0%. The description adds meaning by mentioning 'book' and 'chunk' but does not specify which parameter is required or parameter types/constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists annotations for a book with optional filtering by chunk. It distinguishes from sibling tools like add_annotation and list_books.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like list_chunks or read_chunk. No exclusions or context provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_booksList imported booksA
List all imported books with chunk counts and last-read position.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must carry behavioral disclosure. It states what is returned but does not mention potential pagination, sorting, performance considerations, or side effects. Adequate for a simple list with no parameters.
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?
Single sentence that is front-loaded with verb and resource, no redundant or superfluous text. Every word contributes value.
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 output schema, description adequately covers return fields (chunk counts, last-read position). For a simple list-all tool with no parameters, this is sufficiently complete; could optionally mention ordering or that it returns a list of objects.
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 has zero parameters, and description correctly avoids adding parameter info. Baseline 4 applies since schema_description_coverage is 100% and there are no parameters to describe.
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?
Description clearly states verb 'List', resource 'imported books', and includes specific return fields (chunk counts and last-read position), distinguishing it from sibling tools like list_annotations, list_cards, list_chunks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when or when not to use this tool. Does not contrast with sibling tools like search_book or mention any prerequisites or filtering capabilities.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_cardsList shared cardsC
List shared cards: passages where both human and claude have left overlapping annotations.
| Name | Required | Description | Default |
|---|---|---|---|
| bookId | Yes | ||
| chunkId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description does not disclose read-only or destructive behavior, permissions, or side effects, leaving agents uninformed about safety.
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?
Single sentence is concise but omits critical parameter and behavioral details, making it incomplete rather than efficiently compact.
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?
With 2 parameters, no output schema, and no annotations, the description is too sparse to guide correct usage or handling of results.
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 coverage 0% and description does not explain bookId or chunkId fields, failing to add any meaning beyond the schema's type constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'list shared cards' and defines them as passages with overlapping annotations, distinguishing from sibling tools like list_annotations.
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?
Implies use for finding overlapping annotations but lacks explicit guidance on when to use this vs list_annotations or other sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_chunksList chunks of a bookA
List all chunks (chapter/part breakdown) of a book, without their text.
| Name | Required | Description | Default |
|---|---|---|---|
| bookId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that chunks are listed without text, which is a key behavioral trait, but does not detail what properties chunks contain (e.g., title, order) given no annotations or output schema.
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 a single concise sentence that covers the essential purpose without superfluous words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of output schema and annotations, the description lacks information about the response format, leaving the agent uncertain about the return structure.
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 single parameter 'bookId' is self-explanatory, but the description adds no extra meaning beyond the schema; with 0% schema description coverage, more elaboration would be beneficial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'list' and the resource 'chunks of a book', with the qualifier 'without their text', distinguishing it from sibling tools like read_chunk or list_books.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance is provided; usage is implied by the description but alternatives are not mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_chunkRead a chunkA
Read the text of one chunk. Pass chunkId to read a specific chunk, or omit it to continue from the book's last-read position (its nextId). Reading a chunk updates reading progress.
| Name | Required | Description | Default |
|---|---|---|---|
| bookId | Yes | ||
| chunkId | No | Chunk id; omit to continue from progress |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden of disclosing behavior. It reveals the side effect of updating reading progress and explains the Omit-chunkId-to-continue-from-progress behavior. It does not cover potential errors or authentication needs, but is adequate for a read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences without fluff. The first sentence states purpose, the second details the two invocation modes and side effect. Every part earns its place.
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?
The description adequately covers the tool's core behavior and side effect for a simple read tool with two parameters and no output schema. It could mention the return type (text) explicitly, but given the straightforward nature, it is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning beyond the schema: it explains that omitting chunkId continues from the last-read position. However, bookId remains only implicitly tied to identifying the book. The schema already describes chunkId, so the description offers marginal value over the 50% schema coverage.
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 'Read the text of one chunk,' specifying a concrete verb and resource. It distinguishes itself from siblings like list_chunks (which lists metadata) and read_notes (which reads notes) by focusing on chunk text content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies two usage modes (by chunkId or from progress) but does not explicitly state when to choose one over the other or contrast with sibling tools. No direct exclusions or alternative recommendations are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_notesRead reading notesB
Read the accumulated discussion notes for a book, used to restore context cheaply between sessions.
| Name | Required | Description | Default |
|---|---|---|---|
| bookId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It mentions 'cheaply' hinting at low cost, but does not disclose read-only nature, authentication needs, or return format.
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?
Single 16-word sentence with clear front-loading ('Read the accumulated discussion notes for a book') and an additional usage hint; no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Tool is simple with one parameter and no output schema; description omits what is returned (notes text, format, structure), reducing completeness for an agent.
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 has 0% description coverage and the description does not explain the bookId parameter or how to obtain it, leaving the agent to infer meaning from the name alone.
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?
Description clearly states it reads accumulated discussion notes for a book, distinguishing it from sibling tools like append_notes (which adds notes) and list_annotations (lists annotations). Verb and resource are specific.
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?
Description provides a use case ('restore context cheaply between sessions'), implying lightweight retrieval, but lacks explicit when-not-to-use or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_bookSearch within a bookA
Search all chunks of a book for a substring (case-insensitive) and return matching chunks with context snippets.
| Name | Required | Description | Default |
|---|---|---|---|
| bookId | Yes | ||
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description must carry full behavioral disclosure. It notes case-insensitive matching and return of context snippets, but omits details on edge cases (e.g., empty queries, no matches) or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence with no filler, front-loaded with the action verb 'Search', and efficiently conveys core functionality.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two simple parameters and no output schema, the description adequately covers the tool's purpose and basic behavior, though it could mention return format or pagination.
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 coverage is 0%, so the description must compensate. It clarifies that 'query' is a substring (case-insensitive) and implies 'bookId' identifies the book, adding moderate value but not fully detailing parameter constraints or formats.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Describes a specific action (search within a book) with a clear verb and resource, and distinguishes itself from siblings that list or read chunks by focusing on substring matching.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for substring searches within a book but does not explicitly state when to use this tool versus alternatives like list_chunks or read_chunk.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_progressSet reading progressA
Manually set the last-read chunk id for a book (e.g. to jump or re-read).
| Name | Required | Description | Default |
|---|---|---|---|
| bookId | Yes | ||
| chunkId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states it's a manual set operation, indicating mutation, but doesn't disclose potential side effects, validation, or authorization needs. With no annotations providing safety cues, this is minimally transparent.
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?
Single sentence of 14 words, front-loaded with the action, and efficient with zero waste. Every word earns its place.
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 simple tool with two required string params and no output schema, the description adequately covers purpose and one use case. It doesn't discuss return values or error handling, but complexity is low, so it's mostly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It implicitly maps 'book' to bookId and 'last-read chunk id' to chunkId, but adds no extra detail like format or constraints, providing only baseline semantic context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'set', the resource 'last-read chunk id for a book', and provides an example use case ('to jump or re-read'), which distinguishes it from siblings like 'get_progress' and 'read_chunk'.
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 with the example 'to jump or re-read', offering clear context. However, it lacks explicit exclusions or prerequisites (e.g., book must exist, chunk must be valid), which would strengthen guidance.
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.
12 tool updates
v1.0.0- First observed
add_annotation - First observed
append_notes - First observed
get_progress - First observed
import_book - First observed
list_annotations - First observed
list_books - First observed
list_cards - First observed
list_chunks - First observed
read_chunk - First observed
read_notes - First observed
search_book - First observed
set_progress
TDQS
Scored across 12 tools
Each tool targets a distinct operation: annotations, notes, progress, books, chunks, cards. No overlapping purposes; even list_annotations and list_cards are clearly differentiated.
All tool names follow a consistent verb_noun pattern with underscores (e.g., add_annotation, list_books, read_chunk). No mixing of styles.
12 tools is well-scoped for a collaborative reading server covering import, browsing, progress tracking, annotations, and notes. Each tool earns its place.
Covers core CRUD for books, chunks, annotations, and notes. Missing explicit delete/update for annotations or books, but the workflow is functional and gaps are minor.
Maintenance
Related MCP Connectors
MCP Server for Slima - AI Writing IDE for Novel Authors with AI Beta Reader.
MCP server for Project Gutenberg — 75,000+ public-domain ebooks with full plain-text retrieval.
Read-only MCP server exposing a user ORANO library to their own AI agent.
Markdown-based note-taking with a hosted MCP server. Your notes serve you and your AI.
Related MCP Servers
- AlicenseBqualityCmaintenanceA local MCP server that gives Claude a durable reading room for EPUB and plain text books, enabling chunk-by-chunk navigation, annotations, progress tracking, and shared margin cards.26111MIT
- AlicenseNot gradedqualityCmaintenanceA low-token human-AI co-reading MCP tool that imports local EPUB/TXT/Markdown books into chunks, enabling AI to read only relevant fragments and write co-reading results to long-term reading notes and progress files.65MIT
- AlicenseBqualityDmaintenanceA local MCP server that lets LLM agents read EPUB books and PDF documents with outline-first navigation, precise node reads, and local SQLite persistence.292MIT
- AlicenseAqualityDmaintenanceAn MCP server that splits PDFs by chapters/sections and reads them in Claude-friendly chunks. Enables structured reading of large PDF documents.616MIT