一、引言:Agent 的上限,取决于它能安全触达哪些系统
原文链接:Building agents that reach production systems with MCP
来源:Claude Blog / Anthropic
发布时间:2026 年 4 月 22 日
很多 Agent 原型看起来很聪明:能规划任务、能写代码、能调用几个工具。但一旦进入生产环境,问题会迅速从“模型是否足够强”变成另一个更工程化的问题:这个 Agent 能否稳定、安全、可审计地访问真实业务系统?
Anthropic 在这篇文章里的核心判断可以概括为一句话:Agents are only as useful as the systems they can reach. Agent 的生产价值不是只由模型参数决定,而是由它能连接的系统半径决定。一个无法触达工单系统、代码仓库、数据仓库、云平台、告警平台和企业内部 API 的 Agent,本质上仍然只是一个离生产很远的聊天界面。
这也是 MCP(Model Context Protocol)的意义所在。MCP 不是“又一种 function calling 格式”,而是一层面向 Agent 生态的标准协议:它让外部系统可以用统一方式向 Agent 暴露工具、资源、提示模板、认证流程和交互能力。
本文重点回答五个问题:
- 为什么直接 API 调用和 CLI 很难支撑生产级 Agent?
- MCP 如何把 M×N 的集成复杂度收敛成标准协议层?
- 生产级 MCP Server 应该怎样设计工具语义,而不是机械镜像 API?
- 认证、授权、用户确认、沙箱和审计应该放在架构中的什么位置?
- 一个团队落地 MCP Agent 时,应该遵循哪些工程实践?
先看整体架构:
图注:本文配图均为作者基于原文和 MCP 官方文档整理的概念示意,并非 Anthropic 官方架构图。
二、从 API、CLI 到 MCP:生产集成的三个阶段
Agent 访问外部系统,常见有三种方式:直接 API 调用、命令行工具和 MCP。三者不是互斥关系,而是适用于不同阶段。
2.1 Direct API Calls:原型最快,但会遇到 M×N 集成问题
最直观的做法是让 Agent 直接调用外部 API。例如:给模型一个 createJiraIssue() 函数,或者让它在代码沙箱中发 HTTP 请求。
这种方式适合早期验证:
- 集成链路短;
- 不需要额外协议层;
- 一个 Agent 调一个服务时实现成本最低。
但规模一大,就会出现典型的 M×N integration problem:如果有 M 个 Agent 客户端、N 个外部系统,每个客户端都要重复处理每个系统的认证、工具描述、参数校验、错误语义和权限边界。
| 维度 | 直接 API 调用的问题 |
|---|---|
| 复用性 | 每个 Agent 平台都要重复封装 |
| 认证 | OAuth、token refresh、scope 管理分散在各客户端 |
| 语义 | API endpoint 通常表达后端结构,而不是用户意图 |
| 治理 | 很难统一做审计、限流、确认和策略控制 |
| 迁移 | 从一个 Agent 客户端迁移到另一个客户端成本高 |
直接 API 调用解决的是“能不能连上”,但生产级系统更关心“能不能长期、稳定、可控地连接”。
2.2 CLI:本地自动化很强,但不适合作为云端通用集成层
CLI 是第二种常见方式。很多开发者工具天然有 CLI,Agent 只要能运行 shell,就能复用现有能力。
CLI 的优势在本地非常明显:
- 复用开发者已有工具链;
- 适合代码仓库、文件系统、构建脚本和本地调试;
- 对 Claude Code 这类运行在开发环境中的 Agent 很自然。
但 CLI 依赖几个生产云端并不总能满足的条件:shell、文件系统、本地安装包、本地凭据和用户机器环境。Web Agent、移动端 Agent、云托管 Agent 通常不能假设这些条件存在。
因此,CLI 更像是“本地开发者入口”,而不是“跨客户端、跨平台、跨部署环境的生产协议”。
2.3 MCP:把外部系统变成可发现、可认证、可复用的能力层
MCP 的目标不是替代 API,也不是替代 CLI,而是在 Agent 与外部系统之间增加一层标准协议:
API:系统能力的底座
CLI:本地开发者和自动化入口
MCP:面向 Agent 的协议化集成层
在这个模型中,服务方不再为每个 Agent 平台单独写适配器,而是构建一个 MCP Server。只要 Claude、ChatGPT、Cursor、VS Code 或企业自研 Agent 支持 MCP,就可以复用同一个 Server 暴露的能力。
MCP 的关键价值包括:
- 能力发现:Client 可以发现 Server 提供的 tools、resources、prompts。
- 标准交互:基于 JSON-RPC 2.0、有状态连接和能力协商。
- 认证复用:远程 Server 可以统一处理 OAuth、API Key、token 生命周期。
- 跨客户端分发:一个 Server 可以服务多个 MCP Host。
- 生产治理:可以集中做权限、审计、确认、沙箱和限流。
换句话说,直接 API 调用解决单点连接,CLI 解决本地自动化,MCP 解决生产级 Agent 的生态化连接。
三、MCP 的核心抽象:Host、Client、Server 与三类能力
MCP 官方规范里有三个基本角色:
| 角色 | 含义 | 例子 |
|---|---|---|
| Host | 发起连接的 AI 应用 | Claude、IDE、企业 Agent 平台 |
| Client | Host 内部的 MCP 连接器 | 管理连接、能力协商和工具调用 |
| Server | 暴露外部系统能力的服务 | GitHub MCP、工单 MCP、数据平台 MCP |
Server 向 Client 暴露三类主要能力:
- Tools:可执行函数,例如创建工单、查询部署状态、触发回滚。
- Resources:上下文和数据,例如文档、日志、表结构、文件内容。
- Prompts:模板化消息和工作流,例如“按事故复盘模板生成报告”。
此外,MCP 还支持 Elicitation:Server 在工具调用过程中主动向用户请求补充信息。这一点对生产环境很重要,因为很多操作不能让 Agent 猜测参数或绕过确认。
3.1 一个最小 MCP Tool 示例
下面是一个简化的 TypeScript 示例,展示如何用 MCP SDK 暴露一个面向业务意图的工具。代码重点不是“完整可部署服务”,而是展示工具边界应该怎样建模。
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({
name: "incident-ops",
version: "1.0.0",
});
server.registerTool(
"create_incident_from_alert",
{
description:
"基于告警摘要创建一条生产事故工单,并返回工单编号和处置链接。适用于确认已经影响用户的线上问题。",
inputSchema: {
service: z.string().describe("受影响的服务名,例如 checkout-api"),
severity: z.enum(["sev1", "sev2", "sev3"]).describe("事故级别"),
summary: z.string().min(10).describe("事故摘要"),
evidenceUrl: z.string().url().optional().describe("告警、日志或监控图链接"),
},
},
async ({ service, severity, summary, evidenceUrl }) => {
const response = await fetch(`${process.env.INCIDENT_API_BASE}/incidents`, {
method: "POST",
headers: {
"content-type": "application/json",
authorization: `Bearer ${process.env.INCIDENT_BOT_TOKEN}`,
},
body: JSON.stringify({ service, severity, summary, evidenceUrl }),
});
if (!response.ok) {
return {
content: [{ type: "text", text: `创建事故失败:HTTP ${response.status}` }],
};
}
const incident = await response.json();
return {
content: [
{
type: "text",
text: `已创建事故 ${incident.id}:${incident.url}`,
},
],
};
},
);
const transport = new StdioServerTransport();
await server.connect(transport);
这个示例体现了三个设计点:
- 工具名是
create_incident_from_alert,表达的是业务意图,而不是底层 API endpoint。 inputSchema用zod明确约束参数,避免让 Agent 传入模糊结构。- 返回结果是给模型消费的摘要,而不是把完整后端响应原样塞回上下文。
真实生产环境中,不建议把用户级凭据直接写在进程环境变量里长期复用。更好的做法是让远程 MCP Server 接入 OAuth 或集中式 Vault,在连接建立或工具调用时按用户、租户和 scope 注入短期凭据。
3.2 工具不是 API 镜像,而是 Agent 的任务接口
很多团队第一次做 MCP Server 时,会把每个 REST endpoint 都封装成一个工具:
get_alert
list_alerts
parse_alert_payload
create_ticket
add_ticket_comment
attach_evidence
notify_oncall
这看起来“覆盖面很全”,但对 Agent 并不友好。模型必须在大量低层工具中自己编排流程,任何一步选错工具、漏传参数或误解返回值,任务都会失败。
更好的方式是围绕用户意图设计少量高质量工具:
create_incident_from_alert
summarize_customer_impact
prepare_rollback_plan
notify_oncall_with_context
判断一个 MCP Tool 是否适合 Agent,可以问四个问题:
- 用户会不会用同样的话描述这个任务?
- 工具是否封装了一个完整业务动作?
- 参数是否少而稳定,并且能被模型从上下文中可靠提取?
- 返回结果是否是下一步决策所需的最小摘要?
原文里有一个很重要的经验:少量描述清晰、面向任务的工具,通常优于大量底层 API 的机械镜像。
四、Remote MCP Server:生产级 Agent 的默认形态
本地 MCP Server 适合开发、调试和个人自动化。但如果目标是让 Agent 进入真实生产系统,远程 MCP Server 往往是更有分发价值的形态。
原因很简单:生产 Agent 越来越多运行在云端,而生产系统本身也多是云托管、权限隔离、需要审计的远程系统。此时依赖用户本机 shell 或本地凭据并不现实。
Remote MCP Server 的典型能力边界如下:
| 能力 | 生产价值 |
|---|---|
| HTTPS Endpoint | Web、移动端、云端 Agent 都能连接 |
| OAuth / API Key | 统一身份认证和权限授权 |
| Tool Discovery | Client 能发现可用工具,而不是硬编码调用 |
| Policy Layer | 按用户、租户、环境和工具风险做准入控制 |
| Audit Log | 记录谁在何时让 Agent 做了什么 |
| Sandbox | 控制代码执行、网络访问、文件访问和超时 |
4.1 为什么远程 Server 能带来复利
直接 API 集成通常是一次性适配:你给 Claude 写一套,再给另一个 Agent 平台写一套。MCP 的复利在于,服务方构建的是协议能力,而不是某个单点集成。
当更多客户端支持 MCP 时,同一个 Server 的覆盖面会扩大;当 MCP 协议扩展支持更多能力时,同一个 Server 可以在不重写业务 API 的情况下获得更好的交互方式。
这也是为什么原文强调:如果目标是生产系统集成,应该优先考虑远程 MCP Server,而不是只做本地 Server。
4.2 大型 API 面:不要暴露几百个工具
对于 GitHub、Cloudflare、AWS、Kubernetes、企业云平台这类系统,API 面非常大。如果把每个 endpoint 都映射成 MCP Tool,会产生四个问题:
- 工具定义占满上下文;
- 模型选择工具更困难;
- 多步骤调用链更脆弱;
- 权限和审计粒度难以治理。
更可取的模式是“搜索 + 受控执行”:
search_capability:搜索可用 API、资源类型、示例和约束
execute_plan:在沙箱中执行一段受限脚本或计划
Agent 先搜索需要的能力,再生成短脚本或结构化计划,由 MCP Server 在受控沙箱中执行。模型只接收最终摘要和必要证据,而不是所有中间响应。
这背后的原则是:让代码处理中间数据,让模型处理意图、判断和解释。
五、生产治理:认证、确认、沙箱和可观测性缺一不可
Agent 一旦接入生产系统,就不能再只关注“能不能调用成功”。更重要的是:谁授权的?调用了什么?影响范围是什么?是否需要用户确认?失败能不能回放?
5.1 标准化认证:不要让凭据散落在 prompt 和工具参数里
生产环境中,凭据管理应该遵循几个原则:
- 用户敏感凭据不进入模型上下文;
- OAuth token 由 Server、平台 Vault 或可信凭据层托管;
- token 按用户、租户、scope 和环境隔离;
- 长期会话需要自动 refresh,而不是要求用户反复粘贴密钥;
- 所有凭据使用都应该可审计、可撤销。
对于远程 MCP Server,OAuth 是更自然的选择。用户授权一次,Server 或平台保存可刷新凭据,后续 Agent 会话通过连接上下文获得最小权限访问。
5.2 高风险工具必须有确认边界
不是所有工具都应该被 Agent 自动执行。查询类工具和只读资源通常风险较低,但下面这些操作必须进入确认流程:
- 删除资源;
- 修改权限;
- 发布生产变更;
- 触发回滚或扩缩容;
- 关闭告警或服务;
- 访问高敏数据;
- 发起付款或外部通知。
MCP 的 Elicitation 能让 Server 在工具调用过程中暂停,请求用户补充信息或确认操作。它的价值在于:确认逻辑由工具提供方发起,而不是依赖模型自己判断什么时候该问。
一个策略层可以像下面这样工作:
type ToolCall = {
name: string;
arguments: Record<string, unknown>;
};
type PolicyDecision =
| { action: "allow" }
| { action: "deny"; reason: string }
| { action: "confirm"; message: string };
async function evaluateToolCall(call: ToolCall, userId: string): Promise<PolicyDecision> {
if (call.name.startsWith("delete_") || call.name.includes("production")) {
return {
action: "confirm",
message: `即将执行高风险操作 ${call.name},请确认目标、环境和影响范围。`,
};
}
if (!(await userHasScope(userId, call.name))) {
return { action: "deny", reason: "当前用户没有调用该工具所需的权限" };
}
return { action: "allow" };
}
这段代码表达的是治理思想:工具调用之前先过策略,策略可以允许、拒绝或要求用户确认。真正落地时,确认可以通过 MCP Elicitation、产品 UI 或企业审批系统完成。
5.3 沙箱执行:让 Agent 写代码,但不要让代码直接碰生产
原文提到,对于大型 API 面,可以让 Agent 通过代码编排访问系统能力。但这并不意味着把生产凭据和网络权限直接交给模型生成的代码。
代码编排模式必须配套沙箱:
| 沙箱能力 | 目的 |
|---|---|
| 网络 allowlist | 只能访问指定内部 API 或 SaaS endpoint |
| 文件系统隔离 | 防止读取无关文件和凭据 |
| CPU / 内存 / 时间限制 | 防止死循环和资源滥用 |
| 只读默认权限 | 写操作必须显式授权 |
| 输出截断与摘要 | 避免大结果污染上下文 |
| 审计日志 | 保存脚本、参数、结果和调用人 |
可以把 Agent 生成的代码看成“临时编排计划”,而不是可信应用代码。Server 的职责是验证、限制、执行和记录,而不是盲目信任。
5.4 可观测性:生产 Agent 需要看见轨迹,而不只是结果
传统 API 集成通常只关注接口成功率。Agent 集成还需要观察完整轨迹:
- 模型为什么选择这个工具?
- 工具输入来自哪段上下文?
- 是否触发过确认?
- 工具返回了什么摘要?
- 失败后是否重试?
- 是否访问了敏感资源?
- 用户最终是否接受结果?
因此,生产 MCP Server 至少应该记录四类日志:
- 连接日志:用户、客户端、Server、认证方式、scope。
- 工具调用日志:工具名、参数摘要、风险级别、耗时、结果状态。
- 确认日志:谁确认、确认内容、确认时间、关联操作。
- 数据访问日志:访问了哪些资源、返回了多少数据、是否脱敏。
这些日志不仅用于排障,也用于安全审计、成本分析和 Agent Eval。
六、上下文效率:Tool Search 与 Programmatic Tool Calling
生产 Agent 常见的另一个瓶颈是上下文膨胀。一个企业可能接入几十个 MCP Server,每个 Server 又有几十到几百个工具。如果客户端在会话开始时把全部工具定义塞给模型,模型还没开始解决问题,就已经被工具说明书淹没。
6.1 Tool Search:按需披露工具,而不是一次性加载
Tool Search 的思想是:不要预先加载完整工具目录,而是在运行时按任务搜索相关工具,只把必要工具定义放入上下文。
用户任务:帮我根据昨晚告警创建事故复盘
↓
搜索:incident、alert、postmortem 相关工具
↓
加载:create_incident_from_alert、get_alert_timeline、draft_postmortem
↓
模型基于少量相关工具完成任务
这是一种渐进式披露机制。它降低 token 成本,也减少模型在大量相似工具之间选错的概率。
6.2 Programmatic Tool Calling:让代码过滤中间结果
很多工具返回的是结构化大数据:日志列表、数据库查询结果、监控时间序列、工单评论、代码搜索结果。模型通常不需要看到全部原始数据,只需要看到过滤后的证据和结论。
因此,可以让代码沙箱负责循环调用、过滤、聚合和排序:
const alerts = await tools.monitoring.searchAlerts({ service: "checkout-api", hours: 12 });
const critical = alerts.filter((alert) => alert.severity === "critical");
const timeline = critical.map((alert) => ({
time: alert.startedAt,
title: alert.title,
link: alert.url,
}));
return summarizeForModel(timeline);
这类模式的核心不是“少让模型干活”,而是把工作分层:
- 代码处理确定性的结构化数据;
- 模型处理不确定的意图理解、解释和决策;
- MCP Server 负责权限、执行边界和审计。
七、MCP Apps、Elicitation 与 Skills:让集成不止是文本工具
生产系统不是只有 API。很多关键流程需要 UI、表单、审批和领域知识。
7.1 MCP Apps:把产品 UI 嵌入 Agent 工作流
如果工具只返回纯文本,复杂业务会被压扁成聊天记录。MCP Apps 的方向是让 Server 返回更丰富的交互界面,例如:
- 数据分析图表;
- 工单确认表单;
- 配置预览面板;
- 发布审批页面;
- 监控 Dashboard;
- 多选项决策界面。
这对生产 Agent 很关键。用户不应该只看到“我要删除 12 个资源,是否继续?”这样一句话,而应该看到资源列表、影响范围、回滚方式和审批记录。
7.2 Elicitation:让 Server 在关键步骤主动问用户
Elicitation 适合处理三类问题:
- 参数缺失:例如缺少目标环境、时间窗口或服务名;
- 存在歧义:例如多个同名服务、多个候选工单;
- 高风险确认:例如删除、发布、付款、权限变更。
它避免了一个危险模式:让模型在缺失关键信息时自行猜测。
7.3 Skills:告诉 Agent 如何正确使用工具
MCP 解决“能访问什么”,Skills 解决“应该如何使用”。
一个数据平台 MCP Server 可以提供查询工具,但 Agent 仍然需要知道:
- 哪些表是事实表,哪些表是维表;
- 哪些字段有 PII,需要脱敏;
- 分析 GMV 时应该排除哪些订单状态;
- 查询大表前应该先估算分区范围;
- 结果写入报告时应该附上 SQL 和口径说明。
这些过程知识更适合放进 Skills 或工作流模板中。对复杂领域来说,MCP Server 与 Skills 组合起来,才更接近真正可用的生产 Agent。
八、落地清单:如何设计一个生产级 MCP Agent 集成
如果要把一个内部系统接入 Agent,我会按下面的顺序设计。
8.1 先划定系统边界
不要一上来就问“要暴露哪些 API”。先问:
- Agent 要帮助用户完成哪些高频任务?
- 哪些任务只读,哪些任务会改写生产状态?
- 哪些数据涉及敏感信息?
- 哪些操作必须有人确认或审批?
- 哪些能力适合工具,哪些能力适合资源,哪些能力适合 prompt?
8.2 再设计工具语义
工具设计遵循五条原则:
- 面向用户意图,而不是后端 endpoint;
- 少量高质量工具优于工具爆炸;
- 参数结构稳定,字段有清晰描述和校验;
- 返回结果默认摘要化,只暴露必要上下文;
- 高风险工具在工具层声明风险等级。
8.3 然后补齐生产护栏
上线前至少具备:
- OAuth 或等价的标准认证流程;
- 按用户、租户、环境、scope 的权限控制;
- 高风险操作确认;
- 审计日志;
- 速率限制;
- 沙箱和超时;
- 敏感字段脱敏;
- 工具调用 Eval;
- 回滚和 kill switch。
8.4 最后考虑分发和演进
一个好的 MCP Server 不应该只服务一个客户端。它应该具备:
- 清晰的 Server 名称、版本和文档;
- 稳定的 HTTPS endpoint;
- 可兼容多个 MCP Host;
- 可观测的工具使用数据;
- 可灰度的工具版本;
- 可随业务 API 演进的 schema 管理。
九、结语:MCP 的本质是 Agent 时代的生产连接层
如果只把 MCP 看成“让模型调工具的一种格式”,会低估它的价值。真正重要的是它把外部系统接入 Agent 的方式标准化了:发现能力、认证授权、调用工具、读取资源、触发交互、治理权限、审计行为,都可以围绕同一协议层展开。
生产级 Agent 的关键不只是“更聪明的模型”,而是“更可靠的连接”:
- API 是能力底座;
- CLI 是本地自动化入口;
- MCP 是云端 Agent 访问生产系统的标准协议层;
- Skills 和 Elicitation 则补齐了过程知识与用户参与;
- 沙箱、策略和审计让这种连接真正可上线。
当 Agent 进入企业生产环境,问题不再是“能不能调用某个接口”,而是“能不能以统一、安全、可复用、可审计的方式连接一组异构系统”。这正是 MCP 最值得关注的地方。
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付