🚀 MCP文档转换器
MCP(模型上下文协议)文档转换器是一款强大的MCP工具,可实现多种格式文档间的转换,助力AI智能体轻松完成文档格式转换。
🚀 快速开始
你可以通过以下方式安装MCP文档转换器:
📦 使用pip(推荐)
pip install mcp-document-converter
📦 从源代码安装
git clone https://github.com/xt765/mcp-document-converter.git
cd mcp-document-converter
pip install -e .
✨ 主要特性
- 多格式支持:支持5种主流文档格式,包括Markdown、HTML、DOCX、PDF和纯文本。
- 双向转换:任意格式均可转换为其他格式,共有5×5 = 25种转换组合。
- MCP协议兼容:符合MCP标准,可作为Trae IDE等AI助手的工具使用。
- 插件架构:便于扩展新的解析器和渲染器。
- 语法高亮:HTML和PDF输出支持代码语法高亮。
- 样式自定义:支持自定义CSS样式。
- 元数据保留:转换过程中保留文档标题、作者、创建时间等元数据。
📚 详细文档
用户指南 · API参考 · 贡献指南 · 更新日志 · 许可证
🔧 技术细节
架构
flowchart TB
subgraph Parsers["解析器"]
MD[Markdown]
DOCX1[DOCX]
HTML1[HTML]
PDF1[PDF]
TXT1[文本]
end
subgraph IR["中间表示 (IR)"]
DT[文档树]
META[元数据]
ASSETS[资源]
end
subgraph Renderers["渲染器"]
HTML2[HTML]
PDF2[PDF]
MD2[Markdown]
DOCX2[DOCX]
TXT2[文本]
end
MD --> IR
DOCX1 --> IR
HTML1 --> IR
PDF1 --> IR
TXT1 --> IR
IR --> HTML2
IR --> PDF2
IR --> MD2
IR --> DOCX2
IR --> TXT2
核心组件
- DocumentIR(中间表示):所有文档的统一抽象,包含文档树、元数据、资源等。
- BaseParser(解析器基类):定义解析器接口,将各种格式解析为DocumentIR。
- BaseRenderer(渲染器基类):定义渲染器接口,将DocumentIR渲染为各种格式。
- ConverterRegistry(注册表):管理所有解析器和渲染器,提供格式查找和自动匹配功能。
- DocumentConverter(转换引擎):协调解析器和渲染器完成文档转换。
支持的格式
输入格式(解析器)
| 格式 |
扩展名 |
MIME类型 |
特性 |
| Markdown |
.md, .markdown, .mdown, .mkd |
text/markdown |
YAML前置元数据,GFM扩展 |
| HTML |
.html, .htm |
text/html |
语义标签解析 |
| DOCX |
.docx |
application/vnd.openxmlformats-officedocument.wordprocessingml.document |
样式、表格、图像 |
| PDF |
.pdf |
application/pdf |
文本提取和结构识别 |
| 文本 |
.txt, .text |
text/plain |
自动编码检测和结构识别 |
输出格式(渲染器)
| 格式 |
扩展名 |
MIME类型 |
特性 |
| HTML |
.html |
text/html |
美观的样式,代码高亮,响应式设计 |
| Markdown |
.md |
text/markdown |
标准Markdown格式,YAML前置元数据 |
| DOCX |
.docx |
application/vnd.openxmlformats-officedocument.wordprocessingml.document |
Word文档格式,样式保留 |
| PDF |
.pdf |
application/pdf |
使用WeasyPrint生成,支持分页 |
| 文本 |
.txt |
text/plain |
纯文本,保留基本格式 |
转换矩阵
flowchart LR
subgraph Sources["源格式"]
MD_S[Markdown]
HTML_S[HTML]
DOCX_S[DOCX]
PDF_S[PDF]
TXT_S[文本]
end
subgraph Targets["目标格式"]
MD_T[Markdown]
HTML_T[HTML]
DOCX_T[DOCX]
PDF_T[PDF]
TXT_T[文本]
end
MD_S --> Targets
HTML_S --> Targets
DOCX_S --> Targets
PDF_S --> Targets
TXT_S --> Targets
💻 使用示例
作为MCP工具
配置完成后,AI助手可直接调用以下工具:
1. convert_document(推荐)
使用统一接口转换任何支持的文档类型。
convert_document(
source_path="document.md",
target_format="html"
)
convert_document(
source_path="document.html",
target_format="pdf"
)
convert_document(
source_path="document.docx",
target_format="markdown"
)
convert_document(
source_path="document.md",
target_format="html",
output_path="output.html",
options={
"css": "custom.css",
"preserve_metadata": True
}
)
2. list_supported_formats
列出所有支持的文档格式。
list_supported_formats()
3. get_conversion_matrix
获取完整的格式转换矩阵。
get_conversion_matrix()
4. can_convert
检查从源格式到目标格式的转换是否支持。
can_convert(source_format="markdown", target_format="pdf")
5. get_format_info
获取特定格式的详细信息。
get_format_info(format="markdown")
作为Python库
from mcp_document_converter import DocumentConverter
from mcp_document_converter.registry import get_registry
from mcp_document_converter.parsers import MarkdownParser, HTMLParser
from mcp_document_converter.renderers import HTMLRenderer, PDFRenderer
registry = get_registry()
registry.register_parser(MarkdownParser())
registry.register_parser(HTMLParser())
registry.register_renderer(HTMLRenderer())
registry.register_renderer(PDFRenderer())
converter = DocumentConverter(registry)
result = converter.convert(
source="input.md",
target_format="html",
output_path="output.html"
)
if result.success:
print(f"✅ 转换成功: {result.output_path}")
else:
print(f"❌ 转换失败: {result.error_message}")
📄 工具接口详情
convert_document
将文档从一种格式转换为另一种格式。
参数
| 参数 |
类型 |
是否必需 |
描述 |
source_path |
字符串 |
✅ |
源文件路径,支持绝对或相对路径 |
target_format |
字符串 |
✅ |
目标格式:html, pdf, markdown, docx, text |
output_path |
字符串 |
❌ |
输出文件路径(可选,默认为源文件名) |
source_format |
字符串 |
❌ |
源文件格式(可选,从文件扩展名自动检测) |
options |
对象 |
❌ |
转换选项 |
选项
| 选项 |
类型 |
默认值 |
描述 |
template |
字符串 |
- |
模板名称 |
css |
字符串 |
- |
自定义CSS样式 |
preserve_metadata |
布尔值 |
true |
是否保留元数据 |
extract_images |
布尔值 |
true |
是否提取图像 |
示例
{
"source_path": "/path/to/document.md",
"target_format": "html",
"output_path": "/path/to/output.html",
"options": {
"css": "body { font-family: Arial; }",
"preserve_metadata": true
}
}
🔌 扩展开发
添加新的解析器
from typing import List, Union
from pathlib import Path
from mcp_document_converter.core.parser import BaseParser
from mcp_document_converter.core.ir import DocumentIR, Node, NodeType
class MyParser(BaseParser):
@property
def supported_extensions(self) -> List[str]:
return [".myext"]
@property
def format_name(self) -> str:
return "myformat"
@property
def mime_types(self) -> List[str]:
return ["application/x-myformat"]
def parse(self, source: Union[str, Path, bytes], **options) -> DocumentIR:
content = self._read_source(source)
document = DocumentIR()
document.title = "My Document"
document.add_node(Node(
type=NodeType.PARAGRAPH,
content=[Node(type=NodeType.TEXT, content="Hello World")]
))
return document
添加新的渲染器
from typing import Any
from mcp_document_converter.core.renderer import BaseRenderer
from mcp_document_converter.core.ir import DocumentIR
class MyRenderer(BaseRenderer):
@property
def output_extension(self) -> str:
return ".myext"
@property
def format_name(self) -> str:
return "myformat"
@property
def mime_type(self) -> str:
return "application/x-myformat"
def render(self, document: DocumentIR, **options: Any) -> str:
parts = []
if document.title:
parts.append(f"# {document.title}")
for node in document.content:
pass
return "\n".join(parts)
注册扩展
from mcp_document_converter.registry import get_registry
registry = get_registry()
registry.register_parser(MyParser())
registry.register_renderer(MyRenderer())
🧪 测试
python tests/test_conversion.py
python tests/test_conversion.py::test_markdown_to_html
⚙️ 环境变量
| 变量 |
描述 |
默认值 |
MCP_CONVERTER_LOG_LEVEL |
日志级别 |
INFO |
MCP_CONVERTER_TEMP_DIR |
临时文件目录 |
系统临时目录 |
📦 依赖项
核心依赖项
mcp >= 1.26.0 - MCP协议实现
pydantic >= 2.12.5 - 数据验证
解析器依赖项
markdown >= 3.5.0 - Markdown解析
beautifulsoup4 >= 4.12.0 - HTML解析
python-docx >= 1.1.0 - DOCX解析
pypdf >= 6.7.4 - PDF解析
chardet >= 5.0.0 - 编码检测
pyyaml >= 6.0.0 - YAML解析
渲染器依赖项
weasyprint >= 60.0 - PDF渲染
pygments >= 2.17.0 - 代码高亮
jinja2 >= 3.1.6 - 模板引擎
reportlab >= 4.0.0 - PDF生成
开发依赖项
pytest >= 7.0.0 - 测试框架
pytest-asyncio >= 0.21.0 - 异步测试支持
pytest-cov >= 4.0.0 - 覆盖率报告
basedpyright >= 1.0.0 - 类型检查
ruff >= 0.1.0 - 代码检查和格式化
📄 许可证
本项目采用MIT许可证。
👥 贡献
欢迎提交问题和拉取请求!
🔗 相关项目