Tamperlens

com.tamperlens由 tamperlens.com 發布v1.43.0更新於 Oct 25, 2026

Was this document edited, did its redactions hold, is it safe for a model to read — Tamperlens API.

已驗證STDIO僅桌面檔案與儲存安全與監控

概覽

AI 產生的概覽

本機 MCP 伺服器,將文件送往 Tamperlens API,檢查是否遭編輯、遮蔽是否失效、是否含隱藏或寫給模型的文字,以及同一案件文件間的矛盾

可以做什麼
檢查文件在儲存後是否被追加修改、中繼資料是否自相矛盾、編輯器指紋、簽章涵蓋範圍與完整性、隱藏文字、巨集以及影像中的 AI 生成痕跡,並辨識寫給語言模型而非讀者的文字(內容會被隱去)。執行低成本預檢分流,回傳風險等級、實測讀取與解壓開銷,以及未檢查的內容類別。檢查遮蔽是否真的刪除內容,而不只是蓋住。將候選檔案與原始檔案比對,判斷是否未變動。對 2 至 10 份文件組成的案件檢查共用痕跡與彼此矛盾之處。支援 PDF、Office 格式與常見影像,可透過本機路徑或 http/https 網址提供。
適用情境
在代理程式讀取不受信任的文件之前使用,判斷檔案是否遭編輯、遮蔽是否有效,或是否夾帶針對模型的指令。也適合將檔案與已持有的原件比對,或交叉核對本應彼此獨立的文件。
執行需求
透過 stdio 在本機執行,通常以 npx 啟動 tamperlens-mcp 套件,因此需要 Node.js。需要能連線到 Tamperlens 部署(預設 TAMPERLENS_BASE_URL 覆寫)。TAMPERLENS_API_KEY 為選用:未設定時適用每小時 10 份文件的匿名額度,而 compare_documents 與 inspect_case 必須提供金鑰。僅限桌面端。
安裝前請注意
path 參數會讀取任意本機檔案並將其位元組送往 API;預設沒有目錄沙箱,遭操控的模型可能指定 SSH 金鑰或雲端憑證等私密檔案。應設定 TAMPERLENS_ALLOWED_DIRS 限制讀取範圍。網址抓取在本機發起,除非設定 TAMPERLENS_FETCH_ALLOW_IPS,否則會拒絕內網位址。使用 API 金鑰時,帳戶的保留設定可能保存每次呼叫的衍生紀錄。報告只是風險訊號,不是結論。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Tamperlens,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

tamperlens-mcp

MCP server for Tamperlens — ask whether a document was edited, whether its redactions held, and whether it is safe for a model to read, before it reaches your agent's context.

jsonc
// Claude Desktop / Claude Code — claude_desktop_config.json or .mcp.json{  "mcpServers": {    "tamperlens": {      "command": "npx",      "args": ["-y", "tamperlens-mcp"],      "env": { "TAMPERLENS_API_KEY": "tl_..." }    }  }}

No key is required to try it — without one you get the anonymous allowance of 10 documents an hour. A free key at tamperlens.com/account raises that to 50 a month with no card.

Tools

ToolAnswers
inspect_documentWas this edited after it was written? Revisions appended after the original save, metadata that disagrees with itself, editor fingerprints, signature coverage and integrity, hidden text, macros, AI-generator traces in images — and whether the file carries text addressed to a language model rather than to a reader.
triage_documentIs this worth ingesting, and what does it cost to open? The cheap pre-flight: structure, metadata, signatures and presence flags only — no per-page content walk — at a fraction of the I/O. Returns the risk band, the measured cost (bytes read, bytes expanded, expansion ratio) and a triage block naming the page-content families it did not check. A quiet triage is not a clean document — use it to route, then inspect_document for the full check.
check_redactionDid the redaction actually remove anything? Covering text with a black box hides it from a person and removes nothing from the file.
compare_documentsIs this the same file as the original I already hold, unchanged?
inspect_caseDo these documents of one case (three months of statements, a payslip and its statement) disagree with each other? One report per document, plus what they share that independent documents should not: the same file twice, one base file's /ID or font subset tags, the same creation second. Inconsistencies to review, never verdicts. Needs a key; a case of N documents costs N. Takes paths and/or urls, 2 to 10 in all.

Accepts PDF; Word, Excel and PowerPoint (.docx, .xlsx, .pptx and the macro-enabled twins); and JPEG, PNG, WebP, HEIC/HEIF and AVIF.

A local path or a URL

inspect_document, check_redaction and compare_documents (as originalUrl/candidateUrl) take either a local path or an http/https url — not both. inspect_case takes lists of both (paths, urls). A url is fetched by this server, on your own machine, over your own network, and only the bytes are sent on to Tamperlens. That is why the option lives here and not on the REST API: a server-side fetch of a caller-supplied URL is an SSRF risk on the API host, whereas fetching from your machine reaches only what you can already reach. It is still guarded: http/https only (re-checked at every redirect), a redirect cap, a 30s timeout (TAMPERLENS_FETCH_TIMEOUT_MS to tune), and the same 10 MB cap, enforced on the bytes received rather than a Content-Length that can lie.

It also checks the destination IP, not just the scheme: a url that points at — or redirects to, or resolves by DNS to — a loopback, link-local/metadata (169.254.169.254), private or otherwise non-routable address is refused, and the address it connects to is pinned to the one it validated, so DNS rebinding cannot slip an internal address past the check. The check re-runs at every redirect hop. If you genuinely need to fetch from an internal host, allow-list specific addresses with TAMPERLENS_FETCH_ALLOW_IPS (comma-separated; empty by default, and the default reaches nothing internal).

The path argument reads any local file and sends its bytes to the API. inspect_document, triage_document, check_redaction, compare_documents and inspect_case read whatever local path they are given — there is no directory sandbox by default and no extension filter, because reading a document off disk is the whole job and an intake path is not knowable in advance. Set TAMPERLENS_ALLOWED_DIRS (env table below) to confine reads to an intake directory; a symlink pointing out of a root is resolved and refused. The bytes of that file are then transmitted to the configured Tamperlens deployment. A model an attacker is steering could therefore name a private file (~/.ssh/id_rsa, ~/.aws/credentials) and cause its bytes to leave the machine. Run this server only with agents and inputs you trust, the same rule you would apply to any tool that can read the local filesystem. For a hard boundary, front the intake with a directory you control and pass only paths inside it.

Why you would put this in front of an agent

A document is read by two audiences and only one of them sees the page. An extraction pipeline reads the title, the keywords, the XMP packet, the comments, the names of attachments — fields that exist to be read by software. Text placed there can be written to be obeyed rather than read.

inspect_document reports that before your agent ingests the file, and the recovered payload is elided unconditionally in this server. That is not a convenience: the most likely next reader of a Tamperlens report is the same model that was about to read the document, so an MCP server that echoed the attacker's sentence back into the context would be completing the attack it just detected. You get the field, the location and the cue categories. You do not get the sentence.

What it does not do

  • No local analysis. Every tool is a thin wrapper over the Tamperlens REST API on a running deployment. There is no second engine here to drift from the first.
  • No verdicts. Tamperlens reports risk signals with the evidence behind them, never "this document is fraudulent". Combine them with your own decision logic.
  • The document never enters the model's context. Tools take a path on the caller's filesystem (or a URL fetched here) and read the bytes on this side. Base64 in a tool call would put megabytes of document into the context window to reach a service that needs the bytes, not the model.
  • Retention follows the account behind the key. Files are parsed in memory by the API. Without TAMPERLENS_API_KEY (the anonymous allowance) nothing is kept. With a key that belongs to an account whose history is on (the default for accounts created since retention launched), the API keeps a short derived record of each call (hashes, signal ids and the score; never the file, its name or its text), and keeps the file itself only if the account opted in. The tool result then carries the API's retention and tenantMatches blocks. To keep nothing, set that key to retention: none with PATCH /api/v1/retention from a signed-in dashboard session (the dashboard has no per-key switch); this server does not send the per-call X-Tamperlens-Retention header. Every field is listed at tamperlens.com/privacy#retention.

Configuration

VariableDefaultMeaning
TAMPERLENS_API_KEYnoneOptional. Without it the anonymous allowance applies (10 documents/hour).
TAMPERLENS_BASE_URLhttps://tamperlens.comPoint at your own deployment.
TAMPERLENS_FETCH_TIMEOUT_MS30000Total budget for a url fetch, body and all redirects included.
TAMPERLENS_FETCH_ALLOW_IPSnoneComma-separated exact IPs a url fetch may reach despite the non-routable-address guard. For a deliberate internal document store. Empty means nothing internal is reachable.
TAMPERLENS_ALLOWED_DIRSnoneColon- or comma-separated absolute directories to confine local file reads to. Unset means any absolute path the process can read. Set it to an intake directory so a path argument cannot reach secrets like ~/.ssh or a stray .env; a symlink pointing out of a root is resolved and refused.

Links

Field guide to every signal · Is this file safe for your model to read? · API reference · Security and privacy posture

MIT licensed. Issues and source: github.com/haruodev/tamperlens-mcp.

來源:README.md,提交 7a5dac1

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

3
  1. v1.43.0最新Oct 13, 2026
  2. v1.42.0Oct 13, 2026
  3. v1.36.0Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分