Skip to main content
Glama
donghch
by donghch

Servidor MCP de lector de EPUB

License MCP Version Node.js Version

Un servidor del Protocolo de Contexto de Modelo (MCP) que actúa como un "Kindle para agentes de IA", exponiendo el contenido de archivos EPUB a través de la API de herramientas de MCP.

Descripción general

El servidor MCP de lector de EPUB proporciona a los agentes de IA la capacidad de leer y navegar por archivos EPUB. Implementa el Protocolo de Contexto de Modelo (MCP) para exponer 13 herramientas que permiten abrir archivos EPUB, navegar por la tabla de contenidos y las páginas, buscar contenido, consultar notas al pie y gestionar sesiones de lectura.

Características

  • Abrir archivos EPUB: Validar y analizar archivos EPUB, crear sesiones de lectura

  • Navegar por el contenido: Moverse hacia adelante/atrás por las páginas, saltar a páginas o capítulos específicos

  • Descubrir contenido: Ver tabla de contenidos, metadatos y resúmenes de capítulos

  • Funcionalidad de búsqueda: Búsqueda de texto completo en todos los capítulos con contexto

  • Herramientas de referencia: Resolver referencias de notas al pie, obtener la posición de lectura

  • Gestión de sesiones: Listar libros abiertos, cerrar sesiones, gestionar recursos

Related MCP server: Readbook MCP Server

Requisitos previos

  • Node.js 20+

  • npm o gestor de paquetes compatible

  • Archivos EPUB para leer (formato .epub)

Instalación

Desde el código fuente

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

Uso

Ejecución del servidor

El servidor utiliza transporte stdio, lo que lo hace ideal para la integración con clientes MCP como Claude Desktop.

stdio (Integración local)

Para la integración con Claude Desktop u otros clientes MCP:

node build/index.js

El servidor se comunica a través de stdin/stdout utilizando el protocolo MCP JSON-RPC.

Configuración

Configuración de Claude Desktop

Añada el servidor a su configuración de Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json en macOS):

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

Variables de entorno

Variable

Descripción

Requerido

Predeterminado

LOG_LEVEL

Nivel de registro (error, warn, info, debug)

No

info

Referencia de herramientas

El servidor proporciona 13 herramientas para la interacción con archivos EPUB:

Herramienta

Descripción

Parámetros de entrada

ebook/open

Abrir un archivo EPUB y crear una sesión de lectura

filePath: string, autoNavigate?: boolean

ebook/close

Cerrar una sesión de lectura y liberar recursos

sessionId: string

ebook/list_open_books

Listar todas las sesiones EPUB abiertas actualmente

(ninguno)

ebook/navigate_next

Mover a la página siguiente en la sesión actual

sessionId: string

ebook/navigate_previous

Mover a la página anterior en la sesión actual

sessionId: string

ebook/jump_to_page

Saltar a un número de página específico

sessionId: string, pageNumber: number

ebook/jump_to_chapter

Saltar a un capítulo específico (por título o índice)

sessionId: string, chapter: string | number

ebook/get_position

Obtener la posición de lectura actual y el progreso

sessionId: string

ebook/search

Buscar texto en todos los capítulos

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

ebook/get_toc

Obtener la tabla de contenidos jerárquica

sessionId: string

ebook/get_metadata

Obtener metadatos del EPUB (título, autor, editor, etc.)

sessionId: string

ebook/get_footnote

Resolver una referencia de nota al pie por ID

sessionId: string, footnoteId: string

ebook/get_chapter_summary

Obtener un resumen del capítulo actual

sessionId: string, maxSentences?: number

Detalles de las herramientas

ebook/open

Abre un archivo EPUB, analiza su contenido, crea una sesión de lectura y devuelve metadatos.

Esquema de entrada:

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

Ejemplo de solicitud:

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

Ejemplo de respuesta:

{
  "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

Cierra una sesión de lectura y libera los recursos asociados.

Esquema de entrada:

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

ebook/list_open_books

Lista todas las sesiones de lectura activas actualmente.

Esquema de entrada: (ninguno)

Ejemplo de respuesta:

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

ebook/navigate_next y ebook/navigate_previous

Navega hacia adelante o hacia atrás a través de las páginas.

Esquema de entrada:

{
  sessionId: string;
}

Ejemplo de respuesta:

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

ebook/jump_to_page

Salta a un número de página específico.

Esquema de entrada:

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

ebook/jump_to_chapter

Salta a un capítulo específico por título (coincidencia parcial sin distinción entre mayúsculas y minúsculas) o índice de capítulo (basado en 1).

Esquema de entrada:

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

ebook/get_position

Obtiene la posición de lectura actual y las estadísticas de progreso.

Ejemplo de respuesta:

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

ebook/search

Busca texto en todos los capítulos, con palabras de contexto opcionales.

Esquema de entrada:

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

Ejemplo de respuesta:

{
  "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

Obtiene la tabla de contenidos jerárquica.

Ejemplo de respuesta:

{
  "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

Obtiene los metadatos completos del EPUB.

Ejemplo de respuesta:

{
  "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

Resuelve una referencia de nota al pie por ID.

Esquema de entrada:

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

Ejemplo de respuesta:

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

ebook/get_chapter_summary

Obtiene un resumen del capítulo actual utilizando la extracción de oraciones clave.

Esquema de entrada:

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

Ejemplo de respuesta:

{
  "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."
  ]
}

Desarrollo

Estructura del proyecto

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

Construcción desde el código fuente

# Install dependencies
npm install

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

# Output goes to `build/` directory

Pruebas

# Run all tests
npm test

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

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

Añadir una nueva herramienta

  1. Cree un nuevo archivo en src/tools/ con la implementación de la herramienta:

// 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. Añada el esquema Zod en src/utils/validation.ts:

export const ExampleToolSchema = z.object({
  sessionId: z.string(),
  // ... other parameters
});
  1. Importe y registre en src/server/tool-registration.ts:

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

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

Contribución

¡Las contribuciones son bienvenidas! Por favor, siga estos pasos:

  1. Haga un fork del repositorio

  2. Cree una rama de características (git checkout -b feature/amazing-feature)

  3. Confirme sus cambios (git commit -m 'Add amazing feature')

  4. Empuje a la rama (git push origin feature/amazing-feature)

  5. Abra una solicitud de extracción (Pull Request)

Configuración de desarrollo

# 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

Estándares de código

  • Siga las mejores prácticas de TypeScript con tipado estricto

  • Escriba funciones puras con inmutabilidad siempre que sea posible

  • Utilice inyección de dependencias para la capacidad de prueba

  • Incluya pruebas unitarias completas (patrón AAA)

  • Documente las API públicas y la lógica compleja

Licencia

Este proyecto está bajo la Licencia MIT.

Agradecimientos

Referencias

Registro de cambios

Consulte CHANGELOG.md para ver el historial de versiones.


Nota: Este servidor está diseñado para su uso con clientes MCP como Claude Desktop. Proporciona a los agentes de IA capacidades de lectura de EPUB mientras mantiene el aislamiento de sesiones y la gestión de recursos.

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