Skip to main content
Glama
donghch
by donghch

EPUB Reader MCP-Server

License MCP Version Node.js Version

Ein Model Context Protocol (MCP) Server, der als „Kindle für KI-Agenten“ fungiert und EPUB-Dateiinhalte über die Tools-API von MCP bereitstellt.

Übersicht

Der EPUB Reader MCP-Server bietet KI-Agenten die Möglichkeit, EPUB-Dateien zu lesen und darin zu navigieren. Er implementiert das Model Context Protocol (MCP), um 13 Tools bereitzustellen, die das Öffnen von EPUB-Dateien, die Navigation durch Inhaltsverzeichnisse und Seiten, die Suche in Inhalten, das Überprüfen von Fußnoten und die Verwaltung von Lesesitzungen ermöglichen.

Funktionen

  • EPUB-Dateien öffnen: Validierung und Analyse von EPUB-Dateien, Erstellung von Lesesitzungen

  • Inhaltsnavigation: Vorwärts-/Rückwärtsblättern, Springen zu bestimmten Seiten oder Kapiteln

  • Inhalt entdecken: Anzeigen von Inhaltsverzeichnissen, Metadaten und Kapitelzusammenfassungen

  • Suchfunktion: Volltextsuche über Kapitel hinweg mit Kontext

  • Referenz-Tools: Auflösen von Fußnotenreferenzen, Abrufen der Leseposition

  • Sitzungsverwaltung: Auflisten offener Bücher, Schließen von Sitzungen, Verwalten von Ressourcen

Related MCP server: Readbook MCP Server

Voraussetzungen

  • Node.js 20+

  • npm oder ein kompatibler Paketmanager

  • EPUB-Dateien zum Lesen (.epub-Format)

Installation

Aus dem Quellcode

git clone https://github.com/your-username/mcp-epub-reader.git
cd mcp-epub-reader
npm install
npm run build

Verwendung

Starten des Servers

Der Server verwendet den stdio-Transport, was ihn ideal für die Integration mit MCP-Clients wie Claude Desktop macht.

stdio (Lokale Integration)

Zur Integration mit Claude Desktop oder anderen MCP-Clients:

node build/index.js

Der Server kommuniziert über stdin/stdout unter Verwendung des MCP JSON-RPC-Protokolls.

Konfiguration

Claude Desktop-Konfiguration

Fügen Sie den Server zu Ihrer Claude Desktop-Konfiguration hinzu (~/Library/Application Support/Claude/claude_desktop_config.json unter macOS):

{
  "mcpServers": {
    "epub-reader": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-epub-reader/build/index.js"],
      "env": {
        "LOG_LEVEL": "info"
      }
    }
  }
}

Umgebungsvariablen

Variable

Beschreibung

Erforderlich

Standard

LOG_LEVEL

Protokollierungsebene (error, warn, info, debug)

Nein

info

Tools-Referenz

Der Server bietet 13 Tools für die Interaktion mit EPUB-Dateien:

Tool

Beschreibung

Eingabeparameter

ebook/open

Öffnet eine EPUB-Datei und erstellt eine Lesesitzung

filePath: string, autoNavigate?: boolean

ebook/close

Schließt eine Lesesitzung und gibt Ressourcen frei

sessionId: string

ebook/list_open_books

Listet alle aktuell offenen EPUB-Sitzungen auf

(keine)

ebook/navigate_next

Geht zur nächsten Seite in der aktuellen Sitzung

sessionId: string

ebook/navigate_previous

Geht zur vorherigen Seite in der aktuellen Sitzung

sessionId: string

ebook/jump_to_page

Springt zu einer bestimmten Seitenzahl

sessionId: string, pageNumber: number

ebook/jump_to_chapter

Springt zu einem bestimmten Kapitel (nach Titel oder Index)

sessionId: string, chapter: string | number

ebook/get_position

Ruft die aktuelle Leseposition und den Fortschritt ab

sessionId: string

ebook/search

Durchsucht alle Kapitel nach Text

sessionId: string, query: string, contextWords?: number

ebook/get_toc

Ruft das hierarchische Inhaltsverzeichnis ab

sessionId: string

ebook/get_metadata

Ruft EPUB-Metadaten ab (Titel, Autor, Verlag, etc.)

sessionId: string

ebook/get_footnote

Löst eine Fußnotenreferenz anhand der ID auf

sessionId: string, footnoteId: string

ebook/get_chapter_summary

Ruft eine Zusammenfassung des aktuellen Kapitels ab

sessionId: string, maxSentences?: number

Tool-Details

ebook/open

Öffnet eine EPUB-Datei, analysiert deren Inhalt, erstellt eine Lesesitzung und gibt Metadaten zurück.

Eingabeschema:

{
  filePath: string;      // Absolute or relative path to EPUB file
  autoNavigate?: boolean; // Whether to auto-navigate to first page (default: false)
}

Beispielanfrage:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ebook/open",
    "arguments": {
      "filePath": "/path/to/book.epub",
      "autoNavigate": true
    }
  }
}

Beispielantwort:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "{\"sessionId\":\"sess_123\",\"metadata\":{\"title\":\"Sample Book\",\"author\":\"Author Name\",\"totalPages\":250,\"totalChapters\":12}}"
      }
    ]
  }
}

ebook/close

Schließt eine Lesesitzung und gibt zugehörige Ressourcen frei.

Eingabeschema:

{
  sessionId: string;  // Session ID returned by ebook/open
}

ebook/list_open_books

Listet alle aktuell aktiven Lesesitzungen auf.

Eingabeschema: (keine)

Beispielantwort:

{
  "sessions": [
    {
      "sessionId": "sess_123",
      "filePath": "/path/to/book.epub",
      "metadata": {
        "title": "Sample Book",
        "author": "Author Name",
        "currentPage": 42,
        "totalPages": 250
      }
    }
  ]
}

ebook/navigate_next und ebook/navigate_previous

Navigieren Sie vorwärts oder rückwärts durch die Seiten.

Eingabeschema:

{
  sessionId: string;
}

Beispielantwort:

{
  "sessionId": "sess_123",
  "currentPage": 43,
  "content": "Page content here...",
  "chapterTitle": "Chapter 3: The Adventure Begins"
}

ebook/jump_to_page

Springen Sie zu einer bestimmten Seitenzahl.

Eingabeschema:

{
  sessionId: string;
  pageNumber: number;  // 1-based page number
}

ebook/jump_to_chapter

Springen Sie zu einem bestimmten Kapitel anhand des Titels (teilweise Übereinstimmung, Groß-/Kleinschreibung wird ignoriert) oder des Kapitelindex (1-basiert).

Eingabeschema:

{
  sessionId: string;
  chapter: string | number;  // Chapter title or index
}

ebook/get_position

Ruft die aktuelle Leseposition und Fortschrittsstatistiken ab.

Beispielantwort:

{
  "sessionId": "sess_123",
  "currentPage": 42,
  "totalPages": 250,
  "progress": 0.168,
  "chapterTitle": "Chapter 3: The Adventure Begins",
  "chapterIndex": 3
}

ebook/search

Durchsuchen Sie alle Kapitel nach Text, mit optionalen Kontextwörtern.

Eingabeschema:

{
  sessionId: string;
  query: string;
  contextWords?: number;  // Number of context words around matches (default: 50)
}

Beispielantwort:

{
  "sessionId": "sess_123",
  "query": "adventure",
  "matches": [
    {
      "chapterIndex": 3,
      "chapterTitle": "Chapter 3: The Adventure Begins",
      "pageNumber": 42,
      "context": "...the great adventure began when...",
      "position": 1250
    }
  ],
  "totalMatches": 1
}

ebook/get_toc

Ruft das hierarchische Inhaltsverzeichnis ab.

Beispielantwort:

{
  "sessionId": "sess_123",
  "toc": [
    {
      "title": "Chapter 1: Introduction",
      "level": 1,
      "pageNumber": 1,
      "children": []
    },
    {
      "title": "Part I: The Beginning",
      "level": 1,
      "pageNumber": 10,
      "children": [
        {
          "title": "Chapter 2: First Steps",
          "level": 2,
          "pageNumber": 12,
          "children": []
        }
      ]
    }
  ]
}

ebook/get_metadata

Ruft vollständige EPUB-Metadaten ab.

Beispielantwort:

{
  "sessionId": "sess_123",
  "metadata": {
    "title": "Sample Book",
    "author": "Author Name",
    "publisher": "Publisher Name",
    "description": "Book description...",
    "language": "en",
    "publishedDate": "2023-01-01",
    "totalPages": 250,
    "totalChapters": 12
  }
}

ebook/get_footnote

Löst eine Fußnotenreferenz anhand der ID auf.

Eingabeschema:

{
  sessionId: string;
  footnoteId: string;  // Footnote reference ID (e.g., "fn1")
}

Beispielantwort:

{
  "sessionId": "sess_123",
  "footnoteId": "fn1",
  "content": "Footnote content here...",
  "referencingPage": 42
}

ebook/get_chapter_summary

Ruft eine Zusammenfassung des aktuellen Kapitels durch Extraktion der wichtigsten Sätze ab.

Eingabeschema:

{
  sessionId: string;
  maxSentences?: number;  // Maximum sentences in summary (default: 3)
}

Beispielantwort:

{
  "sessionId": "sess_123",
  "chapterTitle": "Chapter 3: The Adventure Begins",
  "summary": [
    "The protagonist begins their journey.",
    "They encounter their first challenge.",
    "A mysterious figure offers guidance."
  ]
}

Entwicklung

Projektstruktur

mcp-epub-reader/
├── src/
│   ├── epub/                    # EPUB domain logic
│   │   ├── parser.ts           # EPUB parsing and metadata extraction
│   │   ├── paginator.ts        # Page splitting and content retrieval
│   │   └── types.ts            # EPUB domain types
│   ├── server/                 # MCP server implementation
│   │   ├── index.ts           # Server entry point (stdio transport)
│   │   ├── book-manager.ts    # Session lifecycle management
│   │   ├── tool-registration.ts # Tool registration and routing
│   │   └── types.ts           # Server-side types
│   ├── tools/                  # All 13 tool implementations
│   │   ├── open.ts            # ebook/open tool
│   │   ├── close.ts           # ebook/close tool
│   │   ├── list-books.ts      # ebook/list_open_books tool
│   │   ├── navigate.ts        # Navigation tools (next/previous)
│   │   ├── jump.ts            # Jump tools (page/chapter)
│   │   ├── position.ts        # ebook/get_position tool
│   │   ├── search.ts          # ebook/search tool
│   │   ├── toc.ts             # ebook/get_toc tool
│   │   ├── metadata.ts        # ebook/get_metadata tool
│   │   ├── footnote.ts        # ebook/get_footnote tool
│   │   └── summary.ts         # ebook/get_chapter_summary tool
│   └── utils/                  # Shared utilities
│       └── validation.ts      # Zod schemas and input validation
├── tests/                      # Test suites
│   ├── unit/                  # Unit tests
│   └── integration/           # Integration tests
├── package.json
├── tsconfig.json
└── jest.config.js

Erstellen aus dem Quellcode

# Install dependencies
npm install

# Build the project (TypeScript → JavaScript)
npm run build

# Output goes to `build/` directory

Testen

# Run all tests
npm test

# Run tests with coverage
npm test -- --coverage

# Run specific test file
npm test -- tests/unit/epub/parser.test.ts

Hinzufügen eines neuen Tools

  1. Erstellen Sie eine neue Datei in src/tools/ mit der Tool-Implementierung:

// src/tools/example.ts
import { BookManager } from '../server/book-manager';
import { ExampleToolInput, ExampleToolOutput } from '../server/types';

export async function handleExampleTool(
  input: ExampleToolInput,
  bookManager: BookManager
): Promise<ExampleToolOutput> {
  // Tool implementation
  return { result: 'success' };
}

export function createExampleTool(bookManager: BookManager) {
  return {
    name: 'ebook/example' as const,
    handler: (input: ExampleToolInput) => handleExampleTool(input, bookManager),
  };
}
  1. Fügen Sie das Zod-Schema in src/utils/validation.ts hinzu:

export const ExampleToolSchema = z.object({
  sessionId: z.string(),
  // ... other parameters
});
  1. Importieren und registrieren Sie es in src/server/tool-registration.ts:

import { createExampleTool } from '../tools/example';

const toolFactories = {
  // ... existing tools
  'ebook/example': createExampleTool,
};

Mitwirken

Beiträge sind willkommen! Bitte befolgen Sie diese Schritte:

  1. Forken Sie das Repository

  2. Erstellen Sie einen Feature-Branch (git checkout -b feature/amazing-feature)

  3. Commiten Sie Ihre Änderungen (git commit -m 'Add amazing feature')

  4. Pushen Sie den Branch (git push origin feature/amazing-feature)

  5. Öffnen Sie einen Pull Request

Entwicklungseinrichtung

# Clone the repository
git clone https://github.com/your-username/mcp-epub-reader.git
cd mcp-epub-reader

# Install dependencies
npm install

# Set up environment
cp .env.example .env  # if applicable

# Run development server with watch mode
npm run dev

Codestandards

  • Befolgen Sie TypeScript-Best-Practices mit strenger Typisierung

  • Schreiben Sie reine Funktionen mit Unveränderlichkeit, wo möglich

  • Verwenden Sie Dependency Injection für Testbarkeit

  • Fügen Sie umfassende Unit-Tests hinzu (AAA-Muster)

  • Dokumentieren Sie öffentliche APIs und komplexe Logik

Lizenz

Dieses Projekt ist unter der MIT-Lizenz lizenziert.

Danksagungen

Referenzen

Changelog

Siehe CHANGELOG.md für die Versionshistorie.


Hinweis: Dieser Server ist für die Verwendung mit MCP-Clients wie Claude Desktop konzipiert. Er bietet KI-Agenten EPUB-Lesefunktionen bei gleichzeitiger Wahrung der Sitzungsisolierung und Ressourcenverwaltung.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    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.
    2
    GPL 3.0
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to help users manage their reading experience by searching books, tracking reading progress, managing bookmarks, and generating personalized recommendations and summaries.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables searching, reading, and managing a Calibre ebook library through natural language, with features like metadata search, full-text search, content extraction, and library management.
    40 npm
    Apache 2.0