# io.github.caelum29/calibre-mcp (npm · calibre-mcp)

Calibre ebook library server: search, read content, curate metadata, semantic search, gated writes.

- Trust score: 72/100 (medium)
- Change this week: +66
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- npm · `calibre-mcp`: 72/100 (this document), [markdown](https://verifymcp.io/servers/caelum29-calibre-mcp/calibre-mcp.md), [page](https://verifymcp.io/servers/caelum29-calibre-mcp/calibre-mcp)

## Channel facts

- Registry: `npm`
- Package: `calibre-mcp`
- Version: `0.7.2`
- Transport: `stdio`

## 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-08-03.

- **Supply Chain Security**: 79/100
  - No malware found by supply-chain analysis.
  - CVE check failed: a known high-severity CVE affects adm-zip 0.5.18, reached via @huggingface/transformers > onnxruntime-node > adm-zip. A fixed version is available.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (180 of 184), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to caelum29/calibre-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 6 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 82/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 1736 tokens (~96/item across 18 items; 14 tools + 4 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 74/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 8% of tool parameters carry a description.
  - Structured output schemas are declared (86% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.
  - Supports UI / widget rendering.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### Claude

```bash
claude mcp add caelum29-calibre-mcp -- npx -y calibre-mcp
```

### Codex

```bash
codex mcp add caelum29-calibre-mcp -- npx -y calibre-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "caelum29-calibre-mcp": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "calibre-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add caelum29-calibre-mcp --command npx --arg -y --arg calibre-mcp
```

### Hermes

```yaml
mcp_servers:
  caelum29-calibre-mcp:
    command: "npx"
    args: ["-y", "calibre-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "caelum29-calibre-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "calibre-mcp"
      ]
    }
  }
}
```

## 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-08-02 (score 72, +38)

- [security regression] Known CVEs: unverified → fail
- [security improvement] Provenance: unverified → pass
- [security improvement] Install scripts: unverified → pass
- [security improvement] Malware scan: unverified → pass
- [security] The attested source repository moved: caelum29/calibre-mcp
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] License: unverified → pass
- [functional] Licence: MIT

### 2026-08-01 (score 34, +29)

- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] Schema quality: unverified → 100
- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Capabilities: pass

### 2026-07-31 (score 5, −33)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 38, −31)

- [security regression] Provenance: pass → unverified
- [security regression] Known CVEs: fail → unverified
- [security regression] Install scripts: pass → unverified
- [security improvement] GHSA-f88m-g3jw-g9cj no longer affects this package
- [security improvement] CVE-2026-39244 no longer affects this package
- [security improvement] GHSA-frvp-7c67-39w9 no longer affects this package
- [security] The attested source repository moved: caelum29/calibre-mcp
- [functional regression] Maintenance: pass → unverified
- [functional regression] License: pass → unverified
- [functional regression] Dependency health: partial → unverified
- [functional] Licence: MIT

### 2026-07-29 (score 69, +38)

- [security regression] GHSA-frvp-7c67-39w9 affects this package: high
- [security regression] CVE-2026-39244 affects this package: high
- [security regression] GHSA-f88m-g3jw-g9cj affects this package: high
- [security regression] Known CVEs: unverified → fail
- [security improvement] Provenance: unverified → pass
- [security improvement] Install scripts: unverified → pass
- [security] The attested source repository moved: caelum29/calibre-mcp
- [functional improvement] License: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] Schema quality: unverified → good
- [functional] Licence: MIT

### 2026-07-28 (score 31, +25)

- [functional improvement] Schema quality: unverified → 100
- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Tool coverage: 86
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: pass
- [functional] First check of Tool coverage: 8
- [functional] First check of Schema quality: unverified
- [functional] Package version: 0.7.1 → 0.7.2

### 2026-07-27 (score 6)

First indexed and scored.

## MCP tools (14)

### `calibre_list_libraries` (~36 tokens)

List Calibre libraries

List the Calibre libraries available on the Content Server and which one is the default. Call this first to discover valid library names.

Output parameters:

- `default` (string)
- `libraries` (array)

### `calibre_search` (~183 tokens)

Search books

Find books by exact title, author, ISBN, tag, or Calibre query syntax (mode=meta), or by full text (mode=fts). scope=book returns short keyword snippets from inside one book; first hits often land in TOC/front matter — for definitional or topic questions within a book prefer calibre_semantic_search scope=book (ranked passages with char offsets). Use calibre_semantic_search for meaning/topic queries. For "how many" questions use countOnly=true (returns only the count).

Input parameters:

- `bookId`
- `countOnly` (boolean)
- `cursor` (string)
- `library` (string)
- `limit` (integer)
- `mode` (string)
- `query` (string, required)
- `scope` (string)
- `sort` (string)
- `sortOrder` (string)

Output parameters:

- `bookId` (number)
- `bookIds` (array)
- `count` (number)
- `mode` (string)
- `nextCursor` (string)
- `offset` (number)
- `query` (string)
- `scope` (string)
- `total` (number)

### `calibre_get_book` (~88 tokens)

Get book metadata

Get full metadata (authors, ISBN, formats, comments, cover) for one book by its id or uuid (id and bookId are interchangeable — pass the bookId from a search result). Set include_cover=true only when the cover image itself must be inspected.

Input parameters:

- `bookId`
- `id`
- `include_cover` (boolean)
- `library` (string)

Output parameters:

- `book` (object)
- `libraryId` (string)
- `serverUrl` (string)

### `calibre_get_content` (~191 tokens)

Read book text

Extract a book's text as a capped, fenced excerpt; pass the returned nextCursor token verbatim to walk the whole book, or jump to a char position with offset (e.g. a search passage's charStart). Set structure=true for a chapter map with per-chapter cursors. To find text inside a book, use calibre_search scope=book.

Input parameters:

- `bookId`
- `cursor` (string): Opaque continuation token from a previous response (nextCursor or a chapter cursor). Pass it verbatim — do not construct one.
- `format` (string)
- `id`
- `library` (string)
- `maxChars` (integer)
- `offset` (integer): Char position to start reading from — e.g. a search passage's charStart. Mutually exclusive with cursor.
- `sentenceAware` (boolean)
- `structure` (boolean)

Output parameters:

- `backend` (string)
- `chapters` (array)
- `count` (number)
- `detector` (string)
- `format` (string)
- `hasMore` (boolean)
- `hasToc` (boolean)
- `nextCursor` (string)
- `offset` (number)
- `text` (string)
- `totalChars` (number)

### `calibre_get_figures` (~245 tokens)

Get book figures

List a book's figures — images the text references, identified by caption (Figure 1-2 / Рис. 3.1) — with page + caption per figure, then fetch chosen ones as images via indexes (≤3 per call). Captions let you pick figures before spending image tokens. In MCP Apps hosts the fetched figures also render for the user in an in-chat viewer, so you can point at them by figure number — but describe only what the pixels you received actually show.

Input parameters:

- `bookId`
- `detail` (string): Image resolution: standard ≤1024px longest side (default), high ≤1568px.
- `format` (string): Source format override (epub or pdf). Default: epub if present, else pdf.
- `id`
- `include_uncaptioned` (boolean): Also list/fetch images with no caption (covers, decorations, equation images).
- `indexes` (array): Figure indexes from a previous list call — returns those figures as images (≤3 per call). Omit to list. Indexes are per-format; re-list after changing format.
- `library` (string)

### `calibre_list_categories` (~101 tokens)

List categories

Browse library categories (Authors, Tags, Series, Languages, Publisher). No field → list the categories; with a field → its values + counts, filterable via a valueFilter regex (case-insensitive by default; a leading inline flag like `(?i)` is accepted).

Input parameters:

- `cursor` (string)
- `field` (string)
- `library` (string)
- `limit` (integer)
- `valueFilter` (string)

Output parameters:

- `count` (number)
- `field` (string)
- `mode` (string)
- `nextCursor` (string)
- `offset` (number)
- `total` (number)
- `values` (array)

### `calibre_semantic_search` (~168 tokens)

Semantic search

Meaning-based search over the local index. scope=library ranks books; scope=book (needs bookId) ranks passages within one book. target=figures searches figure captions instead of text — use when the user asks for a diagram/chart/schema; hits point at calibre_get_figures for the pixels. mode=hybrid (default) fuses semantic + keyword matches; mode=vector is semantic-only; mode=keyword is exact keyword/FTS (no model at query time). All modes need an index built by calibre_build_index.

Input parameters:

- `bookId`
- `library` (string)
- `mode` (string)
- `query` (string, required)
- `scope` (string)
- `target` (string)
- `topK` (integer)

Output parameters:

- `bookId` (number)
- `bookIds` (array)
- `count` (number)
- `figures` (array)
- `lowConfidence` (boolean)
- `maxRerank` (number)
- `maxScore` (number)
- `mode` (string)
- `note` (string)
- `passages` (array)
- `reranked` (boolean)
- `results` (array)
- `scope` (string)
- `semanticAvailable` (boolean)
- `semanticReason` (string)
- `target` (string)

### `calibre_build_index` (~180 tokens)

Build semantic index

Build the semantic index for specific books (required: bookId, ids, or query — full-library indexing is deferred). Extracts, chunks, and embeds each book. Set keywordOnly=true (or when the embedding model is absent, it happens automatically) to build a keyword-only index that powers mode:"keyword" search with zero ML dependencies. Re-run after adding books; use force to re-index unchanged ones. Set prune=true to also drop index entries for books that no longer exist in the library (removals/merges leave searchable orphans behind).

Input parameters:

- `bookId`
- `enableFts` (boolean)
- `force` (boolean)
- `ids` (array)
- `keywordOnly` (boolean)
- `library` (string)
- `prune` (boolean)
- `query` (string)

Output parameters:

- `bookDetails` (array)
- `booksIndexed` (number)
- `booksRequested` (number)
- `booksSkipped` (number)
- `chunks` (number)
- `elapsedMs` (number)
- `failures` (array)
- `figures` (number)
- `keywordOnly` (boolean)
- `prunedBooks` (number)
- `prunedChunks` (number)
- `prunedFigures` (number)
- `semanticAvailable` (boolean)
- `semanticReason` (string)

### `calibre_find_duplicates` (~107 tokens)

Find duplicates

Find probable duplicate books. mode=identical (exact title+authors) or similar (fuzzy) group the library (or ids/query subset) with a merge-safety score; mode=compare diffs 2+ ids field-by-field. Read-only — never merges.

Input parameters:

- `cursor` (string)
- `ids` (array)
- `library` (string)
- `limit` (integer)
- `mode` (string)
- `query` (string)

Output parameters:

- `booksScanned` (number)
- `capped` (boolean)
- `count` (number)
- `groupCount` (number)
- `keep` (number)
- `languagesDiffer` (boolean)
- `mergeSafety` (number)
- `mode` (string)
- `nextCursor` (string)
- `offset` (number)

### `calibre_quality_report` (~101 tokens)

Quality report

Scan books for metadata problems: missing fields, raw-filename titles, invalid ISBNs, author-sort mismatches, series gaps. Defaults to the whole library; narrow with ids/query or specific checks. Read-only.

Input parameters:

- `checks` (array)
- `cursor` (string)
- `ids` (array)
- `library` (string)
- `limit` (integer)
- `query` (string)
- `readability` (boolean)

Output parameters:

- `booksScanned` (number)
- `byCheck` (object)
- `capped` (boolean)
- `count` (number)
- `nextCursor` (string)
- `offset` (number)
- `total` (number)

### `calibre_recover_metadata` (~88 tokens)

Recover book metadata

Propose real metadata for a book with a missing/raw-filename title via online provider lookup (ISBN from its identifiers or text, else title/author) on Open Library and Google Books. Preview only — returns a changes object for calibre_update_book; never writes.

Input parameters:

- `bookId`
- `id`
- `library` (string)
- `sources` (array)

Output parameters:

- `bookId` (number)
- `changes` (object)
- `confidence` (number)
- `fieldCount` (number)
- `lookupKey` (string)
- `source` (string)

### `calibre_board_data` (~57 tokens)

Cover board data (widget-internal)

Internal endpoint for the in-chat cover-board widget. Returns the cached payload of a recent search. Do not call as the model — search results already contain everything this returns.

Input parameters:

- `query` (string)
- `tool` (string)

Output parameters:

- `books` (array)
- `kind` (string)
- `libraryId` (string)
- `lowConfidence` (boolean)
- `query` (string)
- `serverUrl` (string)
- `tool` (string)
- `total` (number)

### `calibre_open_book` (~74 tokens)

Open book in local viewer (widget-internal)

Internal endpoint for the in-chat widgets' Open button. Launches a book in the local Calibre viewer via the calibre:// scheme. Do not call as the model — use calibre_get_book to show a book instead.

Input parameters:

- `format` (string)
- `id` (integer, required)
- `library` (string)

Output parameters:

- `format` (string)
- `opened` (boolean)
- `url` (string)

### `calibre_ping` (~49 tokens)

Calibre ping

Health check: confirms the MCP server can reach the running Calibre Content Server via calibredb, and reports semantic-search status (embedding model, dependency, index vector count). Returns library categories on success.

## Diagnostics

Captured diagnostic sections: Provenance, Vulnerabilities, Dependencies. The full working is on the page: https://verifymcp.io/servers/caelum29-calibre-mcp/calibre-mcp#diagnostics

## Score history

- 2026-08-03: 72
- 2026-08-02: 72
- 2026-08-01: 34
- 2026-07-31: 5
- 2026-07-30: 38
- 2026-07-29: 69
- 2026-07-28: 31
- 2026-07-27: 6

## Links

- npm package: https://www.npmjs.com/package/calibre-mcp
- Socket report: https://socket.dev/npm/package/calibre-mcp
- Repository: https://github.com/caelum29/calibre-mcp
- Changelog RSS feed: https://verifymcp.io/servers/caelum29-calibre-mcp/calibre-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/caelum29-calibre-mcp/calibre-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/caelum29-calibre-mcp/calibre-mcp
