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
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.
Install
- Works in
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 reviewExtended 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_DIRrequired- Directory with books, notes and progress.
MCP_AUTH_TOKENsecret- 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.
Related
MCP serversApple Books MCP: your books and highlights in Claude
Apple Books MCP
An MCP server for Apple Books on macOS: the agent sees your current book, reads chapters, highlights and notes, finds books
An MCP server for a BookStack wiki: read and search by default, writes enabled separately, rights taken from the token.
An MCP server for WeChat Reading: your AI agent gets your bookshelf, notes, highlights and top reviews
Minutes
minutes
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
The official Kibela MCP server searches, reads and edits notes, folders and comments of your wiki straight from an assistant chat
DoodleNote MCP: meeting notes for agents
DoodleNote MCP
A read-only MCP server: Claude Code, Claude Desktop and Codex search local DoodleNote meetings, notes and transcripts
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.