mcpField
I
Is It AI MCP

Is It AI MCP

本地服务
github.com/JohannsenLum安全010 周前更新

关于 Is It AI MCP

Is It AI MCP 是读取本地图像文件中 C2PA Content Credentials 的 MCP 服务。它报告凭证声明的来源及签名是否有效,不分析图像像素,也不判断声明是否属实。

主要功能

  1. 01读取嵌入的 C2PA 凭证
  2. 02根据文件字节验证签名
  3. 03报告声明来源与判定结果
  4. 04扫描目录并汇总结果
  5. 05将文件来源文本标记为不可信

适用场景

  1. 01检查图像的签名来源记录
  2. 02区分有效凭证与缺失或无效凭证
  3. 03汇总图像文件夹中的凭证检查结果

MCP 相关

该服务向 MCP 客户端提供 `check_image_provenance`,用于检查本地图像路径;并提供 `scan_directory` 批量检查。它返回凭证声明和签名验证结果,不会根据像素推断图像来源。

配置

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

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

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

安装包
pypiis-it-ai-mcp0.1.0

工具

2

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

参数类型必填说明
pathstring是要检查的本地图像文件路径。

详细介绍

is-it-ai-mcp

读取文件对自身的声明,并检查该声明是否依然成立。

图像可以携带一份签名内容凭证,声明其制作方式。
此服务会读取凭证,根据文件字节检查签名,并将两者
一并交给无法自行查看它们的 AI 助手。

一个 MCP 服务,用于读取嵌入图像中的 C2PA 内容凭证,并报告 文件对自身来源的声明,以及该声明是否仍能通过当前文件字节 验证。

📖 文档:mcp.johannsenlum.com/is-it-ai · 安装指南 · 工具参考

🔍 无需安装即可试用:ai.johannsenlum.com/is-it-ai 在你的设备上的浏览器中运行相同检查,不会上传任何内容。

PyPI Python 3.11+ License: MIT

功能

它会打开图像,查找嵌入的 C2PA 清单(内容凭证);如果存在, 则分别报告两件事:清单对图像制作方式的声明,以及该清单上的 加密签名是否仍与文件当前的字节相符。它不会查看像素,也不会猜测。 如果没有清单,或者清单存在但签名已损坏,它会明确说明,而不是 凭空编造答案。

请参阅 docs/pass-fail.md,了解为什么“签名验证通过” 和“声明属实”是两个不同的问题,以及为什么此服务只回答第一个问题。

安装

运行服务

is-it-ai-mcp 已发布到 PyPI。运行方式:

uvx is-it-ai-mcp

从源代码安装(贡献者 / 尚未发布的 main)。 这不属于上述常规 安装流程;仅当你想使用最新的未发布代码,而非已发布的 PyPI 版本时才需要:

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

或者从本地克隆运行:

git clone https://github.com/JohannsenLum/is-it-ai-mcp
cd is-it-ai-mcp
uv sync

无需账号、API 密钥或环境变量。服务只会读取你指定的本地 文件。

Claude Code 和 Claude Desktop

Claude Code:~/.claude.json
{
  "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

通过 Settings → Developer → Edit Config 复制并粘贴此 JSON:

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

工具

check_image_provenance

传入磁盘上一个图像文件的路径。它会返回:

  • verdict:以下三种状态之一(AI_DECLARED、NO_AI_DECLARED、UNKNOWN)。
  • reason:该判定的具体依据,例如 no-credential、credential-invalid、ai-source-type、capture-source-type 或 credential-silent。
  • what_this_does_not_mean:附在每种判定上的通俗说明,确保结果不会被悄悄拔高成超出证据支持范围的结论。
  • signature:原始 validation_state、一个 verified 布尔值,以及签名检查产生的任何 failure_codes。
  • declared:清单存在时其中的声明内容。signer、claim_generator 和 signed_at 是直接从文件中提取的自由文本,在传给你之前会按下文“安全”部分进行防护。source_types(来自封闭词汇表的 IPTC 数字来源类型 URI)和 watermark_declared(一个布尔值)无法承载攻击者编写的文本,因此会原样返回,且永远不会被隔离。

无法读取的文件(路径错误、格式不受支持)会作为独立的错误结果返回,而不是伪装成 UNKNOWN。必须提供磁盘上的真实路径,而不能直接提供图像字节。请参阅文件路径说明。

scan_directory

传入一个文件夹。它会遍历目录树,对找到的每张图像执行相同的检查,并返回按判定和签署者统计的汇总计数,以及携带凭证的文件样本(数量有上限),而不是逐个文件列出结果。这个工具可以针对你指定的任意目录,复现本项目对 401 张图像进行的扫描(见下文)。

三种判定

判定含义仅在以下条件成立时可得出
AI_DECLARED文件的清单声明该图像由 AI 或算法生成存在清单,且其签名验证通过,并包含表明 AI 参与的 IPTC 数字来源类型标记
NO_AI_DECLARED文件的清单声明该图像是在现实世界中拍摄的存在清单,且其签名验证通过,并包含表明图像属于拍摄类(相机、胶片、印刷品、轻微编辑)的 IPTC 数字来源类型标记
UNKNOWN未能确定任何可用信息其他所有情况,包括没有清单、签名失效,或清单从未记录来源类型

**UNKNOWN 是默认结果,也是最常见的结果。**在对 401 张真实图像进行的扫描中,只有 14 张带有 Content Credential,而且全部来自 OpenAI:约 96.5% 的图像完全没有凭证。检查时几乎所有图像都应得到 UNKNOWN。这不是此服务中的错误,而是当前现实世界中图像来源信息的现状。

此工具无法告诉你什么

  • **它不会通过像素检测 AI。**这里完全没有图像分析,也没有模型查看图像。每种判定都来自经加密签名的文本记录,或来自没有这类记录的事实。
  • **缺少凭证并不能证明任何事情。**未标记的 AI 图像与未标记的照片,在此工具看来无法区分。截图、重新保存,或通过几乎任何图像编辑器处理,都会移除凭证,不论图像是否由 AI 制作。UNKNOWN 表示“没有可用记录留存”,绝不表示“没有 AI 参与”。
  • **签名有效并不意味着签署者的声明属实。**签名只能证明清单自签署以来未被篡改,并确认签署者的身份。它无法证明签署者是否说了实话。任何人都可以生成自己的证书、签署自己的文件,并随意声明图像来源:签名依然会完美通过验证,但声明仍可能是假的。验证的是封印,而不是信件内容。请参阅 docs/pass-fail.md。

存在的意义

将图像附加到模型时,图像会先解码为像素,再重新编码,然后模型才能看到它。容器元数据(包括任何 C2PA 清单)都不会传递给模型:模型看到的只有 RGB 数组,仅此而已。没有工具,模型根本无法读取清单,而且往往会根据视觉伪影猜测图像是否由 AI 生成。已发表的基准测试显示,这种猜测的准确率约为 18% 到 31%,仅比随机猜测好一点。此服务旨在让模型读取磁盘上的实际签名记录,而不是根据 JPEG 压缩伪影进行模式匹配。

安全性

此服务返回的每个可读字符串都源自正在检查的文件内部:签名者名称、声明生成器字符串,以及任何自由文本原因或标签。这些文本由文件的生成者写入,并会与您自己的指令一同进入同一个上下文窗口。标记为“签名者”的字段看起来具有经过验证的权威性,但签名覆盖的是资产的字节,而不是清单中任何字符串的真实性。任何人都可以用自己的证书为自己的文件签名,并在其中写入任意内容。

在返回任何此类字符串之前,服务会清理其中的控制字符、限制长度,并将其括在明确标记为不可信数据(而非指令)的围栏边界中,同时附加一个文件作者无法预先猜到的随机 nonce。结构性值、判定结果本身、验证状态以及 IPTC 来源类型 URI 均来自此服务控制的封闭词汇表,因此不会加围栏,因为它们不可能包含攻击者编写的文本。

有关实现,请参阅 src/is_it_ai_mcp/safety.py;完整威胁模型请参阅其模块文档字符串。

文件路径说明

此工具接收的是文件路径,而不是图像字节。在 Claude Code 中,您粘贴到对话中的图像会先写入磁盘,因此可以访问其路径,工具可以直接使用。在其他客户端中,粘贴或附加的图像可能仅以内联数据形式存在,在服务可访问的文件系统上没有路径;这种情况下,此工具便无文件可打开。如果检查结果显示无法找到文件,请先将图像保存到磁盘,然后将工具指向该路径。

开发

uv sync --extra dev
uv run pytest -v

--extra dev 很重要:若不加此参数,就不会安装 pytest-asyncio(pyproject.toml 中 asyncio_mode = "auto" 所必需的依赖),而 pytest 每次运行都会打印一条 "Unknown config option: asyncio_mode" 警告。

测试使用 fixtures/ 中的夹具运行,其中包含一张真实的签名图像,以及经过篡改和移除签名的变体;每种情况的预期结果均已人工验证。有关每个夹具的生成方式及其预期证明内容,请参阅 fixtures/GROUND-TRUTH.md。

许可证

MIT © 2026 Johannsen Lum。

使用、修改、再分发,或基于它构建商业产品均可;唯一条件是保留版权声明和许可证文本。本软件不提供任何形式的担保。

欢迎按照相同的许可证提交贡献。

评论

支持 Markdown

第一次接触 MCP?

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

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