PDF RAG MCP服务器
使用队列感知的FastAPI后端、LanceDB矢量搜索、SQLite元数据和Chakra UI仪表板将大量PDF处理到检索增强生成(RAG)知识库中。模型上下文协议(MCP)层将相同的语料库呈现给代理和IDE,因此搜索结果在客户端之间保持一致。
特性
- 可配置的摄取管道,带有PyMuPDF或Docling解析和本地/OpenAI嵌入。
- 具有进度回调、SHA-256重复数据删除和元数据丰富功能的有界工作队列。
- REST、MCP和观察者共享的线程安全SQLite markdown存储库和LanceDB向量存储。
- 递归目录观察器,用于下一步的删除和进程摄取
/pdfs. - 提供REST端点、MCP传输和静态前端资产的统一FastAPI服务器。
- React+Chakra UI仪表板,用于队列监控和语义搜索。
建筑
src/
backend/
api.py # REST + MCP endpoints and job manager
processor.py # Queue, workers, parsing + embedding pipeline
config.py # Environment-driven settings
storage/ # SQLite MarkdownRepository + LanceDB VectorStore
parsers/ # PyMuPDF and Docling adapters
embeddings/ # EmbeddingManager (local / OpenAI)
frontend/
src/ # React + Chakra UI SPA
package.json快速启动
- 安装必备组件 –Python 3.11+、Node.js 20+、Docker(可选)、用于GPU摄取的NVIDIA容器工具包。
- Bootstrap后端
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt- 构建前端
cd src/frontend
npm install
npm run build- 在本地运行
uvicorn src.backend.api:app --host 0.0.0.0 --port 8000 --reload对于热重载UI开发,请运行 npm run dev 在 src/frontend (服务http://localhost:5173).否则,FastAPI将服务于 frontend/dist 直接捆绑。
配置
所有设置都是环境驱动的(请参见 .env.sample).
| 变量 | 默认值 | 用途 |
|---|---|---|
PDF_PARSER | pymupdf | 解析器后端(pymupdf 或 docling). |
EMBEDDING_BACKEND | local | local 句子变换器或 openai 远程嵌入。 |
SENTENCE_TRANSFORMER_MODEL | sentence-transformers/all-MiniLM-L6-v2 | 本地嵌入模型名称。 |
EMBEDDING_DEVICE | cpu | cpu 或 cuda;当 cuda,CUDA车轮在运行时安装。 |
OPENAI_BASE_URL / OPENAI_MODEL / OPENAI_API_KEY | – | 使用远程嵌入时需要。 |
DATABASE_URL | sqlite:///data/markdown.db | SQLite元数据存储。 |
VECTOR_STORE_PATH | data/vector_store | LanceDB目录。 |
DATA_DIR | data | 运行时工件的基本路径。 |
FRONTEND_DIST_PATH | frontend/dist | FastAPI提供的静态资产。 |
PROCESS_WORKERS | 4 | 工人线程数。 |
PROCESS_QUEUE_MAXSIZE | 100 | 背压前排队的最大任务数。 |
WATCH_ENABLED | true | 切换目录监视器。 |
WATCH_DIR | /pdfs | 递归扫描根文件夹以查找PDF。 |
WATCH_POLL_INTERVAL | 10 | 扫描之间的秒数。 |
MAX_PROCESS_ATTEMPTS | 10 | 在文件被列入黑名单之前失败。 |
存储凭据,例如 OPENAI_API_KEY 在 .env (被git忽略)或平台秘密存储。
处理管道
- 排队——上传、观察者发现和同步请求成为
ProcessingTasks在一个有界的队列中。 - 工作池——可配置的守护进程线程将任务排成队列,发出生命周期回调,并隔离故障。
- 元数据丰富——文件系统统计数据与调用者提供的元数据合并。
- 解析-PyMuPDF或Docling生成markdown。
- 重复数据消除-SHA-256哈希查找跳过重新摄取相同内容。
- 持久性-标记保存到SQLite;嵌入块被分块并添加到具有余弦索引的LanceDB中。
REST端点、MCP工具和观察器都流经此管道,以实现一致的行为。
目录监视器
- 默认启用(
WATCH_ENABLED=true). - 递归扫描
WATCH_DIR为了*.pdf文件夹。 - 在多次故障后跳过已存储或列入黑名单的路径。
- 将任务添加到共享队列中,以便观察程序处理尊重背压并发出进度事件。
- 通过设置禁用
WATCH_ENABLED=false或者通过环境变量调整轮询间隔/重试阈值。
REST+MCP接口
| 路径 | 方法 | 描述 |
|---|---|---|
/api/process | POST | 上传PDF(多部分)。返回作业描述符。 |
/api/process/status | GET | 队列,正在进行、已完成和失败的作业摘要。 |
/api/search | GET | 语义搜索(?query=...&top_k=5). |
/api/markdown | GET | 通过以下方式获取存储的降价 document_id 或 title. |
/.well-known/mcp/server | GET | MCP发现文档。 |
/mcp/tools/query_pdfs | POST | MCP搜索工具({"query": "...", "top_k": 5}). |
/mcp/tools/fetch_markdown | POST | MCP工具用于检索降价({"document_id": 1} 或 { "title": "..." }). |
Claude桌面配置:
{
"mcpServers": {
"pdf-rag": {
"type": "http",
"url": "http://localhost:8000"
}
}
}前端仪表板
npm run dev–Vite开发服务器,热重载。npm run build–FastAPI提供的生产捆绑包。npm run ci:build–TypeScript类型检查+构建(匹配CI)。
UI公开了一个处理队列选项卡(实时进度、重试、失败)和一个搜索选项卡,用于具有元数据预览的语义查询。
Docker工作流程
# Pull published image (recommended)
docker run --rm -p 8000:8000 ghcr.io/tekgnosis-net/pdf-rag-mcp:latest
# Build locally
docker build -t pdf-rag-mcp .
docker run --rm -p 8000:8000 pdf-rag-mcp
# Docker Compose (uses GHCR image by default)
docker compose up --buildGPU加速:
docker run --rm -p 8000:8000 --gpus all \
-e EMBEDDING_DEVICE=cuda \
ghcr.io/tekgnosis-net/pdf-rag-mcp:latest安装 ./data 到 /app/data 用于持久SQLite/LanceDB存储,并将主机文件夹映射到 /app/data/pdfs 给观察者喂食。
开发工作流程和CI奇偶校验
在推送之前,运行GitHub Actions强制执行的相同检查:
.venv/bin/ruff check .
.venv/bin/pytest -q
(cd src/frontend && npm ci && npm run ci:build)
docker build -t pdf-rag-mcp-local .这些步骤反映了 Test, Build and Publish 工作流(lint、pytest、前端类型检查/构建、Docker构建)。
故障排除
| 症状 | 建议的补救措施 |
|---|---|
sentence_transformers 缺少 | 安装可选依赖项或切换到 EMBEDDING_BACKEND=openai. |
| Watcher忽略文件 | 确认PDF文件在 WATCH_DIR,未列入黑名单,队列未满。 |
| 出现重复条目 | 确保源标记不同;重复数据消除对解析的内容哈希进行操作。 |
| OpenAI错误 | 验证 OPENAI_BASE_URL, OPENAI_MODEL,以及 OPENAI_API_KEY 价值观。 |
| 空搜索结果 | 检查嵌入创建日志,并确认LanceDB目录可写。 |
许可证
麻省理工学院许可证©2025项目贡献者
