文档到人工智能——基于MCP的文档查询系统
A生产就绪的RAG,作为模型上下文协议(MCP)服务器运行,使LLM(如Claude Desktop或支持MCP的任何其他LLM)能够使用语义搜索查询您的文档。根据文件夹结构按主题组织文档。 支持:PDF、Word、Excel、Markdown、PowerPoint、HTML、TXT、CSV。 支持的扩展名:.pdf、.docx、.doc、.xlsx、.xls、.xlsam、.xlsb、.md、.pptx、.html、.htm、.txt、.csv
用于文档检索的模型是全MiniLM-L6-v2,嵌入维度为384。
特性
- 从PDF、Word、Excel、Markdown、PowerPoint、HTML、TXT和CSV文档中提取文本
- 按主题组织文档(使用文件夹结构)
- 生成语义搜索的嵌入
- 将文档存储在矢量数据库(chromadb)中
- 向Claude公开MCP工具以搜索和检索文档
- 按主题/类别筛选搜索
- 跨不同主题处理具有相同文件名的多个文档
- 高级搜索:短语匹配、日期范围过滤、正则表达式模式匹配
- 智能分块:按段落、基于语义标题或基于标记的组块固定大小
- 保留标题/节结构,以便更智能地检索
- 可选的重新排序模型,以提高搜索质量
建筑
Documents (PDF, Word, Excel, Markdown, PowerPoint, HTML, TXT, CSV)
→ Text Extraction
→ Chunking (fixed/paragraph/heading/token)
→ Embeddings
→ chromadb (with topic tags)
↓
MCP Server Tools
↓
Claude文档结构
该系统旨在处理以文件夹结构组织的PDF,其中:
- 每个文件夹代表一个 话题 或 类别
- 该文件夹中的PDF会自动标记主题名称
- 正确处理不同文件夹中具有相同文件名的文档
示例结构:
pdfs/
├── Machine_Learning/
│ ├── neural_networks.pdf
│ ├── deep_learning.pdf
│ └── introduction.pdf
├── Python_Programming/
│ ├── basics.pdf
│ ├── advanced.pdf
│ └── introduction.pdf # Different from ML's introduction.pdf
└── Data_Science/
├── statistics.pdf
└── visualization.pdf1.安装,使用本地python
此项目使用 uv 用于快速、可靠的Python包管理。
安装uv(如果尚未安装)
# On macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# On Windows
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"安装并运行
uv sync # Install dependencies from pyproject.toml
python -m app.scan_all_my_documents # Ingest documents
python mcp_server.py # Start the MCP Server双重运输模式
MCP服务器现在正在运行 两种运输方式同时进行 (感谢FastMCP):
- stdio模式 -通过Claude Desktop进行本地连接
- HTTP/SSE模式 -用于通过HTTP进行远程连接
默认情况下,两者同时处于活动状态。服务器会自动公开:
- SSE端点:
http://localhost:38777/sse(用于建立连接) - 消息端点:
http://localhost:38777/messages/(用于发送请求)
您可以使用命令行参数或环境变量自定义HTTP传输:
# Using command line arguments
python mcp_server.py --host 0.0.0.0 --port 38777
# Or using environment variables
export MCP_HOST=0.0.0.0
export MCP_PORT=38777
python mcp_server.py脚本将:
- 递归扫描目录
- 从文件夹名称中检测主题
- 从每个PDF/Words/Markdown/Excel中提取文本并将其分块
- 用主题标记块
- 将所有内容存储在chromadb中
输出示例:
Found 15 PDF files
Base directory: /path/to/pdfs
Detected topics: Data_Science, Machine_Learning, Python_Programming
[1/15] Processing: neural_networks.pdf
Topic: Machine_Learning
✓ Added 45 chunks
...
INGESTION SUMMARY
==================
Total PDFs processed: 15
Successful: 15
Failed: 0
Total chunks added: 523
Documents per topic:
Data_Science: 4 documents, 156 chunks
Machine_Learning: 6 documents, 234 chunks
Python_Programming: 5 documents, 133 chunks添加到您的Claude桌面配置(%APPDATA%/Claude/claude_desktop_config.json):
对于stdio模式(本地):
{
"mcpServers": {
"docs-to-ai": {
"command": "python",
"args": ["C:/[UPDATE_PATH_TO_DOCS-TO-AI]/docs-to-ai/mcp_server.py"]
}
}
}对于HTTP/SSE模式(远程):
{
"mcpServers": {
"docs-to-ai": {
"url": "http://localhost:38777/sse",
"transport": "sse"
}
}
}2.使用Docker进行安装
你需要运行Docker桌面或Docker引擎。然后,只需将以下内容写入一个名为“docker compose.yaml”的文件中,它就会从docker Hub中拉取并运行镜像(镜像:https://hub.docker.com/r/dmeric/docs-to-ai ):
services:
docs-to-ai:
image: dmeric/docs-to-ai
container_name: docs-to-ai
volumes:
- ./cache/chromadb:/app/chromadb # chromadb database (persists the vector store)
- ./cache/doc_cache:/app/doc_cache # Document cache (persists extracted text)
- ./my-docs:/app/my-docs:ro # Documents directory (your PDFs and Word docs). Read-only to prevent accidental modifications
# Stdin/stdout - required for MCP protocol in stdio mode
stdin_open: true
tty: true
ports:
- "${MCP_PORT:-38777}:38777" # for http/sse transport, on http://localhost:38777/sse
# Restart policy
restart: unless-stopped
# # Resource limits (optional - adjust based on your needs)
# deploy:
# resources:
# limits:
# cpus: '2'
# memory: 4G
# reservations:
# cpus: '1'
# memory: 2G
然后在bash或Powershell中运行:
docker compose up -dDocker配置
这 docker-compose.yml 配置:
体积:
./cache/chromadb:/app/cache/chromadb-矢量存储数据库(持久)./cache/doc_cache:/app/cache/doc_cache-文档缓存(持久)./my-docs:/app/my-docs:ro-您的文档目录(只读)
端口:
38777-远程MCP连接的HTTP/SSE端点
环境变量:
FULL_SCAN_ON_BOOT-设置为True启动时扫描文档(默认值:False)FOLDER_WATCHER_ACTIVE_ON_BOOT-设置为True启动时启动文件夹监视器(默认值:True)MCP_PORT-自定义HTTP端口(默认值:38777)
自定义环境变量示例:
# Create a .env file
echo "FULL_SCAN_ON_BOOT=True" > .env
echo "FOLDER_WATCHER_ACTIVE_ON_BOOT=True" >> .env
echo "MCP_PORT=38777" >> .env
# Start with environment variables
docker compose up -d添加到您的Claude桌面配置(%APPDATA%/Claude/claude_desktop_config.json):
{
"mcpServers": {
"docs-to-ai": {
"command": "docker",
"args": [
"exec",
"-i",
"docs-to-ai",
"python",
"mcp_server.py"
]
}
}
}
最后,将您的文档放在文件夹/my-docs中,并要求服务器扫描文档,并可选择启动文件夹监视器。 现在,您应该能够就这些文件向法学硕士提出问题。
项目结构
mcp_server.py-主MCP服务器实现(基于FastMCP)app/document_processor.py-文档文本提取和分块(PDF、Word、Excel、Markdown)app/vector_store.py-矢量数据库操作(ChromaDB)app/scan_all_my_documents.py-批处理文档摄取脚本app/incremental_updater.py-增量文档更新逻辑app/folder_watcher.py-自动文件夹监控和更改检测app/config.py-配置设置pyproject.toml-Python依赖关系和项目元数据(使用uv)Dockerfile-Docker容器配置docker-compose.yml-Docker编写配置
MCP工具
服务器为LLM公开了以下工具:
搜索与发现:
search_documents-使用可选过滤器对所有文档进行语义搜索:
- topic -按主题/类别筛选 - phrase_search -精确短语匹配 - date_from / date_to -按last_modified时间戳过滤(Unix) - regex_pattern -按文本中的正则表达式模式过滤
list_documents-列出所有可用文档(带可选主题过滤器)list_topics-列出所有主题/类别get_collection_stats-获取有关集合的统计信息(文件类型、大小、计数)
文件管理:
scan_all_my_documents-手动触发完整文档扫描并重新索引start_watching_folder-通过增量更新启动自动文件夹监控stop_watching_folder-停止文件夹监视器get_time_of_last_folder_scan-检查上次扫描发生的时间和状态
Claude的查询示例
配置后,您可以询问Claude:
一般查询:
- “您可以访问哪些文件?”
- “有哪些可用的主题?”
- “搜索有关神经网络的信息”
- “显示收藏统计数据”
特定主题查询:
- “在Python_programming主题中搜索Python编程概念”
- “显示有关机器学习的所有文档”
- “在data_Science主题中查找有关数据可视化的信息”
复杂查询:
- “比较不同文档对深度学习的看法”
- “在所有文档中查找所有提及熊猫的内容”
- “Machine_Learning文档中的关键概念是什么?”
高级搜索(带过滤器):
- “搜索‘神经网络’作为精确短语”-短语搜索
- “查找2024-01-01之后修改的Python文档”-日期筛选
- “搜索与模式匹配的项目\\d{3}-\\d{4}“-正则表达式模式搜索
文件管理:
- “扫描我的所有文档”-触发完整的重新索引
- “开始查看我的文档文件夹是否有更改”-启用自动更新
- “上次扫描是什么时候?”-检查文件夹监控状态
- “停止监视文件夹”-禁用自动更新
配置
编辑 app/config.py 自定义:
文档处理:
SUPPORTED_EXTENSIONS-要处理的文件类型(默认值:.pdf,.docx,.doc,.md,.xlsx,.xls,.xlsam,.xlsb,.pptx,.html,.htm,.txt,.csv)CHUNKING_STRATEGY-分块策略:fixed_size,by_paragraph,semantic_heading,或by_token(默认值:by_paragraph)CHUNK_SIZE-每个块的字符数(或令牌,如果CHUNK_BY_TOKEN=true)(默认值:1000)CHUNK_OVERLAP-块之间的重叠(默认值:200)CHUNK_BY_TOKEN-使用基于令牌的分块,而不是基于字符的分块(env-var,默认值:False)TOKENIZER_MODEL-用于令牌分块的TikToken标记器(默认值:cl100k_base)PRESERVE_HEADINGS-保留块中的标题结构(env-var,默认值:True)MAX_HEADING_CHUNK_SIZE-每个基于标题的块的最大字符数(默认值:2000)
搜索配置:
DEFAULT_SEARCH_RESULTS-默认结果数(默认值:10)MAX_SEARCH_RESULTS-最大允许结果(默认值:20)USE_RERANKER-启用重新排序模型以改善结果(env-var,默认值:True)RERANKER_MODEL-重新排序模型名称(默认值:cross-encoder/ms-marco-MiniLM-L-6-v2)RERANKER_TOP_N-要重新排序的结果数(默认值:50)USE_BM25-使用BM25启用混合搜索(env-var,默认值:False)
嵌入模型:
EMBEDDING_MODEL-句子转换器模型(默认值:all-MiniLM-L6-v2)EMBEDDING_DIMENSION-矢量维度(默认值:384)
主题配置:
USE_FOLDER_AS_TOPIC-使用文件夹层次结构作为主题(默认:True)DEFAULT_TOPIC-未分类文档的默认主题(默认:uncategorized)TOPIC_SEPARATOR-层次主题的显示分隔符(默认值:>)
储存:
CHROMADB_DIR-矢量数据库位置(默认值:cache/chromadb)DOC_CACHE_DIR-文档缓存位置(默认值:cache/doc_cache)DOCS_DIR-文档目录(默认:my-docs,可通过以下方式配置DOCS_DIR任何人)CHROMA_COLLECTION_NAME-集合名称(默认值:my-documents)
启动行为:
FULL_SCAN_ON_BOOT-服务器启动时扫描文档(env-var,默认值:False)FOLDER_WATCHER_ACTIVE_ON_BOOT-启动时启动文件夹监视器(env-var,默认值:True)
服务器传输:
MCP_HOST-HTTP服务器主机(env-var,默认值:0.0.0.0)MCP_PORT-HTTP服务器端口(env-var,默认值:38777)
许可证
麻省理工学院
