MCP server for extracting annotations and highlights from e-readers (Kobo, Kindle, Boox)
Project description
annotation-extractor
MCP server for extracting annotations, highlights, and reading progress from e-readers.
Supports Kobo, Kindle, and Boox.
Install
pip install annotation-extractor
As an Agent Skill
Install as a reusable skill for any AI coding agent via skills.sh:
npx skills add rkaushik29/annotation-extractor-mcp
Or from source:
git clone https://github.com/rkaushik29/annotation-extractor-mcp.git
cd annotation-extractor
pip install -e .
Usage
Connect your e-reader via USB, add the MCP server to your agent, and start asking questions about your reading.
| Client | Setup |
|---|---|
| Claude Code | claude mcp add annotations -- annotation-extractor |
| Claude Desktop | Add to claude_desktop_config.json: {"mcpServers": {"annotations": {"command": "annotation-extractor"}}} |
| OpenClaw | openclaw mcp add annotations -- annotation-extractor |
| Gemini CLI | Add to ~/.gemini/settings.json: {"mcpServers": {"annotations": {"command": "annotation-extractor"}}} |
| Codex | codex --mcp-config mcp.json with mcp.json: {"mcpServers": {"annotations": {"command": "annotation-extractor"}}} |
Try it out
Once the MCP is connected and your e-reader is plugged in, try asking your agent:
"What are my highlights from the last book I read?"
"Search my annotations for anything about consciousness"
"Show me all the notes I took while reading Neuromancer"
Environment variables
If auto-detection doesn't find your device, you can point to the data source directly:
KOBO_DB_PATH=/path/to/KoboReader.sqlite annotation-extractor
KINDLE_CLIPPINGS_PATH=/path/to/My\ Clippings.txt annotation-extractor
BOOX_EXPORT_PATH=/path/to/boox-export annotation-extractor
For handwritten note extraction and rendering, these optional variables are also supported:
KINDLE_SCRIBE_PATH=/path/to/kindle-mount annotation-extractor
KINDLE_SCRIBE_CONVERTER=calibre-debug annotation-extractor
BOOX_NOTE_RENDERER=onyx_render.py annotation-extractor
Supported e-readers
| Reader | Data source |
|---|---|
| Kobo | .kobo/KoboReader.sqlite via USB |
| Kindle | My Clippings.txt via USB |
| Boox | Annotation export directory (one .txt file per book) via USB |
Handwritten notes are supported for:
- Kindle Scribe notebooks via
.notebooks/(raw export, optional render via KFX Input) - Boox handwritten exports (
.pdf/.png) and local backup.zipfiles (optional render)
Tools
| Tool | Description |
|---|---|
list_books |
List all books, optionally filtered to those with annotations |
get_annotations |
Get highlights and notes for a specific book (by title or ID) |
search_annotations |
Full-text search across all highlights and notes |
get_reading_progress |
Reading progress, time spent, and status for all books |
get_book_details |
Detailed metadata for a specific book |
get_handwritten_notes |
List handwritten note artifacts (Kindle Scribe / Boox) |
export_handwritten_notes |
Export handwritten note artifacts to a local directory |
All tools accept optional backend_name (e.g., "kobo", "kindle", "boox") and db_path parameters. When omitted, the server auto-detects connected devices.
Adding a new backend
- Create
src/annotation_extractor/backends/yourreader.pyimplementingEReaderBackend - Add your backend to
_ALL_BACKENDSinregistry.py - No changes needed to
server.pyormodels.py
Development
git clone https://github.com/rohitkaushik/annotation-extractor.git
cd annotation-extractor
pip install -e ".[dev]"
pytest
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file annotation_extractor-0.4.1.tar.gz.
File metadata
- Download URL: annotation_extractor-0.4.1.tar.gz
- Upload date:
- Size: 24.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
98cc45a0786d72fab879f1d98b6cbb787355c71e2c904c46479e2db265eb5958
|
|
| MD5 |
45a89412797b1d79369fac606d7de8f8
|
|
| BLAKE2b-256 |
acf81d50b5a8e618eeb17a49cd554e83d898fc3ba0e7384133c7c4a06734f933
|
Provenance
The following attestation bundles were made for annotation_extractor-0.4.1.tar.gz:
Publisher:
publish.yml on rkaushik29/annotation-extractor-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
annotation_extractor-0.4.1.tar.gz -
Subject digest:
98cc45a0786d72fab879f1d98b6cbb787355c71e2c904c46479e2db265eb5958 - Sigstore transparency entry: 1297327807
- Sigstore integration time:
-
Permalink:
rkaushik29/annotation-extractor-mcp@bd2aada80f085d1b736af785218fdc24b070f604 -
Branch / Tag:
refs/tags/v0.4.1 - Owner: https://github.com/rkaushik29
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bd2aada80f085d1b736af785218fdc24b070f604 -
Trigger Event:
release
-
Statement type:
File details
Details for the file annotation_extractor-0.4.1-py3-none-any.whl.
File metadata
- Download URL: annotation_extractor-0.4.1-py3-none-any.whl
- Upload date:
- Size: 22.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c537180ec5e7751309e137b33147fe7f15e26484c39c92221e74b5c68e4f1c3d
|
|
| MD5 |
740f378493cc2ebc3f605ba9ebb0c3b7
|
|
| BLAKE2b-256 |
286a4a759af2f9b9572061679e31c1d2f0903351632b2c17159956fcf69ce15c
|
Provenance
The following attestation bundles were made for annotation_extractor-0.4.1-py3-none-any.whl:
Publisher:
publish.yml on rkaushik29/annotation-extractor-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
annotation_extractor-0.4.1-py3-none-any.whl -
Subject digest:
c537180ec5e7751309e137b33147fe7f15e26484c39c92221e74b5c68e4f1c3d - Sigstore transparency entry: 1297327917
- Sigstore integration time:
-
Permalink:
rkaushik29/annotation-extractor-mcp@bd2aada80f085d1b736af785218fdc24b070f604 -
Branch / Tag:
refs/tags/v0.4.1 - Owner: https://github.com/rkaushik29
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bd2aada80f085d1b736af785218fdc24b070f604 -
Trigger Event:
release
-
Statement type: