{
  "slug": "io-github-caelum29-calibre-mcp",
  "name": "calibre-mcp",
  "auditedAt": "2026-10-24T01:04:10Z",
  "version": "0.9.0",
  "ecosystem": "npm",
  "package": "calibre-mcp",
  "disclaimer": "Automated smoke test, not a security guarantee.",
  "complete": true,
  "checks": {
    "versionPin": {
      "status": "pass",
      "detail": "Pinned npm calibre-mcp@0.9.0",
      "version": "0.9.0"
    },
    "vulnerabilities": {
      "status": "warn",
      "detail": "Medium advisories were returned. No critical or high advisories were returned.",
      "critical": 0,
      "high": 0,
      "medium": 8,
      "low": 0,
      "packagesScanned": 80
    },
    "license": {
      "status": "pass",
      "detail": "MIT",
      "spdx": "MIT"
    },
    "installScripts": {
      "status": "warn",
      "detail": "Install-time scripts: prepare",
      "scripts": [
        "prepare"
      ]
    },
    "secrets": {
      "status": "pass",
      "detail": "No credential patterns in the published artifact.",
      "findings": []
    },
    "packageSize": {
      "status": "pass",
      "detail": "356307 bytes",
      "bytes": 356307
    },
    "activity": {
      "status": "pass",
      "detail": "Active 0 days ago.",
      "ageDays": 0
    },
    "sandbox": {
      "status": "pass",
      "detail": "MCP handshake completed. 14 tools listed.",
      "starts": true,
      "handshake": true,
      "timeToReadyMs": 621,
      "tools": [
        {
          "name": "calibre_list_libraries",
          "description": "List the Calibre libraries available on the Content Server and which one is the default. Call this first to discover valid library names."
        },
        {
          "name": "calibre_search",
          "description": "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 \u2014 for definitional or t"
        },
        {
          "name": "calibre_get_book",
          "description": "Get full metadata (authors, ISBN, formats, comments, cover) for one book by its id or uuid (id and bookId are interchangeable \u2014 pass the bookId from a search result). Set include_cover=true only when the cover image itself must be inspected"
        },
        {
          "name": "calibre_get_content",
          "description": "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"
        },
        {
          "name": "calibre_get_figures",
          "description": "List a book's figures \u2014 images the text references, identified by caption (Figure 1-2 / \u0420\u0438\u0441. 3.1) \u2014 with page + caption per figure, then fetch chosen ones as images via indexes (\u22643 per call). Captions let you pick figures before spending im"
        },
        {
          "name": "calibre_list_categories",
          "description": "Browse library categories (Authors, Tags, Series, Languages, Publisher). No field \u2192 list the categories; with a field \u2192 its values + counts, filterable via a valueFilter regex (case-insensitive by default; a leading inline flag like `(?i)` "
        },
        {
          "name": "calibre_semantic_search",
          "description": "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 \u2014 use when the user asks for a diagram/chart/schema; hit"
        },
        {
          "name": "calibre_build_index",
          "description": "Build the semantic index for specific books (required: bookId, ids, or query \u2014 full-library indexing is deferred). A query selects ALL matching books (no 100-book cap); large selections run long and may outlive the client timeout \u2014 re-run t"
        },
        {
          "name": "calibre_find_duplicates",
          "description": "Find probable duplicate books. mode=identical (exact title+authors) or similar (fuzzy) group the library (or ids/query/filter subset \u2014 filter takes a bundle name) with a merge-safety score; mode=compare diffs 2+ ids field-by-field. Read-onl"
        },
        {
          "name": "calibre_quality_report",
          "description": "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/filter (a bundle name) or specific checks. Read-only."
        },
        {
          "name": "calibre_recover_metadata",
          "description": "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 \u2014 returns a changes object for calibre_updat"
        },
        {
          "name": "calibre_board_data",
          "description": "Internal endpoint for the in-chat cover-board widget. Returns the cached payload of a recent search. Do not call as the model \u2014 search results already contain everything this returns."
        },
        {
          "name": "calibre_open_book",
          "description": "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 \u2014 use calibre_get_book to show a book instead."
        },
        {
          "name": "calibre_ping",
          "description": "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."
        }
      ],
      "toolCount": 14,
      "resourceCount": 4,
      "promptCount": null,
      "stderrExcerpt": "e_book\",\"calibre_merge_books\",\"calibre_manage_bundles\",\"calibre_board_data\",\"calibre_open_book\",\"calibre_ping\"],\"writeEnabled\":false,\"serverUrl\":\"http://localhost:8080\"}\n[calibre-mcp] INFO calibre-mcp listening on stdio\n(node:23) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)\n[calibre-mcp] ERROR content-server request failed {\"url\":\"http://localhost:8080/ajax/library-info\",\"aborted\":false,\"cause\":\"fetch failed\"}\n[calibre-mcp] WARN Calibre Content Server not reachable at http://localhost:8080 \u2014 start it in Calibre (Connect/share \u2192 Start Content server) or set CALIBRE_MCP_SERVER_URL\n[calibre-mcp] INFO extractor backends {\"pdf\":null,\"epub\":null,\"detectedAt\":\"2026-10-24T01:05:23.021Z\"}\n",
      "requiresCredentials": false,
      "network": "disabled",
      "networkAttemptedWhileOffline": true,
      "outboundHosts": []
    }
  },
  "tier": "tested",
  "tierReason": "Sandbox handshake completed, with warnings: medium known vulnerabilities; install scripts present.",
  "logExcerpt": "e_book\",\"calibre_merge_books\",\"calibre_manage_bundles\",\"calibre_board_data\",\"calibre_open_book\",\"calibre_ping\"],\"writeEnabled\":false,\"serverUrl\":\"http://localhost:8080\"}\n[calibre-mcp] INFO calibre-mcp listening on stdio\n(node:23) ExperimentalWarning: SQLite is an experimental feature and might change at any time\n(Use `node --trace-warnings ...` to show where the warning was created)\n[calibre-mcp] ERROR content-server request failed {\"url\":\"http://localhost:8080/ajax/library-info\",\"aborted\":false,\"cause\":\"fetch failed\"}\n[calibre-mcp] WARN Calibre Content Server not reachable at http://localhost:8080 \u2014 start it in Calibre (Connect/share \u2192 Start Content server) or set CALIBRE_MCP_SERVER_URL\n[calibre-mcp] INFO extractor backends {\"pdf\":null,\"epub\":null,\"detectedAt\":\"2026-10-24T01:05:23.021Z\"}\n"
}
