Atlas / MCP servers / sandraschi / Calibre

CalibreBLOCK

mcp/sandraschi/calibre-4

Calibre library automation via FastMCP — metadata, shelves, RAG-friendly export. Companion to Calibre, not a replacement. For Cursor / Claude Desktop.

Verdict
BLOCK
Grade
F
Trust score
38 /100
Exposed tools
51 48r · 3w · 0d
Transport
sse · stdio · streamable-http
License
MIT
Stars
46
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

📖 Installation Guide — download the .exe from Releases, double-click, done

FastMCP 3.2 MCP server for Calibre e-book library management — AI-assisted search, RAG, and agentic workflows for Sandra's 1000+ book library.

Quick Start

Download *`Calibre MCP__x64-setup.exe` from [Releases](https://github.com/sandraschi/calibre-mcp/releases/latest) → double-click → launch Calibre MCP**. Install guide.

Developers from source:

git clone https://github.com/sandraschi/calibre-mcp
cd calibre-mcp
just sync
just start-webapp

// claudedesktopconfig.json { "mcpServers": { "calibre-mcp": { "command": "uv", "args": ["run", "calibre-mcp"],

Read from source at commit f57903aa666aOBSERVED · 2026-10-08
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add calibre-webapp-frontend --env CALIBRE_ADMIN_PASSWORD=${CALIBRE_ADMIN_PASSWORD} --env CALIBRE_PASSWORD=${CALIBRE_PASSWORD} --env LLM_API_KEY=${LLM_API_KEY} --env OPENAI_API_KEY=${OPENAI_API_KEY} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "calibre-webapp-frontend": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "CALIBRE_ADMIN_PASSWORD": "${CALIBRE_ADMIN_PASSWORD}",
        "CALIBRE_PASSWORD": "${CALIBRE_PASSWORD}",
        "LLM_API_KEY": "${LLM_API_KEY}",
        "OPENAI_API_KEY": "${OPENAI_API_KEY}"
      }
    }
  }
}
03

Exposed tools (51)

48 read · 3 write · 0 destructive.

ToolRiskDescription
agentic_calibre_workflowwriteExecute agentic Calibre workflows using FastMCP 2.14.3 sampling with tools.
agentic_library_workflowread
analyze_libraryread
analyze_library_healthread
calibre_metadata_export_jsonread
calibre_metadata_index_buildread
calibre_metadata_searchread
calibre_ragread
conversational_calibre_assistantreadConversational Calibre assistant with natural language responses.
find_duplicate_booksread
get_series_analysisread
get_tag_statisticsread
help_toolread
intelligent_library_processingreadIntelligent batch book processing using FastMCP 2.14.3 sampling with tools.
library_discoveryread
manage_ai_operationsread
manage_analysisread
manage_booksread
manage_bulk_operationsread
manage_commentsread
manage_content_syncwrite
manage_descriptionsread
manage_extended_metadataread
manage_filesread
manage_importwrite
manage_librariesread
manage_library_operationsread
manage_metadataread
manage_organizationread
manage_publishersread
manage_seriesread
manage_smart_collectionsread
manage_systemread
manage_tagsread
manage_timesread
manage_user_commentsread
manage_usersread
manage_viewerread
media_critical_receptionread
media_deep_researchread
media_research_bookread
media_synopsisread
rag_index_buildread
rag_retrieveread
reading_statisticsread
search_fulltextread
show_api_docsread
show_book_prefab_cardread
show_libraries_prefab_cardread
test_toolreadA simple test tool
unread_priority_listread
04

Trust audit

BLOCKgrade F · trust 38/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryFAIL
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (5 observation(s))
Network
declared (11 observation(s))
Shell
declared (11 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHHard-coded secrets · inv.env_committed · CWE-798, CWE-321
.env
.env
Why it matters. a real .env in the package
Fix. ship .env.example with placeholders only
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
scripts/fix_batch.py:160
content = re.sub(r'pickle\.load\(f\)  # noqa: S301', 'pickle.load(f)  # noqa: S301', content)  # already done
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
scripts/fix_batch.py:161
content = re.sub(r'(?<!  # noqa: S301)pickle\.load\(f\)', 'pickle.load(f)  # noqa: S301', content)
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
scripts/fix_batch.py:164
content = re.sub(r'pickle\.load\(f\)(?!.*noqa)', 'pickle.load(f)  # noqa: S301', content)
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
scripts/fix_remaining.ps1:48
Add-Noqa "$src\calibre_mcp\config_discovery.py" '(?m)pickle\.load\(f\)' 'pickle.load(f)  # noqa: S301'
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
scripts/lint_cleanup.ps1:103
$content = $content -replace 'lib_infos = pickle\.load\(f\)', 'lib_infos = pickle.load(f)  # noqa: S301'
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
scripts/fix_remaining.ps1:51
Add-Noqa "$src\calibre_mcp\tools\base_tool.py" 'exec\(exec_code, exec_globals, local_vars\)' 'exec(exec_code, exec_globals, local_vars)  # noqa: S102'
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
scripts/lint_cleanup.ps1:119
$content = $content -replace 'exec\(exec_code, exec_globals, local_vars\)', 'exec(exec_code, exec_globals, local_vars)  # noqa: S102'
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHNetwork egress · net.env_exfil · CWE-200, CWE-319
scripts/cua-smoke.py:325
os.environ.copy() ... urllib.request
Why it matters. reads secrets in the same file that sends data out
MEDIUMInventory / provenance · inv.binary · CWE-1104
calibre_mcp_integration.zip
calibre_mcp_integration.zip
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
extension.wasm
extension.wasm
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
lancedb_test_calibre/calibre_media.lance/_transactions/0-10f849fb-facd-4086-93a1-555793a5a107.txn
0-10f849fb-facd-4086-93a1-555793a5a107.txn
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
lancedb_test_calibre/calibre_media.lance/_transactions/1-ade67a8f-9cf1-4ad9-a371-7a64919e44a9.txn
1-ade67a8f-9cf1-4ad9-a371-7a64919e44a9.txn
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
lancedb_test_calibre/calibre_media.lance/_versions/18446744073709551613.manifest
18446744073709551613.manifest
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.symlink · CWE-1104
scripts/backup-repo.ps1
scripts/backup-repo.ps1
Why it matters. link not followed
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
mcpb/src/calibre_mcp/tools/__init__.py:103
module = importlib.import_module(f"calibre_mcp.tools.{name}")
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
mcpb/verify_pack.py:48
mod = importlib.import_module(entry_module_or_file)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
scripts/pre_commit_check.py:53
__import__(module_name)
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
src/calibre_mcp/tools/__init__.py:103
module = importlib.import_module(f"calibre_mcp.tools.{name}")
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
mcpb/src/calibre_mcp/tools/import_export/export_library.py:144
def _update_progress(self, callback_url: str | None, current: int, total: int, message: str) -> None:
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
mcpb/src/calibre_mcp/tools/import_export/export_library.py:146
if not callback_url:
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
mcpb/src/calibre_mcp/tools/import_export/export_library.py:155
callback_url,
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
src/calibre_mcp/tools/import_export/export_library.py:146
def _update_progress(self, callback_url: str | None, current: int, total: int, message: str) -> None:
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
src/calibre_mcp/tools/import_export/export_library.py:148
if not callback_url:
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
mcpb/src/calibre_mcp/.markdownlint.json:1
{

Gates applied: no_behavioural_pass.

Audited 2026-10-08 · audit v0.4.1 · source sha f57903aa666afull audit observations/trust-audit/mcp-server/sandraschi__calibre-4.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-08f57903aa666aBLOCKF38first audit
06

Questions

What is the Calibre MCP server?

Calibre library automation via FastMCP — metadata, shelves, RAG-friendly export. Companion to Calibre, not a replacement. For Cursor / Claude Desktop.

What tools does Calibre expose?

51 in total: 48 read-only, 3 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is Calibre safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (38/100) and found 9 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does Calibre need?

It reads CALIBRE_ADMIN_PASSWORD, CALIBRE_PASSWORD, LLM_API_KEY, OPENAI_API_KEY and SECRET_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does Calibre run?

It speaks sse, stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as calibre-webapp-frontend at 1.0.0.

How current is this page?

The grade is for one exact copy of the source (f57903aa666a), read on 2026-10-08. The repository is watched and re-audited when it changes.

Advertisement