ot5-mcp-server
MCP-Server zur Dokumentenerkennung
MCP-Server auf TypeScript/Node.js für Agenten in IDEs (VSCode). Stellt 4 Tools bereit: Erkennung von elektronischen PDFs, Word (DOCX), Excel (XLSX) und Suche in PostgreSQL. Jedes Tool gibt dem Agenten strukturiertes JSON zurück.
Funktionen
Tool | Was es tut | Was es zurückgibt |
| Erkennung von textbasierten (nicht gescannten) PDFs | Metadaten, Seitenzahl, Text seitenweise |
| Erkennung von DOCX | Überschriften, Absätze, Tabellen, Listen |
| Erkennung von XLSX | Blätter, Spalten, Zeilenanzahl, erste Zeilen |
| Suche in PostgreSQL (read-only) | Tabellen, Spalten, Zeilen (SELECT) |
Ergebnisvertrag jedes Tools: siehe docs/contract.md.
Related MCP server: Document Search MCP Server
MCP-Prinzipien
Der Agent (IDE) verbindet sich mit dem MCP-Server über den stdio-Transport: Die IDE startet den Server als
untergeordneten Prozess (in unserem Fall – Docker-Container, siehe opencode.json) und tauscht mit ihm
JSON-RPC-2.0-Nachrichten aus. Der Verbindungslebenszyklus besteht aus drei Phasen: initialize → tools/list → tools/call.
In der Phase tools/list erhält der Agent die Tool-Beschreibungen (Name, Beschreibung, Schema der Eingabeparameter) und
fügt sie in den Modellkontext ein; in der Phase tools/call übergibt der Agent dem Server Argumente, der Server führt die
eigentliche Arbeit aus und gibt ein strukturiertes JSON-Ergebnis zurück, das wieder in den Modellkontext
gelangt, um die Antwort zu bilden.
Tool – eine vom Server deklarierte Funktion: Sie hat einen Namen, eine menschenlesbare Beschreibung und ein JSON-Schema
der Parameter. Das Modell führt selbst nichts aus – es entscheidet nur, welches Tool mit welchen Argumenten aufgerufen wird;
die Ausführung erfolgt immer auf der Seite des MCP-Servers. In diesem Projekt sind die Tools extract_pdf,
extract_word, extract_excel und postgres_search. Eine anschauliche Erklärung dieses Schemas mit Mermaid-Diagrammen
finden Sie in docs/mcp-explained.html.
Anforderungen
Node.js 20.11+ (verwendet
import.meta.dirname)PostgreSQL (nur für das Tool
postgres_search)
Installation und Start
npm install # установка зависимостей
npm run build # сборка в dist/
npm run make-samples # сгенерировать образцы в samples/ (для проверки)
npm start # запуск сервера напрямую (stdio)Umgebungsvariablen – in der Datei .env (kopieren Sie .env.example, geben Sie DATABASE_URL an). Die echte .env wird nicht committet.
Start in Docker
Die gesamte Umgebung wird mit Containern hochgefahren: MCP-Server (Build aus Dockerfile) und PostgreSQL mit Testdaten.
# 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:latestSchema: db lebt im Netzwerk ot5_default; der MCP-Container von VSCode verbindet sich mit demselben Netzwerk und greift auf die Datenbank über den Dienstnamen db zu. Die Postgres-Daten liegen im named volume pgdata.
Verbindung zum Agenten in VSCode (opencode)
Im Projekt wird die Erweiterung opencode für VSCode verwendet (
sst-dev.opencode). opencode verbindet MCP-Server über seine Konfigurationopencode.json(nicht über.vscode/mcp.json, das nur für den integrierten MCP-Gateway von GitHub Copilot benötigt wird).
Installieren Sie die Abhängigkeiten und bauen Sie das Projekt:
npm install && npm run build.Starten Sie die Umgebung in Docker:
docker compose up -d db docker build -t ot5-mcp-server .Im Projektstamm liegt bereits
opencode.json– es startetdocs-serverals Container:{ "$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 muss gestartet sein, das Image
ot5-mcp-server:latestgebaut, das Netzwerkot5_defaulterstellt. Der Pfad zudocker.exeist vollständig, da Docker nicht im PATH ist.Starten Sie opencode neu (schließen/öffnen Sie das VSCode-Fenster oder starten Sie die Agentensitzung neu) – die Konfiguration wird beim Start gelesen.
Senden Sie im Agenten-Chat eine Anfrage, die das Tool explizit nennt, z. B.: „Rufe das MCP-Tool
extract_pdffürsamples/sample.pdfauf“.Bestätigung des Aufrufs: Die Antwort des Agenten kommt als JSON, und die Server-Logs erscheinen im Terminal/Docker.
Geheimnisse: Die Datenbankverbindung für den Docker-Modus ist ein lokales Dev-Konto
dev:dev, nur für Tests.
Überprüfung ohne IDE (Smoke-Test)
npm run smoke-testDas Skript scripts/smoke-test.mjs startet den gebauten Server über stdio mit einem MCP-Client und ruft alle Tools auf.
Ausgabe des letzten Laufs: docs/evidence/smoke-test.log.
Beispiel einer Log-Zeile auf der Serverseite (Tool-Name, Parameter, Status):
{"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"}Die Protokollierung ist in src/logger.ts:20–34 implementiert (bereinigt Schlüssel wie password/token).
Sicherheit und Einschränkungen
Dateizugriff – nur relative Pfade innerhalb des Projektstamms; Umgehung über
../ist verboten (src/security.ts:6–22).PostgreSQL – nur Lesen: Sitzung
BEGIN READ ONLY, nurSELECT, keine Multistatements, Abfragetimeout 10 s (src/tools/postgres.ts:43–86). Die Verbindungszeichenfolge kommt nur aus.envund gelangt nicht in die Logs.Geheimnisse – im Repository nur
.env.example; die Protokollierung bereinigt Schlüssel wiepassword/tokenusw. (src/logger.ts:20–34).PDF – nur elektronische (textbasierte) PDFs. Gescannte Dokumente (Bilder) werden nicht erkannt – OCR ist nicht im Umfang enthalten.
Code-Verweise (gemäß Aufgabenanforderungen)
Server und Tool-Registrierung –
src/index.ts:35–106(Tools) undsrc/index.ts:107–108(stdio-Transport).Tool-Implementierungen:
extract_pdf–src/tools/pdf.ts:14–33(Implementierung), Protokollierung insrc/index.ts:36–49;extract_word–src/tools/word.ts:17–71, Protokollierung insrc/index.ts:52–65;extract_excel–src/tools/excel.ts:15–36, Protokollierung insrc/index.ts:68–81;postgres_search–src/tools/postgres.ts:43–86, Protokollierung insrc/index.ts:84–104.
Aufrufprotokollierung –
src/logger.ts:20–34; Beispielausgabe: docs/evidence/smoke-test.log.Ergebnisvertrag – docs/contract.md.
Testanfragen an den Agenten (Kriterium „Aufrufe aus der IDE“)
Die Anfragen wurden im Chat des opencode-Agenten innerhalb von VSCode ausgeführt. Transkript des Dialogs: mcp_ans.md (wird nicht committet,
enthält extrahierten Inhalt persönlicher Dokumente). Übersichtstabelle: docs/evidence/verification.md.
# | Anfrage in VSCode | Erwartetes Tool | Tatsache (laut Transkript) |
1 | „Welche MCPs sind dir verfügbar“ | — (Konfigurationsprüfung) | Der Agent las |
2 | „Erkenne alle PDF-Dateien im Ordner“ |
| Aufgerufen für |
3 | „Gib eine Zusammenfassung zur Datei Анализ…МЧС России.docx“ |
| Dokumentzusammenfassung aus extrahiertem Text erstellt |
4 | „Zeige die Liste der Tabellen in der DB“ |
| employees, orders, products zurückgegeben |
5 | „Zeige die Liste der Tabellen in der DB“ (erneut) |
| Ähnliches Ergebnis |
6 | „Zusammenfassung zu den Kosten aus Перечень…xls“ |
| Tabelle mit Preisen und Fertigungszeiten erstellt |
7 | „Review des Dokuments Приложение 0…pdf“ |
| Korrekter Fehler „Datei nicht im Projekt gefunden“ |
8 | „Lies die Datei Приложение.pdf in C:\Users\User\Documents\“ |
| Fehler: Zugriff nur auf den Projektordner über Docker-Volume; Read vom Benutzer abgelehnt |
Ergebnis zum Kriterium: 8 Testanfragen, davon führen 7 zu einem MCP-Tool-Aufruf (Anforderung „≥5 Anfragen, ≥3 echte Aufrufe“ mit Reserve erfüllt), plus 2 negative Anfragen bestätigen die Sicherheitsgrenzen.
Projektstruktur
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