博客
文章系列日历归档关于搜索

鄂ICP备19019526号

© 2026 博客

  1. 文章
  2. MCP 工程实战:把 Model Context Protocol 跑进生产环境的 5 个关键决策

MCP 工程实战:把 Model Context Protocol 跑进生产环境的 5 个关键决策

2026年6月11日·约 23 分钟·6801 字·3 次阅读
AI 原生架构
MCP 工程实战:把 Model Context Protocol 跑进生产环境的 5 个关键决策

目录

  • 导言:从"实验玩具"到"生产基础设施"
  • 决策 1:传输层选 STDIO 还是 Streamable HTTP?
  • 决策 2:Tool Schema 怎么设计才"既精准又省 token"?
  • 决策 3:安全模型——5 条不可妥协的边界
  • 决策 4:上下文性能——Code Mode 是 2026 年的新范式
  • 决策 5:可观测与生命周期——被低估的"半边天"
  • 实战建议:选型与迁移路径
  • 总结
  • 参考资料

导言:从"实验玩具"到"生产基础设施"

Model Context Protocol (MCP) 自 2024 年 11 月由 Anthropic 开源以来,经历了一段相当陡峭的采用曲线。截至 2026 年初,社区已经构建了"成千上万个"MCP server,官方 SDK 覆盖 TypeScript、Python、Java、Kotlin、C#、Go、PHP、Ruby、Rust、Swift 等所有主流语言(据 Anthropic 官方仓库 modelcontextprotocol/servers 当前已 87k+ Star、11k+ Fork);主流 AI 编程工具——Claude Code、Cursor、Cline、Continue、Windsurf、Zed、VS Code Copilot——均已原生或实验性支持 MCP 作为扩展点。

但采用规模的爆发,也把 MCP 从"实验玩具"推到了"生产基础设施"的位置。Anthropic 2025 年 11 月 4 日发表的《Code execution with MCP》一文直接指出:当 agent 接入几十个 MCP server、几百甚至上千个 tool 时,传统的"把全部 tool 定义一次性塞进上下文窗口、直接调用"模式出现了两个致命问题——

  1. Tool 定义挤占上下文:每条 tool 的 description、parameter schema 都得被模型看到。一个 SaaS 集成稍微复杂一点,几百个 tool 就会让 system prompt 突破 15 万 token;
  2. 中间结果二次流经上下文:tool A 的返回值要被原样写进 tool B 的入参,对长文档/复杂数据流尤其致命。

而更早(2025 年 11 月 18 日)发布的 MCP 规范 2025-11-25 版本,则把协议稳定性和安全模型推上了一个新台阶。本文不重复"MCP 是什么"这类基础科普,而是以生产工程视角,梳理出 5 个在把 MCP 真正跑起来前必须想清楚的关键决策。

决策 1:传输层选 STDIO 还是 Streamable HTTP?

MCP 规范的 2025-11-25 版本把 transport 明确划分为两个对外的稳定选项:

  • STDIO transport:client 和 server 跑在同一台机器上,通过 stdin/stdout + JSON-RPC 2.0 通信。本地文件系统、Git、Shell 这类 MCP server 走 STDIO 最自然,因为它们本来就需要访问本机环境。
  • Streamable HTTP transport:2025-06-18 规范引入、2025-11-25 进一步明确的状态化 HTTP 通道,取代了之前的 HTTP+SSE 方案。远程 SaaS、企业内部服务、多用户共享的 MCP server 走 HTTP。

MCP 官方架构文档给了一个很有指导性的例子:Sentry 的官方 MCP server(运行在 Sentry 平台侧)走 Streamable HTTP,而Claude Desktop 启动的 filesystem server(运行在用户本机)走 STDIO。这背后有一条朴素的工程原则——

如果 server 必须访问本机资源(文件系统、Git 仓库、本地进程),用 STDIO;如果 server 是一项在线服务、用多租户共享,用 Streamable HTTP。

代码层面,如果你用 TypeScript SDK,二者切换的成本极低。STDIO server 的最小骨架如下:

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

const server = new McpServer({ name: "fs-tools", version: "1.0.0" });
server.tool("read_file", { path: { type: "string" } }, async ({ path }) => {
  const fs = await import("fs/promises");
  const content = await fs.readFile(path, "utf-8");
  return { content: [{ type: "text", text: content }] };
});

const transport = new StdioServerTransport();
await server.connect(transport);

要切换到 Streamable HTTP,只需把 StdioServerTransport 换成 StreamableHTTPServerTransport,并启动一个 HTTP 服务器(如 Express、Hono)。Anthropic 官方在多个生产案例中同时支持两种 transport,配置项通过环境变量切换——这是 2026 年 MCP server 的事实标准。

决策 2:Tool Schema 怎么设计才"既精准又省 token"?

MCP server 的核心契约是它的 tool schema(基于 JSON Schema)。这里有两个反直觉的工程经验:

经验 1:description 越具体越好,但越冗长越糟。

Claude 等模型对 tool description 的"语义密度"极度敏感。一条含糊的 description(如 "Search for items")会让模型在 10 个看起来类似的 tool 之间反复犹豫。一条精确的 description(如 "Search Jira issues by JQL query string. Returns up to 50 issues with id, key, summary, status, assignee.")能让模型几乎一次定位。

经验 2:把"高频低代价"的 tool 拆细,把"低频高代价"的 tool 拆粗。

一个常见的反模式是把 20 个相关的数据库操作挤在一个 sql_query tool 里——模型调用一次要消耗几百 token 的 schema,且每次都得自己写 SQL。更好的设计是:list_users / get_user / update_user_status 三个独立 tool,每个 schema 极小、意图极清晰。

经验 3(2026 新增):tool 数量超过 50 必须配 Tool Search。

Claude Code 在 2025 年底推出的 Tool Search 机制,本质上是一个"按需加载 tool 定义"的协议扩展。原理类似 progressive disclosure:默认不把全部 tool 加载到上下文,而是让模型用一个 search_tools meta-tool 按需查找。Claude Code 官方文档明确建议:当 MCP server 暴露的 tool 超过 50 个时,必须配置 tool search,否则会因为上下文爆炸而进入降级模式。 这个建议在社区的反馈中得到了验证——不少团队的 Jira / GitHub / Salesforce 一体化 MCP server 都在接入 tool search 后才稳定可用。Anthropic 官方的实现思路是给 MCP server 加一个 search_tools meta-tool,模型先用这个 tool 检索出与当前任务相关的子集,再按需 read 完整 schema;更进一步还可以让 agent 调节 detail 级别(仅名称 / 名称+描述 / 完整 schema),把上下文开销控制到极致。

决策 3:安全模型——5 条不可妥协的边界

MCP 规范 2025-11-25 在"Security and Trust & Safety"章节列出了 4 条 Key Principles,这是协议层面给出的硬性要求;落到生产环境,还需补一条:

  1. User Consent and Control:用户必须显式同意每一次数据访问和操作。Host 应用(Claude Code 等)必须提供清晰的 UI 让用户在调用前看到 tool 名称、参数、影响范围。
  2. Data Privacy:Host 在把用户数据暴露给 MCP server 前必须取得显式同意;server 不能把收到的数据再转给第三方。
  3. Tool Safety:tool 等于任意代码执行——这一条是规范里最容易被忽略的。MCP 规范明确写道:"descriptions of tool behavior such as annotations should be considered untrusted, unless obtained from a trusted server"。换言之:永远不要把 tool description 当可信信息源。如果你的 MCP server 允许用户提供 description(比如自定义 tool),必须做严格的输入清洗和长度限制,防止 prompt injection。
  4. LLM Sampling Controls:当 MCP server 想要主动调用 LLM(sampling 特性)时,必须取得用户对"是否采样、具体 prompt、server 能看到哪些结果"的逐项同意。协议故意限制了 server 对 prompt 的可见性。
  5. 生产环境补强:执行沙箱。 即使 tool 本身是良性的,如果它被恶意/有缺陷的模型错误调用,后果可能是 fs.readFile("/etc/passwd") 或 psql -c "DROP DATABASE"。官方 reference server 仓库在 README 里明确警告:

"The servers in this repository are intended as reference implementations to demonstrate MCP features and SDK usage. They are not production-ready solutions. Developers should evaluate their own security requirements and implement appropriate safeguards."

生产部署时建议:filesystem MCP 必须用 allowlist 限制可访问目录(如只允许 /workspace/<用户名>/);database MCP 必须用只读账号 + 行级权限(PostgreSQL 的 GRANT SELECT ON schema 是底线);command MCP 必须用 no-shell + 参数白名单。Anthropic 官方推荐的 mcp-server-dev 插件会自动 scaffold 沙箱骨架,但生产部署前仍需人工审计。

一个真实踩坑案例:某团队 2025 年中给内部 code agent 配了 Git MCP server(操作本地 git 仓库),初始版本没限制 git_push 的 remote 参数;模型在一次"帮我把 fix 推到远端"的请求中,错误地把代码 force-push 到了一个共享 dev 分支。规范 2025-11-25 之后,Anthropic 官方在 @modelcontextprotocol/sdk 里加了 annotations 字段(readOnlyHint / destructiveHint / idempotentHint),host 可以基于这些 annotation 自动弹确认框——这是 2026 年 MCP 安全模型最值得团队立刻跟进的能力。

决策 4:上下文性能——Code Mode 是 2026 年的新范式

这是 2025 年 11 月以来 MCP 工程界最大的范式变化。Anthropic 的"Code execution with MCP" 和 Cloudflare 的"Code Mode"(2026 年 2 月 20 日正式发布)几乎在同一时间独立提出了同一个核心思想:

与其让模型直接调 tool,不如让模型写代码调 tool。

Anthropic 给出的数据是:将一个连接了 Google Drive + Salesforce 的 MCP 集群从"直接 tool 调用"切换到"代码生成调用",token 消耗从 15 万降到 2 千,节省 98.7%。

Cloudflare 的 Code Mode 更激进:他们发布了一个覆盖整个 Cloudflare API(DNS、Zero Trust、Workers、R2……)的 MCP server,只暴露两个 tool——search() 和 execute(),上下文占用恒定约 1,000 token。同样的 API 用原生 MCP 实现要消耗 117 万 token——超过当前最强基础模型的整窗上下文。节省幅度 99.9%。

其核心架构可以用一张图概括:

图表加载中…

实现上,Anthropic 提议把每个 tool 变成一个磁盘上的 .ts 文件:

// ./servers/google-drive/getDocument.ts
import { callMCPTool } from "../../../client.js";
interface GetDocumentInput { documentId: string; }
interface GetDocumentResponse { content: string; }

export async function getDocument(input: GetDocumentInput): Promise<GetDocumentResponse> {
  return callMCPTool<GetDocumentResponse>("google_drive__get_document", input);
}

Agent 通过 ls ./servers/ 发现可用 server,再 read_file 加载需要的 tool 定义——和 Claude Skills 的 progressive disclosure 是同一套哲学。Simon Willison 在 2025 年 11 月 4 日的评论里把这种范式称为"让 LLM 发挥其真正强项的合理方式"。

但要注意,Cloudflare 的实现是 server-side Code Mode(在 server 内部把 OpenAPI spec 编译成代码 SDK),而 Anthropic 的提议更偏 client-side(在 client 端把 tool 投影成文件)。两者各有适用场景——前者适合 API 已经规范化的企业 SaaS,后者适合需要灵活组合异构 tool 的开发场景。2026 年的工程共识是:tool 数量 > 20 或 tool 定义总 token > 10k,必须引入某种 Code Mode 机制,否则上下文会先于你的业务逻辑被烧光。

决策 5:可观测与生命周期——被低估的"半边天"

MCP 协议本身在 Base Protocol 章节定义了 Logging、Progress tracking、Cancellation、Error reporting 四类 utility(utilities 章节),但目前大多数 MCP server 实现都只做到了"Logging 一行 stderr"的程度。生产环境这是远远不够的。建议补齐以下几件:

  • 结构化日志 + Trace ID 透传:MCP 的 JSON-RPC 2.0 消息天然有 id 字段(request/response 必须成对的字符串/整数 ID),把它当 trace ID 串起来——一次 agent 任务的 tool 调用链可以这样追踪:Host 分配 rootTraceId → 每次 tool call 时透传到 server → server 在自己的日志里打出来。Langfuse、Arize Phoenix 这类 LLM 可观测平台都支持 MCP 透传。
  • 超时分级:tool 调用必须有显式 timeout,且必须分级。网络类 tool(HTTP / DB)建议 5–10 秒,长任务类 tool(code execution、video processing)建议 30–120 秒。超时后用 JSON-RPC 的 error code 区分——-32000 系列是 server-defined,-32601 是 method not found,-32603 是 internal error。永远不要让 client 等到 OOM。
  • MCP server 版本化:server 必须实现 MCP 规范的 capability negotiation(initialize 阶段),并在 serverInfo 字段返回 version。当 tool schema 发生 breaking change 时,必须 bump major version,并通过 MCP 规范的 notifications/tools/list_changed 主动通知 client。这一点是 2025-11-25 规范相比早期版本最大的稳定性提升。
  • 优雅降级与 reconnect:Claude Code 文档里专门有一个章节叫 "Automatic reconnection"——生产 MCP server 必须处理 client 端的网络抖动。常见模式是 server 端实现一个 idempotent retry 包装,对 read-only tool 重试 3 次,对 mutating tool 拒绝重试。

实战建议:选型与迁移路径

把上面的 5 个决策落到具体行动清单上:

  1. 新接 MCP,先用 SDK scaffold。Anthropic 官方 mcp-server-dev 插件(/plugin install mcp-server-dev@claude-plugins-official)能在 Claude Code 内通过对话直接生成远程 HTTP 或本地 STDIO server 的骨架,含 capability negotiation、tool schema、auth、test 三件套。
  2. 本地开发用 STDIO + MCP Inspector。MCP 官方提供的 MCP Inspector 是调试利器,能让你可视化每一条 JSON-RPC 消息。
  3. 生产部署用 Streamable HTTP + 至少一个 Tool Search 兜底。Claude Code 的 Tool Search 机制是协议外的实现,但已经被 Claude Code / Anthropic 官方强力推荐。
  4. tool 数量超过 20 考虑 Code Mode。自建实现可参考 Anthropic 的 callMCPTool 包装;用 Cloudflare 风格的 server-side 实现则可借助其开源的 Code Mode SDK(2026 年 2 月随 Cloudflare Agents SDK 发布)。
  5. 把"tool 描述不可信"写进团队的 MCP 开发规范。每条 tool description 都当作"用户输入"对待——加长度上限、关键词过滤、最重要的是永远不把 description 直接拼进 system prompt。

总结

MCP 在 2026 年已经过了"是否值得用"的讨论阶段,进入"怎么用得稳"的工程深水区。规范 2025-11-25 的稳定化、Code Mode 范式的爆发、Tool Search 机制的成熟、主流 IDE 的一线支持——这四件事让 MCP 在 2026 年成为 AI Agent 工程的事实标准传输协议。

但协议稳定不等于工程无忧。本文梳理的 5 个决策(传输层选择、tool schema 设计、安全模型、上下文性能、可观测与生命周期)只是必要不充分条件。真正要把 MCP 跑进生产,还需要团队在协议之上建立自己领域的tool 评审机制、token 预算守门人、沙箱安全审计。这才是 MCP 从"能用"走向"敢用"的分水岭。

参考资料

  1. Model Context Protocol 官方文档 - Architecture Overview: https://modelcontextprotocol.io/docs/concepts/architecture
  2. Model Context Protocol 规范 2025-11-25 (latest): https://modelcontextprotocol.io/specification/2025-11-25
  3. Anthropic - Introducing the Model Context Protocol: https://www.anthropic.com/news/model-context-protocol
  4. Anthropic - Code execution with MCP: building more efficient AI agents (2025-11-04): https://www.anthropic.com/engineering/code-execution-with-mcp
  5. Cloudflare Blog - Code Mode: give agents an entire API in 1,000 tokens (2026-02-20): https://blog.cloudflare.com/code-mode-mcp/
  6. Simon Willison - Code execution with MCP: Building more efficient agents (2025-11-04): https://simonwillison.net/2025/Nov/4/code-execution-with-mcp/
  7. Claude Code 官方文档 - Connect Claude Code to tools via MCP: https://docs.claude.com/en/docs/claude-code/mcp
  8. GitHub - modelcontextprotocol/servers(官方 reference servers 集合): https://github.com/modelcontextprotocol/servers

相关文章

  • Agent 工程范式 2026:从 Workflow 到 Context Engineering 的演进路径6月11日
  • AI原生架构(十):通向ASI之路——AI原生应用的未来展望5月12日
  • AI原生架构(九):AI应用运行时——驾驭不确定性的执行基座5月12日

评论

加载评论中…

发表评论

返回文章列表