带MCP的PDF仪表板
上传PDF,通过GLM-OCR(Ollama)/PyMuPDF提取文本,并使用本地LLM与文档聊天。一切都在你的机器上运行 奥拉玛 -不需要API密钥或互联网连接。
特性
- PDF提取 --通过PyMuPDF快速提取文本层;用于扫描/基于图像的PDF的自动GLM-OCR回退
- 根据RAG文件 --每个上传的PDF都有自己的Chroma矢量集合
- 本地LLM聊天 --Ollama提供的带有内联引用的代理问答;从下拉列表中选择任何已安装的Olama型号
- Markdown查看器 --浏览提取的文本、预览块并下载markdown
先决条件
设置
1.克隆存储库
git clone https://github.com/dakshp26/PDFDashboardWithMCP.git
cd PDFDashboardWithMCP2.安装依赖项
uv sync3.拉动Olama车型
ollama pull qwen2.5:3b # chat / agent (or any other chat model)
ollama pull nomic-embed-text # embeddings
ollama pull glm-ocr # OCR fallback (scanned PDFs)4.运行应用程序
uv run streamlit run app/main.py打开 http://localhost:8501 在您的浏览器中。
用法
- 上传PDF --转到上传PDF页面,选择一个PDF,等待提取管道完成
- 聊天 --切换到聊天页面,从下拉菜单中选择您的PDF和任何已安装的Ollama模型,并提出问题
项目结构
app/
├── main.py # Entry point, page navigation
├── app_pages/
│ ├── landing.py # Home / welcome page
│ ├── process_pdf_upload.py # Upload + pipeline UI
│ ├── pdf_library.py # Browse uploaded PDFs (read-only viewer)
│ └── process_pdf.py # Viewer + chat UI
└── process_pdf/
├── extract.py # PDF → Markdown (pymupdf4llm + GLM-OCR)
├── pipeline.py # Extraction pipeline with live progress
├── rag.py # Chunking, embeddings, Chroma persistence
└── agent.py # LangChain agent with retriever tool
mcp_server/
└── server.py # MCP server (list_documents, get_document)
data/ # Runtime data (gitignored)
├── process_pdf/ # Saved PDFs and extracted markdown
└── process_chroma/ # Chroma vector collections (one per PDF)\[!注意\] 有关每个文件、执行顺序和数据流的详细细分,请参阅 APP_STRUCTURE.md.
流线型仪表板
该应用程序是一个三页的Streamlit仪表板:
| 第页 | 描述 |
|---|---|
| 家 | 欢迎页面,提供快速入门概述 |
| 上传PDF | 选择一个PDF,观察提取管道实时运行(文本层→ OCR回退→ 分块→ 嵌入),然后下载提取的markdown |
| PDF库 | 浏览之前上传的所有PDF文件;视图提取的markdown和块预览,无需重新运行管道 |
| 聊天 | 选择一个索引的PDF和任何已安装的Ollama模型,提出问题,并通过内联源引用获得答案 |
管道进度在内部实时显示 st.status 块。处理PDF后,其矢量集合将保留在 data/process_chroma/,因此下一个会话会立即加载,而无需重新运行管道。
MCP服务器
附带的MCP服务器使用两个工具将矢量存储暴露给任何兼容MCP的客户端(Claude Desktop、Cursor等):
list_documents--返回所有索引文档集合get_document(document, query)--搜索集合并返回相关块
Claude Desktop
增添 claude_desktop_config.json (通常 %APPDATA%\Claude\claude_desktop_config.json 在Windows上),或使用 .mcp.json 在项目根目录中保持项目范围:
{
"mcpServers": {
"PDFDashboardWithMCP": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/PDFDashboardWithMCP", "mcp_server/server.py"]
}
}
}Cursor
增添 .cursor/mcp.json 在项目根目录(或全局 ~/.cursor/mcp.json):
{
"mcpServers": {
"PDFDashboardWithMCP": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/PDFDashboardWithMCP", "mcp_server/server.py"]
}
}
}Claude Code
推荐的方法是项目范围 .mcp.json 在存储库根目录中,这样服务器只对该项目有效,不会污染您的全局配置:
{
"mcpServers": {
"PDFDashboardWithMCP": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/PDFDashboardWithMCP", "mcp_server/server.py"]
}
}
}克劳德代码拿起 .mcp.json 打开项目时自动执行。无需额外设置。
替换 /absolute/path/to/PDFDashboardWithMCP 带有克隆存储库的绝对路径。
Ollama一定和他一起跑 nomic-embed-text 拉动MCP服务器加载集合。技术栈
| 组件 | 库 |
|---|---|
| UI | 流光显示 |
| PDF提取 | langchain-pymupdf4llm,PyMuPDF |
| OCR回退 | Ollama glm-OCR |
| 嵌入 | Ollama nomic嵌入文本 |
| 矢量存储 | 色度(langchain色度) |
| LLM/代理 | 任何Ollama聊天模式(例如qwen2.5:3b),LangChain |
| 包管理器 | uv |
| MCP服务器 | MCP\[cli\] |
