Skip to main content
Glama
donghch
by donghch

MCP-сервер для чтения EPUB

License MCP Version Node.js Version

Сервер протокола контекста модели (MCP), который выступает в роли «Kindle для ИИ-агентов», предоставляя доступ к содержимому файлов EPUB через API инструментов MCP.

Обзор

MCP-сервер для чтения EPUB предоставляет ИИ-агентам возможность читать файлы EPUB и перемещаться по ним. Он реализует протокол контекста модели (MCP) и предоставляет 13 инструментов, которые позволяют открывать файлы EPUB, перемещаться по оглавлению и страницам, искать контент, проверять сноски и управлять сеансами чтения.

Функции

  • Открытие файлов EPUB: проверка и разбор файлов EPUB, создание сеансов чтения

  • Навигация по контенту: перемещение вперед/назад по страницам, переход к конкретным страницам или главам

  • Обнаружение контента: просмотр оглавления, метаданных и кратких обзоров глав

  • Функциональность поиска: полнотекстовый поиск по главам с контекстом

  • Инструменты ссылок: разрешение ссылок на сноски, получение позиции чтения

  • Управление сеансами: список открытых книг, закрытие сеансов, управление ресурсами

Related MCP server: Readbook MCP Server

Предварительные требования

  • Node.js 20+

  • npm или совместимый менеджер пакетов

  • Файлы EPUB для чтения (формат .epub)

Установка

Из исходного кода

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

Использование

Запуск сервера

Сервер использует транспорт stdio, что делает его идеальным для интеграции с MCP-клиентами, такими как Claude Desktop.

stdio (Локальная интеграция)

Для интеграции с Claude Desktop или другими MCP-клиентами:

node build/index.js

Сервер взаимодействует через stdin/stdout с использованием протокола MCP JSON-RPC.

Конфигурация

Конфигурация Claude Desktop

Добавьте сервер в конфигурацию Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json в macOS):

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

Переменные окружения

Переменная

Описание

Обязательно

По умолчанию

LOG_LEVEL

Уровень логирования (error, warn, info, debug)

Нет

info

Справочник инструментов

Сервер предоставляет 13 инструментов для взаимодействия с файлами EPUB:

Инструмент

Описание

Входные параметры

ebook/open

Открыть файл EPUB и создать сеанс чтения

filePath: string, autoNavigate?: boolean

ebook/close

Закрыть сеанс чтения и освободить ресурсы

sessionId: string

ebook/list_open_books

Список всех открытых в данный момент сеансов EPUB

(нет)

ebook/navigate_next

Перейти к следующей странице в текущем сеансе

sessionId: string

ebook/navigate_previous

Перейти к предыдущей странице в текущем сеансе

sessionId: string

ebook/jump_to_page

Перейти к конкретному номеру страницы

sessionId: string, pageNumber: number

ebook/jump_to_chapter

Перейти к конкретной главе (по названию или индексу)

sessionId: string, chapter: string | number

ebook/get_position

Получить текущую позицию чтения и прогресс

sessionId: string

ebook/search

Поиск текста по всем главам

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

ebook/get_toc

Получить иерархическое оглавление

sessionId: string

ebook/get_metadata

Получить метаданные EPUB (название, автор, издатель и т.д.)

sessionId: string

ebook/get_footnote

Разрешить ссылку на сноску по ID

sessionId: string, footnoteId: string

ebook/get_chapter_summary

Получить краткий обзор текущей главы

sessionId: string, maxSentences?: number

Детали инструментов

ebook/open

Открывает файл EPUB, анализирует его содержимое, создает сеанс чтения и возвращает метаданные.

Схема ввода:

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

Пример запроса:

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

Пример ответа:

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

Закрывает сеанс чтения и освобождает связанные ресурсы.

Схема ввода:

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

ebook/list_open_books

Перечисляет все активные в данный момент сеансы чтения.

Схема ввода: (нет)

Пример ответа:

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

ebook/navigate_next и ebook/navigate_previous

Перемещение вперед или назад по страницам.

Схема ввода:

{
  sessionId: string;
}

Пример ответа:

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

ebook/jump_to_page

Переход к конкретному номеру страницы.

Схема ввода:

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

ebook/jump_to_chapter

Переход к конкретной главе по названию (частичное совпадение без учета регистра) или индексу главы (начиная с 1).

Схема ввода:

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

ebook/get_position

Получение текущей позиции чтения и статистики прогресса.

Пример ответа:

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

ebook/search

Поиск текста по всем главам с дополнительными контекстными словами.

Схема ввода:

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

Пример ответа:

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

Получение иерархического оглавления.

Пример ответа:

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

Получение полных метаданных EPUB.

Пример ответа:

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

Разрешение ссылки на сноску по ID.

Схема ввода:

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

Пример ответа:

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

ebook/get_chapter_summary

Получение краткого обзора текущей главы с использованием извлечения ключевых предложений.

Схема ввода:

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

Пример ответа:

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

Разработка

Структура проекта

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

Сборка из исходного кода

# Install dependencies
npm install

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

# Output goes to `build/` directory

Тестирование

# Run all tests
npm test

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

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

Добавление нового инструмента

  1. Создайте новый файл в src/tools/ с реализацией инструмента:

// 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. Добавьте схему Zod в src/utils/validation.ts:

export const ExampleToolSchema = z.object({
  sessionId: z.string(),
  // ... other parameters
});
  1. Импортируйте и зарегистрируйте в src/server/tool-registration.ts:

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

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

Вклад в проект

Мы приветствуем ваш вклад! Пожалуйста, выполните следующие шаги:

  1. Сделайте форк репозитория

  2. Создайте ветку для функции (git checkout -b feature/amazing-feature)

  3. Зафиксируйте изменения (git commit -m 'Add amazing feature')

  4. Отправьте изменения в ветку (git push origin feature/amazing-feature)

  5. Откройте Pull Request

Настройка разработки

# 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

Стандарты кода

  • Следуйте лучшим практикам TypeScript со строгой типизацией

  • Пишите чистые функции с неизменяемостью, где это возможно

  • Используйте внедрение зависимостей для тестируемости

  • Включайте комплексные модульные тесты (шаблон AAA)

  • Документируйте публичные API и сложную логику

Лицензия

Этот проект лицензирован по лицензии MIT.

Благодарности

Ссылки

Журнал изменений

См. CHANGELOG.md для истории версий.


Примечание: Этот сервер предназначен для использования с MCP-клиентами, такими как Claude Desktop. Он предоставляет ИИ-агентам возможности чтения EPUB, сохраняя при этом изоляцию сеансов и управление ресурсами.

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