Skip to content

MCP 工具怎么选 | 从零理解如何构建 AI Agent

帮助你快速判断本章定位、前置要求与学习目标。

MCP 解决什么 ​

MCP 解决的是工具和资源接入协议统一,不自动解决工具质量和权限安全。

从 Agent 开发视角看,MCP 把“模型要用的外部能力”拆成几个明确原语:

原语用途例子
Tools让模型触发动作或查询搜索、查数据库、读文件
Resources给模型读取上下文资料数据库 schema、文档、配置
Prompts提供可复用提示模板SQL 生成 few-shot、工具使用说明
Elicitation向用户要补充信息或确认缺参数、审批高风险动作

这比“把所有能力写成一个万能 API”更容易治理。

适合 MCP 的能力:

  • 搜索;
  • 文件和知识库读取;
  • 数据库只读查询;
  • 业务系统查询;
  • 内部工具封装;
  • 开发环境能力。

不适合直接开放的能力:

  • 无审批删除;
  • 无权限写生产数据;
  • 无审计发送外部消息;
  • 无限制执行 shell;
  • 返回敏感数据的全量查询。

MCP Server 不是业务后门 ​

一个 MCP Server 应该像正式后端服务一样设计:

text
Authentication
  -> Authorization
  -> Input Schema
  -> Execution
  -> Structured Error
  -> Audit Log

不要让 MCP 绕过原有业务系统权限。Agent 只是新的调用方,不应该拿到比用户更大的能力。

评估一个 MCP Server ​

问题为什么重要
需要什么认证决定是否能越权
工具权限是否最小化决定风险面
参数 schema 是否清楚决定模型能否正确调用
错误是否结构化决定能否重试和降级
是否有审计日志决定能否追责
是否能限制范围决定是否可上线

不要因为 MCP 接入方便,就把高风险能力直接暴露给模型。

Server 分级 ​

不是所有 MCP Server 风险都一样:

等级例子准入要求
低风险只读读本地文档、查公开资料明确范围、结构化返回
中风险查询查内部订单、查数据库只读身份透传、权限过滤、审计
高风险写入发邮件、建工单、改状态人工确认、参数校验、回滚
极高风险执行shell、生产数据批量修改默认禁用或强审批

选 MCP 工具时先分级,再决定是否允许模型自动调用。不要把所有 server 放进同一个工具列表。

Tools、Resources、Prompts 怎么分工 ​

需求建议
查询订单状态Tool
暴露数据库 schemaResource
约束 SQL 写法Prompt
缺少查询时间范围Elicitation
执行退款Tool + Approval

很多 MCP 设计失败,是因为把静态上下文做成 tool,把需要确认的动作做成普通 tool,把提示规则硬编码进客户端。

工具设计原则 ​

  • 名称明确;
  • 参数少而清楚;
  • 返回结构化;
  • 错误显式;
  • 默认只读;
  • 写操作需要确认;
  • 支持超时;
  • 支持权限检查。

工具越像稳定 API,Agent 越容易正确使用。

一个好工具描述应该回答三件事:

  1. 什么时候用;
  2. 参数怎么填;
  3. 返回结果代表什么。

工具描述不是给人看的注释,它会直接影响模型是否正确调用工具。

Transport 选型 ​

MCP 支持三种传输方式,选择影响部署架构和安全模型:

Transport适合特点注意
stdio本地开发、CLI 工具最简单,父进程启动子进程不适合多客户端、不适合网络部署
HTTP + SSEWeb 服务、远程工具无需持久连接,易横向扩展SSE 为服务端推送,需处理重连
WebSocket低延迟双向通信持久连接,适合实时交互需要处理连接状态和心跳

生产环境推荐:单客户端本地工具用 stdio;多客户端共享或远程服务用 HTTP + SSE。WebSocket 适合需要服务端主动推送的实时场景(如实时日志 streaming)。

不同 Transport 的安全差异 ​

Transport认证方式风险点
stdio依赖进程隔离server 以调用者身份运行,权限取决于进程
HTTP + SSEBearer Token / API Key / OAuth需要 TLS,token 不能硬编码
WebSocket同 HTTP,初始握手时认证长连接需要定期续期和状态验证

多 Server 组合 ​

Agent 通常需要多个 MCP Server 同时工作。组合时要注意:

工具命名冲突 ​

多个 server 可能有同名工具(例如都有 search 或 read_file)。客户端应该:

  • 为工具名加上 server 前缀(github__search、local_fs__read_file);
  • 或者由客户端维护工具名到 server 的映射表;
  • 避免让模型在没有上下文的情况下猜应该调用哪个 server 的工具。

Server 启动顺序和依赖 ​

  • 需要数据库 server 先启动再启动应用 server 的情况,要明确启动顺序;
  • server 启动失败时,是降级(只使用可用 server)还是整体失败,要事先决定;
  • 健康检查:定期 ping 各 server,失败时切换到备用 server 或降级。

权限隔离 ​

多 server 场景下,每个 server 应该只能访问自己负责的数据域:

text
github_server  -> 只访问 GitHub API
database_server -> 只连接指定数据库
filesystem_server -> 只访问指定目录

不要让一个 server 拿到所有权限,然后根据工具名自行限制。权限隔离应该在 server 层而不是 Prompt 层。

Tool Schema 版本管理 ​

MCP Server 的工具 schema 会随时间变化,版本管理影响客户端稳定性。

Schema 变更类型 ​

变更类型是否兼容处理方式
新增可选参数向后兼容直接发布
新增必填参数破坏性变更需要版本号或迁移期
参数类型变更破坏性变更版本号必须升级
工具名称变更破坏性变更保留旧名称一段时间
返回结构变更破坏性变更客户端需同步更新

版本策略 ​

  • 在 server capabilities 里声明版本(server_version: "1.2.0");
  • 破坏性变更使用主版本号(v1 → v2);
  • 为客户端提供迁移指南和变更日志;
  • 生产 server 上线前在测试环境验证工具调用的完整链路。

认证和部署边界 ​

MCP Server 部署时要明确:

  • server 运行在哪里;
  • 使用谁的凭证;
  • 是否透传用户身份;
  • 是否能限制工作目录或数据域;
  • 是否有超时和并发限制;
  • 日志是否包含敏感参数;
  • 谁能安装和启用 server。

本地开发 server 和生产 server 不能按同一标准处理。生产环境里,MCP Server 就是新的后端入口。

MCP 与普通 API ​

选择适合
MCP多 Agent 客户端复用、工具生态统一
普通 API单系统内部调用、强业务控制
SDK平台内深度集成
手写 tool wrapper少量简单工具

MCP 不是必须项。如果只有一个内部服务、一个 Agent 客户端,普通 API wrapper 可能更简单。

工具评测样本 ​

每个 MCP Server 至少准备几类样本:

样本验证
正常查询工具名和参数是否正确
参数缺失是否触发补充信息
权限不足是否拒绝而不是重试
工具超时是否降级
高风险动作是否进入审批
恶意输入是否被参数校验拦住

MCP 接入成功只是第一步。能否被模型稳定、受控地调用,才是生产选型重点。

生产准入清单 ​

  • 是否有 server 版本;
  • 是否声明 capabilities;
  • 工具 schema 是否稳定;
  • 错误是否结构化;
  • 是否支持超时;
  • 是否有权限检查;
  • 是否有审计日志;
  • 高风险工具是否触发确认;
  • 是否有工具调用评测样本。

没有这些,MCP 只是接入成功,不是生产可用。

最终判断 ​

text
多工具生态:MCP
单系统内部:API wrapper
高风险写操作:审批 + 审计
只读查询:适合先接入
权限不清:不要暴露

MCP 的价值是协议统一,生产价值来自权限、审计和工具设计。