关于 tamperlens
tamperlens-mcp 是用于在文档进入 Agent 上下文前检查完整性、涂黑效果和模型可读安全性的 MCP 服务。它将文件字节发送至 Tamperlens API,并返回风险信号而非判定。
主要功能
- 01检查编辑痕迹、元数据、签名和隐藏内容
- 02确认涂黑是否移除了底层数据
- 03将文档与原件进行比较
- 04分流文档并估算处理成本
- 05检查同一案件文档间的不一致
适用场景
- 01在 Agent 读取前筛查文件
- 02分享文档前验证涂黑效果
- 03将候选文件与留存原件比较
- 04依据分流结果安排文档接收
MCP 相关
通过 MCP 工具提供 Tamperlens 文档检查、分流、涂黑验证、比较和案件审查功能。分析由 Tamperlens REST API 执行,而非在本地完成。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y tamperlens-mcpTAMPERLENS_API_KEY密钥Optional. Without it the anonymous allowance applies (10 documents/hour); a free key from tamperlens.com/account raises it. compare_documents and inspect_case require a key.TAMPERLENS_BASE_URLOptional. Defaults to the public deployment at https://tamperlens.com.TAMPERLENS_ALLOWED_DIRSOptional. Colon- or comma-separated absolute directories to confine local file reads to. Unset means any absolute path the process can read (the default). Set it to an intake directory so a path argument cannot reach secrets like ~/.ssh or a stray .env; symlinks out of a root are resolved and refused.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
4收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| url | string | 否 | 用于获取文档的 http:/https: URL。获取操作在本机的网络上本地执行(不会从 Tamperlens 服务端获取),且只会发送字节数据。仅接受 http/https;会跟随重定向并重新检查;最大 10 MB,按接收的字节数强制限制。与 path 二选一,不可同时提供。 |
| path | string | 否 | 此机器上文档的绝对路径——PDF、Office 文档或图像。最大 10 MB。与 url 二选一,不可同时提供。 |
| issuer | string | 否 | 可选的签发方 slug(例如 'chase'),用于进一步将文档与该机构真实文档的结构基线进行比较。仅适用于 PDF;Office 文档和图像会忽略此参数。 |
| policy | object | 否 | 可选。自定义风险阈值和信号规则;响应会增加根据这些规则计算出的 accept/review/reject 判定。报告的其他内容不变。 |
| policy.reject | number | 否 | |
| policy.review | number | 否 | |
| policy.rejectOn | array | 否 | |
| policy.reviewOn | array | 否 |
详细介绍
tamperlens-mcp
适用于 Tamperlens 的 MCP 服务——在文档进入 Agent 的上下文之前,询问文档是否被编辑过、其中的涂黑是否有效,以及模型能否安全地读取它。
// Claude Desktop / Claude Code — claude_desktop_config.json or .mcp.json
{
"mcpServers": {
"tamperlens": {
"command": "npx",
"args": ["-y", "tamperlens-mcp"],
"env": { "TAMPERLENS_API_KEY": "tl_..." }
}
}
}
无需密钥即可试用——不提供密钥时,每小时可匿名处理 10 份文档。在 tamperlens.com/account 获取免费密钥后,每月可处理 50 份文档,无需信用卡。
工具
| 工具 | 可回答的问题 |
|---|---|
inspect_document | 文档写入后是否被编辑过?原始保存后是否追加了修订内容?元数据是否相互矛盾?是否存在编辑器指纹、签名覆盖及完整性问题、隐藏文本、宏、图像中的 AI 生成痕迹——以及文件是否包含面向大模型而非读者的文本? |
triage_document | 这份文档值得导入吗?打开它需要多少成本?这项轻量的预检只检查结构、元数据、签名和存在标记——不逐页遍历内容,I/O 开销只是完整检查的一小部分。返回风险等级、测量出的成本(读取字节数、展开字节数、展开比率),以及一个 triage 区块,列出未检查的页面内容类别。预检结果无异常,不代表文档没有问题——用它来决定如何分流,然后使用 inspect_document 进行完整检查。 |
check_redaction | 涂黑是否真的移除了内容?用黑框遮住文本能让人看不到它,却不会从文件中移除它。 |
compare_documents | 这是否与我已有的原始文件相同,且未经更改? |
inspect_case | 同一案例的这些文档(例如,三个月的对账单、一张工资单及其对账单)是否相互矛盾?每份文档各有一份报告,另会指出它们共有、但独立文档不应共有的内容:同一文件重复出现、同一基础文件的 /ID 或字体子集标签、相同的创建时间(精确到秒)。指出需要复核的不一致之处,但不作结论。需要密钥;包含 N 份文档的案例按 N 份计费。paths 和/或 urls 合计需提供 2 至 10 个。 |
支持 PDF、Word、Excel 和 PowerPoint(.docx、.xlsx、.pptx 及启用宏的对应格式),以及 JPEG、PNG、WebP、HEIC/HEIF 和 AVIF。
本地路径或 URL
inspect_document、check_redaction 和 compare_documents(作为
originalUrl/candidateUrl)接受本地 path 或 http/https
url,二者只能选其一。inspect_case 接受二者的列表(paths、urls)。url 由本服务在你自己的机器上,通过
你自己的网络获取,并且只有字节数据会被转发给 Tamperlens。这就是为什么该选项放在这里,而不是 REST API 中:由服务器获取调用方提供的 URL,会给 API 主机带来 SSRF 风险;而从你的机器获取,只能访问你本来就能访问的内容。获取过程仍受到保护:仅允许 http/https(每次重定向时都会重新检查)、限制重定向次数、设置 30 秒超时
(可通过 TAMPERLENS_FETCH_TIMEOUT_MS 调整),以及同样的 10 MB 上限;上限按实际接收的字节数强制执行,而不是依赖可能不实的 Content-Length。
它还会检查目标 IP,而不只是 URL 协议:如果 url 指向、重定向到,或通过 DNS 解析到环回、链路本地/元数据(169.254.169.254)、私有或其他不可路由地址,都会被拒绝;实际连接的地址也会固定为已验证的地址,因此 DNS 重绑定无法绕过检查,让内部地址通过。每次重定向都会重新执行检查。如果确实需要从内部主机获取内容,可通过 TAMPERLENS_FETCH_ALLOW_IPS(逗号分隔;默认为空,默认情况下无法访问任何内部地址)将特定地址加入允许列表。
path参数会读取任意本地文件,并将其字节数据发送到 API。inspect_document、triage_document、check_redaction、compare_documents和inspect_case会读取提供的任意本地路径 —— 默认情况下没有目录沙箱,也没有扩展名过滤,因为读取磁盘上的文档就是本服务的全部工作,而且无法预先确定输入目录。设置TAMPERLENS_ALLOWED_DIRS(见下方环境变量表),即可将读取范围限制在输入目录中;指向根目录之外的符号链接会被解析并拒绝。随后,该文件的字节数据会传输到配置的 Tamperlens 部署。攻击者操控的模型因此可能指定某个私密文件(~/.ssh/id_rsa、~/.aws/credentials),并导致其字节数据离开机器。仅在使用可信的 Agent 和输入时运行此服务,这与使用任何可读取本地文件系统的工具时应遵循的原则相同。若要设置严格边界,请使用你控制的目录作为输入目录,并且只传入该目录中的路径。
为什么要将它放在 Agent 前面
文档有两类读者,但只有一类能看到页面。提取流水线会读取标题、关键词、XMP 数据包、注释、附件名称等字段 — 这些字段本来就是供软件读取的。写入其中的文本可以是为了让软件遵从,而非阅读。
inspect_document 会在 Agent 读入文件之前报告这些内容,且本服务会始终省略恢复出的载荷。这并非为了方便:Tamperlens 报告最可能的下一位读者,正是原本要读取该文档的同一个模型;因此,若 MCP 服务将攻击者的句子回显到上下文中,就等于完成了它刚检测出的攻击。你会看到字段、位置和线索类别,但看不到句子。
它不会做什么
- 不进行本地分析。 每个工具都是对运行中部署的 Tamperlens REST API 的轻量封装。这里没有第二套引擎,因此不会与第一套产生偏差。
- 不做判定。 Tamperlens 会报告风险信号及其背后的证据,绝不会说“此文档是伪造的”。请结合自己的决策逻辑使用这些信号。
- 文档不会进入模型的上下文。 工具接收调用方文件系统中的路径(或在此处获取的 URL),并在此端读取字节。若在工具调用中使用 Base64,为了将文档字节传给需要这些字节而非模型的服务,就会让数 MB 的文档进入上下文窗口。
- 保留情况取决于密钥所属的账户。 API 会在内存中解析文件。不设置
TAMPERLENS_API_KEY(匿名额度)时,不会保留任何内容。使用属于已开启历史记录的账户的密钥时(自保留功能上线以来创建的账户默认开启),API 会保留每次调用的简短派生记录(哈希、信号 ID 和分数;绝不保留文件、文件名或文本),只有账户选择加入时才会保留文件本身。工具结果随后会包含 API 返回的retention和tenantMatches区块。若要不保留任何内容,请在已登录的控制台会话中使用PATCH /api/v1/retention将该密钥设为retention: none(控制台没有针对单个密钥的开关);此服务不会发送每次调用的X-Tamperlens-Retention标头。所有字段列于 tamperlens.com/privacy#retention。
配置
| 变量 | 默认值 | 含义 |
|---|---|---|
TAMPERLENS_API_KEY | 无 | 可选。未设置时适用匿名额度(每小时 10 份文档)。 |
TAMPERLENS_BASE_URL | https://tamperlens.com | 指向你自己的部署。 |
TAMPERLENS_FETCH_TIMEOUT_MS | 30000 | url 获取的总时限,包括正文和所有重定向。 |
TAMPERLENS_FETCH_ALLOW_IPS | 无 | 以逗号分隔的精确 IP 地址;即使存在不可路由地址保护,url 获取仍可访问这些地址。适用于有意访问内部文档存储的情况。留空表示无法访问任何内部地址。 |
TAMPERLENS_ALLOWED_DIRS | 无 | 以冒号或逗号分隔的绝对目录,将本地文件读取限制在这些目录内。未设置时,进程可读取任意绝对路径。将其设为收件目录,这样 path 参数就无法访问 ~/.ssh 等机密或意外出现的 .env;若符号链接指向根目录之外,解析后会被拒绝。 |
链接
所有信号的指南 · 此文件可安全地供你的模型读取吗? · API 参考 · 安全与隐私立场
采用 MIT 许可证。问题反馈与源代码: github.com/haruodev/tamperlens-mcp。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。