Access and Manage Your Apple Books Library
MCP server exposing your Apple Books library, highlights, and reading position for Claude to query and reflect on.
Why it matters
Interact with your Apple Books library to manage collections, notes, and annotations. This asset allows you to query your book data and extract insights for research or personal organization.
Outcomes
What it gets done
List and describe book collections and their contents.
Retrieve and search annotations, highlights, and notes across your library.
Summarize recent highlights and organize books by genre.
Search for specific highlighted text or notes within your books.
Install
Add it to your toolbox
Run in your project directory:
curl -fsSL https://spark.entire.vc/get/vb-apple-books | bash Capabilities
Tools your agent gets
List all collections in Apple Books library
Get all books in a specific collection
Get detailed information about a collection
List all books in the Apple Books library
Get all annotations for a specific book
Get detailed information about a specific book
List all annotations across the library
Get all highlights filtered by color
Overview
Apple Books MCP Server
An MCP server exposing your Apple Books library, collections, annotations, and reading position, plus one-click prompts for weekly digests and reading reflections, with opt-in collection editing. Use to have Claude read, search, or reflect on your Apple Books library and highlights. Book-content tools work only for non-DRM EPUBs, not Apple Books Store purchases or iCloud-only books.
What it does
Apple Books MCP is a Model Context Protocol server for Apple Books that lets Claude pick up where you left off in a book (chapter plus its text and recent highlights), expand on any highlight with the surrounding paragraph shown in context, revisit a book by pulling and clustering its highlights by theme, and reflect on patterns across your reading history and recurring ideas in your highlights.
It exposes tools across six areas. Collections: list, get books in, describe, and search collections by title, plus opt-in write tools (create, rename, delete, add/remove books) gated behind an --enable-writes flag - writes go directly to the library database behind guard rails: they refuse while Books is open, take an automatic WAL-safe backup first, validate schema and abort on drift, and only touch user-created collections (deleting a collection never deletes its books). Books: list all, describe a book's metadata/progress/annotation count, list its annotations, search by title, and filter by genre. Reading Status: books in progress, finished, unstarted, and most recently opened. Annotations: browse all grouped by book, get recent ones flat with date and book, get full annotation detail, pull the text window around a highlight with the highlight marked, filter by highlight color, and search notes/highlights/surrounding text, including by date range. Library Stats: a single summary tool with overall reading stats. Book Content (non-DRM EPUBs only - imported books, Project Gutenberg, Standard Ebooks; Apple Books Store purchases are FairPlay-protected and return a clear error, iCloud-only books return a not-downloaded hint): table of contents, plain-text chapter content with offset/max_chars slicing, and the chapter the user last left off on via Apple Books' auto-bookmark.
brew install uv # for macos
uvx apple-books-mcp
It also exposes a Currently Reading resource (the most recently opened in-progress book with metadata, the last-read chapter plus a text preview, and recent annotations, attachable to any conversation) and three one-click prompts: weekly_digest (summarize the past week's reading and highlights), library_snapshot (a reflection on your whole reading life), and revisit_book (revisit notes and highlights from a specific book).
When to use - and when NOT to
Use this connector when you want Claude to read, search, and reflect on your actual Apple Books library and highlights, resume a conversation about the book you're currently reading, or (opt-in) manage your Apple Books collections programmatically.
Book-content tools only work for non-DRM EPUBs; Apple Books Store purchases and iCloud-only (not-downloaded) books will not return content. Collection write tools are off by default and must be explicitly enabled, and they refuse to run while Apple Books is open. If iCloud sync for collections is enabled, direct database edits may not propagate to other devices and can be reverted by a cloud re-sync.
Capabilities
Read: list/get/describe/search collections and books, reading-status queries (in-progress/finished/unstarted/recent), annotation browsing/search/context/color-filter/date-range, library stats, and EPUB chapter listing/content/current-position. Write (opt-in via --enable-writes): create, rename, and delete user-created collections, and add or remove books from a collection (both idempotent).
How to install
Run without installing via uv (uvx apple-books-mcp), or install via pip (pip install apple-books-mcp) and run with python -m apple_books_mcp, or run via Docker with the Apple Books data directory mounted read-only. Add the corresponding entry to Claude Desktop's mcpServers config (uvx, python, or docker command variants are all documented). On first use, macOS will prompt to allow access to Apple Books' private sandboxed container - this must be allowed or every tool returns empty results; access is read-only and scoped to that container.
Who it's for
Apple Books readers who want Claude to search, summarize, and reflect on their reading history and highlights, or manage their book collections directly from a conversation.
Source README
Apple Books MCP
Model Context Protocol (MCP) server for Apple Books.
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 |
|---|---|---|
| list_all_collections | List all collections | limit?: int |
| get_collection_books | Get all books in a collection | collection_id: str |
| describe_collection | Get details of a collection | collection_id: str |
| search_collections_by_title | Search for collections by title | title: str |
Editing collections (opt-in)
Off by default. Enable by adding --enable-writes to the server args:
"args": ["apple-books-mcp@latest", "--enable-writes"]
Apple provides no automation API for collections, so these write directly to the library database - behind guard rails: every write refuses while Books is open, takes an automatic WAL-safe backup first (~/.py_apple_books/backups/), validates the schema and aborts on drift, and only touches user-created collections (plus "Want to Read" membership). Deleting a collection never deletes the books in it.
⚠️ If iCloud sync for collections is enabled, direct edits may not propagate to other devices and can be reverted by a cloud re-sync.
| Tool | Description | Parameters |
|---|---|---|
| create_collection | Create a new collection | title: str, details?: str |
| rename_collection | Rename a user-created collection | collection_id: int, new_title: str |
| delete_collection | Delete a user-created collection (books untouched) | collection_id: int |
| add_book_to_collection | Add a book to a collection (idempotent) | collection_id: int, book_id: int |
| remove_book_from_collection | Remove a book from a collection (idempotent) | collection_id: int, book_id: int |
Books
| Tool | Description | Parameters |
|---|---|---|
| list_all_books | List all books | limit?: int |
| describe_book | Get details of a particular book (metadata, progress, annotation count, description) | book_id: str |
| list_annotations | Get all annotations for a book (id + text + chapter per row, chapter-ordered) | book_id: int, limit?: int |
| search_books_by_title | Search for books by title | title: str |
| get_books_by_genre | Get books by genre (substring match) | genre: str, limit?: int |
Reading Status
| Tool | Description | Parameters |
|---|---|---|
| get_books_in_progress | Get books currently being read | limit?: int |
| get_finished_books | Get books that have been finished | limit?: int |
| get_unstarted_books | Get books not yet started | limit?: int |
| get_recently_read_books | Get most recently opened books | limit?: int (default: 10) |
Annotations
| Tool | Description | Parameters |
|---|---|---|
| list_all_annotations | Browse every annotation grouped by book, newest first | limit?: int |
| recent_annotations | Get most recent annotations (flat, with date + book per row) | limit?: int (default: 10) |
| describe_annotation | Get full details of a single annotation | annotation_id: str |
| get_annotation_context | Text window around a highlight (the paragraph it's in), with the highlight marked «...» |
annotation_id: int, chars_before?: int (default: 500), chars_after?: int (default: 500) |
| get_highlights_by_color | Highlights of a particular color, grouped by book | color: str, limit?: int |
| search_notes | Search user notes (shows highlight + note inline) | note: str, limit?: int |
| search_annotations | Search across highlights + notes + surrounding text | text: str, limit?: int |
| get_annotations_by_date_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 |
|---|---|---|
| get_library_stats | 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 |
|---|---|---|
| list_book_chapters | Table of contents for a book (chapter titles, order, nesting) | book_id: int |
| get_chapter_content | Plain-text content of a chapter, with optional offset + max_chars slicing |
book_id: int, chapter_id: str, offset?: int, max_chars?: int |
| get_current_reading_position | The chapter the user last left off reading (via Apple Books' auto-bookmark CFI) | book_id: 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 |
|---|---|---|
| weekly_digest | Summarize what I've read and highlighted in the past week | days?: int (default: 7) |
| library_snapshot | A reflection on my whole reading life | None |
| revisit_book | Revisit your notes and highlights from a specific book | book_title: 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
FAQ
Common questions
Trust
How it checks out
Discussion
Questions & comments · 0
Sign In Sign in to leave a comment.