ot5-mcp-server
MCPサーバー文書認識
TypeScript/Node.js製のMCPサーバーで、IDE(VSCode)のエージェント向け。4つのツールを提供する: 電子PDF、Word(DOCX)、Excel(XLSX)の認識と、PostgreSQL検索。各ツールはエージェントに構造化JSONを返す。
機能
ツール | 動作 | 戻り値 |
| テキストPDF(非スキャン)の認識 | メタデータ、ページ数、テキスト |
| DOCXの認識 | 見出し、段落、表、リスト |
| XLSXの認識 | シート、列、行数、先頭行 |
| PostgreSQL検索(読み取り専用) | テーブル、列、行(SELECT) |
各ツールの結果コントラクト: docs/contract.md 参照。
Related MCP server: Document Search MCP Server
原則
エージェント(IDE)はMCPサーバーにstdioトランスポートで接続する:IDEがサーバーを子プロセスとして起動し
(本プロジェクトではDockerコンテナ、opencode.json参照)、JSON-RPC 2.0でメッセージを交換する。
接続ライフサイクルは3フェーズ:initialize → tools/list → tools/call。
tools/listフェーズでエージェントはツールの説明(名前、説明、入力パラメータのスキーマ)を取得し、
それをモデルのコンテキストに追加する。tools/callフェーズでエージェントはサーバーに引数を送信し、サーバーが実際の処理を実行して
構造化JSONの結果を返し、それがモデルのコンテキストに戻って応答生成に使われる。
ツールとは、サーバーが宣言する関数である:名前、人間可読な説明、JSONスキーマのパラメータを持つ。
モデル自身は何も実行しない — どのツールをどの引数で呼ぶかを決定するだけである。
実行は常に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コンテナは同じネットワークに接続し、
サービス名 db でDBにアクセスする。PostgreSQLのデータは名前付きボリューム pgdata に保存される。
VSCodeのエージェントへの接続(opencode)
本プロジェクトではVSCode用拡張機能 opencode を使用(
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ウィンドウを閉じて開き直すか、エージェントセッションを再開)— 設定は起動時に読み込まれる。
エージェントのチャットで、ツールを明示的に呼び出すリクエストを送信。例:「
samples/sample.pdfに対して MCPツールextract_pdfを呼び出して」。呼び出しの確認:エージェントの応答はJSONとして返る。サーバーのログはターミナル/Dockerに表示される。
注意:DB接続文字列はDockerモードでは
docker-compose.ymlの環境変数から取得される。ローカル開発時は.envのDATABASE_URLを使用(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からの呼び出し」基準)
リクエストはVSCode内のopencodeエージェントチャットで実行された。対話のトランスクリプト:mcp_ans.md(コミットしない。
個人文書から抽出したコンテンツを含むため)。集計表: docs/evidence/verification.md。
# | VSCodeでのリクエスト | 期待されるツール | 実際の結果(トランスクリプトによる) |
1 | 「利用可能なMCPはどれ?」 | —(設定確認) | エージェントが |
2 | 「フォルダ内の全PDFを認識して」 |
|
|
3 | 「Анализ…МЧС России.docx の要約を」 |
| 抽出テキストから文書要約を生成 |
4 | 「DBのテーブル一覧を表示」 |
| employees、orders、products を返却 |
5 | 「DBのテーブル一覧を表示」(再実行) |
| 同様の結果 |
6 | 「Перечень…xls からコスト情報を抽出」 |
| 価格と製造期間の表を生成 |
7 | 「Приложение 0…pdf をレビュー」 |
| 正しいエラー「プロジェクト内にファイルが見つかりません」 |
8 | 「C:\Users\User\Documents\ の Приложение.pdf を読んで」 |
| エラー:Dockerボリューム経由でプロジェクトフォルダのみアクセス可能。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