关于 proof-of-commitment
proof-of-commitment 为 npm、PyPI、Cargo、Go 包及 GitHub 仓库评估基于行为信号的供应链风险。开发者可通过 MCP 服务、命令行工具和网页工具检查依赖及维护者集中度,补充漏洞公告之外的风险评估。
主要功能
- 01评估软件包和仓库的行为信号
- 02审计依赖清单与依赖树
- 03检查 npm、PyPI、Cargo 和 Go 包
- 04生成 SARIF 与 CI 审计结果
- 05安装拦截软件包安装的钩子
- 06查询企业和维护者信号
适用场景
- 01在项目审计中检查依赖风险
- 02拦截编码 Agent 发起的软件包安装
- 03将供应链检查加入 CI 工作流
- 04检查 GitHub 仓库的依赖
MCP 相关
提供 12 个 MCP 工具,用于审计软件包、依赖树和 GitHub 仓库,并查询软件包及企业信息。MCP 客户端可查询 npm、PyPI、Cargo 和 Go 的风险评分。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://poc-backend.amdal-dev.workers.dev/mcpclaude mcp add --transport http proof-of-commitment https://poc-backend.amdal-dev.workers.dev/mcp{"mcpServers":{"proof-of-commitment":{"type":"http","url":"https://poc-backend.amdal-dev.workers.dev/mcp"}}}在 Cursor 中打开{"servers":{"proof-of-commitment":{"type":"http","url":"https://poc-backend.amdal-dev.workers.dev/mcp"}}}在 VS Code 中打开{"mcpServers":{"proof-of-commitment":{"type":"http","url":"https://poc-backend.amdal-dev.workers.dev/mcp"}}}{"mcpServers":{"proof-of-commitment":{"serverUrl":"https://poc-backend.amdal-dev.workers.dev/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
12| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| domain | string | 是 | 要查询的域名(例如 'example.com')。将规范化为不含协议或路径的小写形式。 |
详细介绍
承诺度评估
Star 数会说谎,行为信号不会。
一个 MCP 服务和 Web 工具,可根据行为承诺度为 npm 包、PyPI 包、Rust crate、Go 模块和 GitHub 仓库评分——这些信号比 Star 数、README 或下载量更难造假。
$ npx proof-of-commitment axios zod chalk lodash minimatch
Scoring 5 npm packages... done in 3.0s
Package Risk Score Publishers Downloads Age Provenance
chalk 🔴 CRITICAL 72 1 432.9M/wk 14.6y —
minimatch 🔴 CRITICAL 78 1 634.1M/wk 14.9y —
lodash 🔴 CRITICAL 80 1 158.9M/wk 14.1y —
zod 🔴 CRITICAL 83 1 161.2M/wk 6.3y 🔐 verified
axios 🔴 CRITICAL 88 1 115.7M/wk 11.8y 🔐 verified
⚠ COMPROMISED — axios token theft (2026-03-30)
⚠ 5 CRITICAL packages found.
CRITICAL = sole npm publisher + >10M weekly downloads (publish-access concentration risk)
npm audit 不会标记这些问题。它们不是漏洞,而是攻击面集中问题。只需一个被盗的 npm 令牌、一个遭钓鱼攻击的维护者,一次推送就能波及整个生态系统(axios,2026 年 3 月 30 日——已发生)。
供应链问题
下载量每周超过 1,000 万的 91 个 npm 包中,有 26 个只有一位 npm 发布者。它们每周的下载量合计超过 30 亿次。npm audit 不会显示这些问题,Star 数也不会。
典型的 Node.js 项目中有四个包目前处于严重风险状态:
- chalk — 每周下载量 4.32 亿次,1 位 npm 发布者
- zod — 每周下载量 1.85 亿次,1 位 npm 发布者(30 多位 GitHub 贡献者)
- lodash — 每周下载量 1.56 亿次,1 位 npm 发布者
- axios — 每周下载量 1.13 亿次,1 位 npm 发布者(2026 年 3 月 30 日遭到攻击)
它们也不会出现在你的 package.json 中——但几乎每个项目都包含以下包:
- minimatch — 每周下载量 6.25 亿次,1 位 npm 发布者
- glob — 每周下载量 3.66 亿次,1 位 npm 发布者
- cross-spawn — 每周下载量 2.15 亿次,1 位 npm 发布者
行为信号可以揭示这些问题,Star 数和 README 则不能。
快速安装(MCP)
无需登录。添加到任何兼容 MCP 的 AI 工具中,即可开始查询供应链风险。
Claude Desktop
在 macOS 上打开 ~/Library/Application Support/Claude/claude_desktop_config.json(配置文件参考),或在 Windows 上打开 %APPDATA%\Claude\claude_desktop_config.json,然后添加:
{
"mcpServers": {
"commit": {
"type": "streamable-http",
"url": "https://poc-backend.amdal-dev.workers.dev/mcp"
}
}
}
重启 Claude Desktop。聊天输入框中会出现一个工具图标——让它审计你的 package.json。
Cursor
打开 ~/.cursor/mcp.json(Cursor MCP 文档)并添加:
{
"mcpServers": {
"commit": {
"type": "streamable-http",
"url": "https://poc-backend.amdal-dev.workers.dev/mcp"
}
}
}
Smithery(编入索引后)
npx -y @smithery/cli install proof-of-commitment --client claude
立即试用
终端(无需安装):
# New in v1.8.0: zero-arg auto-detect — cd into any project, run once:
npx proof-of-commitment
# Picks the highest-coverage manifest in cwd (package-lock.json > yarn.lock >
# pnpm-lock.yaml > pnpm-workspace.yaml > package.json; requirements.txt;
# Cargo.toml; go.sum > go.mod). When multiple ecosystems are present, the
# file with the most recent mtime wins.
# Explicit package list still works:
npx proof-of-commitment axios zod chalk
# Or point at a specific file:
npx proof-of-commitment --file package.json
npx proof-of-commitment --file package-lock.json # npm (transitive)
npx proof-of-commitment --file yarn.lock # yarn
npx proof-of-commitment --file pnpm-lock.yaml # pnpm
npx proof-of-commitment --file pnpm-workspace.yaml # pnpm monorepo
npx proof-of-commitment --pypi litellm langchain requests
npx proof-of-commitment --cargo serde tokio reqwest
npx proof-of-commitment --golang github.com/gin-gonic/gin golang.org/x/net
npx proof-of-commitment --file go.mod
npx proof-of-commitment --file go.sum # full transitive Go set
# JSON output for downstream tools:
npx proof-of-commitment --file package-lock.json --json | jq '.criticalCount'
CI 集成(v1.8.0+)
--fail-on=<level> 可将 CLI 变成一行 CI 门禁。无需 GitHub Action。
# .github/workflows/supply-chain.yml
name: Supply Chain
on: [pull_request]
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npx -y proof-of-commitment --fail-on=critical
级别:
--fail-on | 在以下情况下退出码为 1… |
|---|---|
critical | 任意包被标记为 CRITICAL(发布权限集中) |
risky | 任意包被标记为 CRITICAL 或 HIGH(评分 < 40) |
none | 从不——仅生成报告 |
默认值:在 CI 中(设置了 CI=true 时,所有主要 CI 运行器都会设置)以及使用 --json 输出时为 critical。交互模式(TTY、非 CI)沿用 v1.7 的默认值 exit 0——在本地运行不会改变你的 Shell 使用习惯。
如果你需要 PR 评论和步骤摘要,专用的 piiiico/commit-action@v1 仍是合适的选择;--fail-on 则适用于只需判断是否通过的精简流水线。
GitHub Code Scanning 的 SARIF 输出(v1.26.0+)
--sarif 会输出 SARIF 2.1.0——静态分析结果的标准格式。将其上传到 GitHub Code Scanning 后,Commit 发现结果会与 CodeQL 和 Snyk 一起显示在 Security 标签页中。
# .github/workflows/supply-chain.yml
name: Supply Chain
on: [pull_request]
jobs:
audit:
runs-on: ubuntu-latest
permissions:
security-events: write
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npx -y proof-of-commitment --file package-lock.json --sarif --fail-on=none > results.sarif
- uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: results.sarif
category: commit-supply-chain
CRITICAL 和 HIGH 包会在仓库的 Security 标签页中显示为警报。遭入侵的包(在 Commit 事件注册表中)会显示为单独的警报。--fail-on 仍独立控制退出码——使用 --fail-on=critical 还可以阻止 PR。
Web 演示(无需安装): getcommit.dev/audit — 粘贴你的包,几秒内即可查看风险评分。
IDE 钩子(Cursor + Claude Code + Windsurf)
poc hook 可通过一条命令,为 Cursor (beforeShellExecution)、Claude Code (PreToolUse) 和 Windsurf (pre_run_command) 安装供应链防护门。相同的钩子脚本会拦截任何 Agent 发起的软件包安装,自动检测调用它的客户端,并在运行前阻止 CRITICAL 软件包。
# Install for the current project (writes .cursor/hooks.json + .claude/settings.json + .windsurf/hooks.json):
poc hook
# Or protect every project for your user:
poc hook --global
# Narrow to one client:
poc hook --cursor # only .cursor/hooks.json
poc hook --claude-code # only .claude/settings.json
poc hook --windsurf # only .windsurf/hooks.json
# Remove (cleans all three):
poc hook --uninstall
该钩子会写入 .cursor/hooks.json、.claude/settings.json 和 .windsurf/hooks.json(项目级),或写入 ~/ 下的对应文件(使用 --global 时)。当 Cursor、Claude Code 或 Windsurf 运行 npm install axios、pip install litellm、cargo add serde 或 go get github.com/gin-gonic/gin 时,钩子会调用 Commit API,并在 500 毫秒内阻止、警告或放行。
拦截范围:
| 包管理器 | 命令示例 |
|---|---|
| npm / npx | npm install <pkg>、npm add <pkg> |
| pnpm | pnpm add <pkg> |
| yarn | yarn add <pkg> |
| pip / pip3 / uv | pip install <pkg> |
| cargo | cargo add <pkg>、cargo install <pkg> |
| go | go get <module>、go install <module> |
**这为何重要:**供应链攻击如今几分钟内就会发生。Shai-Hulud 蠕虫(2026 年 5 月)在 39 分钟内攻陷了 637 个软件包,并专门针对 AI 编码助手——在 .claude/settings.json 和 .vscode/tasks.json 中植入持久化钩子。当 AI 助手安装依赖项时,它会绕过过去作为最后一道防线的人工审核。poc hook 重新设立了这道防线——无论由 Cursor、Claude Code 还是 Windsurf 驱动,都使用同一道防线。
**默认行为:**CRITICAL 软件包(npm 发布者唯一且每周下载量超过 1,000 万——与 LiteLLM/axios 攻击特征完全一致)会被阻止。HIGH 软件包会触发“询问用户”提示(Cursor/Claude Code),或被阻止并显示提示消息(Windsurf)。设置 COMMIT_HOOK_SEVERITY_BLOCK=HIGH 可同时阻止两种级别的软件包。
**使用 API 密钥:**运行 poc hook 前,先执行 poc login sk_commit_…——密钥会嵌入钩子配置,并解除速率限制。
在下一次攻击发生前收到通知
CLI 会告诉你今天有哪些风险。免费 API 密钥可解锁监控功能——重新计算你所依赖软件包的评分,并在评分下降时发出提醒(发布者减少、发布停滞、评分下降 ≥10 分)。
- **Open(免费):**监控 3 个软件包 · 每周一发送摘要
- **Developer($15/月):**监控 15 个软件包 · 每日扫描 · 即时邮件提醒
获取免费 API 密钥 →(无需银行卡,30 秒即可完成 · 每天包含 200 次审计)
npm install -g proof-of-commitment # then:
poc watch axios --email [email protected] # free key + monitoring in one step
poc watch chalk # add more packages (3 free)
poc init # add CI gate to this repo
GitHub Action
在 30 秒内为任意 CI 流水线添加供应链审计——自动从 package.json 或 requirements.txt 检测软件包、将结果作为 PR 评论发布、写入 GitHub Step Summary,并可选择在发现 CRITICAL 软件包时使工作流失败。
使用专用 Action:piiiico/commit-action:
# .github/workflows/supply-chain.yml
name: Supply Chain Audit
on:
pull_request:
paths: ['package.json', 'package-lock.json', 'bun.lock']
jobs:
audit:
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- uses: actions/checkout@v4
- uses: piiiico/commit-action@v1
with:
fail-on-critical: true # blocks merges on CRITICAL packages
comment-on-pr: true # posts results as a PR comment
当 comment-on-pr: true(默认值)时,Action 会自动将审计表作为评论发布到拉取请求中;重新运行时会更新同一条评论,因此不会刷屏。审查者无需离开 PR 即可查看风险表。
输入:
| 输入 | 默认值 | 描述 |
|---|---|---|
packages | (auto) | 以逗号分隔的软件包名称(若未设置,则从 package.json/requirements.txt 自动检测) |
packages-file | (auto) | package.json 或 requirements.txt 的路径(默认:在工作区根目录自动检测) |
fail-on-critical | true | 如果发现 CRITICAL 软件包,则使工作流失败 |
max-packages | 20 | 自动检测时要审计的软件包数上限 |
include-dev-dependencies | false | 包含 package.json 中的 devDependencies |
comment-on-pr | true | 将审计结果作为 PR 评论发布(需要 pull-requests: write 权限) |
api-key | (none) | Commit Pro API 密钥——启用批量请求和每月 10K 次请求 |
api-url | (prod) | 覆盖 API 端点(适用于可自托管场景) |
输出: has-critical、critical-count、audit-summary(Markdown 表格,也会写入 Step Summary)。
**免费版与 Pro 版:**不使用 API 密钥时,会逐个审计软件包(并在请求间延迟,以遵守速率限制)。使用 Pro API 密钥时,所有软件包会通过单个批量请求完成审计——速度更快,每月限额也更高。
PR 评论 / Step Summary 输出示例:
| Package | Risk | Score | Publishers | Downloads/wk | Age |
|---------|-------------|-------|------------|--------------|-------|
| chalk | 🔴 CRITICAL | 75 | 1 | 380M | 12.7y |
| zod | 🔴 CRITICAL | 83 | 1 | 133M | 6.1y |
| axios | 🔴 CRITICAL | 89 | 1 | 93M | 11.6y |
README 徽章
为你维护或依赖的任意 npm 软件包添加 Commit Trust 徽章:

示例:
| 软件包 | 徽章 URL |
|---|---|
| chalk |  |
| react |  |
| express |  |
| @babel/core |  |
评级:🟢 OK(75+)· 🟠 WARNING(40–74)· 🔴 CRITICAL(<40 或唯一的 npm 发布者且每周下载量超过 10M)
徽章缓存 1 小时。无需 API 密钥。
还支持 PyPI、Cargo、Go 模块以及完整的生态专属格式:




REST API
无需 API 密钥。无需安装。
curl https://poc-backend.amdal-dev.workers.dev/api/audit \
-X POST \
-H "Content-Type: application/json" \
-d '{"packages": ["axios", "zod", "chalk", "lodash", "express"]}'
{
"count": 5,
"results": [
{
"name": "chalk",
"ecosystem": "npm",
"score": 75,
"maintainers": 1,
"weeklyDownloads": 398397580,
"ageYears": 12.7,
"trend": "stable",
"riskFlags": ["CRITICAL"],
"scorecardScore": 3.6, // null if no GitHub repo
"hasDangerousWorkflow": false // null if no Scorecard data
},
...
]
}
12 个 MCP 工具
| 工具 | 描述 |
|---|---|
audit_dependencies | 批量审计最多 20 个 npm/PyPI/Cargo/Go 软件包的风险 |
audit_github_repo | 获取仓库的 package.json/requirements.txt 并审计其中的所有依赖项 |
audit_dependency_tree | 映射 npm 软件包的完整依赖树(包括传递依赖中的 CRITICAL 项) |
lookup_npm_package | 单个 npm 软件包的行为特征 |
lookup_pypi_package | 单个 PyPI 软件包的行为特征 |
lookup_cargo_crate | 单个 Rust crate 的行为特征(crates.io) |
lookup_go_module | 单个 Go 模块的行为特征(proxy.golang.org + GitHub) |
lookup_github_repo | GitHub 仓库的持续性评分(存续时间、提交频率、贡献者深度) |
lookup_business | 挪威企业注册信息——运营年限、员工人数、财务数据 |
lookup_business_by_org | 同上,按组织编号查询 |
query_commitment | 浏览器扩展行为数据(唯一已验证访客数、回访率) |
get_api_key | 在聊天中创建免费 API 密钥——无需浏览器,立即返回密钥 |
匿名使用:在 /mcp 和 /api/audit 两个端点合计,每个 IP 每 UTC 日 15 次请求。免费密钥(无需信用卡,30 秒即可在 https://getcommit.dev/get-started 完成注册):每天 200 次。更高等级请访问 https://getcommit.dev/pricing。
分数衡量什么
每个软件包按以下维度评分,范围为 0–100:
- 存续时间 — 软件包已存在多久?遭弃用的软件包可能会被重新激活,用于攻击。
- 发布者集中度 — 单一 npm 发布者 + 每周数百万次下载 = LiteLLM 攻击所利用的攻击面。(发布者 = 有权在 npm 上发布软件包的人,与 GitHub 贡献者不同。)
- 发布一致性 — 定期发布表明有人在积极监督。长期中断 = 漏洞不断累积。
- 下载趋势 — 增长中的软件包会引来更多关注(也包括攻击)。稳定 = 关注度较低。
- OpenSSF Scorecard — 流程安全(代码审查强制执行、分支保护、CI/CD 安全性)。与行为信号相互独立。Scorecard 分数高 ≠ 能防范凭据窃取攻击。
axios(Scorecard 为 8.1/10)和 chalk(Scorecard 为 3.6/10)在行为信号上的风险都为 CRITICAL。它们衡量的是不同的攻击面 — Scorecard 可发现流程漏洞,行为信号可发现发布者集中度。
风险标记:
CRITICAL— 单一 npm 发布者 + 每周下载量 >10M(与 LiteLLM/axios 完全一致的攻击特征)HIGH— 软件包发布不足 1 年 + 快速普及WARN— 12 个月以上未发布新版本
实际数据
# packages you know about:
chalk — score 75, 1 publisher, 432M/week ⚑ CRITICAL
zod — score 83, 1 publisher, 185M/week ⚑ CRITICAL (30+ GitHub contributors)
lodash — score 81, 1 publisher, 156M/week ⚑ CRITICAL
axios — score 88, 1 publisher, 113M/week ⚑ CRITICAL (attacked Mar 30 2026)
express — score 90, 5 publishers, 95M/week
# packages probably not in your package.json, definitely in your lock file:
minimatch — score 78, 1 publisher, 625M/week ⚑ CRITICAL
glob — score 80, 1 publisher, 366M/week ⚑ CRITICAL
cross-spawn — score 72, 1 publisher, 215M/week ⚑ CRITICAL
# post-attack:
litellm — score 74, 1 publisher ⚑ CRITICAL (supply chain attack Mar 2026)
# Rust crates (new in v1.3.0):
serde — score 78, 1 owner, 13M/week ⚑ CRITICAL (dtolnay sole owner)
tokio — score 89, 2 owners, 10M/week
reqwest — score 85, 1 owner, 8M/week ⚑ HIGH
为什么关注行为信号
LiteLLM 攻击(2026 年 3 月)和 axios 攻击(2026 年 3 月 30 日)遵循了相同模式:凭据被盗 → 推送恶意软件包 → 超过 9700 万台机器暴露。按这些指标衡量,这两个软件包如今的风险都为 CRITICAL,攻击者利用的正是单账户这一条件。这些分数是在攻击发生后计算的:这是追溯判断,不是预测。
声明式信号(星标、README 质量、CI 徽章)无法捕捉这种风险。行为层面的承诺则可以。
博客
- LinkedIn 后门:为什么 npm audit 漏掉了一个 250 行的攻击 — 一场伪造招聘者克隆攻击将恶意软件藏在测试文件中,并通过 npm 生命周期脚本运行。npm audit:毫无反应。了解哪些行为信号本可以发出警报。
- axios:结构性分析 — axios 因单一 npm 发布者而被标记为 CRITICAL,攻击者在 2026 年 3 月 30 日利用的正是这一条件。分数是在攻击发生后而非发生前计算的。
技术栈
| 层 | 技术 |
|---|---|
| 后端 | Cloudflare Workers + D1 |
| MCP | Model Context Protocol SDK |
| 数据 | npm registry、PyPI、crates.io、proxy.golang.org、deps.dev、GitHub API、Brønnøysund (NO) |
| 着陆页 | Astro + Cloudflare Pages |
路线图
计划中的功能,不作承诺。项目仍处于早期阶段,欢迎为以下任意项目贡献代码。
| 功能 | 状态 | 说明 |
|---|---|---|
| Cargo(Rust)注册表支持 | ✅ 已上线 | MCP 工具、REST API、徽章端点 — ecosystem: "cargo" |
| Go 模块支持 | ✅ 已上线 | proxy.golang.org + deps.dev + 以 GitHub 为主要依据的评分 — ecosystem: "golang" |
| 分数明细可视化 | 计划中 | 在 getcommit.dev/audit 上展示 5 个维度的图表组件 |
CLI 的 --json 标志 | ✅ 已上线 | npx proof-of-commitment --file package-lock.json --json | jq '.criticalCount' |
| pnpm 工作区单体仓库支持 | ✅ 已上线 | 使用 --file pnpm-workspace.yaml,或从 pnpm-lock.yaml 自动检测 |
| 历史分数追踪 | 计划中 | 趋势图表 — 这个软件包的风险是否随时间增加? |
| 组织级仪表板 | 计划中 | 汇总查看 GitHub 组织中所有仓库的风险 |
请参阅未解决的问题,了解当前可以协助的事项。
更广泛的愿景
供应链审计是第一个工具。其底层原语是承诺图——用行为信号取代基于内容的信任,适用于任何领域。
当内容可以轻易伪造时(评论、星标、README),承诺就成了信号。一位在 12 年间发布过 847 个版本的发布者,与一位在 2023 年只发布过一次的发布者,所体现的承诺截然不同。
同样的逻辑也适用于网站、企业和 AI Agent。两家卡组织分别指出了这一缺口:Mastercard Verifiable Intent §9.2 明确将行为信任列为“未涵盖”。Visa TAP 能识别 Agent,却没有回答是否应该信任它们。
Proof of Commitment 正是它们所指向的信任层。
本地运行
bun install
bun run dev:backend # local server with SQLite
bun run test:e2e # E2E test with mock World ID
部署:
bun run deploy # deploys to Cloudflare Workers
发布
推送 v* 标签后会自动触发发布,也可以通过 GitHub Actions workflow_dispatch 手动触发。
转化漏斗冒烟测试门禁
运行 npm publish 前,CI 工作流会执行 scripts/funnel-smoke.sh——一项发布前本地模拟检查,用于测试转化漏斗的四条关键路径:
| 路径 | 测试内容 | 捕获的错误类型 |
|---|---|---|
| A | 设置 COMMIT_API_KEY 后通过 CLI 审计 → 200 + 结果 | v1.20.0:缺少 Authorization 标头 → 付费转化数为 0 |
| B | CLI 匿名审计,返回 429 → 提示信息 + instant_key_url | 429 处理 / CTA 展示 |
| C | cursor-hook(Cursor stdin)返回 429 → permission: ask + 注册 URL | v1.21.0:429 时静默 allow → 安全缺口 + 转化数为 0 |
| D | cursor-hook(Claude Code PreToolUse stdin)返回 429 → hookSpecificOutput.permissionDecision: ask + claude-code-hook-429 归因 | v1.22.0:Claude Code 驱动时回复格式错误 → 静默允许 / 转化归因错误 |
任一路径失败都会阻止发布。该门禁会运行本地 Python 模拟服务端,因此在 CI 中结果确定,且不依赖生产环境的限流状态。
**可选 CI 密钥:**在 GitHub 仓库机密中设置 COMMIT_TEST_API_KEY,即可在路径 A 中使用真实 API 密钥。若未设置,则使用本地服务端无条件接受的模拟密钥。
本地运行:
bash scripts/funnel-smoke.sh
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。