mcpField
C
Checktrail

Checktrail

本地服务
github.com/stsepelin开发工具0今天更新

关于 Checktrail

Checktrail 是面向开发者、CI 和 MCP 客户端的本地代码验证工具集。它规划已注册的检查,仅在明确授权后运行原生工具,并提供执行证据,避免将跳过或空检查视为通过。

主要功能

  1. 01发现项目并规划已注册检查
  2. 02经明确授权后运行原生检查
  3. 03以执行证据报告结果
  4. 04支持多种语言和基础设施配置
  5. 05提供命令行、MCP 工具和 Agent 技能

适用场景

  1. 01运行项目代码前审阅所选检查
  2. 02在本地或 CI 中验证代码
  3. 03检查实际覆盖的文件和测试
  4. 04为代码库配置检查而不指定任意命令

MCP 相关

本地 MCP 服务通过所选宿主向 MCP 客户端提供 Checktrail 验证工作流。宿主负责模型选择和认证;执行项目代码需要明确授权。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"stsepelin-checktrail": {
"command": "npx",
"args": [
"-y",
"@stsepelin/checktrail"
]
}
}
}
启动命令npx -y @stsepelin/checktrail

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

安装包
npm@stsepelin/checktrail0.1.0-alpha.5

工具

12

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

此工具无需参数。

详细介绍

Checktrail

通过 CLI、MCP 工具和实际运行记录进行本地代码验证。

本地 MCP 服务通过所选 MCP 宿主运行。该宿主负责 AI 选择以及订阅/API 身份验证;Checktrail 无需登录模型服务。直接调用提供商是另一个可选接口。有关已实现的工具、计划中的审查阶段以及新会话强制执行的限制,请参阅 MCP 审查工作流。

原名 Repo Verifier。现有源代码检出请参阅更名指南。

已发布预览版:0.1.0-alpha.5。 公开源代码位于 stsepelin/checktrail。 在依赖适配器之前,请参阅实现状态、计划和 语言矩阵。 安装指南涵盖 CLI、Claude Code 和 Codex。 Agent 技能提供可通过 npx skills add stsepelin/checktrail 安装的设置、验证和审查工作流。 项目设置涵盖 init、doctor 和 MCP 配置生成器。 发布准备记录了发布和验证门槛。里程碑审计区分已实现的配置与尚未完成的验收工作;客户端检查记录了实际应用覆盖情况。 公开采用情况记录了五个固定版本库上的已发布软件包,包括设置过程中的阻碍和兼容性缺口。 Alpha.3 修复了记录在案的 TypeScript 4.9.5 不兼容问题。 设置范围指南说明了语言、文档和工作流的覆盖范围。 Alpha.5 新增了带有逐项检查排除项的具名 Go 构建标签配置。 其发布记录 包含软件包、客户端和升级/回滚验证。

托管矩阵 在 Linux 和 macOS 上通过了发布提交 832a044 的检查。已验证确切的 npm 压缩包以及全新 CLI/MCP 安装。 MCP Registry 条目 目前处于启用状态;默认情况下仍禁用执行。

Checktrail 会发现项目、规划已注册的检查,在明确获得信任时调用原生工具,并报告结果,不会将跳过的检查或空检查判为成功。同一引擎服务于开发者、CI 和 MCP 客户端。

可选的库任务存储会在重启后保留本地验证结果。库工作器增加了原生执行、轮询和取消功能。MCP 报告仍使用内存;标准 Tasks 集成尚未完成。

尝试本地检出版本

需要 Node.js 22 或更高版本。目前执行目标平台为 macOS 和 Linux。

npm ci --ignore-scripts
npm run build
node dist/src/cli.js plan --root examples/javascript --detailed
node dist/src/cli.js run --root examples/javascript --trust-project --detailed

plan 和 inspect 会读取文件,但不会执行项目代码。run 需要 --trust-project:测试、编译器插件和项目配置可能会以你的用户权限执行 代码。这不是沙箱。

除帮助和版本信息外,成功的命令会返回 JSON;输入错误会写入 stderr。退出代码:

Code含义
0所选检查通过、只读操作成功,或建议性实验已完成
1至少一项所选检查失败
2所需证据不完整、执行不受信任或输入无效

通过的运行仅适用于所选检查和范围。PHP 语法检查通过 并不意味着其应用测试也通过。未知框架和空计划均视为不完整。 验证期间源代码发生变更,则不会判定整体通过。

初始适配器

生态系统此基础中的执行方式
JavaScript原生 Node 测试;显式运行 ESLint 检查,并提供逐文件覆盖率证据
Python显式运行 unittest/pytest 测试和 Ruff/mypy 检查
Gogofmt 检查、go vet、禁用缓存并输出 JSON 事件的 go test
PHP语法检查和显式 PHPStan 分析;原生验证结果列于状态中
TypeScript显式 javascript.typescript:本地 tsc、禁止输出文件、文件纳入证据
Jest显式 javascript.jest:原生结果统计;待运行测试视为未完成
Vue显式 javascript.vue-tsc:SFC 和 TS 检查;可选启用 javascript.vue-router 路由契约
Vitest显式 javascript.vitest:原生 JSON 计数和精确的测试文件统计
Playwright显式 javascript.playwright:原生测试/项目证据及已准备的浏览器
其他框架测试运行器清单发现;计划添加执行集成
Rust锁定的离线 Cargo 构建、显式工作区/目标配置、Clippy/libtest/doctests 和 Cargo/Rustfmt
RubyMRI 语法检查;可选启用范围受限的 RuboCop/RSpec/Minitest,并提供源代码和生命周期证据
Swift语法检查;范围受限的 Linux ARM64 SwiftPM 构建、XCTest/Swift Testing 和显式 SwiftLint 规则
C / C++已准备的 Clang 检查;范围受限的 C17/C++20 CMake 构建、CTest、clang-format 和 clang-tidy
Java显式类路径编译,以及范围受限且版本固定的 Checkstyle、Maven reactor 和 Gradle 模块测试
C# / .NET显式 C# 编译;可选启用范围受限的 C#/F#/VB 构建/NUnit 和 C#/VB 空白检查
GitHub Actions静态工作流检查,并进行原生逐文件统计
Kubernetes范围受限的离线 kubeconform 文档/架构验证,并提供物理源代码地址
Kustomize范围受限的本地资源/前缀/副本组装,并进行原生渲染核对及源代码绑定的架构检查
Terraform范围受限的无提供程序多文件 JSON 模块验证,并提供原生源代码诊断
Helm根 chart 及可选的本地应用/子 chart 别名验证,并提供原生约束和源代码诊断
Kotlin可选启用版本固定的 detekt 轻量分析,并统计每个已选文件的规则、源代码、抑制项和完成情况
Scala可选启用版本固定的 Scala 2/3 编译;显式处理混合/生成/仅编译脚本及有序宏阶段
必须已安装工具。引擎不会安装依赖、自动修复问题、启动服务、执行迁移、提交或部署。
Go 执行会禁用模块代理下载和工具链自动下载。Rust 配置文件使用锁定的离线 Cargo,并禁用 rustup 自动安装。其他
被调用的工具和测试代码仍可能访问网络。

选择检查项

如果未进行配置,则对每个检测到的项目应用已注册的默认项。 仅当脚本与 node --test 完全一致时,才会自动选择 Node 测试。 Python 需要显式选择,因为清单无法确定测试运行器。 在被检查的根目录中创建 checktrail.json:

{
  "schemaVersion": 1,
  "projects": [
    { "path": "web", "checks": ["javascript.node-test", "javascript.eslint"] },
    { "path": "library", "checks": ["javascript.typescript"] },
    { "path": "service", "checks": ["go.format", "go.vet", "go.test"] },
    { "path": "worker", "checks": ["python.unittest"] }
  ]
}

存在此文件时,它只会选择列出的项目/检查项。路径必须是相对于 --root 的 已发现项目根目录;若指向该根目录本身,请使用 .。 配置不能提供任意命令,也不能启用执行权限。 schema 会拒绝未知字段,检查项 ID 由引擎验证。私有配置和规则无需公开发布。 本地公开/私有 JSON 包以及可叠加的操作员覆盖配置已实现; 请参阅策略包。显式的 fetch-pack 命令可以通过 HTTPS 下载固定版本的纯数据包,供之后离线使用。显式的 fetch-adapter 命令会在发布私有文件前验证 固定版本可执行包中的每个制品;注册和可信执行是分开的操作。

由操作员注册的外部适配器可以运行固定版本的 本地 Node、Python、PHP 或原生可执行包。仓库配置可以选择这些已注册的检查项;执行仍需获得操作员信任。该协议会检查证据是否完整,而分析的正确性仍由适配器作者负责。

TypeScript 检查需要本地 tsconfig.json,并且配置根目录内必须安装编译器(位于项目本地或提升到某个祖先目录)。它会禁用 noCheck、代码生成和增量状态。项目中清点的每个 .ts、.tsx、.mts 和 .cts 文件都必须出现在编译器的文件列表中。若编译器干净退出但排除了源文件,结果将不完整。严格性和声明检查等其他编译器选项来自项目配置。对于具有新鲜内存中 声明的项目引用解决方案,请使用 javascript.typescript-build。 Vue SFC 检查使用单独的适配器。 集成测试使用 TypeScript 6.0.3 进行验证;其他版本未经验证。 javascript.vue-router 捕获选定的原生测试路由器,并验证其完整参与声明的 URL 探测;有关版本和投影限制,请参阅 Vue Router 配置说明。 javascript.nuxt-runtime 会构建全新的 SSR 测试程序集,并在进程内请求后检查原生路由器捕获情况。选择加入配置版本 2 后,还会验证原生服务端处理程序、中间件调用、运行时配置边界、生成的 API 消费者类型以及受控响应。有关版本和范围限制,请参阅 Nuxt 配置说明 和程序集契约。 python.fastapi-routes 捕获已配置 FastAPI 应用的原生路由。选择加入配置版本 2 后,还会检查声明的挂载/托管程序集、安全依赖项、响应模型、中间件/生命周期顺序以及受控 ASGI 响应。有关版本和范围限制,请参阅 FastAPI 配置说明 和程序集契约。 python.django-routes 在 Django 设置完成后捕获受支持的嵌套 URL 解析器链;请参阅 Django 配置说明。 php.laravel-runtime 捕获测试程序集的路由、中间件、监听器、计划任务和容器绑定投影。选择加入配置版本 2 后,会比较所有声明的原生集合、选定的模型默认值以及受控 HTTP 响应。有关引导行为和限制,请参阅 Laravel 配置说明 和程序集契约。

javascript.eslint 使用已安装的 ESLint 和项目本地 JavaScript 扁平配置。被忽略的文件、不匹配的配置以及未启用任何规则的文件都会导致检查不完整。错误和警告都会导致检查失败。它会保留现有 lint 缓存,且不会执行修复。有关范围、配置要求和已验证的工具支持,请参阅 ESLint 契约。

javascript.vitest 运行已安装的 Vitest 一次,要求报告中包含每个计划测试文件,并拒绝空结果或全部跳过的结果。它会禁用聚焦测试、快照更新和自动依赖安装。有关已测试版本和限制,请参阅 Vitest 契约。

javascript.playwright 会核对原生测试、项目和重试结果,要求浏览器已预先安装,并保护快照。请参阅 Playwright 契约。

javascript.jest 要求提供原生断言和文件核算信息,并保守地将待处理测试视为不完整。请参阅 Jest 契约。 javascript.vue-tsc 会检查 Vue SFC 和 TypeScript,且不生成输出,并拒绝禁用模板检查的情况。请参阅 Vue 契约。

python.pytest 会核对原生收集信息以及设置/调用/拆卸阶段的证据。有关范围和预备运行时,请参阅 pytest 契约。

python.ruff 要求提供精确的原生文件选择和活动规则证据,并禁用修复。请参阅 Ruff 契约。

python.mypy 会检查显式指定的源文件,要求提供原生源文件计数证据,并拒绝宽泛的模块错误抑制。请参阅 mypy 契约。 go.test-race 增加了可选启用的原生竞态检测,并提供未缓存的测试证据。 请参阅 Go 竞态检测约定。Go 检查会将原生包选择与已清点的源代码进行核对;go.staticcheck 则增加了显式的全规则分析和规范化问题发现。请参阅 Go 范围。受约束的 go.golangci-lint 配置允许显式选择原生 linter,同时禁用隐藏的问题过滤器和修复功能。 Alpha.5 增加了 Go 构建标签配置,为每项选定的原生检查提供一份显式配置。Alpha.4 不包含此功能;可运行示例见 examples/go-build。 当前源代码还实现了版本 2 的重复标签/目标配置,以及显式的生产环境 go.build 检查;这些新增功能尚未发布。没有目标执行器时,跨目标测试仍不可用。请参阅 Go 构建配置。

php.phpstan 将逐文件分析统计与原生 JSON 诊断结合起来。 请参阅 PHPStan 约定。

php.phpunit 会流式传输全新的原生 JUnit 证据,并统计文件和断言。 请参阅 PHPUnit 约定。现有 JUnit 工件也可以单独导入;导入不会验证当前源代码或执行的新鲜度。

php.pest 在 CI 模式下运行相关测试,并禁用缓存的测试影响重放;请参阅 Pest。php.pint 使用原生文件和规则统计验证格式;请参阅 Pint。

详细报告包含 ESLint、Ruff、PHPStan、Staticcheck、golangci-lint 和 TypeScript 解决方案构建的规范化源代码问题发现。SARIF 导出会保留失败和未完成的执行,不会将空的问题发现列表视为成功。

项目可以声明环境要求,但只能通过操作员的 --allow-env NAME 权限或显式库选项提供这些环境。MCP 工具调用无法授予环境访问权限。

使用工作区依赖和 Git 选择以及 --base REVISION,验证变更项目及其声明的使用方。 影响范围不确定时,将保留完整的已配置计划。

MCP

从已构建的检出目录运行服务:

node dist/src/cli.js serve --root /path/to/your/repository

对于接受命令/参数形式服务定义的客户端:

{
  "mcpServers": {
    "checktrail": {
      "command": "node",
      "args": [
        "/path/to/checktrail/dist/src/cli.js",
        "serve",
        "--root",
        "/path/to/your/repository"
      ]
    }
  }
}

可用工具包括 project_context、validation_plan、validation_run、 validation_report、finding_comparison、runtime_comparison、contract_validation、 architecture_validation、review_guidance、review_context、review_receipt、 review_hypotheses、review_benchmark、review_workflow、review_run、review_refute、review_probe、review_verify、review_score、review_paired_score、review_calibration_fit、 review_calibration_apply、import_context 和 mutation_experiment。前两个目前会返回相同的项目/检查清单;建议性指导和源代码审查分别使用各自的工具。报告保存在内存中(最近十份),并会在进程退出时消失。

仅在信任项目执行时,才将 --allow-execution 添加到服务参数中。 模型无法通过工具参数授予此权限。仅当客户端可以接收路径、命令和原始诊断时,才添加 --detailed。默认摘要会省略这些字段。通过 MCP 客户端返回的数据可能会发送给该客户端的模型提供商。

仅限操作员使用的 review-benchmark-score 命令会根据冻结且密封的合成基准工件计算描述性配对指标;请参阅基准评分。声明、标签、主机隔离和质量均未经验证。 review_benchmark 工作器视图会从固定的原始合成就绪协议中,读取启动时选定的一项匿名试验。操作员命令会冻结成对案例、保留所有预先声明的日志槽位,并准备匿名评审数据包。主机隔离、完整模型尝试和质量仍未验证;现场试验仍需等待必要的实现门槛。请参阅 REVIEW-BENCHMARK.md。

与模型无关的 review_workflow 工具会与主机拥有的 AI 会话及由操作员固定的实时探测交换有界的评审者/反驳者/裁决者任务。前台 review-session CLI 使用相同的引擎。任务输出需要在启动时启用 --detailed --allow-review-source;原生探测还需要执行信任。已完成的阶段仍会将发现和主机隔离标记为未验证。请参阅工作流操作与限制和可选的私有持久化命令审计。

此实现使用官方 MCP v2 SDK。自动化测试会通过 stdio 测试 2026-07-28 协议及 SDK 的旧版协商。这并不能证明与所有编辑器或 Agent 应用程序兼容。

普通验证调用会异步运行,并在原始调用中返回报告。启动时启用 --task-store,即可为支持的请求启用有界的标准 Tasks 轮询配置,同时保留普通调用回退。请参阅 MCP 兼容性,了解经过测试的 SDK 2.3.0 路由、生命周期证据及剩余的客户端/运行时配置。选定的 Windows 私有任务存储后端已新增原生源代码/软件包 CI 控制;其平台验收仍在等待中。

可通过 CLI、库和 MCP 获取精确的发现基线与例外。发现策略说明了创建、过期、陈旧状态和扩展检查。比较成功时会保留单独的原生验证结果;它绝不会将失败的验证变为通过。

运行时清单比较会检查本地前后程序集工件中的注册项、属性、重复项和顺序变化。导入的工件会保留明确的完整性与来源限制。

公共策略包和私有叠加层会组合已注册的检查,并通过固定的 SHA-256 完整性校验。可在 CLI 调用或 MCP 启动时使用 --policy-overlay,将本地要求添加到已检入的要求中。

已捕获的契约检查会使用严格的使用者架构验证生产者 JSON,并设置工作器截止时间,且对导入的证据单独标注。

限制与证据

详细报告包含工具身份凭据。原生版本探测共用执行限制,且需要操作员信任;缺少身份信息时,不会将成功检查报告为通过。

清单会排除依赖项/构建目录、符号链接和常见的机密文件名,但不会应用 .gitignore。可选的 Git 选择仍会保留这些排除项。限制为 20,000 个条目、深度 32、每个文件 8 MiB,以及文件总字节数 64 MiB。源指纹涵盖纳入的内容和排除项名称,但不涵盖被忽略的依赖项、外部配置、工具二进制文件或服务。

执行设有全程时间预算(默认 30 秒,最高可配置为 120 秒)、每条命令输出上限 1 MiB,以及每次运行输出总量上限 4 MiB。超时、已取消的工作、截断的输出和格式错误的测试证据均视为不完整。详细报告包含进程输出;请勿公开私有仓库的报告。

结果无法证明项目代码没有恶意行为:受信任的测试可以伪造输出、修改其他文件或启动分离进程。隔离和证明属于未来的独立能力。请参阅安全性。

开发

npm run check
npm run format:check
node scripts/smoke-package.mjs

测试涵盖真实进程执行、工具可用时的原生适配器集成、源代码变更检测、输出限制、架构、CLI 退出代码和 MCP 调用。本地运行时缺少的原生工具会明确跳过;CI 会准备工具,并通过必需配置要求使用精确的原生回归名称。更改架构定义后,构建完成时运行 node scripts/generate-schemas.mjs;测试会拒绝已检入的 JSON 架构与定义不一致的情况。

所有示例和测试样例均为合成内容。贡献必须包含一个最小失败案例、对应修复,以及一个适用时的有效近似案例。请参阅贡献指南。采用 MIT 许可。

明确的架构策略会根据字面层级允许列表和可选的循环限制,检查已捕获的项目依赖。导入图的完整性需作为证据声明;这并不意味着会发现原生导入。公开的已构建软件包测试样例会通过消费者类型和运行时检查,测试已安装的生产者。

辅助审查建议

使用 guidance --root PATH,可从计划的检查中选择公开审查问题;也可以添加明确的 --topic。此只读操作不声称具有覆盖率,也不会调用模型。请参阅建议指南。

使用 mutate --root examples/mutations --input mutations.json --trust-project,可在临时源代码副本中进行范围受限的实验。其初始配置支持无依赖项目中的扁平 Node 测试。断言杀死、存活和执行结果不确定是彼此独立的建议结果;请参阅变异实验。

C/C++ 配置会验证准备好的 Clang 参数数组,并要求为清单中的转换单元和头文件提供原生依赖覆盖。单独选择启用的原生工具配置会构建有限的 C17/C++20 CMake 声明,生成整数值头文件,链接静态库和可执行文件,运行已注册的 CTest 回调,并检查格式和明确的分析器规则。两个配置都要求操作员信任才能执行。

Java 配置使用明确的发行版本和固定的本地依赖编译清单中的源代码。不会执行 Maven/Gradle、注解处理器和应用测试。 选择启用的 Checkstyle 配置会使用固定工具和逐文件完成检查,验证已配置的 Java 源代码审计。选择启用的 Maven 和 Gradle 配置会编译声明的 Java 模块,并核对原生测试证据。选择启用的 SpotBugs 配置会分析新编译的 Java 字节码。Kotlin detekt 配置会使用固定的轻量规则分析所选 Kotlin 源代码。Kotlin 编译器配置和 Scala 编译器配置 分别提供单独选择的原生编译证据。更广泛的分析器/平台配置以及生成代码/JPMS 分析器范围仍为必需项。

使用性能测试工具复现合成规划和执行成本。报告会保留原始测量数据和工件标识;文档中记录的快照仅为观测结果,不代表速度保证。

C# 配置使用已准备好的 .NET SDK 和明确的编译设置。项目构建目标、源代码生成器和测试运行程序是单独的功能。

GitHub Actions 配置会使用明确的运行器标签和变量、本地依赖检查以及原生完成证据,检查清单中的工作流。它不会执行工作流任务或操作代码。 开发评估记录了各类别相对于直接原生命令的检测数、误报数和结果不完整数。 这些小规模合成观测无法证明独立审查的质量。 Agent 评估工作流冻结公开来源案例, 将仅使用原生工具的审查者与 MCP 辅助审查者分开,封存评估,并提供 盲法裁定和明确的不完整结果核算。 强制跨类别试点记录了 全新的 Claude/Codex 尝试、交付失败和独立执行审计。

影响测量比较完整验证与 Git 选取的 验证,包括依赖声明错误时遗漏的消费者故障。仅减少选取的检查数量,不能证明运行安全或更快。

可选的 review-context 和 review-receipt 用于交换 范围受限的选定源代码和外部审查者评估。源代码和审查文本 需要 --detailed --allow-review-source;声明和声明的用途仍仅供参考。 核心验证不会调用模型或上传代码。可选的 提供方审查需要单独授予操作者推理和源代码披露权限;常规输出会隐藏源代码和候选文本。 受限的尝试输出会在相同的输出授权范围内保留物理共享引擎 命令输出和通过凭据检查的 API 响应正文; 完整的全尝试及主机使用情况验收仍待完成。

原生审查探测将由操作者固定的控件绑定到 选定源代码和测得的函数/防护执行。原生执行需要操作者信任; 布尔反例仅作为参考证据。

独立反驳会将一个未经验证的假设 发送给全新的无状态验证者,同时隐去先前审查者的标签和判定。 反驳意见仅供参考。原生佐证与独立裁定 现在结合了全新的反驳、实时的操作者固定 Node 探测,以及单独的 原始证据任务。受限观测无法验证生产影响、 声明机制或严重程度;完整的独立发现仍未完成。

审查者评分根据声明的 标签报告适当的概率损失、可靠性、风险/覆盖率,以及明确的不完整/未知项核算。 这不能证明置信度经过校准,也不能证明其可作为质量门槛。

按类别声明的校准会拟合数值型 开发观测,并仅将其应用于使用相同声明模型的互斥保留协议。不可用的类别和超出 训练范围的预测仍标记为未知。拟合不能证明置信度经过校准、 标签已验证、主机隔离独立,或留出集质量达标。

声明的判定概率将数值型 预测与严重程度分开,并将封存评分绑定到原始候选项。独立反驳者和裁定者会收到假设/源代码/原生案例 证据,但看不到先前的候选元数据和汇总判定。这些结构性检查不能证明声明属实、实现全新的主机隔离或置信度经过校准。

范围受限的导入上下文会收集 JS/TS 源代码和 静态消费者边缘,但不会执行项目代码。对于未知或不完整的采集,会为每个已声明项目保留建议性的完整回退方案。 它不会缩小验证计划范围,也不能证明运行时可达性。

实验性的受限 Windows 可执行文件配置 设有专用原生 CI 门禁。 其验收仍待完成;更广泛的 Windows 工具、 Git 和私有持久化配置仍未经验证。 所选的本地 Helm 应用/子图表配置文件会验证已声明的传递依赖图和重复别名图、物理默认值与根级覆盖值、原生值约束,以及绑定到源文件的模板/渲染诊断。它通过同一可信 CLI/MCP 引擎使用已准备好的固定版本工具;任意图表和集群行为需要单独支持。

评论

支持 Markdown

第一次接触 MCP?

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

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