mcpField
C
Canari

Canari

本地服务
github.com安全0今天更新

关于 Canari

Canari 是用于核验 MCP 服务、Agent 技能和 DSH 插件的账本,面向安装前需要评估组件的宿主。它发布带签名、可离线验证的证明,保留版本历史,并给出 ALLOW、BLOCK 或 REVIEW 判定。

主要功能

  1. 01包含制品哈希的签名证明
  2. 02使用公钥离线验证
  3. 03保留版本替代链的历史
  4. 04每周扫描多个组件注册表
  5. 05支持可配置策略的安装门禁
  6. 06汇总变化与发现的漂移报告

适用场景

  1. 01安装前核验组件
  2. 02无网络时验证证明
  3. 03依据账本发现阻止安装
  4. 04复核每周扫描间的变化

MCP 相关

stdio MCP 服务提供 gate_check、verify_bundle 和 store_summary 工具。它附带最新证明的快照,也可使用完整账本存储以获取版本替代历史。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"lanbass869-cell-canari": {
"command": "uvx",
"args": [
"canari-mcp"
]
}
}
}
启动命令uvx canari-mcp

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

安装包
pypicanari-mcp0.1.3

工具

3

收录的工具列表 · 更新于 今天

参数类型必填说明
namestring是
policystring否default|strict|release-gate|lax|paranoid
versionstring否
registryenum是npm | pypi | mcp-registry | dsh-registry

详细介绍

Canari

CI tests coverage mutation release

Agent 组件验证台账——针对 MCP 服务、Agent 技能和 DSH 插件,提供签名、可离线验证且保留历史记录的证明。

名称源自煤矿中的金丝雀:它是最先察觉异常的。

功能

  1. 每周扫描 Agent 组件生态系统(npm、PyPI、MCP Registry、dsh.so)
  2. 每个组件都会获得一份签名证明:DSSE/Ed25519 信封,其载荷为 in-toto Statement v1(subject[],含 digest.sha256、predicateType、predicate),用于绑定:工件哈希 + 主机版本 + 扫描场景。GUAC / cosign / slsa-verifier 无需 Canari 专用代码即可读取。
  3. 任何拥有公钥的人都可以离线验证证明
  4. 历史记录永不删除——版本变更会形成替代链
  5. 提供公开的机器可读数据流,供任何 AI Agent 或主机使用
  6. 信任启发式规则:发布节奏(L2.4)、元数据异常(L2.5)、仿冒拼写(L2.6)
  7. 提供使用者安装门禁和策略:canari-verify bundle.json --key pub.json --gate --gate-policy paranoid

安装

pip install canari-mcp

也可通过 PyPI 和 GitHub 发布版本 获取(wheel + sdist + SHA256SUMS + Ed25519 签名)。两个渠道提供的工件逐字节相同;请参阅 docs/release-process.md 验证签名发布版本。

canari-gate --store out --list

开放数据集

dataset/ 是依据 CC-BY-4.0 发布的台账快照:包含883 个组件的 3251 份签名证明、规范数据流、漂移报告、架构、两把公钥,以及每个文件都附有 sha256 的 MANIFEST.json。使用 canari-verify 离线验证数据包;使用清单验证整个快照(见 dataset/README.md)。扫描后运行 python scripts/sync_dataset.py 刷新数据集。

质量门禁(在 CI 中强制执行)

门禁阈值当前值
测试在 3.10/3.12/3.13 上全部通过434 项通过
行覆盖率>= 85%90%
变异杀死率>= 90%(不计等价变异体)100%(50/50)
实时数据审计抽样证明可从 npm/PyPI 重新推导18/18

运行这些门禁:python scripts/quality_gate.py

快速开始

# install
pip install canari-mcp

# run a scan
canari-baseline --limit 50

# verify an attestation offline
canari-verify out/attestations/npm_some-package.bundle.json --key out/public_key.json

# verify + policy gate (exit 0 ALLOW / 5 BLOCK / 6 REVIEW)
canari-verify out/attestations/npm_some-package.bundle.json --key out/public_key.json \\
    --gate --gate-policy strict

# custom policy file
canari-verify bundle.json --key out/public_key.json --gate --gate-policy-file my-policy.json
策略文件示例
{"name": "my-policy", "block_on_findings": true, "require_native_provenance": false}

使用者侧(主机实际使用的部分)

1. 查找组件并执行门禁
# resolve the newest signed attestation for a component and run the gate
canari-gate --store out --registry npm --name express
canari-gate --store out --registry dsh-registry --name aegis --policy paranoid --json

# exit codes: 0 ALLOW, 5 BLOCK, 6 REVIEW, 3 not found
canari-gate --store out --list
2. 漂移报告(自上周以来的变化)
canari-drift --store out --write out/drift
# verdict flips / same-version silent changes / findings added / findings removed

每次扫描后,run_weekly.py 都会自动生成此报告。

3. 在任何 MCP 主机中使用(dsh、Codex、Claude 等)

canari-mcp 通过 stdio 使用 MCP 协议(零依赖),并提供三个工具: gate_check、verify_bundle、store_summary。

{
  "mcpServers": {
    "canari": {
      "command": "canari-mcp"
    }
  }
}

无需参数:wheel 内置了每个组件最新的签名证明快照(883 个组件,由 scripts/build_snapshot.py 从 dataset/ 构建),因此 gate_check 开箱即用。需要完整的替代历史记录而非快照时,可将 --store(或 $CANARI_STORE)指向完整台账检出目录。

主机(或 Agent)随后可以询问:“是否允许安装 npm:express?”并获得 ALLOW / BLOCK / REVIEW 结果及原因,且该结果由可签名、可离线验证的证明提供支持。

4. 门控实际安装命令

canari-guard 会包装安装命令,将每个组件与账本进行核对,并在判定结果为阻止时拒绝执行:

canari-guard -- dsh plugin --profile wbpj add dsh-purge
canari-guard -- npm install some-mcp-server
canari-guard -- pip install mcp-server-fetch==0.2.1

# exit 0 allowed+executed | 5 blocked by ledger | 6 review not confirmed
# --dry-run prints what would run; --allow-review accepts pass-with-findings

主机不会被修改——防护程序位于安装命令之前。

对于 DeepSeek Harness(dsh),请将以下内容添加到配置文件的 cordis.patch.yml 中 (已在 dsh 上完成端到端验证:模型调用了 mcp__canari__store_summary,并收到了实时组件数量):

    - id: mcp-canari
      name: '@deepseek-ai/dsh-mcp-client'
      config:
        serverName: canari
        transport: stdio
        command: 'E:\Temp\tbdig\_venv_pr_a\Scripts\python.exe'
        args: ['-m', 'canari.mcp_server', '--store', 'E:\Temp\tbdig\canari\out',
               '--key', 'E:\Temp\tbdig\canari\out\public_key.json']
        cwd: 'E:\Temp\tbdig\canari'
        failOnStartupError: true

多注册表覆盖

注册表来源检查内容继承内容
npm搜索 API + packument + tarball sha256是否存在、版本、制品哈希、维护者-
PyPISimple API + JSON API同上-
MCP Registry官方 REST是否存在身份信息-
dsh.soJSON API引用现有的 L1-L5 结论(不重新扫描)dsh.so 判定结果

诚实说明局限

  • 这是风险信号,而非安全保证
  • M0/M1 覆盖元级检查(L1-L2);行为检查(L3+)属于 M1+
  • 扫描覆盖范围仅限注册表公开的信息
  • expires_at 为 7 天——证明会过期,需要重新扫描

此方案应对的威胁模型

postmark-mcp(MITRE ATLAS AML.CS0053):15 个版本均无问题,随后出现一次被投毒的提交,约 300 个组织受到影响。下架后,没有通知任何主机。缺口在于:没有纵向观察、没有跨主机撤销信息源,也没有可移植的判定结果。

Canari 填补了这一缺口。

许可证

Apache-2.0。请参阅 LICENSE 和 SECURITY.md。

评论

支持 Markdown

第一次接触 MCP?

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

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