ot5-mcp-server
MCP-сервер распознавания документов
MCP-сервер на TypeScript/Node.js для агентов в IDE (VSCode). Предоставляет 4 инструмента: распознавание электронных PDF, Word (DOCX), Excel (XLSX) и поиск по PostgreSQL. Каждый инструмент возвращает агенту структурированный JSON.
Возможности
Инструмент | Что делает | Что возвращает |
| Распознавание текстового (не сканированного) PDF | Метаданные, число страниц, текст постранично |
| Распознавание DOCX | Заголовки, абзацы, таблицы, списки |
| Распознавание XLSX | Листы, колонки, число строк, первые строки |
| Поиск по PostgreSQL (read-only) | Таблицы, колонки, строки (SELECT) |
Контракт результата каждого инструмента: см. docs/contract.md.
Related MCP server: Document Search MCP Server
Принципы 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).
Установите зависимости и соберите проект:
npm install && npm run build.Поднимите окружение в Docker:
docker compose up -d db docker build -t ot5-mcp-server .В корне проекта уже лежит
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.Перезапустите opencode (закройте/откройте окно VSCode или перезапустите сессию агента) — конфиг читается при старте.
В чате агента отправьте запрос, явно называющий инструмент, например: «Вызови MCP-инструмент
extract_pdfдляsamples/sample.pdf».Подтверждение вызова: ответ агента придёт как 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 не входит в объём.
Ссылки на код (по требованиям задания)
Сервер и регистрация инструментов —
src/index.ts:35–106(тулы) иsrc/index.ts:107–108(stdio-транспорт).Реализация инструментов:
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.
Логирование вызовов —
src/logger.ts:20–34; пример вывода: docs/evidence/smoke-test.log.Контракт результата — docs/contract.md.
Проверочные запросы к агенту (критерий «вызовы из IDE»)
Запросы выполнялись в чате агента opencode внутри VSCode. Транскрипт диалога: mcp_ans.md (не коммитится,
содержит извлечённый контент личных документов). Сводная таблица: docs/evidence/verification.md.
# | Запрос в VSCode | Ожидаемый tool | Факт (по транскрипту) |
1 | «Какие MCP тебе доступны» | — (проверка конфигурации) | Агент прочитал |
2 | «Распознай все PDF-файлы в папке» |
| Вызван для |
3 | «Дай резюме по файлу Анализ…МЧС России.docx» |
| Резюме документа сформировано по извлечённому тексту |
4 | «Покажи список таблиц в БД» |
| Возвращены employees, orders, products |
5 | «Покажи список таблиц в БД» (повторно) |
| Аналогичный результат |
6 | «Выжимка по стоимости из Перечень…xls» |
| Сформирована таблица с ценами и сроками изготовления |
7 | «Ревью документа Приложение 0…pdf» |
| Корректная ошибка «файл не найден в проекте» |
8 | «Прочитай файл Приложение.pdf в C:\Users\User\Documents\» |
| Ошибка: доступ только к папке проекта через 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)This server cannot be deployed
Maintenance
Related MCP Connectors
Document conversion MCP server: PDF to Markdown, image OCR, spreadsheet parsing.
MCP server for detecting and redacting PII (Personally Identifiable Information) in PDF documents.
Document-to-Markdown MCP server — convert PDF, Office and HTML into LLM-ready Markdown.
Hosted MCP server: convert PDFs to clean, LLM-ready Markdown with tables, formulas and OCR.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server that enables searching and reading binary document files (PDF, DOCX, PPTX, XLSX, ODT, ODS, ODP, RTF, EPUB) using regex patterns and retrieving content by sections.2MIT
- FlicenseNot gradedqualityBmaintenanceA local MCP server providing read-only access to documents like Word, PDF, Excel, and images, with file listing, reading, and metadata extraction.1-
- AlicenseNot gradedqualityDmaintenanceMCP server for comprehensive PDF processing including text extraction with OCR, keyword search with regex, table extraction, and page preview as Base64 PNG images.1MIT
- AlicenseNot gradedqualityDmaintenanceA read-only MCP server for PDF analysis that enables text extraction, image extraction, metadata retrieval, and text search via natural language.MIT