Is It AI MCP

io.github.JohannsenLum由 GitHub 帳號 JohannsenLum 發布v0.1.0更新於 Oct 24, 2026

MCP server that reads C2PA Content Credentials: what an image declares about its own origin

已驗證STDIO僅桌面安全與監控媒體與設計

概覽

AI 產生的概覽

讀取圖片中嵌入的 C2PA 內容憑證,回報檔案對自身來源的宣告,以及該簽章是否仍然有效。

可以做什麼
提供兩個工具。check_image_provenance 接收一個圖片檔案路徑,回傳判定結果(AI_DECLARED、NO_AI_DECLARED 或 UNKNOWN)、判定依據、原始簽章驗證狀態,以及宣告的簽署者、宣告產生器、簽署時間與 IPTC 來源類型。scan_directory 會走訪資料夾,對找到的每張圖片執行相同檢查,回傳依判定與簽署者彙總的計數,以及有上限的樣本。它只讀取簽章清單,不分析像素,也不根據視覺痕跡猜測。
適用情境
當助理需要查看圖片內嵌的來源紀錄,而不是根據外觀推斷是否為 AI 生成時適用,例如檢查單一檔案或掃描整個圖片目錄。由於帶憑證的圖片很少,大多數檔案會回傳 UNKNOWN。
執行需求
以 PyPI 套件 is-it-ai-mcp 透過 stdio 在本機執行,使用 uvx 啟動,因此需要具備 uv/uvx 的 Python 環境。不需要帳號、API 金鑰或環境變數。它需要磁碟上的真實檔案路徑,而不是內嵌圖片位元組,因此貼上的圖片必須先存到磁碟。
安裝前請注意
回傳的每個可讀字串(簽署者、宣告產生器、自由文字原因)都來自被檢查的檔案,屬於不可信內容;伺服器會清理、限制長度並將其視為資料加上圍欄。簽章驗證通過只能證明清單未被竄改以及由誰簽署,不能證明其宣告為真。缺少憑證不能說明任何事,UNKNOWN 絕不表示沒有 AI 參與。此伺服器只讀取本機檔案。

安裝

在 SourceWeft 中

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

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

其他 MCP 客戶端

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

README

is-it-ai-mcp

Read the file's own claim about itself, and check whether that claim still holds.

An image can carry a signed Content Credential declaring how it was made.
This server reads it, checks the signature against the bytes, and hands both
back to your AI assistant, which cannot see either on its own.

An MCP server that reads the C2PA Content Credential embedded in an image and reports what the file declares about its own origin, plus whether that declaration still verifies against the bytes in front of you.

📖 Documentation: mcp.johannsenlum.com/is-it-ai · install guide · tool reference

🔍 Try it without installing anything: ai.johannsenlum.com/is-it-ai runs the same checks in your browser, on your machine, with nothing uploaded.

[PyPI] [Python 3.11+] [License: MIT]

What it does

It opens an image, looks for an embedded C2PA manifest (a Content Credential), and if one exists, reports two separate things: what the manifest claims about how the image was made, and whether the cryptographic signature over that manifest still matches the file's current bytes. It does not look at pixels and it does not guess. If there is no manifest, or the manifest exists but the signature is broken, it says so plainly instead of inventing an answer.

See docs/pass-fail.md for why "the signature verified" and "the claim is true" are two different questions, and why this server only ever answers the first one.

Install

Running the server

is-it-ai-mcp is published on PyPI. Run it with:

bash
uvx is-it-ai-mcp

Install from source (contributors / unreleased main). Not part of the normal install path above, only needed if you want the latest unreleased code instead of the published PyPI release:

bash
uvx --from git+https://github.com/JohannsenLum/is-it-ai-mcp is-it-ai-mcp

Or run from a local clone:

bash
git clone https://github.com/JohannsenLum/is-it-ai-mcpcd is-it-ai-mcpuv sync

No account, API key, or environment variable is required. The server only reads local files you point it at.

Claude Code and Claude Desktop

Claude Code: ~/.claude.json
jsonc
{  "mcpServers": {    "is-it-ai": {      "command": "uvx",      "args": ["is-it-ai-mcp"]    }  }}

Claude Desktop: claude_desktop_config.json

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json

Copy this JSON in via Settings → Developer → Edit Config:

jsonc
{  "mcpServers": {    "is-it-ai": {      "command": "uvx",      "args": ["is-it-ai-mcp"]    }  }}

Tools

check_image_provenance

Give it the path to one image file on disk. It returns:

  • verdict: one of the three states below (AI_DECLARED, NO_AI_DECLARED, UNKNOWN).
  • reason: the specific basis for that verdict, for example no-credential, credential-invalid, ai-source-type, capture-source-type, or credential-silent.
  • what_this_does_not_mean: a plain-language caveat attached to every verdict, so the result cannot be quietly upgraded into a stronger claim than the evidence supports.
  • signature: the raw validation_state, a verified boolean, and any failure_codes the signature check produced.
  • declared: what the manifest claims when one exists. signer, claim_generator, and signed_at are free text pulled straight from the file, so each is guarded per the Security section below before it reaches you. source_types (IPTC digital-source-type URIs, drawn from a closed vocabulary) and watermark_declared (a boolean) cannot carry attacker-authored text, so both are returned as-is and are never fenced.

A file that cannot be read (bad path, unsupported format) comes back as a distinct error result rather than a fake UNKNOWN. It needs a real path on disk, not the image bytes themselves. See Note on file paths.

scan_directory

Give it a folder. It walks the tree, runs every image it finds through the same check, and returns aggregate counts by verdict and by signer, plus a capped sample of the files that carried a credential, rather than a line per file. This is the tool that reproduces this project's own 401-image sweep (see below) against any directory you point it at.

The three verdicts

VerdictMeansReachable only when
AI_DECLAREDThe file's manifest asserts AI or algorithmic generationA manifest is present, its signature verifies, and it carries an IPTC digital-source-type marking AI involvement
NO_AI_DECLAREDThe file's manifest asserts a real-world captureA manifest is present, its signature verifies, and it carries an IPTC digital-source-type marking a capture (camera, film, print, minor edits)
UNKNOWNNothing usable was establishedEverything else, including no manifest, a broken signature, or a manifest that never recorded a source type

UNKNOWN is the default and by far the most common answer. In a scan of 401 real images, only 14 carried a Content Credential at all, and every one of those was from OpenAI: about 96.5% had no credential whatsoever. Expect UNKNOWN on almost everything you check. That is not a bug in this server, it is the current state of image provenance in the wild.

What this cannot tell you

  • It does not detect AI from pixels. There is no image analysis here at all, no model looking at the picture. Every verdict comes from a cryptographically signed text record, or from the absence of one.
  • A missing credential is not evidence of anything. An unmarked AI image and an unmarked photograph are indistinguishable to this tool. Screenshotting, re-saving, or passing an image through almost any editor strips the credential, AI-made or not. UNKNOWN means "no usable record survived," never "no AI was involved."
  • A valid signature does not make the signer's claims true. The signature proves the manifest has not been altered since it was signed and confirms who signed it. It proves nothing about whether the signer told the truth. Anyone can generate their own certificate, sign their own file, and assert whatever origin they like: it will verify perfectly and still be false. Verification is about the seal, not the letter. See docs/pass-fail.md.

Why it exists

When you attach an image to a model, the image is decoded to pixels and re-encoded before the model ever sees it. Container metadata, including any C2PA manifest, never reaches the model: the model sees an RGB array, nothing more. Without a tool, it cannot read a manifest at all, and it will tend to guess whether an image is AI-generated from visual artefacts instead. Published benchmarks put that guess at roughly 18 to 31% accuracy, little better than chance. This server exists so the model reads the actual signed record on disk instead of pattern-matching on JPEG compression artefacts.

Security

Every human-readable string returned by this server originated inside the file being inspected: signer name, claim-generator string, and any free-text reason or label. That text was written by whoever produced the file, not by you, and it lands in the same context window as your own instructions. A field labelled "signer" carries an air of verified authority, but the signature covers the asset's bytes, not the honesty of any string inside the manifest. Anyone can sign their own file with their own certificate and write anything they like in it.

Before any such string is returned, it is cleaned of control characters, length-capped, and wrapped in a fenced boundary that marks it explicitly as untrusted data rather than instructions, with a random nonce the file's author could not have pre-guessed. Structural values, the verdict itself, the validation state, and the IPTC source-type URIs are drawn from closed vocabularies this server controls and are never fenced, since they cannot carry attacker-authored text.

See src/is_it_ai_mcp/safety.py for the implementation and the full threat model in its module docstring.

Note on file paths

This tool takes a file path, not image bytes. In Claude Code, an image you paste into the conversation is written to disk first, so its path is reachable and this just works. In other clients, a pasted or attached image may exist only as inline data with no path on the filesystem the server can reach, in which case there is nothing for this tool to open. If a check comes back unable to find the file, save the image to disk first and point the tool at that path.

Development

bash
uv sync --extra devuv run pytest -v

--extra dev matters: without it, pytest-asyncio (needed for asyncio_mode = "auto" in pyproject.toml) is not installed, and pytest prints an "Unknown config option: asyncio_mode" warning on every run.

Tests run against the fixtures in fixtures/, a real signed image plus tampered and stripped variants with hand-verified expected outcomes. See fixtures/GROUND-TRUTH.md for how each was produced and what each is expected to prove.

Licence

MIT © 2026 Johannsen Lum.

Use it, change it, redistribute it, build something commercial on it: the only condition is that you keep the copyright notice and licence text. It comes with no warranty of any kind.

Contributions are accepted under the same licence.

來源:README.md,提交 f587c10

工具

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

版本歷史

1
  1. v0.1.0最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

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

  • 近 30 天內可連通25 分

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

  • 已宣告認證方式10 分

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

  • 已列出工具15 分

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

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