Co-Reading MCP

A local reading room for Claude: an EPUB or TXT book is split into chunks, and margin notes and progress persist between sessions.

  • 120 ★ on the repository
  • Last commit
  • MIT
MCP server

Extended access

Why this level

  • The server reads and writes book, note and progress files in the chosen directory, and `reading_delete_book` moves a book to trash.
  • Remote mode without HTTPS and a token exposes your library to anyone who knows the address.
All reasons and checks

idleprocesscc/co-reading-mcp

Install

Manual install

{"mcpServers": {"co-reading": {"command": "node", "args": ["/absolute/path/to/co-reading-mcp/src/server.js"], "env": {"READING_MCP_DATA_DIR": "/absolute/path/to/co-reading-mcp/data"}}}}

The README snippet for Claude Desktop and Claude Code. Run `cp -R data.example data` first.

Access and checks

How we review

Extended accessThe tool runs code or makes network calls and only reads external data.

  • The server reads and writes book, note and progress files in the chosen directory, and `reading_delete_book` moves a book to trash.
  • Remote mode without HTTPS and a token exposes your library to anyone who knows the address.

This is third-party code. Review the repository files before installing.

What it does

The MCP server imports EPUB and plain text into stable chunks and keeps chapter boundaries. Claude reads a book in parts with `prevId` and `nextId` pointers, continues from the first unread chunk and searches the book from a cache. The human and Claude both leave margin notes. The reader notes can stay private and then be submitted to Claude in one command, and the reply lands under them. The server tracks reading progress, shows small cards when both stop at the same passage and returns a short ritual when a book is finished. A simple browser reader at `http://127.0.0.1:8787` and a REST API come with it.

Who it is for. Readers who work through a book with Claude and want notes and progress to survive after the chat closes.

Good fit when

  • A book is read chapter by chapter with Claude and the talk resumes where it stopped.
  • Search across the book text is needed without re-uploading the file to each new chat.
  • Your own marks pile up first and the reader decides later to show them to Claude.
  • Books are uploaded to a remote server from the browser because chat attachments do not reach its file system.

Not a fit when

  • A quick one-shot summary of a book is needed: the server is built for chunked reading.
  • The server would go to the public internet without HTTPS and `MCP_AUTH_TOKEN`.
  • The book format differs from EPUB, TXT and Markdown.

Example request

Continue the book from where we stopped and leave a margin note on the last paragraph.

MCP

Transport
stdio, http, sse
Authentication
not required

Environment variables

READING_MCP_DATA_DIR required
Directory with books, notes and progress.
MCP_AUTH_TOKEN secret
Token for the remote server, required beyond localhost.

Limitations

Node.js 18 or newer and Python 3.10 or newer for the import scripts are required. You run the server yourself, and there is no npm package. Remote access requires HTTPS and `MCP_AUTH_TOKEN`, otherwise the reader and API are visible to everyone. A token in `/?token=` lands in the first request, so avoid it on shared devices. Polished PNG cards need Chromium installed separately through Playwright; without it cards render as SVG. Images from EPUB are kept only with `--keep-images`.

How to disable. Remove the `co-reading` entry from the client configuration and stop the `node src/server.js` process. Books, notes and progress live in the `data/` directory, which is deleted separately.

FAQ

How do I import a book?

For EPUB run `python3 scripts/import_epub.py ./book.epub --out ./data/books`, for text run `python3 scripts/import_text.py ./book.txt --title "Title" --out ./data/books`. You can also upload a file with a button in the browser reader.

How do I enable remote access?

Run `READING_MCP_DATA_DIR=./data MCP_AUTH_TOKEN="secret" npm run start:sse`. The `/mcp` address suits Claude connectors, and `/sse` stays for older clients.

What happens when a book is deleted?

The book leaves the library and its folder and related data move to `data/trash/books/`. Trash is pruned after 30 days; `READING_TRASH_RETENTION_DAYS=0` turns pruning off.

Which tools does the server have?

Reading and search (`reading_list_books`, `reading_read_chunk`, `reading_continue`, `reading_search_chunks`), import (`reading_import_book`), notes (`reading_annotate_passage`, `reading_submit_user_notes`) and progress (`reading_mark_read`, `reading_get_progress`).

How do I start the reader for the human?

Run `npm run reader` and open `http://127.0.0.1:8787`. The same process also keeps the MCP stdio server alive if the client config points to `src/http.js`.

Discussion

No questions or reviews yet.

An MCP server for a BookStack wiki: read and search by default, writes enabled separately, rights taken from the token.

MCP serverExtended access55Repository stars

An MCP server for WeChat Reading: your AI agent gets your bookshelf, notes, highlights and top reviews

MCP serverBroad access584Repository stars

Minutes

minutes

Official

A local-first MCP server for meeting memory: on-device recording and transcription into Markdown, searchable from Claude Code, Codex, Cursor and any MCP client

MCP serverExtended access1.6KRepository stars
Official

The official Kibela MCP server searches, reads and edits notes, folders and comments of your wiki straight from an assistant chat

MCP serverExtended access16Repository stars
Official

A read-only MCP server: Claude Code, Claude Desktop and Codex search local DoodleNote meetings, notes and transcripts

MCP serverExtended access186Repository stars

README in short

The project is meant as a shared reading surface for a human and Claude with anchored notes. Private content stays in the git-ignored `data/` directory, and the repository ships only a toy example.

README badge

Report a problem