Install
$ agentstack add mcp-vgnshiyer-apple-books-mcp ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
Apple Books MCP
Model Context Protocol (MCP) server for Apple Books.
[](https://vgnshiyer.me/AppleBooksMcp)
[](https://pypi.org/project/apple-books-mcp/) [](https://opensource.org/licenses/Apache-2.0) [](https://www.linkedin.com/comm/mynetwork/discovery-see-all?usecase=PEOPLE_FOLLOWS&followMember=vgnshiyer) [](https://www.buymeacoffee.com/vgnshiyer)
At a glance
- Pick up where you left off — Claude sees the chapter you're on and its text, plus recent highlights in the book.
- Expand on any highlight — get the surrounding paragraph explained in context, with the exact anchor you marked shown in
«...». - Revisit a book — pull your highlights, cluster them by theme, and quote you back to yourself.
- Reflect on your reading — patterns across books, recurring ideas in your highlights, what you're actually drawn to.
https://github.com/user-attachments/assets/77a5a29b-bfd7-4275-a4af-8d6c51a4527e
And much more!
Available Tools
Collections
| Tool | Description | Parameters | |------|-------------|------------| | listallcollections | List all collections | limit?: int | | getcollectionbooks | Get all books in a collection | collectionid: str | | describecollection | Get details of a collection | collectionid: str | | searchcollectionsbytitle | Search for collections by title | title: str |
Books
| Tool | Description | Parameters | |------|-------------|------------| | listallbooks | List all books | limit?: int | | describebook | Get details of a particular book (metadata, progress, annotation count, description) | bookid: str | | listannotations | Get all annotations for a book (id + text + chapter per row, chapter-ordered) | bookid: int, limit?: int | | searchbooksbytitle | Search for books by title | title: str | | getbooksbygenre | Get books by genre (substring match) | genre: str, limit?: int |
Reading Status
| Tool | Description | Parameters | |------|-------------|------------| | getbooksinprogress | Get books currently being read | limit?: int | | getfinishedbooks | Get books that have been finished | limit?: int | | getunstartedbooks | Get books not yet started | limit?: int | | getrecentlyreadbooks | Get most recently opened books | limit?: int (default: 10) |
Annotations
| Tool | Description | Parameters | |------|-------------|------------| | listallannotations | Browse every annotation grouped by book, newest first | limit?: int | | recentannotations | Get most recent annotations (flat, with date + book per row) | limit?: int (default: 10) | | describeannotation | Get full details of a single annotation | annotationid: str | | getannotationcontext | Text window around a highlight (the paragraph it's in), with the highlight marked «...» | annotationid: int, charsbefore?: int (default: 500), charsafter?: int (default: 500) | | gethighlightsbycolor | Highlights of a particular color, grouped by book | color: str, limit?: int | | searchnotes | Search user notes (shows highlight + note inline) | note: str, limit?: int | | searchannotations | Search across highlights + notes + surrounding text | text: str, limit?: int | | getannotationsbydate_range | Annotations within a date range (flat, with date + book per row) | after?: YYYY-MM-DD, before?: YYYY-MM-DD, limit?: int |
Library Stats
| Tool | Description | Parameters | |------|-------------|------------| | getlibrarystats | Get library summary with reading stats | None |
Book Content
Only works for non-DRM EPUBs (imported books, Project Gutenberg, Standard Ebooks, etc.). Apple Books Store purchases are FairPlay-protected and return a clear error. iCloud-only books return a "not downloaded" hint.
| Tool | Description | Parameters | |------|-------------|------------| | listbookchapters | Table of contents for a book (chapter titles, order, nesting) | bookid: int | | getchaptercontent | Plain-text content of a chapter, with optional offset + max_chars slicing | bookid: int, chapterid: str, offset?: int, maxchars?: int | | getcurrentreadingposition | The chapter the user last left off reading (via Apple Books' auto-bookmark CFI) | bookid: int |
Available Resources
Attachable data objects accessible from Claude Desktop's resource picker.
| Resource | URI | Description | |----------|-----|-------------| | Currently Reading | apple-books://currently-reading | The book you're reading right now — most recently opened in-progress book, with metadata, the chapter you left off on plus a preview of its text (for non-DRM EPUBs), and recent annotations. Attach to any conversation to focus Claude on your current read. |
Available Prompts
One-click workflows, accessible from Claude Desktop's prompt picker.
| Prompt | Description | Arguments | |--------|-------------|-----------| | weeklydigest | Summarize what I've read and highlighted in the past week | days?: int (default: 7) | | librarysnapshot | A reflection on my whole reading life | None | | revisitbook | Revisit your notes and highlights from a specific book | booktitle: str |
Installation
Using uv (recommended)
uvx can be used to directly run apple-books-mcp (without installing it).
brew install uv # for macos
uvx apple-books-mcp
Using pip
pip install apple-books-mcp
After installing, you can run the server using:
python -m apple_books_mcp
Using Docker
docker run -v ~/Library/Containers/com.apple.iBooksX/Data/Documents:/root/Library/Containers/com.apple.iBooksX/Data/Documents:ro ghcr.io/vgnshiyer/apple-books-mcp:latest
First-run permission prompt (macOS)
On first use, macOS will ask whether uvx (or python / docker, depending on how you launched) may "access data from other apps." Click Allow — the MCP reads Apple Books' private container at ~/Library/Containers/com.apple.iBooksX/, which macOS treats as another app's sandboxed data. Access is read-only and scoped to that container; the server starts successfully either way, but without permission every tool comes back empty.
Configuration
Claude Desktop Setup
Using uvx (recommended)
{
"mcpServers": {
"apple-books-mcp": {
"command": "uvx",
"args": [ "apple-books-mcp@latest" ]
}
}
}
Using python
{
"mcpServers": {
"apple-books-mcp": {
"command": "python",
"args": ["-m", "apple_books_mcp"]
}
}
}
Using Docker
{
"mcpServers": {
"apple-books-mcp": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "~/Library/Containers/com.apple.iBooksX/Data/Documents:/root/Library/Containers/com.apple.iBooksX/Data/Documents:ro",
"ghcr.io/vgnshiyer/apple-books-mcp:latest"
]
}
}
}
Upcoming Features
- [ ] PDF content access (currently EPUB-only)
- [ ] fuller annotation context via CFI → paragraph resolution
Contribution
Thank you for considering contributing to this project!
Development
If you cloned this repository, you can test it using Claude Desktop with below configuration:
Use uv venv to create a virtual environment and install the dependencies.
uv venv
uv sync
Debugging
With Claude Desktop
{
"mcpServers": {
"apple-books-mcp": {
"command": "uv",
"args": [
"--directory",
"/path/to/apple-books-mcp/",
"run",
"apple_books_mcp",
"-v"
]
}
}
}
With inspector
npx @modelcontextprotocol/inspector uvx apple-books-mcp
Opening Issues
If you encounter a bug, have a feature request, or want to discuss something related to the project, please open an issue on the GitHub repository. When opening an issue, please provide:
Bug Reports: Describe the issue in detail. Include steps to reproduce the bug if possible, along with any error messages or screenshots.
Feature Requests: Clearly explain the new feature you'd like to see added to the project. Provide context on why this feature would be beneficial.
General Discussions: Feel free to start discussions on broader topics related to the project.
Contributing
1️⃣ Fork the GitHub repository https://github.com/vgnshiyer/apple-books-mcp \ 2️⃣ Create a new branch for your changes (git checkout -b feature/my-new-feature). \ 3️⃣ Make your changes and test them thoroughly. \ 4️⃣ Push your changes and open a Pull Request to main.
Please provide a clear title and description of your changes.
License
Apple Books MCP is licensed under the Apache 2.0 license. See the LICENSE file for details.
Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: vgnshiyer
- Source: vgnshiyer/apple-books-mcp
- License: Apache-2.0
- Homepage: https://vgnshiyer.me/AppleBooksMcp
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.