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
Visit Server

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)

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured