mcpField
P
Paperless-ngx

Paperless-ngx

本地服务
github.com/tobee89文件与存储210 周前更新

关于 Paperless-ngx

Paperless-ngx 是面向 Paperless-ngx 3.x 的 MCP 服务,适合希望通过 AI 客户端检索和管理文档的用户。它覆盖 REST API v10,并通过工具集、只读模式和响应裁剪控制工具范围与上下文占用。

主要功能

  1. 01覆盖并追踪 REST API 端点
  2. 02搜索、读取、上传和管理文档
  3. 03按工具集选择暴露的能力
  4. 04只读模式移除写入工具
  5. 05裁剪列表响应并分页读取 OCR 文本
  6. 06提供收件箱整理与共享审查提示词

适用场景

  1. 01搜索文档并读取 OCR 内容
  2. 02按需启用邮件或管理工具集
  3. 03在只读模式下浏览文档档案
  4. 04整理未分类文档或审查公开共享链接

MCP 相关

作为 MCP 服务,它向客户端公开 Paperless-ngx 的文档、元数据、工作流和系统操作工具,并提供提示词。工具集可限制暴露范围,且可启用只读模式。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"tobee89-mcp-paperless-ngx": {
"command": "npx",
"args": [
"-y",
"mcp-paperless-ngx"
],
"env": {
"PAPERLESS_URL": "<PAPERLESS_URL>",
"PAPERLESS_TOKEN": "<PAPERLESS_TOKEN>",
"PAPERLESS_PUBLIC_URL": "<PAPERLESS_PUBLIC_URL>",
"PAPERLESS_TOOLSETS": "<PAPERLESS_TOOLSETS>",
"PAPERLESS_READ_ONLY": "<PAPERLESS_READ_ONLY>",
"PAPERLESS_HEADERS": "<PAPERLESS_HEADERS>",
"PAPERLESS_DOWNLOAD_DIR": "<PAPERLESS_DOWNLOAD_DIR>",
"PAPERLESS_MAX_PAGE_SIZE": "<PAPERLESS_MAX_PAGE_SIZE>",
"PAPERLESS_TIMEOUT_MS": "<PAPERLESS_TIMEOUT_MS>",
"PAPERLESS_API_VERSION": "<PAPERLESS_API_VERSION>"
}
}
}
}
启动命令npx -y mcp-paperless-ngx
需要配置的环境变量
PAPERLESS_URLBase URL of the Paperless-ngx instance
PAPERLESS_TOKEN密钥Paperless-ngx API token
PAPERLESS_PUBLIC_URLURL used when building links, if the instance is reachable under a different name from outside
PAPERLESS_TOOLSETSComma-separated toolsets, or all
PAPERLESS_READ_ONLYExpose only tools that cannot change anything
PAPERLESS_HEADERSExtra request headers; needed behind forward-auth proxies such as Authentik
PAPERLESS_DOWNLOAD_DIRWhere downloaded files are written
PAPERLESS_MAX_PAGE_SIZEHard ceiling on list page sizes
PAPERLESS_TIMEOUT_MSRequest timeout in milliseconds
PAPERLESS_API_VERSIONREST API version sent in the Accept header

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

安装包
npmmcp-paperless-ngx0.1.1

工具

85

收录的工具列表 · 更新于 2 周前

参数类型必填说明
pageinteger否
querystring否在文档内容和元数据中进行全文搜索。支持 Paperless 查询语法,例如 'invoice AND 2024'、'correspondent:telekom'、'created:[2024-01-01 TO 2024-12-31]'。对于“查找关于 X 的文档”之类的问题,优先使用此参数。
orderingstring否排序字段;添加 '-' 前缀表示降序。常用值:-created、-added、title、archive_serial_number。
is_taggedboolean否false 会返回完全没有标签的文档——即尚未分类处理的文档集合。
owner__idinteger否仅返回此用户 ID 所有的文档。
page_sizeinteger否默认值为 25。
is_in_inboxboolean否true 会返回仍带有收件箱标签的文档。这通常是开始分类处理的入口。
more_like_idinteger否返回与此文档 ID 相似的文档。忽略其他筛选条件。
tags__id__inarray否仅返回带有这些标签 ID 中至少一个的文档。
extra_filtersobject否文档端点接受的任意其他 Django 风格筛选条件,例如 {'content__icontains': 'kündigung', 'created__year': 2024, 'mime_type': 'application/pdf'}。用于指定上方未列出的筛选条件。
tags__id__allarray否仅返回带有所有这些标签 ID 的文档。
tags__id__nonearray否排除带有这些标签 ID 中任意一个的文档。
content_previewinteger否每份文档包含的 OCR 文本字符数。0 表示禁用。请保持数值较小。
added__date__gtestring否在此日期(YYYY-MM-DD)当天或之后添加到 Paperless 的文档。
added__date__ltestring否在此日期或之前添加到 Paperless(YYYY-MM-DD)。
storage_path__idinteger否精确的存储路径 ID。
title__icontainsstring否仅匹配标题中不区分大小写的子字符串。比 query 更高效且匹配条件更严格。
correspondent__idinteger否精确的通信对象 ID。
document_type__idinteger否精确的文档类型 ID。
created__date__gtestring否在此日期或之后创建(YYYY-MM-DD)。
created__date__ltestring否在此日期或之前创建(YYYY-MM-DD)。
custom_field_querystring否以 JSON 编码的自定义字段筛选条件,例如 '["due","range",["2024-08-01","2024-09-01"]]' 或 '["customer","icontains","acme"]'。运算符列表请参阅 Paperless API 文档。
archive_serial_numberinteger否精确的档案序列号。

详细介绍

eichner.cloud

mcp-paperless-ngx

面向 Paperless-ngx 3.x 的 Model Context Protocol 服务
全面覆盖 REST API、感知架构、节省令牌。

许可证:MIT Node 20+ Paperless-ngx 3.x REST API v10 端点覆盖率 92/92 Glama 质量评分


基于 REST API version 10 构建,并在以下三方面另辟蹊径:

  • 覆盖情况清晰。 92 个已记录的端点均已作为工具提供,或在 src/tools/coverage.ts 中列出,并说明未纳入的原因。测试会强制执行这一点,因此 Paperless 新版本新增端点时,会导致 CI 失败,而不会悄然变成不受支持的功能。
  • 严控令牌用量。 Paperless 文档包含完整的 OCR 文本。简单封装器默认会返回这些文本,一次搜索就可能耗尽模型的上下文。此处,列表结果会在服务端通过 ?fields= 裁剪,文本由单独的分页工具提供,而且任何列表端点都不会直接传递原始 API 响应——这一点由测试强制保证。参见上下文开销。
  • 按需启用功能。 99 个工具会淹没模型的工具列表。工具集让你只公开特定客户端所需的功能,而 --read-only 则会彻底移除所有写入路径。

不支持 Paperless-ngx 2.x:API version 10 引入了此服务假定存在的端点(嵌套标签、文档版本、share_link_bundles、拆分后的 PDF 操作)。

快速开始

npx -y mcp-paperless-ngx --check   # verify connectivity, then exit
Claude Code
claude mcp add paperless --scope user \
  --env PAPERLESS_URL=https://paperless.example.com \
  --env PAPERLESS_TOKEN=your-api-token \
  -- npx -y mcp-paperless-ngx
Claude Desktop、Cursor、Cline 和其他 MCP 客户端
{
  "mcpServers": {
    "paperless": {
      "command": "npx",
      "args": ["-y", "mcp-paperless-ngx"],
      "env": {
        "PAPERLESS_URL": "https://paperless.example.com",
        "PAPERLESS_TOKEN": "your-api-token"
      }
    }
  }
}
获取 API 令牌

Paperless 网页界面 → 你的用户名(右上角)→ 我的个人资料 → API 令牌字段旁边的圆形箭头按钮。

配置

变量必需默认值用途
PAPERLESS_URL是—服务连接到的基础 URL。
PAPERLESS_TOKEN是—API 令牌。也可使用 PAPERLESS_API_KEY。
PAPERLESS_PUBLIC_URL否PAPERLESS_URL为用户构建链接时使用的 URL;如果从外部访问实例时使用了不同名称,则需设置此项。
PAPERLESS_TOOLSETS否见下文以逗号分隔的工具集,或 all。
PAPERLESS_READ_ONLY否false仅公开不会更改任何内容的工具。
PAPERLESS_HEADERS否—额外请求标头,格式为 JSON({"X-Auth":"…"})或 Name: value, Name: value。在 Authentik 或 Authelia 等前置身份验证代理后使用时需要设置。
PAPERLESS_DOWNLOAD_DIR否系统临时目录下载文件的写入位置。
PAPERLESS_MAX_PAGE_SIZE否100列表分页大小的上限,无论模型请求的大小是多少。
PAPERLESS_TIMEOUT_MS否60000请求超时时间。
PAPERLESS_API_VERSION否10在 Accept 标头中发送的 REST API 版本。

CLI 标志 --url、--token、--public-url、--toolsets 和 --read-only 会覆盖环境变量。--check 用于验证连接,--list-tools 用于打印已启用的工具。

工具集

工具集默认状态内容
documents开启搜索、读取、更新、删除、上传、下载、笔记、批量操作和 PDF 操作
metadata开启标签、往来对象、文档类型、存储路径
customfields开启自定义字段定义
views开启已保存的视图
sharing开启共享链接和共享链接集合
workflows开启自动化规则、触发器、操作
system开启全局搜索、统计信息、状态、任务、回收站
mail关闭IMAP 账户、邮件规则、已处理邮件
admin关闭用户、群组、个人资料、配置、日志(只读)

mail 和 admin 默认关闭,因为大多数会话都用不上它们,而且每增加一个工具,每次请求都会消耗额外上下文。请显式启用它们:

PAPERLESS_TOOLSETS=documents,metadata,system,mail
PAPERLESS_TOOLSETS=all

上下文成本

将 API 封装为供大模型使用的接口,会产生 API 本身没有的成本:模型看到的所有内容都会在每次请求中计费。以下两方面会带来影响,以及此服务如何应对。

响应。 在 Paperless 中,有三种响应形式成本很高,也很容易意外返回:

来源问题处理方式
文档列表每份文档的 content 都包含完整 OCR 文本使用 ?fields= 在服务端限制响应字段;get_document_content 会单独分页返回文本
/api/search/会返回所有对象类型中经过完整填充的 Document 对象,其中包含 OCR 文本对文档进行摘要,其他类型则简化为 id + name
工作流、邮件规则、群组、任务每个对象有 27–34 个字段,触发器/操作定义以内嵌形式呈现仅摘要标识字段;嵌套列表折叠为计数。full: true 会返回全部内容

工具定义。 这项成本更高,也更不易察觉:名称、描述和 JSON 架构会随每一次请求发送,无论是否调用任何工具。

工具集工具数量每次请求的大致成本
all99~20,500 tokens
默认85~18,500 tokens
documents,metadata49~12,900 tokens

无法让这项成本归零——这是模型可以使用工具而不必猜测所付出的代价。但有意识地控制工具集很有意义:如果你的会话只会搜索和归档文档,设置 PAPERLESS_TOOLSETS=documents,metadata 节省的上下文比任何响应精简方式都多。

安全

此服务提供破坏性操作,因为不能执行这些操作的文档管理器就称不上真正的管理器。它不会试图猜测这些操作何时适用——这项判断应由客户端和用户作出。它会采取以下措施:

  • 破坏性工具标注了 destructiveHint: true,以便 MCP 客户端要求用户确认。
  • 工具描述会明确说明哪些操作无法撤销(empty_trash、delete_custom_field、delete_originals),并要求在调用前确认。
  • --read-only 会从工具列表中移除所有写入工具,而不是等到调用时才拒绝执行。
  • 批量端点支持“对所有符合此筛选条件的项目执行操作”模式。此服务不会开放这种模式:批量工具需要明确的 ID 列表,因此错误的筛选条件不会悄无声息地影响整个档案。
  • create_share_link 会生成可公开访问的 URL。其描述会明确说明这一点,而且还提供了 audit_sharing 提示词,用于检查已经公开的内容。

与凭据相关的端点(生成令牌、注册 TOTP、禁用他人的第二因素)特意不予开放。完整列表及原因请参见 EXCLUDED_ENDPOINTS。

提示词

在支持 MCP 提示词的客户端中注册为斜杠命令:

提示词功能
triage_inbox浏览尚未分类的文档,优先使用现有条目提出元数据建议,并在用户批准前不应用任何更改。
find_document根据模糊描述查找文档,先以较低成本搜索,再扩大搜索范围。
audit_sharing检查所有公开共享链接,并标记永不过期的链接。

测试

分为三个层次,因为它们能发现不同的问题:

npm test                                        # logic — no network
PAPERLESS_URL=… PAPERLESS_TOKEN=… \
  node scripts/smoke-test.mjs                   # all 55 read-only tools, live
PAPERLESS_URL=… PAPERLESS_TOKEN=… \
  node scripts/write-test.mjs                   # writes, live — see the warning

npm test 检查此服务自身的逻辑:端点覆盖情况、枚举值是否符合架构、列表工具是否会泄露原始 API 对象,以及只读模式是否确实移除了写入操作。

smoke-test.mjs 检查它对 Paperless 的假设。它会针对真实实例调用每个只读工具,通过列表调用解析 ID,而非将 ID 写死,并打印响应大小,以便留意开销较大的工具。它不会写入任何内容。

write-test.mjs 覆盖其余功能:上传和消费、更新每种字段类型、备注、批量编辑标签、分享链接、旋转,以及一次移入回收站再还原的往返操作。

它只会操作自己创建的对象。 所有创建的对象名称都带有 zz-mcp-test 前缀,并会在最后删除;它绝不会修改自己未上传的文档。如果运行过程中断,带有该前缀的遗留对象可以安全删除。如果有测试实例,建议优先使用。

跟进 Paperless 的变化

PAPERLESS_URL=… PAPERLESS_TOKEN=… node scripts/sync-schema.mjs
npm test

sync-schema.mjs 会根据你自己的实例的 OpenAPI 文档重新生成 schema/endpoints.json。 随后,测试套件会报告所有既未开放、也未明确排除的端点。维护流程就是这样:将其指向较新版本的 Paperless,测试就会告诉你有哪些变化。

开发

npm install
npm start          # run from source
npm run build      # compile to build/
npm test           # unit tests + coverage checks
npm run inspect    # build, then open the MCP inspector

相关项目

已有多个适用于 Paperless-ngx 的 MCP 服务,其中最活跃的两个都支持 3.x: cubinet-code/paperless-ngx-mcp 会在 2.x 和 3.x 之间自动适配;baruchiro/paperless-mcp 则允许你选择 API 版本(PAPERLESS_API_VERSION,默认值为 9)。如果你需要在同一次安装中同时支持两个主版本,可以使用其中之一。

本服务选择了相反的取舍:它假定使用 API 版本 10,不支持更早版本。这样才能调用 3.x 新增的端点——嵌套标签、文档版本、share_link_bundles、独立的 PDF 操作——并通过测试断言已涵盖所有 92 个有文档说明的端点。此外,它还会在服务端通过 ?fields= 精简列表响应,因此默认不会附带 OCR 文本。

许可证

MIT。请参阅 LICENSE。


由 eichner.cloud 构建 — 可自托管,并且对它相当钟爱。

评论

支持 Markdown

第一次接触 MCP?

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

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