ot5-mcp-server

ot5-mcp-server

MCP server providing tools to extract text from PDF, Word, and Excel documents and perform read-only PostgreSQL searches, returning structured JSON results.

Category
访问服务器

README

MCP-сервер распознавания документов

MCP-сервер на TypeScript/Node.js для агентов в IDE (VSCode). Предоставляет 4 инструмента: распознавание электронных PDF, Word (DOCX), Excel (XLSX) и поиск по PostgreSQL. Каждый инструмент возвращает агенту структурированный JSON.

Возможности

Инструмент Что делает Что возвращает
extract_pdf Распознавание текстового (не сканированного) PDF Метаданные, число страниц, текст постранично
extract_word Распознавание DOCX Заголовки, абзацы, таблицы, списки
extract_excel Распознавание XLSX Листы, колонки, число строк, первые строки
postgres_search Поиск по PostgreSQL (read-only) Таблицы, колонки, строки (SELECT)

Контракт результата каждого инструмента: см. docs/contract.md.

Принципы MCP

Агент (IDE) подключается к MCP-серверу по транспорту stdio: IDE запускает сервер как дочерний процесс (в нашем случае — Docker-контейнер, см. opencode.json) и обменивается с ним сообщениями JSON-RPC 2.0. Жизненный цикл подключения состоит из трёх фаз: initialize → tools/list → tools/call. На фазе tools/list агент получает описания инструментов (имя, описание, схему входных параметров) и добавляет их в контекст модели; на фазе tools/call агент передаёт серверу аргументы, сервер выполняет реальную работу и возвращает структурированный JSON-результат, который попадает обратно в контекст модели для формирования ответа.

Tool — это функция, объявленная сервером: у неё есть имя, человекочитаемое описание и JSON-схема параметров. Модель сама ничего не выполняет — она лишь решает, какой tool вызвать и с какими аргументами; исполнение всегда происходит на стороне MCP-сервера. В этом проекте тулами являются extract_pdf, extract_word, extract_excel и postgres_search. Наглядное объяснение этой схемы со схемами Mermaid — в docs/mcp-explained.html.

Требования

  • Node.js 20.11+ (используется import.meta.dirname)
  • PostgreSQL (только для тула postgres_search)

Установка и запуск

npm install          # установка зависимостей
npm run build        # сборка в dist/
npm run make-samples # сгенерировать образцы в samples/ (для проверки)
npm start            # запуск сервера напрямую (stdio)

Переменные окружения — в файле .env (скопируйте .env.example, укажите DATABASE_URL). Реальный .env не коммитится.

Запуск в Docker

Всё окружение поднимается контейнерами: MCP-сервер (сборка из Dockerfile) и PostgreSQL с тестовыми данными.

# 1. Собрать образ MCP-сервера
docker build -t ot5-mcp-server .

# 2. Поднять PostgreSQL с тестовыми данными (db/init.sql)
docker compose up -d db

# 3. Проверка (опционально): тулы через stdio-контейнер
docker run -i --rm --network ot5_default -e PROJECT_ROOT=/project \
  -e DATABASE_URL=postgres://dev:dev@db:5432/docs \
  -v "%CD%:/project" ot5-mcp-server:latest

Схема: db живёт в сети ot5_default; MCP-контейнер VSCode подключается к той же сети и ходит к БД по имени сервиса db. Данные Postgres в named volume pgdata.

Подключение к агенту в VSCode (opencode)

В проекте используется расширение opencode для VSCode (sst-dev.opencode). opencode подключает MCP-серверы через свой конфиг opencode.json (а не через .vscode/mcp.json, который нужен только для встроенного MCP-шлюза GitHub Copilot).

  1. Установите зависимости и соберите проект: npm install && npm run build.

  2. Поднимите окружение в Docker:

    docker compose up -d db
    docker build -t ot5-mcp-server .
    
  3. В корне проекта уже лежит opencode.json — он запускает docs-server как контейнер:

    {
      "$schema": "https://opencode.ai/config.json",
      "mcp": {
        "docs-server": {
          "type": "local",
          "command": [
            "C:\\Program Files\\Docker\\Docker\\resources\\bin\\docker.exe",
            "run", "-i", "--rm", "--network", "ot5_default",
            "-e", "PROJECT_ROOT=/project",
            "-e", "DATABASE_URL=postgres://dev:dev@db:5432/docs",
            "-v", "C:\\Users\\User\\Documents\\HW\\OT-5:/project",
            "ot5-mcp-server:latest"
          ],
          "enabled": true
        }
      }
    }
    

    Docker должен быть запущен, образ ot5-mcp-server:latest собран, сеть ot5_default создана. Путь к docker.exe — полный, т.к. Docker не в PATH.

  4. Перезапустите opencode (закройте/откройте окно VSCode или перезапустите сессию агента) — конфиг читается при старте.

  5. В чате агента отправьте запрос, явно называющий инструмент, например: «Вызови MCP-инструмент extract_pdf для samples/sample.pdf».

  6. Подтверждение вызова: ответ агента придёт как JSON, а логи сервера появятся в терминале/Docker.

Секреты: строка БД для docker-режима — локальная dev-учётка dev:dev, только для тестов.

Проверка без IDE (смоук-тест)

npm run smoke-test

Скрипт scripts/smoke-test.mjs поднимает собранный сервер по stdio через MCP-клиент и вызывает все тулы. Вывод последнего прогона: docs/evidence/smoke-test.log.

Пример строки лога на стороне сервера (имя тула, параметры, статус):

{"ts":"2026-08-20T06:45:44.748Z","tool":"extract_pdf","params":{"path":"samples/sample.pdf"},"status":"success"}
{"ts":"2026-08-20T06:45:44.787Z","tool":"extract_word","params":{"path":"samples/sample.docx"},"status":"success"}
{"ts":"2026-08-20T06:45:44.798Z","tool":"extract_excel","params":{"path":"samples/sample.xlsx"},"status":"success"}
{"ts":"2026-08-20T06:45:44.811Z","tool":"postgres_search","params":{"operation":"list_tables"},"status":"success"}

Логирование реализовано в src/logger.ts:20–34 (вычищает ключи вида password/token).

Безопасность и ограничения

  • Доступ к файлам — только относительные пути внутри корня проекта; обход через ../ запрещён (src/security.ts:6–22).
  • PostgreSQL — только чтение: сессия BEGIN READ ONLY, только SELECT, без мультистейтментов, таймаут запроса 10 с (src/tools/postgres.ts:43–86). Строка подключения — только из .env, в логи не попадает.
  • Секреты — в репозитории только .env.example; логирование вычищает ключи вида password/token и т.п. (src/logger.ts:20–34).
  • PDF — только электронные (текстовые) PDF. Сканированные документы (изображения) не распознаются — OCR не входит в объём.

Ссылки на код (по требованиям задания)

  1. Сервер и регистрация инструментов — src/index.ts:35–106 (тулы) и src/index.ts:107–108 (stdio-транспорт).
  2. Реализация инструментов:
    • extract_pdf — src/tools/pdf.ts:14–33 (реализация), логирование в src/index.ts:36–49;
    • extract_word — src/tools/word.ts:17–71, логирование в src/index.ts:52–65;
    • extract_excel — src/tools/excel.ts:15–36, логирование в src/index.ts:68–81;
    • postgres_search — src/tools/postgres.ts:43–86, логирование в src/index.ts:84–104.
  3. Логирование вызовов — src/logger.ts:20–34; пример вывода: docs/evidence/smoke-test.log.
  4. Контракт результата — docs/contract.md.

Проверочные запросы к агенту (критерий «вызовы из IDE»)

Запросы выполнялись в чате агента opencode внутри VSCode. Транскрипт диалога: mcp_ans.md (не коммитится, содержит извлечённый контент личных документов). Сводная таблица: docs/evidence/verification.md.

# Запрос в VSCode Ожидаемый tool Факт (по транскрипту)
1 «Какие MCP тебе доступны» — (проверка конфигурации) Агент прочитал opencode.json, перечислил 4 тула docs-server
2 «Распознай все PDF-файлы в папке» extract_pdf ×2 Вызван для Чек 3 743.pdf и samples/sample.pdf — текст извлечён
3 «Дай резюме по файлу Анализ…МЧС России.docx» extract_word Резюме документа сформировано по извлечённому тексту
4 «Покажи список таблиц в БД» postgres_search (list_tables) Возвращены employees, orders, products
5 «Покажи список таблиц в БД» (повторно) postgres_search (list_tables) Аналогичный результат
6 «Выжимка по стоимости из Перечень…xls» extract_excel Сформирована таблица с ценами и сроками изготовления
7 «Ревью документа Приложение 0…pdf» extract_pdf (негативный) Корректная ошибка «файл не найден в проекте»
8 «Прочитай файл Приложение.pdf в C:\Users\User\Documents\» extract_pdf (негативный) Ошибка: доступ только к папке проекта через Docker volume; Read отклонён пользователем

Итог по критерию: 8 проверочных запросов, из них 7 приводят к вызову MCP-тула (требование «≥5 запросов, ≥3 реальных вызова» выполнено с запасом), плюс 2 негативных запроса подтверждают границы безопасности.

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

src/index.ts            # сервер, stdio-транспорт, регистрация тулов
src/logger.ts           # логирование вызовов (имя, параметры, статус)
src/security.ts         # проверка путей внутри корня проекта
src/tools/pdf.ts        # PDF (pdf-parse)
src/tools/word.ts       # DOCX (mammoth + cheerio)
src/tools/excel.ts      # XLSX (xlsx / SheetJS)
src/tools/postgres.ts   # PostgreSQL (pg, read-only)
scripts/make-samples.ts # генерация образцов
scripts/smoke-test.mjs  # смоук-тест через MCP-клиент
Dockerfile              # образ MCP-сервера
docker-compose.yml      # PostgreSQL с тестовыми данными
db/init.sql             # инициализация БД (таблицы + данные)
opencode.json          # MCP-конфиг для агента opencode
docs/contract.md        # контракт результатов
docs/evidence/          # логи подтверждений (smoke-test.log, verification.md)
docs/mcp-explained.html # наглядное объяснение принципов MCP (схемы Mermaid)

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选