mcpField
D
docsift

docsift

本地服务
github.com/anishmoncivarghese记忆与知识711 周前更新

关于 docsift

DocSift 是面向希望 Agent 检索带出处段落、又不将文件发送到云端服务的用户的本地文档转换与搜索工具。它会索引转换后的文档,并返回带页码和章节标题的相关摘录。

主要功能

  1. 01将文档转换为 Markdown
  2. 02索引文档以供后续查询
  3. 03返回带出处的相关段落
  4. 04使用 Docling 处理 PDF
  5. 05使用 MarkItDown 处理其他格式

适用场景

  1. 01在长篇 PDF 中查找条款
  2. 02不粘贴报告也能提问
  3. 03从本地文档检索可引用章节

MCP 相关

DocSift 通过 stdio 提供 MCP 服务,包含 `search_document` 和 `convert_document` 工具。MCP 客户端可搜索并索引本地文件。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"anishmoncivarghese-docsift": {
"command": "uvx",
"args": [
"docsift"
]
}
}
}
启动命令uvx docsift

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypidocsift0.5.7

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

DocSift

文档只需转换一次。只向 Agent 提供所需内容。

mcp-name: io.github.anishmoncivarghese/docsift

300 页的 PDF 无法放进大模型的上下文窗口;即使放得下,粘贴进去也会很昂贵。DocSift 会将文档转换为整洁的 Markdown、建立索引,然后仅返回能够回答问题的段落,并附上页码和章节标题,方便引用。

它在你的机器上运行。PDF 由 Docling 处理,其他格式由 MarkItDown 处理,两者通过同一个接口提供服务。无需云 API、账户或遥测。

**节省开销的关键:**检索,而非转换。清理 PDF 几乎无法减少 Token 数量,因为 Docling 已通过其版面模型移除了页眉和页脚。真正影响费用的是提出问题后只获取三个相关片段,而不是整个文档。

快速开始

选择所需的引擎——markitdown 适用于 Word、Excel、PowerPoint、HTML、CSV 和 EPUB;docling 适用于 PDF(下载量较大:包含 ML 版面模型);all 则包含两个引擎以及 HTTP API 和 MCP 服务。

pip install "docsift[markitdown]"
pip install "docsift[docling]"
pip install "docsift[all]"

docsift convert report.pdf

这会将清理后的 Markdown、按 Token 预算分块的内容和 JSON 摘要写入 ./output/。单独运行 pip install docsift 只会安装 CLI,不包含任何引擎;执行转换时会明确告知这一点,而不是含糊地失败。

Office 指现代格式:.docx、.xlsx、.pptx。2007 年之前的二进制格式——.doc、.xls、.ppt——不受支持,DocSift 会根据文件名拒绝处理,而不会等到中途才失败。请先在 PowerPoint、Keynote、LibreOffice 或 Google Slides 中打开文件,并将其另存为 .pptx。

在 Claude、Codex 或其他 MCP 客户端中使用

这是使用该工具的最直接方式:让助手搜索你自己的文档,而无需将文档粘贴到任何地方。

支持的客户端

DocSift 通过 stdio 使用 MCP——客户端会在你的机器上将其作为程序启动。任何支持这种方式的客户端都可以使用:

客户端支持情况方法
Claude Code是claude mcp add — 第 2 步
Claude Desktop是claude_desktop_config.json
VS Code(Copilot Agent 模式)是.vscode/mcp.json
Codex CLI是~/.codex/config.toml
Cursor是JSON 配置,格式与 VS Code 相同
浏览器中的 claude.ai否需要远程服务
ChatGPT(网页版或桌面版)否需要远程服务

在安装任何内容之前,有必要先说清最后两项。它们的连接器功能只接受位于公共 HTTPS URL 上的远程 MCP 服务,而 DocSift 不支持远程传输——没有任何配置能让本地服务出现在这些界面中。

这是有意为之,并非疏忽。要连接这些客户端,就得在服务器上运行 DocSift 并将文档上传到服务器,这与本工具的用途背道而驰。未来增加可自托管的远程传输是合理的选择;把文件发送到别人的机器上则不是。

1. 将其安装为命令,而不是安装到项目中

MCP 客户端会将 DocSift 作为程序启动,因此它必须安装在任何虚拟环境之外。请将其安装为独立工具:

uv tool install --python 3.12 "docsift[mcp,docling,markitdown]"

也可以使用 pipx:

pipx install --python python3.12 "docsift[mcp,docling,markitdown]"

DocSift 需要 Python 3.11 或更高版本。如果你的默认版本较旧,上面的版本标志可避免出现无法满足依赖要求的错误。请预留较大的下载空间:docling 会安装 PyTorch 和布局模型。

在 Linux 上,请添加 --torch-backend auto。 默认配置会解析为 CUDA 版 PyTorch,安装后占用 5.3 GB,其中约 2 GB 是没有 NVIDIA GPU 的机器永远不会加载的 nvidia-* wheel。auto 会检测你的驱动并选择合适的版本:没有 GPU 的机器上占用 1.6 GB;有 GPU 的机器则会保留 CUDA:

uv tool install --python 3.12 --torch-backend auto "docsift[mcp,docling,markitdown]"

macOS 的 wheel 本来就只支持 CPU,因此这个标志在那里不会产生任何变化。这是 uv 的功能:使用 pipx 或 pip 时没有相应选项,因为 CPU 版本位于单独的索引上,而且没有已发布的包能将安装程序重定向到该索引。如果你在仅有 CPU 的 Linux 机器上通过这种方式安装,DocSift 会在首次转换后告知你,而不会对数 GB 未使用的文件只字不提。

确认安装成功。请逐条运行以下命令;第二条会打印可执行文件的路径,下一步需要用到它。

docsift --version

which docsift
2. 将其注册到客户端

选择你使用的客户端即可。以下只需选一项。

Claude Code

$(which docsift) 会自动填入路径,因此可以按原样运行:

claude mcp add --scope user docsift -- "$(which docsift)" mcp

然后确认服务已启动——查看是否显示 docsift ... ✔ Connected:

claude mcp list

--scope user 会让它在每个项目中都可用;如果不加此选项,服务只会注册到你所在的目录。

Claude Code 的设置到此完成。 跳过下方的其他客户端,直接进入第 3 步。

VS Code

Copilot Agent 模式会读取单个项目中的 .vscode/mcp.json,或者读取适用于所有项目的 MCP: Open User Configuration 命令所打开的文件:

{
  "servers": {
    "docsift": {
      "type": "stdio",
      "command": "/replace/with/the/path/from/which/docsift",
      "args": ["mcp"]
    }
  }
}
Codex CLI

~/.codex/config.toml:

[mcp_servers.docsift]
command = "/replace/with/the/path/from/which/docsift"
args = ["mcp"]
startup_timeout_sec = 60

请按示例提高超时时间。Codex 默认只允许 10 秒,而 DocSift 启动时会加载 PyTorch,因此默认设置会将仍在启动中的服务报告为启动失败。

Claude Desktop、Cursor

这些客户端会读取 JSON 配置文件。对于 macOS 上的 Claude Desktop,该文件位于 ~/Library/Application Support/Claude/claude_desktop_config.json;如果文件不存在,请创建它。

如果文件为空或是新建的,完整内容如下——请将命令替换为第 1 步中 which docsift 打印的路径:

{
  "mcpServers": {
    "docsift": {
      "command": "/replace/with/the/path/from/which/docsift",
      "args": ["mcp"]
    }
  }
}

如果文件中已有其他服务,请将 docsift 添加到它们旁边,而不是替换整个文件——注意前一项后的逗号:

{
  "mcpServers": {
    "something-you-already-had": {
      "command": "..."
    },
    "docsift": {
      "command": "/replace/with/the/path/from/which/docsift",
      "args": ["mcp"]
    }
  }
}

请使用绝对路径,不要只写 docsift。这些客户端无法可靠地继承 shell 的 PATH,路径错误或只写命令名会导致 ENOENT: no such file or directory。

然后重启应用——配置会在启动时读取。

请使用 which docsift 返回的绝对路径,不要只写 docsift。 MCP 客户端无法可靠地继承 shell 的 PATH,这是本地服务无法启动却没有提示的最常见原因。

3. 提问

无需学习任何命令——描述你想做什么:

搜索 ~/Documents/contract.pdf 中的终止条款

report.pdf 中关于 Q3 收入的内容是什么?

第一次询问一个新文件时,系统会转换它;对于 PDF,这个过程很慢—— 大约需要三分钟。这是启动开销,与页数无关:Docling 会在首次转换时从 HuggingFace 下载布局和表格模型,然后加载 PyTorch。因此,转换一个三页的 测试文件所需的时间,和转换一份三十页的报告差不多;选一个小文件来“快速 试试”也无济于事。

这只会发生一次。之后,系统会根据文件内容识别文件,即使你移动或重命名 文件,也能立即返回答案。

对于较长的 PDF,请先转换,再提问:

docsift convert big-report.pdf

这会填充 MCP 服务读取的同一缓存,因此第一个问题的响应速度和后续问题一样快。 这样也能绕过一个实际限制——MCP 客户端会为工具调用设置自己的超时时间;转换时间 足够长时,可能会超时并显示错误,即使转换最终本可以完成。

4. 检查是否正常工作

在让它处理真实 PDF 之前,先用一个能立即转换的文件验证配置。创建一个文件:

printf '# Test\n\nDocSift returns only the passages that match a question.\n' > /tmp/docsift-check.md

然后让你的助手使用指定的工具提问:

使用 docsift search_document 工具,在 /tmp/docsift-check.md 中搜索 "passages"

明确指定工具名称,并留意实际运行的是哪个工具。 如果只是随口一问, 助手往往会用自己的文件读取工具打开小文件并作答——你得到的答案虽然正确, 却完全没有用到 DocSift,这会让有问题的配置看起来像是正常工作的。如果助手报告 的是读取了文件,而不是调用了 docsift,这次检查就没有告诉你任何事情。

第一次调用时,系统会询问你是否允许运行工具——请批准;如果客户端提供 “不要再次询问”选项,也请选择它,这样后续提问就不会在思路中途被打断。

成功时,记录中会出现一次 docsift 工具调用,并返回那一句话。这不需要 PDF 或模型权重,因此如果这里失败,问题出在配置——命令不在 PATH 中,或服务 未注册——而不是转换。

接下来试试你自己的真实 PDF,并预期第一次提问需要一分钟。对于这种大小的 文档,该选哪种方式不言自明:通读全文代价很高,这时搜索就成了显而易见的选择。

有一项测试值得专门运行:询问文档中没有提及的内容。 你应该得不到任何 结果,而不是一个听起来似乎合理的答案。搜索是基于词项的,因此文本中没有 的词不会匹配任何内容——亲眼看到这一点,比成功查询十几次更能说明你可以 信任它到什么程度。

你会得到什么

两个工具:

  • search_document — 最重要的工具。提供文件路径和问题;它会在首次 遇到文件时转换文件,然后只返回匹配的段落,并附上页码和章节标题。
  • convert_document — 转换并索引文件,返回摘要(页数、词元估算值、分块数), 而不是文本。
预期效果

在搭载 Apple 芯片的 MacBook Air 上测试,使用一份 34 页、1.7 MB 的 PDF——一份 BusinessEurope 经济展望报告。选择它是因为它正是这款工具要处理的棘手文档类型:密集的表格、脚注,以及多栏排版内容。

整份文档约 21,000 个 token,42 个分块
回答一个问题约 4,000 个 token,5 段内容,并附可引用的页码
首次转换约 3 分钟——大部分时间用于一次性下载模型
转换此后任意文件几秒到一分钟,视文件大小而定
此后的每个问题即时返回

Token 数量上的差距正是重点,而且文档越长,差距越大。

需要说清楚这 3 分钟花在哪里,因为很容易误以为“文档越大,处理越慢”。大部分时间都花在 Docling 首次运行时获取版面和表格模型,以及加载 PyTorch 上。在一台干净的 Linux 机器上,一份3 页、1.8 KB的 PDF 耗时 186 秒——与这份 34 页的报告基本相同。首次运行后,模型会保存在磁盘上,转换耗时便会随文档大小而变化。docsift convert 会全程显示动态进度指示器,你可以看到它正在工作,而不用猜测。

search_document 还接受 limit 和 max_tokens 参数;当你要求更多或更少内容时,模型会设置这些参数。默认设置会在 5,000-token 预算内返回 5 段内容。密集文档会产生较大的分块——上面那份报告中的每块约有 1,000 个 token——因此,如果回答似乎被截断,调高 max_tokens 即可;这比让模型反复回答同一个问题更省。

这些数字没有体现一个注意事项:搜索基于词汇匹配,而非语义。 DocSift 会在 SQLite FTS5 中为分块建立索引,并使用 BM25 排序。它匹配你输入的词语——而不是同义词、释义或含义。搜索“termination clause”(终止条款)时,如果某个章节只提到“ending the agreement”(结束协议),就不会返回该章节。询问这份报告中的“energy prices”(能源价格)时,结果出现了运输和化肥成本相关章节,因为这些段落恰好包含这个短语;如果把问题表述为“why did transport costs rise?”(运输成本为何上涨?),可能完全找不到相关内容。

这是有意为之的取舍,并非疏忽:无需下载嵌入模型,无需重建索引,无需 GPU,没有任何内容离开你的设备,而且首次运行只需几分钟,而非十几分钟。如果你需要语义检索,DocSift 写出的 Markdown 和分块 JSON 可作为向量存储的干净输入——这确实是合理的需求,但目前这款工具还不支持。请参阅已知限制。

PowerPoint 的回答会引用幻灯片编号。 演示文稿按每张幻灯片分别分块,因此返回的段落会注明来自哪张幻灯片及其标题——就像 PDF 段落会标注页码一样。两者的字段都叫 pages;对于演示文稿,它表示幻灯片。演讲者备注也会被提取,并可供搜索。

演示文稿无法提供的是图表关系。 一张包含三个方框和两条箭头的幻灯片会提取出三个标签。文字会保留,但各元素之间的关系不会保留,因此 DocSift 无法判断两个方框之间的箭头表示什么。幻灯片中的图像完全不会被读取——截图中的文字无法通过搜索找到。

所有操作都在你的设备上的该进程中完成。没有进程监听端口,也没有任何文档内容通过网络传输。该服务拥有的文件系统访问权限,与启动它的用户完全相同。

它不在 claude.ai 连接器目录中,也不可能出现在那里。 claude.ai 在云端运行,无法在你的电脑上启动程序。本地 MCP 服务适用于运行在你自己设备上的应用——Claude Code、Claude Desktop、Codex、Cursor——在 Web 应用的连接器列表中搜索 DocSift 永远找不到它。

命令行

docsift convert report.pdf --max-tokens 800 --overlap 100
docsift convert report.pdf --engine markitdown
docsift inspect report.pdf
docsift compare report.pdf
docsift search doc_xxxxxxxxxxxx "operational risk"
docsift search doc_xxxxxxxxxxxx '"operational risk"' --limit 5 --context 1
docsift cache info
docsift cache clear

inspect 会报告 DocSift 对文件的处理方式,包括引擎、标识和缓存状态,而不会转换文件。compare 会使用两种引擎处理同一份文档,并为结果生成差异文件。

转换时会清除重复的页眉和页脚、页码及图像引用,然后将文本拆分为符合 token 预算的文本块,并保留其标题上下文。--keep-furniture 和 --keep-image-refs 可关闭相应的清理阶段。

结果会缓存,因此文件和设置均未更改时,可立即返回结果。--no-cache 会强制重新运行。

搜索使用本地 SQLite FTS5 进行关键词排序,并支持带引号的词组。它会读取 HTTP 服务和 MCP 服务写入的存储库;docsift convert 会将独立文件写入输出目录,但不会将其添加到该存储库中。--context 会提取相邻文本块,--max-tokens 会限制整个响应的长度,且只会打印选中的文本块。分数用于对单次响应中的结果排序,不同请求之间的分数不可比较。

HTTP API

pip install "docsift[all]"
docsift serve

转换始终在后台运行:较长的 PDF 可能需要几分钟,而等待同步响应的客户端会超时。

上传后会返回 202,其中包含作业 ID 和文档 ID:

curl -sS -F [email protected] http://127.0.0.1:8000/v1/documents

轮询,直到状态变为 succeeded 或 failed:

curl -sS http://127.0.0.1:8000/v1/jobs/job_xxxxxxxxxxxxxxxx

然后获取整份文档:

curl -sS http://127.0.0.1:8000/v1/documents/doc_xxxxxxxxxxxx/markdown
curl -sS http://127.0.0.1:8000/v1/documents/doc_xxxxxxxxxxxx/chunks

也可以提出问题,只获取相关文本块:

curl -sS --get --data-urlencode 'q=operational risk' \
  --data 'limit=5' --data 'max_tokens=5000' \
  http://127.0.0.1:8000/v1/documents/doc_xxxxxxxxxxxx/search

DELETE /v1/documents/{id} 会删除文档、其搜索索引和缓存的转换结果,也会取消仍在进行的转换,因此删除操作不会因工作进程随后完成任务而被撤销。OpenAPI 文档位于 /openapi.json。

请先设置 DOCSIFT_API_KEY,再允许任何其他对象访问该服务。 设置后,每个 /v1/* 路由都需要 X-API-Key 请求头,而 /health、/version 和 API 文档仍保持开放,以便进行健康检查和连接器导入。整个服务共用一个密钥——它不代表每个用户的身份,也不能替代网络访问控制。该服务会转换收到的任何文件,因此请在自己控制的基础设施上运行它。

Power Platform、Copilot Studio 和 n8n

DOCSIFT_PUBLIC_URL=https://docsift.example docsift openapi --format swagger2 -o connector.json

将其导入为 Power Platform 自定义连接器。服务自身的 /openapi.json 使用 OpenAPI 3.1,自定义连接器会拒绝该格式;此命令会生成其支持的 Swagger 2.0 格式。已在真实租户中验证:文件可以导入并进行身份验证,且会返回符合架构的响应。

示例中提供了可运行的示例,包括可导入的 n8n 工作流、Copilot Studio 连接器操作指南,以及用于等待转换完成的 Power Automate Do until 流程。更详细的指南请参阅 docs/USING_DOCSIFT.md。

更多

已知限制DocSift 不会做什么,直言不讳。在依赖它之前值得一读。
配置所有环境变量。
Docker在容器中运行服务。
部署到 Azure端到端的托管部署。
隐私哪些内容会写入磁盘,以及网络访问的三种情况。
安全威胁模型,以及如何报告漏洞。
贡献设置、门槛,以及评审关注的内容。
更新日志发布了什么,以及发布时间。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。