ot5-mcp-server
MCP服务器文档识别
MCP服务器基于TypeScript/Node.js,用于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
MCP原理
代理(IDE)通过stdio传输连接到MCP服务器:IDE将服务器作为子进程启动
(在本项目中为Docker容器,参见 opencode.json)并通过JSON-RPC 2.0交换消息。
连接生命周期包含三个阶段: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。在Docker中启动环境:
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 访问数据库。Postgres数据存放在命名卷 pgdata 中。
连接到VSCode(opencode)中的代理
项目使用VSCode的 opencode 扩展(
sst-dev.opencode)。 opencode通过其配置文件opencode.json连接MCP服务器(而非.vscode/mcp.json, 后者仅用于内置的GitHub Copilot MCP网关)。
安装依赖并构建项目:
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中。
密钥:docker模式的数据库连接串为本地开发账号
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 | 「显示数据库中的表列表」 |
| 返回 employees、orders、products |
5 | 「显示数据库中的表列表」(重复) |
| 结果类似 |
6 | 「从 Перечень…xls 提取价格要点」 |
| 生成了包含价格和制造周期的表格 |
7 | 「审阅文档 Приложение 0…pdf」 |
| 正确报错「项目中未找到文件」 |
8 | 「读取 C:\Users\User\Documents\ 中的 Приложение.pdf」 |
| 错误:仅可通过Docker卷访问项目文件夹;读取被用户拒绝 |
该标准的结论: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