Skip to main content
Glama
kikuovo
by kikuovo

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 start

Configure 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:remote

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

  1. Copy the repo to the VPS and npm install.

  2. Run start:remote behind a process manager (e.g. pm2 start npm --name co-reading -- run start:remote) so it survives disconnects/reboots.

  3. 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
    }
  4. In the Claude mobile app, go to Settings → Connectors → Add custom connector, and enter https://your-domain.com/mcp with 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 .txt or .epub file (by filePath) or raw text, 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; omit chunkId to 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 tools
add_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bookIdYes
chunkIdYes
quoteYesShort exact quote from the chunk text that the annotation anchors to
commentYesThe annotation content
authorYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bookIdYes
contentYes

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/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 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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bookIdYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/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 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoBook title; defaults to the EPUB's own title when importing an EPUB
filePathNoAbsolute path to a .txt or .epub file to import
textNoRaw plain-text book content, used if filePath is not given

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bookIdYes
chunkIdNo

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bookIdYes
chunkIdNo

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters1/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bookIdYes

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose5/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 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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bookIdYes
chunkIdNoChunk id; omit to continue from progress

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bookIdYes

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bookIdYes
queryYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
bookIdYes
chunkIdYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

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

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 12 tool updatesv1.0.0
    • First observedadd_annotation
    • First observedappend_notes
    • First observedget_progress
    • First observedimport_book
    • First observedlist_annotations
    • First observedlist_books
    • First observedlist_cards
    • First observedlist_chunks
    • First observedread_chunk
    • First observedread_notes
    • First observedsearch_book
    • First observedset_progress

TDQS

A3.8/5.0

Scored across 12 tools

Disambiguation5/5

Each tool targets a distinct operation: annotations, notes, progress, books, chunks, cards. No overlapping purposes; even list_annotations and list_cards are clearly differentiated.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with underscores (e.g., add_annotation, list_books, read_chunk). No mixing of styles.

Tool Count5/5

12 tools is well-scoped for a collaborative reading server covering import, browsing, progress tracking, annotations, and notes. Each tool earns its place.

Completeness4/5

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

ActivitySlowing
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    A 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.
    65
    MIT