MarkItDown:微软开源的文档转换神器,让LLM轻松读懂你的世界
在AI时代,我们每天都在和大量文档打交道:PDF报告、Word合同、Excel表格、PPT演示、图片扫描件…这些格式各异的内容,对大型语言模型(LLM)来说却是一道门槛。
传统的文档解析工具要么收费昂贵(如LlamaParse),要么转换质量堪忧。微软在2024年12月开源的MarkItDown,用“轻量、开源、多格式、保留结构”的理念,迅速成为LLM文档预处理的事实标准。截至2026年4月,该项目已获得104,500+ Stars,单周增长超过8,000星,增速惊人。
MarkItDown的核心价值
|
|
|
|---|---|
| 多格式支持 |
|
| 结构保留 |
|
| LLM友好 |
|
| 轻量开源 |
|
| 插件生态 |
|
| MCP原生 |
|
二、快速上手:5分钟玩转MarkItDown
安装
MarkItDown支持Python 3.10+,推荐使用虚拟环境:
# 创建虚拟环境python -m venv .venvsource .venv/bin/activate # Windows: .venv\Scripts\activate# 安装全部依赖(推荐)pip install 'markitdown[all]'# 或按需安装(节省空间)pip install 'markitdown[pdf,docx,pptx]'
可选依赖包括:[pptx](PowerPoint)、[docx](Word)、[xlsx](Excel)、[pdf](PDF)、[audio-transcription](音频转录)、[youtube-transcription](YouTube字幕)等。
命令行使用
MarkItDown的CLI设计极其简洁,一条命令搞定转换:
# 基础转换markitdown report.pdf > report.md# 指定输出文件markitdown contract.docx -o contract.md# 管道操作(适合批量处理)cat presentation.pptx | markitdown# 启用插件markitdown --use-plugins scanned.pdf# 查看已安装插件markitdown --list-plugins
Python API使用
对于需要集成到应用或数据处理管道的场景,Python API更灵活:
from markitdown import MarkItDown# 基础转换md = MarkItDown(enable_plugins=False)result = md.convert("financial_report.xlsx")print(result.text_content)# 结合LLM进行图片描述(适用于PPT和图片)from openai import OpenAIclient = OpenAI()md = MarkItDown( llm_client=client, llm_model="gpt-4o", llm_prompt="请详细描述图片中的图表和数据")result = md.convert("chart.jpg")print(result.text_content)# 使用Azure文档智能(企业级精度)md = MarkItDown(docintel_endpoint="<your-endpoint>")result = md.convert("complex_layout.pdf")print(result.text_content)
三、MCP协议集成:让AI Agent直接读懂文档
Model Context Protocol(MCP)是Anthropic推出的开放协议,旨在让AI助手安全地访问外部工具和数据源。MarkItDown原生支持MCP,意味着Claude Desktop、Cursor等AI Agent可以直接读取PDF、Word等文件,无需手动转换。
3.1 三种传输模式
MarkItDown MCP服务器支持三种传输模式,适应不同场景:
|
|
|
|
|---|---|---|
| STDIO |
|
|
| Streamable HTTP |
|
|
| SSE |
|
|
3.2 Claude Desktop集成实战
步骤1:安装MCP服务器
pip install markitdown-mcp
步骤2:配置Claude Desktop
编辑~/Library/Application Support/Claude/claude_desktop_config.json(macOS)或%APPDATA%/Claude/claude_desktop_config.json(Windows):
{"mcpServers":{"markitdown":{"command":"markitdown-mcp","args":[]}}}
步骤3:重启Claude Desktop
完全退出并重新打开Claude Desktop后,即可直接上传PDF、Word等文件进行对话。
实际使用效果:
用户可以直接拖拽PDF到Claude Desktop对话框,Claude会自动调用MarkItDown MCP工具将文档转为Markdown后进行分析和回答。
3.3 Docker部署(生产环境推荐)
对于生产环境或需要隔离部署的场景,Docker是更好的选择:
{"mcpServers":{"markitdown":{"command":"docker","args":["run","--rm","-i","mcp/markitdown:latest"]}}}
如需访问本地文件,需要挂载目录:
{"mcpServers":{"markitdown":{"command":"docker","args":["run","--rm","-i","-v","/Users/username/documents:/workdir","mcp/markitdown:latest"]}}}
使用时,Claude需要通过file:///workdir/filename.pdf这样的路径访问文件。
3.4 HTTP/SSE模式部署
如需通过HTTP提供服务(适合远程访问或微服务架构):
# HTTP模式markitdown-mcp --transport http --host 127.0.0.1 --port 3001# SSE模式markitdown-mcp --transport sse --host 127.0.0.1 --port 8080
安全提示:生产环境务必绑定127.0.0.1(localhost),不要暴露0.0.0.0到公网。MCP服务器本身不提供认证机制,需要通过反向代理(如Nginx)添加认证层。
3.5 MCP Inspector调试工具
当MCP服务器无法正常工作时,可以使用MCP Inspector进行调试:
npx @modelcontextprotocol/inspector
在Inspector界面中:
-
选择STDIO传输模式 -
输入 markitdown-mcp作为命令 -
点击Connect连接 -
查看可用工具列表,测试 convert_to_markdown工具
Inspector会显示完整的请求/响应日志,帮助快速定位配置问题。
3.6 常见集成问题排查
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
pip install 'markitdown[all]' |
|
|
|
sudo usermod -aG docker $USER
|
四、AI Agent实战集成案例
4.1 LangChain自定义Document Loader
MarkItDown可以与LangChain无缝集成,作为自定义Document Loader使用:
from langchain.document_loaders import BaseLoaderfrom langchain.schema import Documentfrom markitdown import MarkItDownclassMarkItDownLoader(BaseLoader):"""基于MarkItDown的通用文档加载器"""def__init__(self, file_path: str, enable_plugins: bool = True):self.file_path = file_pathself.enable_plugins = enable_pluginsself.md = MarkItDown(enable_plugins=enable_plugins)defload(self) -> list[Document]:"""加载并转换文档""" result = self.md.convert(self.file_path)# 返回LangChain Document对象return [Document( page_content=result.text_content, metadata={"source":self.file_path,"title": result.title, **result.metadata } )]# 使用示例loader = MarkItDownLoader("annual_report.pdf")docs = loader.load()# 接入RAG流水线from langchain.text_splitter import MarkdownHeaderTextSplittersplitter = MarkdownHeaderTextSplitter( headers_to_split_on=[("#", "Header 1"), ("##", "Header 2")])chunks = splitter.split_text(docs[0].page_content)
实战优势:相比LangChain原生的UnstructuredFileLoader,MarkItDown加载速度更快(实测比Unstructured快2-5倍),且直接输出Markdown格式,更适合后续的分块和向量化处理。
4.2 批量文档处理Pipeline
企业级知识库构建通常需要批量处理大量文档:
import osfrom pathlib import Pathfrom concurrent.futures import ThreadPoolExecutorfrom markitdown import MarkItDowndefprocess_document(file_path: Path) -> dict:"""处理单个文档""" md = MarkItDown(enable_plugins=True)try: result = md.convert(str(file_path))return {"source":str(file_path),"content": result.text_content,"title": result.title,"status":"success" }except Exception as e:return {"source":str(file_path),"error":str(e),"status":"failed" }defbatch_process(directory: str, max_workers: int = 4):"""批量处理目录中的所有文档"""# 支持的文件格式 extensions = {".pdf", ".docx", ".pptx", ".xlsx", ".html", ".csv"}# 收集所有文件 files = [ f for f in Path(directory).rglob("*")if f.suffix.lower() in extensions ]print(f"发现 {len(files)} 个待处理文档")# 并行处理 results = []with ThreadPoolExecutor(max_workers=max_workers) as executor: results = list(executor.map(process_document, files))# 统计结果 success = sum(1for r in results if r["status"] == "success") failed = sum(1for r in results if r["status"] == "failed")print(f"处理完成:成功 {success},失败 {failed}")return results# 执行批量转换results = batch_process("./company_docs", max_workers=8)
性能实测:在4核8GB服务器上,MarkItDown处理一个50页的PDF平均耗时0.8-1.2秒,比Unstructured的2-3秒有显著提升。
4.3 Cursor编辑器集成
Cursor作为AI原生代码编辑器,也可以通过MCP集成MarkItDown:
方式1:使用Smithery一键安装
npx -y @smithery/cli install @KorigamiK/markitdown_mcp_server --client cursor
方式2:手动配置
在Cursor设置中添加MCP服务器配置:
{"mcpServers":{"markitdown":{"command":"markitdown-mcp"}}}
配置后,在Cursor的AI对话框中可以直接引用项目中的文档文件,Cursor会自动调用MarkItDown进行解析。
4.4 Zed编辑器集成
Zed编辑器同样支持MCP协议,配置方式:
{"context_servers":{"markitdown_mcp":{"settings":{},"command":{"path":"uv","args":["--directory","/path/to/markitdown_mcp_server","run","markitdown-mcp"]}}}}
4.5 Railway云部署(REST API + MCP双模式)
对于需要云原生部署的场景,可以使用markitdown-mcp-rest项目,同时提供REST API和MCP服务:
一键部署到Railway:
# 使用Railway模板部署# 访问:https://railway.com/deploy/markitdown-mcp-rest
部署后提供:
- REST API:
POST /convert
接收文件上传或URL,返回Markdown - MCP端点:
通过SSE传输模式接入AI Agent - 健康检查:
GET /health
用于监控 - Bearer Token认证:
自动生成的访问令牌
API调用示例:
# 文件上传转换curl -X POST https://your-app.railway.app/convert \ -H "Authorization: Bearer YOUR_TOKEN" \ -F "file=@document.pdf"# URL转换curl -X POST https://your-app.railway.app/convert \ -H "Authorization: Bearer YOUR_TOKEN" \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com/report.pdf"}'
定价:$0.01每次Actor启动 + $0.02每次文档转换,无订阅费。
五、RAG系统实战:从文档到向量库
5.1 完整知识库构建Pipeline
import osfrom markitdown import MarkItDownfrom langchain.text_splitter import MarkdownHeaderTextSplitterfrom langchain.embeddings import OpenAIEmbeddingsfrom langchain.vectorstores import ChromaclassKnowledgeBaseBuilder:"""企业知识库构建器"""def__init__(self, persist_dir: str = "./chroma_db"):self.md = MarkItDown(enable_plugins=True)self.embeddings = OpenAIEmbeddings()self.persist_dir = persist_dirself.vectorstore = Nonedefingest_document(self, file_path: str) -> list:"""摄取单个文档"""# 1. MarkItDown转换 result = self.md.convert(file_path)# 2. Markdown标题分块 splitter = MarkdownHeaderTextSplitter( headers_to_split_on=[ ("#", "Header 1"), ("##", "Header 2"), ("###", "Header 3") ] ) chunks = splitter.split_text(result.text_content)# 3. 添加元数据for chunk in chunks: chunk.metadata.update({"source": file_path,"title": result.title,"doc_type": os.path.splitext(file_path)[1] })return chunksdefbuild_kb(self, docs_dir: str):"""构建知识库""" all_chunks = []for root, dirs, files in os.walk(docs_dir):for file in files:if file.endswith(('.pdf', '.docx', '.pptx', '.xlsx')): file_path = os.path.join(root, file)try: chunks = self.ingest_document(file_path) all_chunks.extend(chunks)print(f"✓ 已处理: {file}")except Exception as e:print(f"✗ 失败: {file} - {e}")# 存入向量数据库self.vectorstore = Chroma.from_documents( documents=all_chunks, embedding=self.embeddings, persist_directory=self.persist_dir )self.vectorstore.persist()print(f"知识库构建完成,共 {len(all_chunks)} 个文档块")returnself.vectorstoredefquery(self, question: str, k: int = 5):"""查询知识库"""ifnotself.vectorstore:self.vectorstore = Chroma( persist_directory=self.persist_dir, embedding_function=self.embeddings ) results = self.vectorstore.similarity_search(question, k=k)return results# 使用builder = KnowledgeBaseBuilder()builder.build_kb("./company_docs")# 查询results = builder.query("2024年Q3营收是多少?")for doc in results:print(f"来源: {doc.metadata['source']}")print(f"内容: {doc.page_content[:500]}...")print()
5.2 与LlamaIndex集成
LlamaIndex是另一个流行的RAG框架,MarkItDown同样可以轻松集成:
from llama_index.core import Document, VectorStoreIndexfrom llama_index.core.node_parser import MarkdownNodeParserfrom markitdown import MarkItDown# MarkItDown转换md = MarkItDown()result = md.convert("report.pdf")# 创建LlamaIndex Documentdoc = Document( text=result.text_content, metadata={"source":"report.pdf", "title": result.title})# Markdown感知分块parser = MarkdownNodeParser()nodes = parser.get_nodes_from_documents([doc])# 构建索引index = VectorStoreIndex(nodes)# 查询query_engine = index.as_query_engine()response = query_engine.query("总结这份报告的主要发现")print(response)
六、进阶技巧与最佳实践
6.1 自定义输出格式
MarkItDown返回的DocumentConverterResult对象包含丰富元数据:
result = md.convert("document.pdf")print(result.text_content) # Markdown文本print(result.title) # 文档标题print(result.url) # 来源URLprint(result.metadata) # 完整元数据字典
6.2 开发自定义插件
MarkItDown提供完善的插件开发接口,参考packages/markitdown-sample-plugin:
from markitdown import DocumentConverter, DocumentConverterResultclassMyCustomConverter(DocumentConverter):defconvert(self, file_path: str) -> DocumentConverterResult:# 实现自定义转换逻辑withopen(file_path, 'rb') as f: content = self._parse_custom_format(f)return DocumentConverterResult( title="Custom Doc", text_content=content )defaccepts(self, file_path: str, mimetype: str = None) -> bool:return file_path.endswith('.custom')
6.3 性能优化建议
|
|
|
|---|---|
|
|
ThreadPoolExecutor批量处理文档 |
|
|
|
|
|
|
|
|
[all]带来的臃肿 |
七、性能对比与选型建议
|
|
|
|
|
|
|
|---|---|---|---|---|---|
| MarkItDown |
|
|
|
|
|
| Marker |
|
|
|
|
|
| LlamaParse |
|
|
|
|
|
| PyMuPDF4LLM |
|
|
|
|
|
| Unstructured |
|
|
|
|
|
选型建议:
- 需要AI Agent集成:
MarkItDown原生MCP支持是独特优势 - 快速原型/个人项目:
MarkItDown开箱即用,依赖轻量 - 学术论文/科研文献:
Marker的公式和表格处理更精准 - 企业生产环境:
考虑LlamaParse的API稳定性或Azure文档智能 - 完全离线场景:
MarkItDown本地运行,无云端依赖
八、写在最后
MarkItDown的爆发式增长(单周+8,000 Stars)反映了AI应用开发的底层需求:让LLM能够无缝接入人类现有的文档资产。它不完美(复杂表格和公式的处理不如专业工具),但足够好用、足够开放、足够轻量。
MCP协议的原生支持更是让它在AI Agent时代占据先机——当Claude Desktop、Cursor等工具可以直接调用MarkItDown读取PDF时,文档处理的”最后一公里”问题被彻底打通。
正如项目文档所言:
“Markdown is extremely close to plain text, with minimal markup or formatting, but still provides a way to represent important document structure. Mainstream LLMs natively ‘speak’ Markdown.”
在LLM逐渐成为基础设施的今天,MarkItDown正在成为连接”人类文档世界”与”AI理解世界”的标准桥梁。如果你正在构建RAG应用、知识库系统或任何需要处理文档的AI产品,它值得成为你的首选工具。
参考链接:
-
GitHub:https://github.com/microsoft/markitdown -
官方文档:https://microsoft.github.io/markitdown/ -
PyPI:https://pypi.org/project/markitdown/ -
MCP集成:https://github.com/microsoft/markitdown-mcp -
Railway部署:https://railway.com/deploy/markitdown-mcp-rest
2026年4月16日,来自于GitHub Trending、官方文档及社区实战案例整理
MarkItDown:微软开源的文档转换神器,让LLM轻松读懂你的世界
总⭐:104.5k | 近7天增长:+8,202⭐ | 近30天增长:+15,000⭐+
一、为什么需要MarkItDown?
在AI时代,我们每天都在和大量文档打交道:PDF报告、Word合同、Excel表格、PPT演示、图片扫描件…这些格式各异的内容,对大型语言模型(LLM)来说却是一道门槛。
传统的文档解析工具要么收费昂贵(如LlamaParse),要么转换质量堪忧。微软在2024年12月开源的MarkItDown,用“轻量、开源、多格式、保留结构”的理念,迅速成为LLM文档预处理的事实标准。截至2026年4月,该项目已获得104,500+ Stars,单周增长超过8,000星,增速惊人。
MarkItDown的核心价值
|
|
|
|---|---|
| 多格式支持 |
|
| 结构保留 |
|
| LLM友好 |
|
| 轻量开源 |
|
| 插件生态 |
|
| MCP原生 |
|
二、快速上手:5分钟玩转MarkItDown
安装
MarkItDown支持Python 3.10+,推荐使用虚拟环境:
# 创建虚拟环境python -m venv .venvsource .venv/bin/activate # Windows: .venv\Scripts\activate# 安装全部依赖(推荐)pip install 'markitdown[all]'# 或按需安装(节省空间)pip install 'markitdown[pdf,docx,pptx]'
可选依赖包括:[pptx](PowerPoint)、[docx](Word)、[xlsx](Excel)、[pdf](PDF)、[audio-transcription](音频转录)、[youtube-transcription](YouTube字幕)等。
命令行使用
MarkItDown的CLI设计极其简洁,一条命令搞定转换:
# 基础转换markitdown report.pdf > report.md# 指定输出文件markitdown contract.docx -o contract.md# 管道操作(适合批量处理)cat presentation.pptx | markitdown# 启用插件markitdown --use-plugins scanned.pdf# 查看已安装插件markitdown --list-plugins
Python API使用
对于需要集成到应用或数据处理管道的场景,Python API更灵活:
from markitdown import MarkItDown# 基础转换md = MarkItDown(enable_plugins=False)result = md.convert("financial_report.xlsx")print(result.text_content)# 结合LLM进行图片描述(适用于PPT和图片)from openai import OpenAIclient = OpenAI()md = MarkItDown( llm_client=client, llm_model="gpt-4o", llm_prompt="请详细描述图片中的图表和数据")result = md.convert("chart.jpg")print(result.text_content)# 使用Azure文档智能(企业级精度)md = MarkItDown(docintel_endpoint="<your-endpoint>")result = md.convert("complex_layout.pdf")print(result.text_content)
三、MCP协议集成:让AI Agent直接读懂文档
Model Context Protocol(MCP)是Anthropic推出的开放协议,旨在让AI助手安全地访问外部工具和数据源。MarkItDown原生支持MCP,意味着Claude Desktop、Cursor等AI Agent可以直接读取PDF、Word等文件,无需手动转换。
3.1 三种传输模式
MarkItDown MCP服务器支持三种传输模式,适应不同场景:
|
|
|
|
|---|---|---|
| STDIO |
|
|
| Streamable HTTP |
|
|
| SSE |
|
|
3.2 Claude Desktop集成实战
步骤1:安装MCP服务器
pip install markitdown-mcp
步骤2:配置Claude Desktop
编辑~/Library/Application Support/Claude/claude_desktop_config.json(macOS)或%APPDATA%/Claude/claude_desktop_config.json(Windows):
{"mcpServers":{"markitdown":{"command":"markitdown-mcp","args":[]}}}
步骤3:重启Claude Desktop
完全退出并重新打开Claude Desktop后,即可直接上传PDF、Word等文件进行对话。
实际使用效果:
用户可以直接拖拽PDF到Claude Desktop对话框,Claude会自动调用MarkItDown MCP工具将文档转为Markdown后进行分析和回答。
3.3 Docker部署(生产环境推荐)
对于生产环境或需要隔离部署的场景,Docker是更好的选择:
{"mcpServers":{"markitdown":{"command":"docker","args":["run","--rm","-i","mcp/markitdown:latest"]}}}
如需访问本地文件,需要挂载目录:
{"mcpServers":{"markitdown":{"command":"docker","args":["run","--rm","-i","-v","/Users/username/documents:/workdir","mcp/markitdown:latest"]}}}
使用时,Claude需要通过file:///workdir/filename.pdf这样的路径访问文件。
3.4 HTTP/SSE模式部署
如需通过HTTP提供服务(适合远程访问或微服务架构):
# HTTP模式markitdown-mcp --transport http --host 127.0.0.1 --port 3001# SSE模式markitdown-mcp --transport sse --host 127.0.0.1 --port 8080
安全提示:生产环境务必绑定127.0.0.1(localhost),不要暴露0.0.0.0到公网。MCP服务器本身不提供认证机制,需要通过反向代理(如Nginx)添加认证层。
3.5 MCP Inspector调试工具
当MCP服务器无法正常工作时,可以使用MCP Inspector进行调试:
npx @modelcontextprotocol/inspector
在Inspector界面中:
-
选择STDIO传输模式 -
输入 markitdown-mcp作为命令 -
点击Connect连接 -
查看可用工具列表,测试 convert_to_markdown工具
Inspector会显示完整的请求/响应日志,帮助快速定位配置问题。
3.6 常见集成问题排查
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
pip install 'markitdown[all]' |
|
|
|
sudo usermod -aG docker $USER
|
四、AI Agent实战集成案例
4.1 LangChain自定义Document Loader
MarkItDown可以与LangChain无缝集成,作为自定义Document Loader使用:
from langchain.document_loaders import BaseLoaderfrom langchain.schema import Documentfrom markitdown import MarkItDownclassMarkItDownLoader(BaseLoader):"""基于MarkItDown的通用文档加载器"""def__init__(self, file_path: str, enable_plugins: bool = True):self.file_path = file_pathself.enable_plugins = enable_pluginsself.md = MarkItDown(enable_plugins=enable_plugins)defload(self) -> list[Document]:"""加载并转换文档""" result = self.md.convert(self.file_path)# 返回LangChain Document对象return [Document( page_content=result.text_content, metadata={"source":self.file_path,"title": result.title, **result.metadata } )]# 使用示例loader = MarkItDownLoader("annual_report.pdf")docs = loader.load()# 接入RAG流水线from langchain.text_splitter import MarkdownHeaderTextSplittersplitter = MarkdownHeaderTextSplitter( headers_to_split_on=[("#", "Header 1"), ("##", "Header 2")])chunks = splitter.split_text(docs[0].page_content)
实战优势:相比LangChain原生的UnstructuredFileLoader,MarkItDown加载速度更快(实测比Unstructured快2-5倍),且直接输出Markdown格式,更适合后续的分块和向量化处理。
4.2 批量文档处理Pipeline
企业级知识库构建通常需要批量处理大量文档:
import osfrom pathlib import Pathfrom concurrent.futures import ThreadPoolExecutorfrom markitdown import MarkItDowndefprocess_document(file_path: Path) -> dict:"""处理单个文档""" md = MarkItDown(enable_plugins=True)try: result = md.convert(str(file_path))return {"source":str(file_path),"content": result.text_content,"title": result.title,"status":"success" }except Exception as e:return {"source":str(file_path),"error":str(e),"status":"failed" }defbatch_process(directory: str, max_workers: int = 4):"""批量处理目录中的所有文档"""# 支持的文件格式 extensions = {".pdf", ".docx", ".pptx", ".xlsx", ".html", ".csv"}# 收集所有文件 files = [ f for f in Path(directory).rglob("*")if f.suffix.lower() in extensions ]print(f"发现 {len(files)} 个待处理文档")# 并行处理 results = []with ThreadPoolExecutor(max_workers=max_workers) as executor: results = list(executor.map(process_document, files))# 统计结果 success = sum(1for r in results if r["status"] == "success") failed = sum(1for r in results if r["status"] == "failed")print(f"处理完成:成功 {success},失败 {failed}")return results# 执行批量转换results = batch_process("./company_docs", max_workers=8)
性能实测:在4核8GB服务器上,MarkItDown处理一个50页的PDF平均耗时0.8-1.2秒,比Unstructured的2-3秒有显著提升。
4.3 Cursor编辑器集成
Cursor作为AI原生代码编辑器,也可以通过MCP集成MarkItDown:
方式1:使用Smithery一键安装
npx -y @smithery/cli install @KorigamiK/markitdown_mcp_server --client cursor
方式2:手动配置
在Cursor设置中添加MCP服务器配置:
{"mcpServers":{"markitdown":{"command":"markitdown-mcp"}}}
配置后,在Cursor的AI对话框中可以直接引用项目中的文档文件,Cursor会自动调用MarkItDown进行解析。
4.4 Zed编辑器集成
Zed编辑器同样支持MCP协议,配置方式:
{"context_servers":{"markitdown_mcp":{"settings":{},"command":{"path":"uv","args":["--directory","/path/to/markitdown_mcp_server","run","markitdown-mcp"]}}}}
4.5 Railway云部署(REST API + MCP双模式)
对于需要云原生部署的场景,可以使用markitdown-mcp-rest项目,同时提供REST API和MCP服务:
一键部署到Railway:
# 使用Railway模板部署# 访问:https://railway.com/deploy/markitdown-mcp-rest
部署后提供:
- REST API:
POST /convert
接收文件上传或URL,返回Markdown - MCP端点:
通过SSE传输模式接入AI Agent - 健康检查:
GET /health
用于监控 - Bearer Token认证:
自动生成的访问令牌
API调用示例:
# 文件上传转换curl -X POST https://your-app.railway.app/convert \ -H "Authorization: Bearer YOUR_TOKEN" \ -F "file=@document.pdf"# URL转换curl -X POST https://your-app.railway.app/convert \ -H "Authorization: Bearer YOUR_TOKEN" \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com/report.pdf"}'
定价:$0.01每次Actor启动 + $0.02每次文档转换,无订阅费。
五、RAG系统实战:从文档到向量库
5.1 完整知识库构建Pipeline
import osfrom markitdown import MarkItDownfrom langchain.text_splitter import MarkdownHeaderTextSplitterfrom langchain.embeddings import OpenAIEmbeddingsfrom langchain.vectorstores import ChromaclassKnowledgeBaseBuilder:"""企业知识库构建器"""def__init__(self, persist_dir: str = "./chroma_db"):self.md = MarkItDown(enable_plugins=True)self.embeddings = OpenAIEmbeddings()self.persist_dir = persist_dirself.vectorstore = Nonedefingest_document(self, file_path: str) -> list:"""摄取单个文档"""# 1. MarkItDown转换 result = self.md.convert(file_path)# 2. Markdown标题分块 splitter = MarkdownHeaderTextSplitter( headers_to_split_on=[ ("#", "Header 1"), ("##", "Header 2"), ("###", "Header 3") ] ) chunks = splitter.split_text(result.text_content)# 3. 添加元数据for chunk in chunks: chunk.metadata.update({"source": file_path,"title": result.title,"doc_type": os.path.splitext(file_path)[1] })return chunksdefbuild_kb(self, docs_dir: str):"""构建知识库""" all_chunks = []for root, dirs, files in os.walk(docs_dir):for file in files:if file.endswith(('.pdf', '.docx', '.pptx', '.xlsx')): file_path = os.path.join(root, file)try: chunks = self.ingest_document(file_path) all_chunks.extend(chunks)print(f"✓ 已处理: {file}")except Exception as e:print(f"✗ 失败: {file} - {e}")# 存入向量数据库self.vectorstore = Chroma.from_documents( documents=all_chunks, embedding=self.embeddings, persist_directory=self.persist_dir )self.vectorstore.persist()print(f"知识库构建完成,共 {len(all_chunks)} 个文档块")returnself.vectorstoredefquery(self, question: str, k: int = 5):"""查询知识库"""ifnotself.vectorstore:self.vectorstore = Chroma( persist_directory=self.persist_dir, embedding_function=self.embeddings ) results = self.vectorstore.similarity_search(question, k=k)return results# 使用builder = KnowledgeBaseBuilder()builder.build_kb("./company_docs")# 查询results = builder.query("2024年Q3营收是多少?")for doc in results:print(f"来源: {doc.metadata['source']}")print(f"内容: {doc.page_content[:500]}...")print()
5.2 与LlamaIndex集成
LlamaIndex是另一个流行的RAG框架,MarkItDown同样可以轻松集成:
from llama_index.core import Document, VectorStoreIndexfrom llama_index.core.node_parser import MarkdownNodeParserfrom markitdown import MarkItDown# MarkItDown转换md = MarkItDown()result = md.convert("report.pdf")# 创建LlamaIndex Documentdoc = Document( text=result.text_content, metadata={"source":"report.pdf", "title": result.title})# Markdown感知分块parser = MarkdownNodeParser()nodes = parser.get_nodes_from_documents([doc])# 构建索引index = VectorStoreIndex(nodes)# 查询query_engine = index.as_query_engine()response = query_engine.query("总结这份报告的主要发现")print(response)
六、进阶技巧与最佳实践
6.1 自定义输出格式
MarkItDown返回的DocumentConverterResult对象包含丰富元数据:
result = md.convert("document.pdf")print(result.text_content) # Markdown文本print(result.title) # 文档标题print(result.url) # 来源URLprint(result.metadata) # 完整元数据字典
6.2 开发自定义插件
MarkItDown提供完善的插件开发接口,参考packages/markitdown-sample-plugin:
from markitdown import DocumentConverter, DocumentConverterResultclassMyCustomConverter(DocumentConverter):defconvert(self, file_path: str) -> DocumentConverterResult:# 实现自定义转换逻辑withopen(file_path, 'rb') as f: content = self._parse_custom_format(f)return DocumentConverterResult( title="Custom Doc", text_content=content )defaccepts(self, file_path: str, mimetype: str = None) -> bool:return file_path.endswith('.custom')
6.3 性能优化建议
|
|
|
|---|---|
|
|
ThreadPoolExecutor批量处理文档 |
|
|
|
|
|
|
|
|
[all]带来的臃肿 |
七、性能对比与选型建议
|
|
|
|
|
|
|
|---|---|---|---|---|---|
| MarkItDown |
|
|
|
|
|
| Marker |
|
|
|
|
|
| LlamaParse |
|
|
|
|
|
| PyMuPDF4LLM |
|
|
|
|
|
| Unstructured |
|
|
|
|
|
选型建议:
- 需要AI Agent集成:
MarkItDown原生MCP支持是独特优势 - 快速原型/个人项目:
MarkItDown开箱即用,依赖轻量 - 学术论文/科研文献:
Marker的公式和表格处理更精准 - 企业生产环境:
考虑LlamaParse的API稳定性或Azure文档智能 - 完全离线场景:
MarkItDown本地运行,无云端依赖
八、写在最后
MarkItDown的爆发式增长(单周+8,000 Stars)反映了AI应用开发的底层需求:让LLM能够无缝接入人类现有的文档资产。它不完美(复杂表格和公式的处理不如专业工具),但足够好用、足够开放、足够轻量。
MCP协议的原生支持更是让它在AI Agent时代占据先机——当Claude Desktop、Cursor等工具可以直接调用MarkItDown读取PDF时,文档处理的”最后一公里”问题被彻底打通。
正如项目文档所言:
“Markdown is extremely close to plain text, with minimal markup or formatting, but still provides a way to represent important document structure. Mainstream LLMs natively ‘speak’ Markdown.”
在LLM逐渐成为基础设施的今天,MarkItDown正在成为连接”人类文档世界”与”AI理解世界”的标准桥梁。如果你正在构建RAG应用、知识库系统或任何需要处理文档的AI产品,它值得成为你的首选工具。
参考链接:
-
GitHub:https://github.com/microsoft/markitdown -
官方文档:https://microsoft.github.io/markitdown/ -
PyPI:https://pypi.org/project/markitdown/ -
MCP集成:https://github.com/microsoft/markitdown-mcp -
Railway部署:https://railway.com/deploy/markitdown-mcp-rest
夜雨聆风