# Apple Books (mcpb · apple-books-mcp-0.9.0.mcpb)

Access your Apple Books library, annotations, reading progress, and highlights through Claude

- Trust score: 57/100 (low)
- Change this week: +1
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- mcpb · `apple-books-mcp-0.9.0.mcpb`: 57/100 (this document), [markdown](https://verifymcp.io/servers/vgnshiyer-apple-books-mcp/apple-books-mcp-2.md), [page](https://verifymcp.io/servers/vgnshiyer-apple-books-mcp/apple-books-mcp-2)
- pypi · `apple-books-mcp`: 94/100, [markdown](https://verifymcp.io/servers/vgnshiyer-apple-books-mcp/apple-books-mcp.md), [page](https://verifymcp.io/servers/vgnshiyer-apple-books-mcp/apple-books-mcp)

## Channel facts

- Registry: `mcpb`
- Package: `https://github.com/vgnshiyer/apple-books-mcp/releases/download/v0.9.0/apple-books-mcp-0.9.0.mcpb`
- Version: `0.9.0`
- Transport: `stdio`
- SHA-256: `0fe18329889376b756716d14a3e6aa89374af7df1190504185632dcd68039fbc`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 13/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs were checked across the 35 of 35 dependencies we could resolve, so this covers what we could see, not the whole tree.
  - Install-script risk not yet assessed.
  - 0 of 35 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (Apache-2.0).
  - Actively maintained (last published 34 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 84/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3927 tokens (~122/item across 32 items; 31 tools + 1 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 100/100
  - No destabilizing schema changes in the last 30 days.
- **Tool Coverage**: 67/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 33 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the Apple Books MCP server?

Apple Books ships as an MCPB bundle, a single file you download and open in an MCP host that supports MCPB bundles, such as Claude Desktop. The host reads the launch command from the bundle's own manifest, so there is no command to copy. Before opening it, check the file's SHA-256 matches the one the MCP registry declares for it, 0fe18329889376b756716d14a3e6aa89374af7df1190504185632dcd68039fbc; the commands to do that are on this page. If it does not match, do not open it.

- Download bundle: `https://github.com/vgnshiyer/apple-books-mcp/releases/download/v0.9.0/apple-books-mcp-0.9.0.mcpb`
- SHA-256: `0fe18329889376b756716d14a3e6aa89374af7df1190504185632dcd68039fbc`

### Verify on macOS / Linux

```bash
echo "0fe18329889376b756716d14a3e6aa89374af7df1190504185632dcd68039fbc  apple-books-mcp-0.9.0.mcpb" | shasum -a 256 -c
```

### Verify on Windows (PowerShell)

```powershell
(Get-FileHash -Algorithm SHA256 .\apple-books-mcp-0.9.0.mcpb).Hash -eq "0fe18329889376b756716d14a3e6aa89374af7df1190504185632dcd68039fbc"
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-31 (score 57, 0)

- [security] Stability: 0.97 → pass

### 2026-10-30 (score 57, +1)

No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-27 (score 56, +1)

No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-25 (score 55, +1)

No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-23 (score 54, +1)

No change was recorded against any check on this day. Stability & Change Management went from 70 to 73. That category is still filling its 30-day observation window: 21 days of observed history at the previous scan, 22 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-21 (score 53, +1)

No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-19 (score 52, +1)

No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-17 (score 51, +1)

No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (31)

### `list_all_collections` (~100 tokens)

List collections

List all collections in my Apple Books library. Output is one row
per collection: ``[id] title``. Use ``describe_collection(id)`` for
details or ``get_collection_books(id)`` to list its books.

Args:
    limit: Max collections to return (1–500, default 200).
    offset: Collections to skip, for paging.

Input parameters:

- `limit` (integer)
- `offset` (integer)

### `get_collection_books` (~90 tokens)

List a collection's books

List the books in a collection as lean rows: ``[id] title by
author``. Descriptions are intentionally omitted — collections
with many books would otherwise emit tens of thousands of chars of
marketing blurb. Use ``describe_book(id)`` for details on any
specific book.

Args:
    collection_id: The collection's numeric ID.

Input parameters:

- `collection_id` (integer, required)

### `describe_collection` (~48 tokens)

Describe a collection

Describe a specific collection in detail — title, details text,
and the books contained in it.

Args:
    collection_id: The collection's numeric ID.

Input parameters:

- `collection_id` (integer, required)

### `search_collections_by_title` (~53 tokens)

Search collections by title

Search for collections by title (substring match). Output is one
row per match: ``[id] title``.

Args:
    title: The title to search for.

Input parameters:

- `title` (string, required)

### `create_collection` (~66 tokens)

Create a collection

Create a new collection in the user's Apple Books library.
Requires write access and Books to be quit; a backup is taken
automatically.

Args:
    title: Name for the new collection.
    details: Optional description.

Input parameters:

- `details`
- `title` (string, required)

### `rename_collection` (~68 tokens)

Rename a collection

Rename a user-created collection (built-in collections are
refused). Requires write access and Books to be quit.

Args:
    collection_id: The collection's numeric ID.
    new_title: The new name.

Input parameters:

- `collection_id` (integer, required)
- `new_title` (string, required)

### `delete_collection` (~63 tokens)

Delete a collection

Delete a user-created collection (built-in collections are
refused). The books inside are NOT deleted — only the collection.
Requires write access and Books to be quit.

Args:
    collection_id: The collection's numeric ID.

Input parameters:

- `collection_id` (integer, required)

### `add_book_to_collection` (~79 tokens)

Add a book to a collection

Add a book to a collection (user-created collections and "Want to
Read"). Idempotent. Requires write access and Books to be quit.

Args:
    collection_id: The collection's numeric ID.
    book_id: The book's numeric ID.

Input parameters:

- `book_id` (integer, required)
- `collection_id` (integer, required)

### `remove_book_from_collection` (~76 tokens)

Remove a book from a collection

Remove a book from a collection (the book stays in the library).
Idempotent. Requires write access and Books to be quit.

Args:
    collection_id: The collection's numeric ID.
    book_id: The book's numeric ID.

Input parameters:

- `book_id` (integer, required)
- `collection_id` (integer, required)

### `list_all_books` (~105 tokens)

List all books

List all books in my Apple Books library. Output is one row per
book: ``[id] title by author``. Use ``describe_book(id)`` for
details on any book.

Args:
    limit: Max books to return (1–500, default 200).
    offset: Books to skip, for paging; a footer names the next
        offset when there are more.

Input parameters:

- `limit` (integer)
- `offset` (integer)

### `describe_book` (~108 tokens)

Describe a book

Describe a specific book in detail — metadata (title, author, genre,
page count), reading status (progress, last opened, finished date),
and annotation count. Also whether the chapter tools can read its
text (``Readable text:``, and why not), and an ``Open in Books:``
link (``ibooks://assetid/...``) that opens it in Apple Books.

Args:
    book_id: The book's numeric ID.

Input parameters:

- `book_id` (integer, required)

### `search_books` (~155 tokens)

Search books by title or author

Search for books whose title or author contains ``query``, ignoring
case, accents and quote/dash style ("don't" finds "Don’t", "godel"
finds "Gödel"). Output is one row per book, by book id:
\``[id] title by author``. Use ``describe_book(id)`` for details.

Args:
    query: Text to find in the title or the author's name.
    limit: Max books to return (1–500, default 200).
    offset: Books to skip, for paging; a footer names the next
        offset when there are more.

Input parameters:

- `limit` (integer)
- `offset` (integer)
- `query` (string, required)

### `search_books_by_title` (~140 tokens)

Search books by title

Search for books by title (substring match, ignoring case, accents
and quote/dash style). Output is one row per match: ``[id] title by
author``. Use ``describe_book(id)`` for details, and
\``search_books`` to match authors too.

Args:
    title: The title to search for.
    limit: Max books to return (1–500, default 200).
    offset: Books to skip, for paging; a footer names the next
        offset when there are more.

Input parameters:

- `limit` (integer)
- `offset` (integer)
- `title` (string, required)

### `get_books_by_genre` (~112 tokens)

Find books by genre

Get books whose genre matches the given string (substring match).
Output is one row per match: ``[id] title by author (genre)``.

Args:
    genre: The genre to search for (e.g. "Romance", "Philosophy").
    limit: Max books to return (1–500, default 200).
    offset: Books to skip, for paging.

Input parameters:

- `genre` (string, required)
- `limit` (integer)
- `offset` (integer)

### `get_books_in_progress` (~88 tokens)

Books in progress

Get books currently being read (progress > 0% and < 100%). Output
per row: ``[id] title by author`` with a progress summary below.

Args:
    limit: Max books to return (1–500, default 200).
    offset: Books to skip, for paging.

Input parameters:

- `limit` (integer)
- `offset` (integer)

### `get_finished_books` (~78 tokens)

Finished books

Get books that have been finished. Output per row: ``[id] title
by author`` with a progress summary below.

Args:
    limit: Max books to return (1–500, default 200).
    offset: Books to skip, for paging.

Input parameters:

- `limit` (integer)
- `offset` (integer)

### `get_unstarted_books` (~84 tokens)

Unstarted books

Get books that haven't been started yet (0% progress). Output per
row: ``[id] title by author`` with a progress summary below.

Args:
    limit: Max books to return (1–500, default 200).
    offset: Books to skip, for paging.

Input parameters:

- `limit` (integer)
- `offset` (integer)

### `get_recently_read_books` (~97 tokens)

Recently read books

Get the most recently read books, newest first (by when each was
last opened or read, whichever is later).
Output per row: ``[id] title by author`` with a progress summary
below.

Args:
    limit: Max books to return (1–500, default 10).
    offset: Books to skip, for paging.

Input parameters:

- `limit` (integer)
- `offset` (integer)

### `list_all_annotations` (~161 tokens)

List all annotations

Browse all annotations grouped by book, most recent first. Rows:
\``[annotation_id] <text> — <chapter title> (ch=<id>)``, with the
user's note, if any, on a second line prefixed with ``↳ note:``.
Pass ``ch=<id>`` to ``get_chapter_content`` for the chapter, or
call ``get_annotation_context(annotation_id)`` for the passage
around a specific highlight.

Args:
    limit: Max annotations to return (1–500, default 50).
    offset: Annotations to skip, for paging; a footer names the
        next offset when there are more.

Input parameters:

- `limit` (integer)
- `offset` (integer)

### `list_annotations` (~145 tokens)

List a book's annotations

List annotations within a specific book in reading order (their
position in the book). Rows are lean —
\``[annotation_id] <text> — <chapter> (ch=<id>)`` — with the user's
note, if any, on a second line prefixed with ``↳ note:``.

Args:
    book_id: The book's numeric ID.
    limit: Max annotations to return (1–500, default 50).
    offset: Annotations to skip, for paging; a footer names the
        next offset when there are more.

Input parameters:

- `book_id` (integer, required)
- `limit` (integer)
- `offset` (integer)

### `get_highlights_by_color` (~163 tokens)

Highlights by color

Browse highlights of a particular color, grouped by book.

Output is one row per highlight: ``[id] text — chapter``. The
book's name is shown once in the header, with a count of matching
highlights on this page.

Args:
    color: ``yellow``, ``green``, ``blue``, ``pink``, or ``purple``.
    limit: Max annotations to return (1–500, default 50).
    offset: Annotations to skip, for paging.
    order_by: ``newest`` (default) or ``oldest`` first.

Input parameters:

- `color` (string, required)
- `limit` (integer)
- `offset` (integer)
- `order_by` (string)

### `search_notes` (~137 tokens)

Search notes

Search user notes (not highlights) by substring, grouped by book.
Output shows the highlighted passage on the primary row and the
matching note on a second line prefixed with ``↳ note:``.

Args:
    note: Substring to find inside note bodies.
    limit: Max annotations to return (1–500, default 50).
    offset: Annotations to skip, for paging.
    order_by: ``newest`` (default) or ``oldest`` first.

Input parameters:

- `limit` (integer)
- `note` (string, required)
- `offset` (integer)
- `order_by` (string)

### `search_annotations` (~167 tokens)

Search annotations

Search across every annotation field — selected (highlighted) text,
the surrounding paragraph, and the user's note body. Grouped by
book; a row's note, if any, is on a second line prefixed with
\``↳ note:``. Use ``search_notes`` when you only want to find your
own written notes.

Args:
    text: Substring to match anywhere in an annotation.
    limit: Max annotations to return (1–500, default 50).
    offset: Annotations to skip, for paging.
    order_by: ``newest`` (default) or ``oldest`` first.

Input parameters:

- `limit` (integer)
- `offset` (integer)
- `order_by` (string)
- `text` (string, required)

### `recent_annotations` (~110 tokens)

Recent annotations

Most recent annotations, newest first. Flat rows with the creation
time (the server's local time zone) and book name inline so Claude
can see chronology across books at a glance.

Row format::

    YYYY-MM-DD HH:MM [id] text — chapter · Book Title

Args:
    limit: Max annotations to return (1–500, default 10).
    offset: Annotations to skip, for paging.

Input parameters:

- `limit` (integer)
- `offset` (integer)

### `describe_annotation` (~78 tokens)

Describe an annotation

Describe a specific annotation in detail — text, note, book (with
an ``Open in Books:`` link), chapter, color, creation date. For the
passage around the highlight, call ``get_annotation_context``
instead.

Args:
    annotation_id: The annotation's numeric ID.

Input parameters:

- `annotation_id` (integer, required)

### `get_annotation_context` (~170 tokens)

Get the passage around a highlight

Return the passage around a specific highlight — the text before
and after, with the highlight itself wrapped in ``«...»``. Use
this to expand on a highlight without fetching the whole chapter.

Works for non-DRM EPUBs downloaded to this Mac; fails with a
clear message for DRM-protected books, iCloud-only books, or
older annotations that lack the chapter hint.

Args:
    annotation_id: The annotation's numeric ID.
    chars_before: Chars of context before the highlight (0–5000).
        Default 500.
    chars_after: Chars of context after the highlight (0–5000).
        Default 500.

Input parameters:

- `annotation_id` (integer, required)
- `chars_after` (integer)
- `chars_before` (integer)

### `get_annotations_by_date_range` (~212 tokens)

Annotations by date range

Annotations created within a date range, newest first by default.
Flat rows with the creation time and book name inline. Dates and
times are in the Mac's local time zone, named in the header.

Row format::

    YYYY-MM-DD HH:MM [id] text — chapter · Book Title

Args:
    after: Only include annotations created on or after this date
        (YYYY-MM-DD, or YYYY-MM-DDTHH:MM).
    before: Only include annotations created on or before this
        date (YYYY-MM-DD covers the whole day, or YYYY-MM-DDTHH:MM).
    limit: Max annotations to return (1–500, default 50).
    offset: Annotations to skip, for paging.
    order_by: ``newest`` (default) or ``oldest`` first.

Input parameters:

- `after`
- `before`
- `limit` (integer)
- `offset` (integer)
- `order_by` (string)

### `list_book_chapters` (~78 tokens)

List a book's chapters

List the table of contents for a book — chapter titles, order, and
nesting depth. Only works for non-DRM EPUBs that have been downloaded
to this Mac.

Args:
    book_id: The book's numeric ID (from ``list_all_books`` or similar).

Input parameters:

- `book_id` (integer, required)

### `get_chapter_content` (~371 tokens)

Get chapter text

Return the plain-text content of a chapter, paginated by default
to protect the context window. Get ``chapter_id`` from
\``list_book_chapters`` or from the ``(ch=...)`` suffix on
annotation listing rows, or pass ``"current"`` (the default) for
the chapter the user is reading in Apple Books. Works for non-DRM
EPUBs downloaded to this Mac.

Default ``max_chars=10000`` (~2500 words) fits most chapters in
one call. Longer chapters return a slice with a footer naming
the exact ``offset`` to pass next. At most 50000 chars are
returned per call.

Every response ends with a footer like one of::

    (full chapter returned: 4,872 chars.)
    …(returned chars 0–10000 of 24,311 [10000 chars]. Call again with
      offset=10000 to continue; 14,311 chars remaining.)
    (returned chars 20000–24311 of 24311 [4311 chars]. End of chapter.)

Args:
    book_id: The book's numeric ID.
    chapter_id: Chapter identifier, the 1-based chapter order as a
        string (e.g. ``"5"``), or ``"current"`` (the default): the
        chapter of the user's reading position. A chapter whose id
        is literally "current" wins.
    offset: Character offset to start from. Defaults to 0.
    max_chars: Max chars to return (1–50000). Default 10000.

Input parameters:

- `book_id` (integer, required)
- `chapter_id` (string)
- `max_chars` (integer)
- `offset` (integer)

### `get_current_reading_position` (~125 tokens)

Current reading position

Return where the user last left off reading a book — chapter
title and chapter_id, no text — and an ``Open in Books:`` link to
the book. Follow up with ``get_chapter_content`` for the text.

Works for non-DRM EPUBs downloaded to this Mac. If Apple Books
hasn't recorded a position, falls back to inferring from the
user's most recent highlight (labeled as such in the output).

Args:
    book_id: The book's numeric ID.

Input parameters:

- `book_id` (integer, required)

### `get_library_stats` (~21 tokens)

Library stats

Get a summary of your Apple Books library with reading stats.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/vgnshiyer-apple-books-mcp/apple-books-mcp-2#diagnostics

## Score history

- 2026-11-05: 57
- 2026-11-04: 57
- 2026-11-03: 57
- 2026-11-02: 57
- 2026-11-01: 57
- 2026-10-31: 57
- 2026-10-30: 57
- 2026-10-29: 56
- 2026-10-28: 56
- 2026-10-27: 56
- 2026-10-26: 55
- 2026-10-25: 55
- 2026-10-24: 54
- 2026-10-23: 54
- 2026-10-22: 53
- 2026-10-21: 53
- 2026-10-20: 52
- 2026-10-19: 52
- 2026-10-18: 51
- 2026-10-17: 51
- 2026-10-16: 50
- 2026-10-15: 50
- 2026-10-14: 49
- 2026-10-13: 49
- 2026-10-12: 43
- 2026-10-10: 43
- 2026-10-07: 43
- 2026-10-06: 43
- 2026-10-04: 43
- 2026-10-03: 43

## Common questions

### What is the Apple Books MCP server?

Apple Books is an MCP server listed in the public MCP registry as io.github.vgnshiyer/apple-books-mcp. Access your Apple Books library, annotations, reading progress, and highlights through Claude. This page covers its MCPB bundle (https://github.com/vgnshiyer/apple-books-mcp/releases/download/v0.9.0/apple-books-mcp-0.9.0.mcpb).

### Is the Apple Books MCP server safe to use?

Apple Books scores 57 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Apple Books MCP server expose?

Apple Books exposes 31 tools: list_all_collections, get_collection_books, describe_collection, search_collections_by_title, create_collection, and 26 more. Their descriptions and schemas cost roughly 3,548 tokens of context every time the server is loaded.

### What licence is the Apple Books MCP server under?

Apple Books declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- Repository: https://github.com/vgnshiyer/apple-books-mcp
- Website: https://vgnshiyer.me/AppleBooksMcp
- Changelog RSS feed: https://verifymcp.io/servers/vgnshiyer-apple-books-mcp/apple-books-mcp-2.xml
- Changelog JSON feed: https://verifymcp.io/servers/vgnshiyer-apple-books-mcp/apple-books-mcp-2.json
- HTML version of this page: https://verifymcp.io/servers/vgnshiyer-apple-books-mcp/apple-books-mcp-2
