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 installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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.
- AlicenseNot gradedqualityBmaintenanceMCP 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
Related MCP Connectors
A paid remote MCP for Context7 MCP docs, built to return verdicts, receipts, usage logs, and audit-r
OCR, transcription, file extraction, and image generation for AI agents via MCP.
MCP server for the PDFGate API. Generate PDFs, manage documents and handle e-signatures.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Epyur/ot5-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server