Skip to main content

A Model Context Protocol server for converting documents to Markdown

Project description

Any2Markdown MCP 服务器

Python 版本 MCP 协议 许可证 构建状态

一个高性能的文档转换服务器,同时支持 Model Context Protocol (MCP 模型上下文协议)RESTful API 接口。将 PDF、Word 和 Excel 文档转换为 Markdown 格式,具备图片提取、页眉页脚移除和批量处理等高级功能。

📚 语言版本: English README | 中文说明

✨ 核心特性

🔄 双协议支持

  • MCP 协议:原生支持模型上下文协议和流式 HTTP 传输
  • RESTful API:传统 HTTP API,配备 OpenAPI/Swagger 文档
  • 统一后端:两种协议共享相同的转换逻辑

📄 文档转换

  • PDF 转 Markdown:基于 marker-pdf 的高质量文本提取
  • Word 转 Markdown:支持 .docx/.doc 格式,保持格式化
  • Excel 转 Markdown:支持 .xlsx/.xls 格式,表格转换
  • 批量处理:并发处理多个文档

🖼️ 高级功能

  • 图片提取:从文档中提取图片并通过静态 URL 提供服务
  • 页眉页脚移除:智能移除重复的页面元素
  • 多格式输出:Markdown、HTML 和 JSON 输出格式
  • 结构分析:文档结构分析和验证
  • 并发处理:高性能异步处理和速率限制

🚀 快速开始

系统要求

  • Python 3.9+
  • 4GB+ 内存(用于 AI 模型)
  • 10GB+ 磁盘空间(用于模型缓存)

安装

# 克隆仓库
git clone https://github.com/WW-AI-Lab/any2markdown.git
cd any2markdown

# 创建虚拟环境
python -m venv .venv
source .venv/bin/activate  # Windows: .venv\Scripts\activate

# 准备环境变量文件
cp env.example .env

# 安装依赖
pip install -r requirements.txt

快速启动

方式一:Docker 部署(推荐,开箱即用)

# 使用预构建镜像直接启动服务
docker run -d \
  -p 3000:3000 \
  --name any2markdown-mcp-server \
  --restart unless-stopped \
  -v $(pwd)/uploads:/app/uploads \
  -v $(pwd)/temp_images:/app/temp_images \
  -v $(pwd)/logs:/app/logs \
  -v $(pwd)/models:/root/.cache/marker \
  -v $(pwd)/models/huggingface:/root/.cache/huggingface \
  -v $(pwd)/models/torch:/root/.cache/torch \
  -v $(pwd)/models/transformers:/root/.cache/transformers \
  ccr.ccs.tencentyun.com/yfgaia/any2markdown-mcp-server:latest

# 💡 卷挂载说明:
# - uploads/: 上传文件存储
# - temp_images/: 临时图片缓存  
# - logs/: 日志文件
# - models/: AI模型缓存(首次运行会自动下载,约3-5GB)

# 或使用部署脚本
./scripts/deploy.sh docker

# GPU 加速部署(需要 NVIDIA GPU)
./scripts/deploy.sh docker-gpu

# 自定义端口部署
./scripts/deploy.sh docker -p 8080

# 或直接使用 docker-compose:
docker-compose up -d any2markdown-mcp

方式二:源码部署(开发环境)

# 使用部署脚本启动服务器
./scripts/deploy.sh source

# 或手动启动:
python run_server.py

# 服务器将在以下地址可用:
# - MCP 协议:http://localhost:3000/mcp (流式 HTTP)
# - REST API:http://localhost:3000/api/v1/
# - API 文档:http://localhost:3000/api/v1/docs

测试安装

# 测试 RESTful API
python test_restful_api.py

# 测试 MCP 协议
python test_streamable_client.py

# 检查服务状态
./scripts/deploy.sh status

# 停止服务
./scripts/deploy.sh stop

📖 使用示例

RESTful API

📋 完整API文档: 详细的API设计和使用说明请参考 RESTful API 设计文档

📋 dify集成文档: 详细的dify集成文档请参考 dify集成文档

Any2Markdown 提供统一的RESTful API接口,支持两种调用方式:

快速开始

# 文件上传方式 (推荐)
curl -X POST "http://localhost:3000/api/v1/convert" \
  -F "file=@document.pdf" \
  -F "extract_images=true" \
  -F "include_content=false"

# JSON方式 (base64编码)
curl -X POST "http://localhost:3000/api/v1/convert" \
  -H "Content-Type: application/json" \
  -d '{
    "files": [{
      "filename": "document.pdf",
      "file_content": "<base64编码的PDF>",
      "options": {
        "extract_images": true,
        "include_content": false
      }
    }]
  }'

# 查看系统状态
curl "http://localhost:3000/api/v1/status"

# 访问API文档
open http://localhost:3000/api/v1/docs

支持的功能

  • 统一端点: 单一/api/v1/convert端点处理所有文档类型
  • 双调用方式: 支持文件上传和base64 JSON两种方式
  • 多文件处理: 支持批量转换多个文档
  • 自动检测: 根据文件扩展名自动识别文档类型
  • 丰富选项: 支持图片提取、页面范围、格式保留等选项

MCP 协议

from mcp.client import ClientSession
from mcp.client.stdio import stdio_client

# 连接到 MCP 服务器
async with stdio_client() as (read, write):
    async with ClientSession(read, write) as session:
        # 转换 PDF 文档
        result = await session.call_tool(
            "convert_pdf_to_markdown",
            {
                "file_content": base64_pdf_content,
                "filename": "document.pdf",
                "extract_images": True,
                "remove_header_footer": True
            }
        )
        print(result.content)

🛠️ 可用工具/端点

工具/端点 描述 输入格式 功能特性
convert_pdf_to_markdown PDF 转换,AI 驱动的文本提取 PDF OCR、布局检测、图片提取
convert_word_to_markdown Word 文档转换 DOCX, DOC 格式保持、图片提取
convert_excel_to_markdown 电子表格转换 XLSX, XLS 多工作表、公式支持
batch_convert_documents 批量处理 混合格式 并发处理
analyze_pdf_structure 文档结构分析 PDF 元数据提取
validate_document 文档验证 所有格式 格式验证
get_supported_formats 列出支持的格式 - 功能发现

🏗️ 架构设计

┌─────────────────────────┐  ┌─────────────────────────┐
│     MCP 客户端          │  │    HTTP 客户端          │
│  (Claude, IDE 等)       │  │  (Web, Mobile 等)       │
└─────────────────────────┘  └─────────────────────────┘
            │                            │
            ▼                            ▼
┌─────────────────────────────────────────────────────┐
│              Any2Markdown 服务器                    │
├─────────────────────────┬───────────────────────────┤
│     MCP 协议            │      RESTful API          │
│  (流式 HTTP)            │   (OpenAPI/Swagger)       │
└─────────────────────────┴───────────────────────────┘
            │                            │
            └─────────────┬──────────────┘
                          ▼
┌─────────────────────────────────────────────────────┐
│               共享后端                               │
├─────────────────────────────────────────────────────┤
│  文档处理器           │  模型管理器     │  工具模块    │
│  ├─ PDF (marker)      │  ├─ AI 模型     │  ├─ 文件    │
│  ├─ Word (python-docx)│  ├─ 缓存        │  ├─ 验证    │
│  └─ Excel (pandas)    │  └─ 内存        │  └─ 图片    │
└─────────────────────────────────────────────────────┘

📁 项目结构

any2markdown/
├── 📚 docs/                    # 文档
│   ├── README.md               # 项目概述
│   ├── technical-design.md     # 技术架构
│   ├── restful-api-design.md   # API 规范
│   └── requirements.md         # 需求分析
├── 💻 src/any2markdown_mcp/    # 源代码
│   ├── server.py               # 主服务器 (MCP + FastAPI)
│   ├── config.py               # 配置管理
│   ├── 🔧 tools/               # MCP 工具实现
│   │   ├── pdf_tools.py        # PDF 转换工具
│   │   ├── word_tools.py       # Word 转换工具
│   │   ├── excel_tools.py      # Excel 转换工具
│   │   └── utility_tools.py    # 实用工具
│   ├── 🌐 api/                 # RESTful API 层
│   │   ├── handlers.py         # API 端点
│   │   ├── models.py           # Pydantic 模型
│   │   └── utils.py            # API 工具
│   ├── ⚙️ processors/          # 文档处理器
│   │   ├── pdf_processor.py    # PDF 处理逻辑
│   │   ├── word_processor.py   # Word 处理逻辑
│   │   └── excel_processor.py  # Excel 处理逻辑
│   └── 🧠 models/              # AI 模型管理
│       └── model_manager.py    # 模型加载和缓存
├── 🧪 tests/                   # 测试文件
├── 🚀 scripts/                 # 部署脚本
│   └── deploy.sh               # 统一部署脚本
├── 📋 requirements.txt         # 依赖列表
├── 🏗️ pyproject.toml           # 项目配置
├── 🐳 Dockerfile               # Docker 配置
├── 🐳 docker-compose.yml       # Docker Compose 配置
└── 🚀 run_server.py            # 服务器启动脚本

⚙️ 配置

环境变量

# 服务器配置
MCP_SERVER_HOST=0.0.0.0
MCP_SERVER_PORT=3000

# 处理配置  
MAX_CONCURRENT_JOBS=3
MAX_FILE_SIZE=100MB
TEMP_IMAGE_DIR=./temp_images

# 模型配置
MODEL_CACHE_DIR=~/.cache/marker
USE_GPU=true

# Hugging Face模型缓存配置
HF_HOME=~/.cache/huggingface
HF_HUB_CACHE=~/.cache/huggingface/hub
HF_ASSETS_CACHE=~/.cache/huggingface/assets
TORCH_HOME=~/.cache/torch
TRANSFORMERS_CACHE=~/.cache/transformers

# 模型下载配置
HF_HUB_ENABLE_HF_TRANSFER=false
HF_HUB_DISABLE_PROGRESS_BARS=false
HF_HUB_DISABLE_TELEMETRY=true

# 日志配置
LOG_LEVEL=INFO
LOG_FILE=logs/server.log
DEBUG=false

部署选项

源码部署

# 基础部署
./scripts/deploy.sh source

# 开发模式,启用调试日志
./scripts/deploy.sh source --dev

# 自定义端口并禁用 GPU
./scripts/deploy.sh source -p 8080 --no-gpu

# 自定义环境文件
./scripts/deploy.sh source -e .env.production

Docker 部署

# 标准 Docker 部署
./scripts/deploy.sh docker

# GPU 加速部署(需要 NVIDIA Docker)
./scripts/deploy.sh docker-gpu

# 自定义端口
./scripts/deploy.sh docker -p 8080

# 开发模式
./scripts/deploy.sh docker --dev

模型缓存配置

为了避免每次重启容器都重新下载模型,建议配置模型缓存目录挂载:

# 1. 初始化模型缓存目录结构
./scripts/setup_model_cache.sh

# 2. 使用 Docker Compose(推荐)
docker-compose up -d

# 3. 或者手动指定挂载目录
docker run -d \
  -p 3000:3000 \
  -v ./models/marker:/home/appuser/.cache/marker \
  -v ./models/huggingface:/home/appuser/.cache/huggingface \
  -v ./models/torch:/home/appuser/.cache/torch \
  -v ./models/transformers:/home/appuser/.cache/transformers \
  -v ./logs:/app/logs \
  -v ./temp_images:/app/temp_images \
  --name any2markdown \
  any2markdown:latest

模型缓存说明:

  • 首次启动:系统会自动下载所需模型(约3-5GB),需要较长时间
  • 后续启动:使用缓存的模型,启动速度显著提升
  • 磁盘空间:建议预留至少10GB空间用于模型缓存
  • 网络要求:需要能够访问 Hugging Face Hub

服务管理

# 检查服务状态
./scripts/deploy.sh status

# 停止所有服务
./scripts/deploy.sh stop

# 清理资源
./scripts/deploy.sh cleanup

配置文件

创建 config.toml 或设置环境变量:

[server]
host = "0.0.0.0"
port = 3000
max_concurrent_jobs = 3

[processing]
max_file_size = "100MB"
temp_image_dir = "./temp_images"
enable_header_footer_removal = true

[models]
cache_dir = "~/.cache/marker"
enable_gpu = true
preload_models = true

# Hugging Face 模型缓存配置
hf_home = "~/.cache/huggingface"
hf_hub_cache = "~/.cache/huggingface/hub"
hf_assets_cache = "~/.cache/huggingface/assets"
torch_home = "~/.cache/torch"
transformers_cache = "~/.cache/transformers"

# 模型下载选项
hf_hub_enable_hf_transfer = false
hf_hub_disable_progress_bars = false
hf_hub_disable_telemetry = true

[logging]
level = "INFO"
file = "logs/server.log"

🧪 测试

# 运行所有测试
pytest

# 运行特定测试类别
pytest -m unit          # 单元测试
pytest -m integration   # 集成测试
pytest -m slow          # 需要模型加载的测试

# 运行覆盖率测试
pytest --cov=src/any2markdown_mcp --cov-report=html

# 测试特定功能
python test_restful_api.py      # REST API 测试
python test_streamable_client.py # MCP 协议测试

dify集成

支持在dify工作流中集成,即通过dify 默认的http节点即可实现文件转换,具体方法查阅dify集成

📊 性能

基准测试

  • PDF 转换:~2-5 秒/页(使用 GPU)
  • Word 转换:~0.5-2 秒/文档
  • Excel 转换:~0.1-1 秒/工作表
  • 并发请求:最多 3 个同时转换
  • 内存使用:~2-4GB(模型加载后)

优化建议

  • 为 PDF 处理启用 GPU 加速
  • 根据可用内存调整 MAX_CONCURRENT_JOBS
  • 为模型缓存使用 SSD 存储
  • 为大型文档配置适当的超时值

🤝 贡献

我们欢迎贡献!请查看我们的贡献指南

开发环境设置

# 安装开发依赖
pip install -e ".[dev]"

# 安装 pre-commit 钩子
pre-commit install

# 运行代码质量检查
black src/ tests/
isort src/ tests/  
mypy src/
flake8 src/
pytest

添加新文档类型

  1. src/any2markdown_mcp/processors/ 中创建处理器
  2. src/any2markdown_mcp/tools/ 中添加 MCP 工具
  3. src/any2markdown_mcp/api/ 中添加 API 端点
  4. 更新文档和测试

📄 API 文档

🔗 相关项目

📝 许可证

本项目使用 MIT 许可证 - 详见 LICENSE 文件。

🙋 支持

🎯 发展路线图

  • 支持 PowerPoint (PPTX) 转换
  • 图片类型PDF转换效果优化
  • Kubernetes 部署清单
  • 云存储集成

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

iflow_mcp_ww_ai_lab_any2markdown-1.0.0.tar.gz (968.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

File details

Details for the file iflow_mcp_ww_ai_lab_any2markdown-1.0.0.tar.gz.

File metadata

  • Download URL: iflow_mcp_ww_ai_lab_any2markdown-1.0.0.tar.gz
  • Upload date:
  • Size: 968.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for iflow_mcp_ww_ai_lab_any2markdown-1.0.0.tar.gz
Algorithm Hash digest
SHA256 ed3fe88a9854d66779f7bb4b6121273287fb5c0894e11b200318b56000a118af
MD5 21604aa1672da95ad3a175f6b316026d
BLAKE2b-256 6a483938481c52b754bbe4a4dd46fcf8b890f8494729b4c4c2a51e5ada1f52a2

See more details on using hashes here.

File details

Details for the file iflow_mcp_ww_ai_lab_any2markdown-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: iflow_mcp_ww_ai_lab_any2markdown-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 64.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for iflow_mcp_ww_ai_lab_any2markdown-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 90771e8d1fdb70ac6a9aa3d73ce7ac0e47eba37bba86d026ec5c615eaf13900b
MD5 6fab8d9ff1ab984c0f588f2ce6625060
BLAKE2b-256 7f06ef9dfa674859db89f05e3f49cdd5cba6e2ba50670160a100f32de16afdae

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page