Calibre MCP Server
Provides AI agents with research capabilities for local Calibre e-book libraries, including fulltext search across titles, ISBNs, and comments, plus structured excerpt retrieval from books.
README
# Calibre MCP Server
Ein experimenteller [Model Context Protocol (MCP)](https://github.com/modelcontextprotocol) Server, der auf eine lokale [Calibre](https://calibre-ebook.com/) Bibliothek zugreift. Ziel ist es, KI-Agenten (z. B. ChatGPT, Copilot, Claude Desktop) ein Research-API auf deine E-Book-Sammlung zu geben – inklusive Fulltext-Suche und strukturierten Excerpts.
Zusätzlich gibt es ein Calibre-GUI-Plugin, das den MCP-Server direkt aus Calibre heraus startet und stoppt.
---
## Features (aktueller Stand)
- MCP-Server auf Basis von `fastmcp`
- Tool `calibre_fulltext_search`
- Tool `calibre_get_excerpt`
- Zugriff auf Calibre-`metadata.db` via SQLite (read-only)
- Volltext-ähnliche Suche über Titel, ISBN und Kommentare (`books` + `comments`)
- Auflösen von Büchern über ISBN (inkl. `identifiers`-Tabelle)
- Domänenschicht `LibraryResearchService` als zentrale API
- Calibre-GUI-Plugin, das den MCP-Server als Subprozess startet/stoppt
- Zwei kleine Testskripte zum manuellen Testen gegen eine echte Bibliothek
---
## Repository-Struktur
Wichtige Verzeichnisse/Dateien:
- `pyproject.toml` – Projekt- und Dependency-Definitionen
- `src/calibre_mcp_server/` – MCP-Server und Domänencode
- `core/models.py` – einfache Domain-Modelle (`FulltextHit`, `Excerpt` …)
- `core/service.py` – `LibraryResearchService`, zentrale Research-API
- `infra/metadata_sqlite.py` – Zugriff auf `metadata.db` über SQLite
- `tools/ft_search_tool.py` – MCP-Tool `calibre_fulltext_search`
- `tools/excerpt_tool.py` – MCP-Tool `calibre_get_excerpt`
- `main.py` – Einstiegspunkt für den MCP-Server (`python -m calibre_mcp_server.main`)
- `calibre_plugin/` – Calibre-GUI-Plugin
- `__init__.py` – Plugin-Metadaten für Calibre
- `action.py` – GUI-Action, startet/stoppt den MCP-Server
- `tests/` – manuelle Testskripte
- `manual_test_service.py` – einfacher End-to-End-Test für den Service
- `inspect_metadata_isbn.py` – Debug-Script, das zeigt, wie eine ISBN in `metadata.db` gespeichert ist
---
## Voraussetzungen
- Python 3.10+ (getestet mit 3.12)
- Eine lokale Calibre-Bibliothek
- z. B. `X:\E-Books` mit `metadata.db` im Root
- Entwicklungsabhängigkeiten (werden über `pip` installiert):
- `fastmcp`
- `pydantic`
- plus alles, was in `pyproject.toml` steht
---
## Installation (Development Setup)
```bash
# Repository klonen
git clone https://github.com/Miguel0888/mcp-server.git
cd mcp-server
# Optional: virtuelles Environment anlegen
python -m venv .venv
# Windows:
.venv\Scripts\activate
# Linux/macOS:
# source .venv/bin/activate
# Paket im Editable-Mode installieren (inkl. Dependencies)
python -m pip install -e .
Danach ist das Paket calibre_mcp_server im aktiven Python-Interpreter importierbar.
MCP-Server manuell starten
Voraussetzung: Environment-Variable CALIBRE_LIBRARY_PATH muss auf den Root deiner Calibre-Bibliothek zeigen (dort, wo metadata.db liegt).
Beispiel (Windows):
set CALIBRE_LIBRARY_PATH=X:\E-Books
python -m calibre_mcp_server.main
Du solltest die FastMCP-Banner-Ausgabe sehen und der Server wartet dann auf MCP-Client-Verbindungen über STDIO.
In einer MCP-fähigen IDE / einem MCP-Client (z. B. ChatGPT, Claude Desktop, Copilot Agent Mode) kann dieser Command als MCP-Server registriert werden und die Tools calibre_fulltext_search und calibre_get_excerpt verwenden.
Manuelle Tests gegen eine echte Bibliothek
1. tests/manual_test_service.py
Dieses Script testet die Domänenschicht LibraryResearchService direkt – ohne MCP und ohne Calibre-Plugin.
Anpassen in tests/manual_test_service.py:
library_path = r"X:\E-Books" # Pfad zu deiner Calibre-Bibliothek
# Eine Query, von der du erwartest, dass sie Treffer liefert
query = "der"
# Eine echte ISBN aus deiner Bibliothek
test_isbn = "9783446429338"
Ausführen:
python tests\manual_test_service.py
Erwartetes Verhalten:
fulltext_searchgibt eine Liste von Treffern (FulltextHit) mitbook_id,title,isbn(falls vorhanden) und einem kurzen Snippet aus Kommentaren/Titel zurück.get_excerpt_by_isbnfindet das Buch zutest_isbnüber dieidentifiers-Tabelle und gibt einen einfachen Excerpt zurück (aktuell auscommentsoder – wenn leer – dem Titel).
2. tests/inspect_metadata_isbn.py
Dieses Script hilft beim Debuggen von ISBN-Mapping und zeigt, wie Calibre die Daten in metadata.db speichert.
Konfiguration im Script:
library_root = r"X:\E-Books"
# Default-ISBN (kann per CLI-Argument überschrieben werden)
raw_isbn = "9783446429338"
Ausführen ohne Argument (nutzt die Default-ISBN):
python tests\inspect_metadata_isbn.py
Oder mit einer anderen ISBN:
python tests\inspect_metadata_isbn.py 9781484265611
Das Script zeigt u. a.:
- Schema von
booksundidentifiers - alle Zeilen in
books.isbn, die zur normalisierten ISBN passen - alle Zeilen in
identifiers.val, die passen (inkl.book-ID und Typ) - zugehörige Bücher inkl. Kommentaren (falls vorhanden)
Calibre-GUI-Plugin
Im Ordner calibre_plugin/ liegt ein einfaches GUI-Plugin, mit dem du den MCP-Server direkt aus Calibre heraus starten und stoppen kannst.
Aufbau
-
calibre_plugin/__init__.py- beschreibt das Plugin für Calibre (Name, Version, min. Calibre-Version, etc.)
- verweist mit
actual_plugin = "action:McpInterfaceAction"auf die Implementierung
-
calibre_plugin/action.py- definiert
McpInterfaceAction(Unterklasse vonInterfaceAction) - fügt eine Toolbar-/Menü-Aktion "MCP Server" hinzu
- beim Klick: Start/Stopp eines Subprozesses mit
python -m calibre_mcp_server.main - setzt
CALIBRE_LIBRARY_PATHautomatisch auf die aktuell geöffnete Bibliothek (self.gui.current_db.library_path)
- definiert
Manuell ein Plugin-ZIP bauen
Im Projekt-Root:
mkdir -p dist
cd calibre_plugin
zip -r ..\dist\calibre-mcp-plugin.zip .
Die ZIP-Datei dist/calibre-mcp-plugin.zip enthält dann direkt __init__.py und action.py (genau so erwartet Calibre das).
Plugin in Calibre installieren
- Calibre öffnen
- Einstellungen → Plugins → "Plugin aus Datei laden"
calibre-mcp-plugin.zipauswählen- Calibre neu starten
Danach sollte in der Toolbar oder im Menü ein Eintrag "MCP Server" vorhanden sein.
- Erster Klick → startet den MCP-Server (externes
python), setztCALIBRE_LIBRARY_PATH - Zweiter Klick → beendet den Serverprozess
Wichtig: In der Python-Umgebung, die Calibre für python nutzt, muss das Paket calibre_mcp_server installiert sein, z. B.:
python -m pip install -e .
(ggf. mit dem Python, das in PATH liegt oder explizit in action.py konfiguriert wird.)
GitHub Actions: automatischer Build & Release des Plugins
Lege die Datei .github/workflows/release.yml an mit:
name: Release Calibre MCP Server
on:
push:
tags:
- 'v*'
jobs:
build-and-release:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'
- name: Install package (editable)
run: |
python -m pip install --upgrade pip
python -m pip install -e .
- name: Smoke test (compile sources)
run: |
python -m compileall src
- name: Build Calibre plugin zip
run: |
mkdir -p dist
cd calibre_plugin
zip -r ../dist/calibre-mcp-plugin.zip .
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
files: dist/calibre-mcp-plugin.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Was der Workflow tut:
- Läuft bei
pushauf Tags, die mitvbeginnen (z. B.v0.1.0). - Checkt das Repo aus.
- Installiert dein Paket im Editable-Mode.
- Führt einen kleinen Smoke-Test aus (
compileall). - Baut
dist/calibre-mcp-plugin.zipaus dem Ordnercalibre_plugin. - Erzeugt (falls nötig) einen GitHub Release zum Tag und hängt das ZIP als Asset an.
Release auslösen
Im Repo-Root:
# Version bump + commit (optional)
git commit -am "Bump version to v0.1.0"
# Tag erstellen
git tag v0.1.0
# Tag pushen
git push origin v0.1.0
Danach solltest du im GitHub-UI unter „Actions“ den Workflow sehen und unter „Releases“ dann den neuen Release mit angehängter calibre-mcp-plugin.zip.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
E2B
Using MCP to run code via e2b.