Calibre MCP Server

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.

Category
Visit Server

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_search gibt eine Liste von Treffern (FulltextHit) mit book_id, title, isbn (falls vorhanden) und einem kurzen Snippet aus Kommentaren/Titel zurück.
  • get_excerpt_by_isbn findet das Buch zu test_isbn über die identifiers-Tabelle und gibt einen einfachen Excerpt zurück (aktuell aus comments oder – 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 books und identifiers
  • 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 von InterfaceAction)
    • 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_PATH automatisch auf die aktuell geöffnete Bibliothek (self.gui.current_db.library_path)

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

  1. Calibre öffnen
  2. Einstellungen → Plugins → "Plugin aus Datei laden"
  3. calibre-mcp-plugin.zip auswählen
  4. 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), setzt CALIBRE_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:

  1. Läuft bei push auf Tags, die mit v beginnen (z. B. v0.1.0).
  2. Checkt das Repo aus.
  3. Installiert dein Paket im Editable-Mode.
  4. Führt einen kleinen Smoke-Test aus (compileall).
  5. Baut dist/calibre-mcp-plugin.zip aus dem Ordner calibre_plugin.
  6. 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

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.

Official
Featured
TypeScript
Audiense Insights MCP Server

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.

Official
Featured
Local
TypeScript
Magic Component Platform (MCP)

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.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
Kagi MCP Server

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.

Official
Featured
Python
graphlit-mcp-server

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.

Official
Featured
TypeScript
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

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.

Official
Featured
E2B

E2B

Using MCP to run code via e2b.

Official
Featured