01是什么 / 为什么#mcp-what-why
MCP 是一套开放标准,规定 AI 应用与外部工具之间「怎么发现能力、怎么调用、怎么回传结果」。它解决的是集成复杂度:没有标准时,M 个应用接 N 个工具要写 M×N 套定制对接;有了标准,工具方写一个 server、应用方实现一个 client,各做一次即可,复杂度塌缩成 M+N。
为什么是「标准」而不是「又一个模型能力」
把它想成 USB-C。在通用接口出现之前,每个设备配一根专用线,充电线、数据线、视频线各不通用;约定一个通用口之后,M 个设备加 N 类外设,各自符合标准一次就够。AI 世界原本的问题一模一样:同一个 GitHub 工具,要为 Claude 写一遍、为 Cursor 写一遍、为每个 IDE 再写一遍。
做成一个 MCP server 之后,任何支持 MCP 的客户端都能直接接上去读 issue、提 PR——工具方和应用方解耦,各做各的。生态越大,省得越多,这是它区别于「多一个模型功能」的地方。
和 Function Calling 是分工,不是替代
这是现场最容易问混的一处。两者作用在不同层:
| 维度 | 函数调用(Function Calling) | MCP |
|---|---|---|
| 解决什么 | 让模型决定调哪个函数、传什么参数 | 让工具「怎么被发现、被调用」跨应用标准化 |
| 作用层 | 模型能力层:一次推理里的一步 | 集成协议层:应用与工具之间的通道 |
| 谁定义工具 | 每个应用自己在代码里声明一遍 | 工具方在 server 里声明一次,人人可用 |
| 换个应用怎么办 | 要重写对接 | 做成 server 后,任何 MCP 客户端直接接 |
关系是叠加:MCP 内部仍然靠模型的 function calling 做决策,它做的是把那「一次调用」标准化、跨厂商化。二者不是二选一。
治理:它不是某一家的私有协议
2024 年 11 月由 Anthropic 首次开源,2025 年被主流 AI 应用与 IDE 快速采用, 2025 年 12 月捐给 Agentic AI Foundation(AAIF)——Linux 基金会旗下的中立基金会,由 Anthropic、Block、OpenAI 等共同发起。协议变更走 SEP(Specification Enhancement Proposal,规范增强提案)公开流程。
核实 2026-07-08,来源 aaif.io 官方博客。这一条对客户的用处很直接:接入 MCP 不等于绑定某一家大模型厂商。
02什么时候不该上 MCP#boundary
判断的法则只有一条:这套工具会不会被多个应用或多个团队复用。会复用,MCP 这层标准才收得回成本;只服务一个应用,直接写 Function Calling 更省事。标准的价值来自复用面,没有复用面就只剩额外一层。
三条替代路径,各自适用的场景不同:
直接写 Function Calling
工具只服务一个应用、由同一个团队维护、短期内不打算给别人用。少一层协议、少一层部署,调试路径也短。
内部 SDK 或共享库
多个应用要复用,但都在同一技术栈、同一代码仓里。共享库的类型检查和重构支持比跨进程协议强,没必要为内部复用付出协议的代价。
直接暴露 OpenAPI
消费方不是 AI 应用,或者已有成熟的 API 治理体系而 AI 只是其中一个消费者。这时把 MCP 当作 API 之上的可选适配层,而不是替代品。
反过来,出现下面任一条就值得上:工具要被两个以上 AI 应用接入;工具方与应用方不是同一个团队;需要让工具能力可被发现、可被集中治理和审计。
这一节是网页版在讲义之外补的:讲义把这个判断散在对练与动手做里,没有正面展开替代路径。判据本身来自讲义已有口径,未引入新的外部事实。
03协议解剖#mcp-protocol
三个角色各管一件事:Host 管权限、Client 管连接、Server 管能力。通信底座是 JSON-RPC 2.0。服务端对外提供三类东西——工具、资源、提示词,区别在于「谁触发」。
三个角色
主机(Host)是用户面对的 AI 应用,如 Claude Desktop 或 IDE,负责权限与用户交互;客户端(Client)是 Host 内部为每个 server 建的连接器,一对一维护会话;服务端(Server)是工具与数据的提供方,声明自己能做什么。
一个 Host 可以挂多个 Client,每个 Client 专线连一个 Server。Claude Desktop 里同时接了 filesystem 和 GitHub 两个 server,它内部就起两个 client,各连一个,互不干扰。
一次连接怎么开始
经典流程三步:初始化握手(initialize)双方交换协议版本与能力清单 →
能力发现,客户端拉取 tools/list、resources/list、
prompts/list → 正常调用。握手时 server 说「我支持 tools 和 resources、不支持 prompts」,client 就只去拉这两类,能力协商避免瞎调。
2026-07-28 已按新版更新新版已删掉这套握手、改走无状态:删掉 initialize 与会话 ID,上下文随每个请求走。理解经典三步仍是基础,但届时这一节的机制描述需要改写——细节见传输与版本演进。
三大原语:两把刀切同一件事
第一把刀按「能做什么」切:
| 原语 | 是什么 | 谁触发 | 典型例子 |
|---|---|---|---|
| 工具 Tools | 模型可调用的动作,会执行、可能改状态 | 模型自主决定 | 查数据库、发邮件、创建 issue |
| 资源 Resources | 可读取的数据或上下文,只读无副作用 | 应用或用户挂载引用 | 一个文件、一段记录、一份文档 |
| 提示词 Prompts | 预置的对话模板,把最佳用法固化 | 用户显式选用 | 「代码审查」「总结会议纪要」模板 |
第二把刀按「谁控制」切,决定的是责任落点——这一刀比上一刀更影响架构:
| 原语 | 谁控制 | 责任落点 |
|---|---|---|
| 工具 Tools | 模型控制(model-controlled) | 确认弹窗、权限与审计都要按「模型会乱调」设防 |
| 资源 Resources | 应用控制(application-controlled) | 数据可见性由应用负责,越权看数据在这层查 |
| 提示词 Prompts | 用户控制(user-controlled) | 入口放在界面让用户主动挑,不由模型代选 |
控制者决定展示方式、确认时机、权限与审计责任。选错控制面,用户体验和审计责任就会错位——比如把一个有副作用的动作做成资源,就绕过了本该有的确认环节。
口径依据官方规范 2025-11-25,核实 2026-07-12,来源 modelcontextprotocol.io 规范页。
反向能力与弃用走向
除服务端三原语外,协议还定义了反向能力:Sampling(服务端反过来请客户端的模型帮忙生成)、 Elicitation(服务端向用户追问补充信息)、Roots(客户端告知可访问的目录范围)。
2026-07-28 已按新版更新新版已把 Roots、Sampling、Logging 正式列入弃用(Deprecated),建议改用工具参数、直连模型 API、stderr 或 OpenTelemetry 等替代,保留至少 12 个月缓冲。选型时不要把架构压在这几项上。
真实报文:一次 tools/call 的来回
下面是一次完整往返。点任一高亮字段看它的作用与它牵到哪一节;未启用 JavaScript 时,全部字段说明以列表形式在报文下方给出。
① 客户端 → 服务端:调用工具
{
"jsonrpc": "2.0",
"id": 7,
"method": "tools/call",
"params": {
"name": "query_db",
"arguments": {
"sql": "SELECT region, SUM(rev) FROM sales GROUP BY region"
}
}
}
② 服务端 → 客户端:返回结果
{
"jsonrpc": "2.0",
"id": 7,
"result": {
"content": [
{ "type": "text", "text": "[{\"region\":\"华东\",\"rev\":10200000}, ...]" }
],
"isError": false
}
}
- jsonrpc
- 协议版本标识,恒为
"2.0"。MCP 的所有通信都是标准 JSON-RPC 2.0 报文,不是自造格式——这正是它能被现有 API 治理体系直接接管的原因。 - id
- 把一问一答配对起来的编号。响应必须带回同一个
id,所以同一条连接上可以有多个请求并行往返而不会串线。日志里靠它把一次调用的两端串起来。 - method
- 方法名,决定这是哪一类操作。
tools/list列工具、tools/call调用工具、resources/list列资源。前缀就是三大原语的名字。 - params.name
- 要调用哪个工具。这个名字来自 server 在
tools/list里声明的清单,模型只能在清单范围内选——能力协商在这里兑现。 - params.arguments
- 结构化参数,由模型根据工具描述填出来。这里是工具描述质量的直接后果:描述含糊,模型就会传错参数或在不该调的时候调用。写 docstring 要当成写给模型的产品说明,见动手写 server。也正因为模型能自主构造这一段,它是安全那一节里最需要设防的位置。
- result
- 成功时的返回体。与之互斥的是
error——JSON-RPC 用哪个字段出现来区分协议层面的成败,两者不会同时出现。 - result.content
- 回传内容,是一个数组,每项带
type。工具返回的不只是纯文本,这个结构为多种内容类型留了位置。 - result.isError
- 业务层面的失败标记。注意它和 JSON-RPC 的
error是两件事:error表示这次调用在协议层就没走通(方法不存在、参数不合法),isError: true表示调用成功抵达、但工具自己执行失败(如 SQL 报错)。排错时先分清是哪一类,能省掉大半时间。
整段就是标准 JSON-RPC:可读、可校验、可审计。这也是「为什么选 JSON-RPC」的答案——简单、语言无关、天然可序列化,MCP 流量因此能轻松纳入现有 API 治理。
04传输与版本演进#mcp-transport
同一套报文可以本地进程直连,也可以走 HTTP 远程。选型口诀:只在本机用、碰本地资源走 stdio;要多人或多应用共享、跨网络走 Streamable HTTP。但真正要先定的不是传输,是信任模型。
| 维度 | stdio(标准输入输出) | Streamable HTTP(可流式 HTTP) |
|---|---|---|
| 跑在哪 | 本地:Host 把 server 当子进程拉起 | 远程:server 是独立 HTTP 服务 |
| 适合谁 | 本地工具(读本地文件、跑本地命令) | 团队共享、SaaS 化、跨网络的 server |
| 鉴权 | 靠本地进程边界,通常无需额外认证 | 需要 OAuth 等认证 |
| 部署 | 随客户端启动,零运维 | 像普通 Web 服务:容器或函数计算 |
语法相同不代表信任相同
这是这一章最值钱的一句。stdio 的边界是进程隔离,凭据走环境变量或本地文件,信任前提是「你启动的那个命令及其来源」——本地不自动等于安全。Streamable HTTP 的边界是网络策略,靠 TLS、Origin 校验、OAuth 的 audience 限定,信任前提是网络边界与授权配置。
换传输等于换一整套进程、网络、凭据边界。从 stdio 迁到 HTTP 时鉴权设计要重做,不是改个 URL。所以顺序应该是先定信任模型,再选传输形态。
口径依据官方规范 2026-07-28,核实 2026-07-30。Streamable HTTP 自 2025 年 3 月起取代旧的 HTTP+SSE(Server-Sent Events),是当前的标准传输。
五版脉络:一路在解决「企业规模化」
早期几版解决「能跑通」,后面几版全在解决「多车道、能鉴权、能规模化扩容」——协议在稳步往企业基础设施的方向走。
| 版本 | 传输 | 授权 | 状态模型 | 这一版解决了什么 |
|---|---|---|---|---|
| 2024-11-05 | stdio + HTTP+SSE | 无 | 有状态 | 先能跑通:三原语与 JSON-RPC 2.0 基座 |
| 2025-03-26 | Streamable HTTP(取代 HTTP+SSE) | OAuth 2.1 框架 | 有状态 · Mcp-Session-Id | 能远程、能鉴权:工具注解、批处理 |
| 2025-06-18 | Streamable HTTP | 服务端定为 OAuth 资源服务器;RFC 8707 受众校验 | 有状态 | 输出能对接程序:结构化输出、Elicitation |
| 2025-11-25 | Streamable HTTP | OIDC 发现、增量授权、CIMD | 有状态 | 往企业靠:图标元数据、实验性 Tasks |
| 2026-07-28 | Streamable HTTP(无会话) | RFC 9207 签发方校验;凭据绑签发方;DCR 转 CIMD | 无状态 | 能规模化:无状态核心、MRTR、头路由、可缓存列表、扩展框架 |
无状态核心:新版改动最大的一处
旧的有状态模型要先 initialize 握手拿会话 ID,整通会话认一个实例,于是需要会话粘连(sticky session)或共享会话存储,「这个会话归哪台机器」得一直记着。
无状态之后,每个请求自带协议版本与客户端信息,像每封信都写全地址,谁收都能处理。前面挂一个普通轮询负载均衡就行,任意请求打任意实例。结果是 MCP server 可以像普通无状态 Web 服务一样扩容,这是「向企业规模化倾斜」最实的一步。
三个扩展方向
Extensions
把非核心能力拆成独立、可单独版本化的扩展(反向 DNS 命名),核心保持精简,生态各自演进。
Tasks
长任务从实验特性转为官方扩展,提供任务句柄:发起后可查询、更新、取消,不必卡在一次同步调用里。
MCP Apps
server 可下发交互式 HTML 界面,在沙箱 iframe 里渲染,界面与工具调用走同一套协议——工具返回不再只能是纯文本。
加上正式弃用政策(Active → Deprecated → Removed,至少 12 个月缓冲),新版给客户两个安心点:能力可扩展、变更有节奏。
新版好在哪:五个能拿去跟客户讲的收益
下面这张表按收益组织,不按变更组织——客户关心的是「我得到什么」, 不是「协议删了哪个字段」。
| 你得到什么 | 具体变成什么样 | 靠哪条改动 | 拿什么证明 |
|---|---|---|---|
| server 能当普通 Web 服务养 | 容器随时扩缩、滚动升级不断会话,函数计算这类随起随停的形态也能跑 | 删会话与握手,上下文随每个请求走 | 前面挂一个普通轮询负载均衡即可,不再需要会话粘连或共享会话存储 |
| 现有网关直接能治理 | 按方法名与工具名做路由、限流、审计,跟治理普通 REST 一个姿势 | Mcp-Method / Mcp-Name 成为必带请求头 | 网关规则写在请求头上,不用为 MCP 单独改造一层解包逻辑 |
| 工具列表能缓存,直接省 token | 少一堆 list 轮询;工具顺序固定后,大模型的提示词缓存更容易命中 | 列表结果必带 ttlMs 与 cacheScope;工具列表建议定序 | 本册已核实:GitHub 官方 server 94 个工具约 17,600 tokens 常驻上下文 |
| 调用能并进现有可观测体系 | 一条 trace 从应用一路串到工具调用,不用为 MCP 自造一套埋点 | _meta 里定下 traceparent / tracestate / baggage 传播约定 | 接上后与既有 APM 同图排障 |
| 变更有节奏,企业敢立项 | 任何特性从弃用到最早移除之间至少十二个月,且走公开提案流程 | 首个正式的特性生命周期政策 | 这是客户问「会不会说变就变」时最有力的一句回答 |
还有一条不在表里但值得提:扩展框架成形——非核心能力拆成可单独版本化的扩展 (Tasks、MCP Apps 都在其中),核心保持精简、生态各自演进。对客户的意思是: 以后加能力不必等整个协议大版本。
什么场景因此变了:六个以前难做、现在能做的
| 场景 | 旧版为什么难 | 新版怎么解 | 客户长什么样 |
|---|---|---|---|
| 对外提供 MCP 的 SaaS 平台 | 会话粘在实例上,横向扩容要么配粘连、要么建共享会话存储 | 任意请求打任意实例,扩容回到普通 Web 服务的做法 | 把自家能力开放成 MCP 给客户接的平台方 |
| 函数计算 / Serverless 部署 | 函数实例随起随停,存不住会话,基本没法用 | 无状态天然契合,按调用付费、闲时不烧钱 | 调用量波动大、不愿养常驻实例的团队 |
| 拿现有 API 网关统一纳管 | 要解开 JSON 体才知道调的是什么,网关得改造成 MCP 专用 | 按 Mcp-Method / Mcp-Name 两个头路由,现有网关加条规则即可 | 已有网关与 API 治理体系的中大型企业 |
| 接了几十个 server 的智能体平台 | 工具定义随每条消息进上下文,token 烧得快且只能靠轮询感知变化 | 列表可缓存加定序,轮询变少、提示词缓存更易命中 | 工具生态大、成本压力集中在上下文的平台 |
| 长耗时工具(报表、批处理、深检索) | 卡在一次同步调用里,超时就丢,没有标准的查询与取消姿势 | Tasks 转为官方扩展:句柄轮询查询、可回传输入、可取消 | 跑分钟级甚至更久任务的业务系统 |
| 要过安全评审的行业 | 授权细节留白多,评审时逐条解释成本高 | 签发方校验、注册收口、凭据不串用三条写进规范,加上弃用政策 | 金融、政务这类先过评审才谈落地的客户 |
怎么用这张表:客户问「升级有什么好处」,别背九项变更——先认领他属于哪一行, 再用那一行的「旧版为什么难」和他现在的痛点对上号。 对不上号的,就老实说这版对他影响不大。
口径:场景为本册按官方变更推导的落地判断,非官方清单;协议事实来源见本节末与来源页。
逐项对照:2026-07-28 相对 2025-11-25 改了什么
官方 changelog 给的是九项主变更加十二项次要变更。下表按对落地的影响排序, 每行标出对应的 SEP 编号,客户要追溯时给得出出处。
| 变更 | 旧 · 2025-11-25 | 新 · 2026-07-28 | 对你意味着什么 | SEP |
|---|---|---|---|---|
| 会话 | Mcp-Session-Id 头维持会话 | 删掉会话与该头;要跨调用留状态,改用服务端铸造的句柄,当普通工具参数传 | 不用粘性会话,普通负载均衡就能横向扩 | 2567 |
| 握手 | initialize / initialized 两步握手 | 删握手;每个请求在 _meta 里自带协议版本与客户端能力,版本不匹配返回 UnsupportedProtocolVersionError | 少一轮往返,任意实例都能接同一个请求 | 2575 |
| 版本协商 | 靠握手交换能力 | 新增 server/discover,服务端必须实现,广告支持的版本、能力与身份 | 版本选择前置,探活与兼容判断更直接 | 2575 |
| 服务端反向请求 | roots/list、sampling/createMessage、elicitation/create 由服务端发起 | 改走多轮请求(MRTR):返回 input_required,客户端带 inputResponses 重试原请求 | 不再需要一直开着的回调通道 | 2322 |
| 结果字段 | 结果无类型标记 | 所有结果必带 resultType(complete / input_required) | 旧服务端省略时按 complete 处理,兼容有据 | 2322 |
| 订阅通知 | HTTP GET 端点 + resources/subscribe | 收口成一条长连 subscriptions/listen,客户端按类型订阅 | 变更通知只剩一条流,网关好治理 | 2575 |
| 断流恢复 | Last-Event-ID 可续传、可重投 | 取消可恢复与重投;断了要用新的请求 ID 重发 | 客户端要自己做幂等与重试,别假设续得上 | 2575 |
| 长任务 | 实验性 tasks/result,阻塞等结果 | 转为官方扩展 io.modelcontextprotocol/tasks:tasks/get 轮询 + tasks/update 回传,去掉 tasks/list | 长任务有了标准姿势,且能单独版本化 | 2663 |
| 端点精简 | ping、logging/setLevel、roots 变更通知 | 全部删除;日志级别改为每个请求在 _meta 里带 | 实现面变小,少三处要维护的端点 | 2575 |
| 请求头路由 | 要解 JSON 体才知道调的是什么 | Mcp-Method / Mcp-Name 成为必带头 | 网关、限流器、WAF 不解包就能路由——网关侧最实的一条 | 2243 |
| 列表可缓存 | 只能靠 listChanged 通知 | 五个列表类结果必带 ttlMs 与 cacheScope(public / private) | 能缓存、能让共享中间层判断可否缓存,少一堆轮询 | 2549 |
| 工具顺序 | 顺序不保证 | tools/list 建议返回确定性顺序 | 为的是提高大模型提示词缓存的命中率 | — |
| 链路追踪 | 无约定 | _meta 里定下 traceparent / tracestate / baggage 传播约定 | MCP 调用能并进现有可观测体系,不用自造一套 | 414 |
| 错误码 | 资源未找到用 -32002 | 改为 -32602;并划分 -32020–-32099 为规范保留段 | 错误码不再各家自定义,排错时口径统一 | — |
四项弃用,和一个十二个月的窗口
这一版首次带来正式的特性生命周期政策:Active → Deprecated → Removed 三态, 从弃用到最早可移除之间至少十二个月。口径要说准——这是「弃用到移除」的窗口, 不是「新版本只管十二个月」。说岔了会变成给客户的错误承诺。
| 已进入弃用的 | 官方给的替代 | 我现在该做什么 |
|---|---|---|
| Roots | 改用工具参数、资源 URI 或服务端配置传目录 | 盘一遍哪些工具靠 roots 拿路径,改成显式入参 |
| Sampling | 直接对接大模型厂商 API | 服务端别再借客户端的模型;自己接 API、自己记账 |
| Logging | stdio 写 stderr,或走 OpenTelemetry | 顺手把 trace 上下文接上(新版已定 _meta 传播约定) |
| HTTP+SSE 传输 | 迁到 Streamable HTTP | 2025-03-26 起就该迁了,这次正式进弃用态,别再拖 |
| OAuth 动态客户端注册(RFC 7591) | 改用客户端 ID 元数据文档(CIMD) | 旧机制保留兼容;新接入直接上 CIMD,别再往注册端点建 |
迁移成本落在哪,官方说得很直白:依赖会话标识的实现受影响最大——这正是无状态改造的代价所在。 Tier 1 SDK 已扩至六个,其中 TypeScript、Python、Go、C# 都已出支持版本,包内附迁移说明。
核实 2026-07-30,来源 MCP 官方 2026-07-28 发布文与 changelog。 规范已于 2026-07-28 正式发布,本节按官方 changelog 逐项更新。本节仍是全册时效性最强的一处,下一次定点复查 2027-01-31。
05动手写 server#mcp-server
写 server 的核心工作不是写代码,是想清楚哪些是动作(工具)、哪些是只读上下文(资源)、哪些是可复用模板(提示词)。代码本身用官方 Python SDK 几行就能跑起来。
最小可运行的 server
pip install "mcp[cli]"
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("demo-weather") # 起个 server 名
@mcp.tool()
def get_weather(city: str) -> str:
"""查询某城市的当前天气(示例返回假数据)"""
return f"{city}:晴,26°C"
if __name__ == "__main__":
mcp.run() # 默认走 stdio 传输
装饰器 @mcp.tool() 会自动把函数签名、类型注解和 docstring 转成规范的工具描述——客户端在 tools/list 里看到的就是它。所以函数注释是写给模型看的,要写清什么时候用、参数是什么。这一点直接决定报文里 arguments 那一段填得对不对。
另外两个装饰器对应另外两个原语:@mcp.resource("file://readme") 暴露只读上下文,
@mcp.prompt() 把一段最佳用法固化成模板。同一个 server 里三类能力可以齐活。
选栈两条硬事实:①官方 Tier 1 SDK 六种——TypeScript / Python / C# / Go / Rust / Ruby(Tier 是支持等级承诺,不是安全认证);②面向新规范的正式版已发,不再是 beta:Python SDK v2.0.0(2026-07-28,与规范同日)把 FastMCP 更名为 MCPServer,装饰器写法不变;TypeScript SDK 前一天发 2.0.0 并拆成 @modelcontextprotocol/core / client / server 等一组包。v1 线转维护(Python 当前 v1.30.0)——上面这段 FastMCP 写法在 v1 内仍可用,暂不升级的把依赖钉上限(mcp>=1.28,<2),做迁移评估时记得新版类名已换。
SDK 版本口径核实 2026-10-20,来源 官方 SDK 页与两个 SDK 仓库的 GitHub releases。不可外推边界:Tier 1 是支持等级承诺,各语言 SDK 的正式版进度并不同步,选栈前按目标语言的仓库发布页核当日版本。
开发顺序:先单测 server,再接模型
官方调试工具 MCP Inspector 相当于电工的万用表:npx @modelcontextprotocol/inspector
连上你的 server,用图形界面查看它暴露了什么、逐个点击调用、看真实的报文往返。
先用 Inspector 把 server 单独调通,排除模型这个变量,再接进真实客户端。把「server 对不对」和「模型会不会用」拆成两件事排查,定位速度差一个数量级。
最常见的落地姿势:把现有 REST API 包一层
像给老电器配一个转接头:后端不改、业务不重写,套一层标准口就能插进所有 MCP 客户端。包装层做四件事——描述、转调、整理返回、鉴权。
已有「查订单」接口,就写一个 query_order 工具,内部转调它、把 JSON 里的关键字段挑出来返回。给客户的工作量口径:有现成 API 时,一个中等复杂度的 server
通常几人天,不是重写业务系统。
几百个接口怎么排队:别一个 API 起一个 server,也别一次全包。相关接口按业务域聚成少数几个 server,否则光是部署与目录管理就先失控;批次上先包 AI 应用真会用到的那几个——工具定义是随每条消息进上下文的(见运行期成本),包得越全,每一轮对话都在为没人调用的工具付钱。所以「全量改造」既不必要也不划算,它天然是件可以分批交付的工程。
06生产落地#mcp-production
demo 跑通只是起点。企业里要回答三个问题:远程 server 怎么鉴权、怎么部署与集中管控、去哪儿发现可信的 server。三个答案分别是:标准 OAuth、MCP 网关、私有 registry。
鉴权:就是标准 OAuth,不是另起一套
本地 server 靠进程边界就安全;远程 server 暴露在网络上,必须认证「谁在调、有没有权」。 MCP 的授权底座自 2025-06-18 起是 OAuth 2.1(在 2.0 之上收紧,配合 OIDC,OpenID Connect):客户端拿令牌访问,server 校验令牌与权限。像进写字楼——本地 server 是自家客厅,进门即信任;远程 server 是办公楼,得先在前台换访客证,刷卡才能进对应楼层。
关键话术:能直接对接客户现有的身份与访问管理(IAM,Identity and Access Management)体系。新版要求客户端校验令牌签发方、注册时声明应用类型、凭据绑定签发方——都是在堵「令牌被张冠李戴」的坑。安全评审里有一条 MUST 级红线:token 透传明令禁止——server 不得把收到的令牌原样转发给下游,RFC 8707 的 audience(受众)校验是强制项,防的正是「拿着给 A 的令牌去调 B」这类混淆代理(confused deputy)攻击。
还有容易漏的一层:MCP 层的授权只管到「这个用户能不能调这个工具」,管不到「这个用户能不能看这条数据」。工具内部访问后端时如果用的是一个通用高权限账号,前面令牌校验做得再干净,数据面仍然是所有人共用一份最高权限——越权是在这里发生的,不在协议层。所以下面验收线里的「后端二次授权」是独立的一条:后端要按调用者身份自己再判一次,而不是信任「能调进来就是有权」。
为什么要一个 MCP 网关
企业里 server 会越来越多,还有员工想接外部 server。网关在客户端与众多 server 之间做统一入口:集中认证、限流、审计、按策略放行或拦截。相当于公司的统一收发室,所有进出的流量都在这里登记、安检、留档,而不是每个工位各收各的。
有了网关才谈得上「这个部门只能用这几个 server」「所有调用留审计日志」「外部 server 先过白名单」。治理有了着落。
和已有的 API 网关是分工,不是替换——这是客户第一个会追的问题。MCP 流量本身就是标准 JSON-RPC over HTTP,TLS、限流、审计、认证这些通用治理,现有网关本来就接得住;MCP 网关补的是它看不懂的那层协议语义:按 server 与工具的粒度授权、server 的发现与白名单、连接前审查工具描述。能复用的就复用,别让客户以为要为 MCP 再买一整套治理。
去哪儿发现 server
官方 Registry 是公开 server 的元数据仓库,记录每个 server 叫什么、在哪、怎么装。它像应用商店的货架说明卡:不托管代码,也不替你做安全审查。
建议复查官方 Registry 仍是 preview、未正式发布(GA),可能有破坏性变更,且不收私有 server。企业内网的 server 必须自建私有 registry——可实现同一套接口以复用生态工具。这是数据不出门与合规的必然要求,也是「企业要自建私有目录」这个立项的依据。
核实 2026-07-08,来源 registry 官方页。不可外推边界:Registry 仍是 preview 且不收私有 server——上面有条目不等于通过了安全审查,企业内网该自建的私有目录一样得建。
运行期成本:贵在上下文,不在调用2026-07-20
客户问"这东西贵不贵",答案往往不在他以为的地方。MCP 的运行期开销主要不是每次调用的网络往返,而是工具定义常驻上下文——而且它随每一条消息进上下文,不是每会话一次,所以成本是按轮次乘的。
| 数字 | 说明 | 条件与不可外推边界 |
|---|---|---|
| 17.6k tokens | GitHub 官方 MCP server 暴露 94 个工具,仅工具定义就占约 17,600 tokens | Atlassian 工程博客 2026-03-29 的对照表;未公布模型与计数方法。这是单个大 server 的量级,不能外推成"每个 server 都这么贵"——工具少、描述简的 server 只有几百到几千 |
| 降到 ~3.9k / ~0.5k | 同样 94 个工具,经描述压缩后分别降到约 3,900(低压缩)与约 500(最激进) | 同一来源、同一场景。压缩是牺牲描述细节换上下文,而描述质量直接影响模型会不会误调——见动手写 server,不是免费的 |
| 1–2ms / 会话 | MCP 流量经网关一跳的额外延迟(加密迭代调到约 100 次之后) | Envoy AI Gateway 官方基准 2025-12-08,MacBook Pro M1 八核、简单 echo 工具、按会话计而非按调用;默认加密配置(10 万次 KDF 迭代)下是数十毫秒。单机基准,不能当生产 SLA |
这三个数改变什么判断
别把工具堆进一个 server
工具数直接乘进每轮上下文。一个 90+ 工具的 server 光定义就吃掉 200k 窗口的近 9%,接几个这样的大 server,还没开口就先付掉可观的一块,而且每一轮都要重付一次。按用途拆 server、按场景只挂需要的那几个。
网关那一跳通常不是瓶颈
调优后 1–2ms 的量级,相对模型推理可以忽略。客户拿"多一层代理会不会慢"反对上网关时,真正该谈的是加密配置,不是要不要网关。
选型时先问"暴露多少工具"
这个问题比"支持哪些功能"更能预测实际成本。工具多不等于能力强,但一定等于上下文贵。
以上三条均为 2026-07-20 联网核实,来源 Atlassian MCP Compression 与 Envoy AI Gateway 基准。成本类数字比协议条款更易过期——模型窗口、计价、客户端的延迟加载策略都在变,引用前先核日期。客户端侧已有缓解手段(工具定义超过上下文一定比例时改为按需检索加载),但各家实现与阈值不同,不写进本页口径。
上线前的五条验收线
Inspector 里调通只是联调,不是生产结论。终极判断是一句话:任意一次调用都能回放「谁、经哪个版本、调了什么、为何被允许、结果如何」。
| 验收线 | 查什么 | 要什么证据 |
|---|---|---|
| 版本与协商 | 锁定稳定基线、能力协商取交集、未知能力要拒绝 | 初始化记录、版本兼容表、错误路径用例 |
| 身份与授权 | Origin 校验、令牌 audience 限定、scope 最小化、后端二次授权 | 负向测试、策略日志、审计记录 |
| 供应链与工具安全 | server 来源可信、版本哈希锁定、副作用受控、高危操作要确认 | 来源清单、红队用例、审批与补偿记录 |
| 可靠性 | 超时、限流、熔断、容量、故障恢复 | 压测报告、告警配置、演练记录 |
| 业务质量 | 输出正确、权限正确、用户可验收 | 评测集、人工抽检、反馈闭环 |
对应到云上
| 技术环节 | 代表性做法(多厂商,非绑定) |
|---|---|
| Server 托管 | 函数计算或容器服务跑自建 server;主流云与平台提供托管运行时与目录 |
| 统一鉴权 | API 网关加 OAuth,对接各云 IAM 做认证、限流、审计 |
| 远程接入 | 部分厂商提供远程 MCP 托管与 Streamable HTTP 出口 |
| 现成生态 | 官方 servers 仓库加各厂商官方 server(数据库、SaaS 类) |
| 私有目录 | 自建私有 registry 管理内部 server,数据不出门 |
只列有真实关联的环节,同一环节给多厂商代表性选项,不绑死单一供应商。各云的具体服务能力以 2026 年现状为准,属于变动最快的一类信息,引用前先核日期;完整清单见讲义第 5 章。
07安全#mcp-security
MCP 让工具即插即用,也把「插进来的东西可信吗」变成头等问题。风险不是理论上可能,是已经大规模发生。但每一类都有对应防护,关键是默认就要设防。
四类特有威胁
工具投毒(Tool Poisoning)
恶意 server 把攻击指令藏在工具描述里,客户端一连上、模型一读描述就被注入——发生在任何实际调用之前。描述即攻击面。
地毯式抽换(Rug Pull)
一开始是正常 server,赢得信任后偷偷把工具行为或描述改成恶意。先立牌坊后作恶。
混淆代理(Confused Deputy)
server 借用客户端或用户的权限,去做用户没有授权的事,权限被越权放大。
裸奔 server
把 server 无鉴权直接暴露公网,等于把内部能力开放给所有人。
风险有多真实
| 数字 | 说明 | 边界 |
|---|---|---|
| 40+ CVE | 2026 年 1–4 月 MCP 生态披露,横跨各语言 SDK 与参考实现,受影响组件合计下载量约 1.5 亿,官方参考 server 也中招 | 统计窗口为 2026 年 1–4 月,不可外推为全年或当前值 |
| 72.8% | MCPTox 基准 20 个 agent 设置中的最高投毒成功率(o1-mini) | 限定条件是「开启自动批准」;关掉自动批准后此数字不适用,引用时必须带上这个前提 |
| CVE-2025-6514 | mcp-remote 的远程执行漏洞,恶意端点经构造授权 URL 达成 | 特定组件的特定版本,不代表协议本身有此缺陷 |
核实 2026-07-08,来源 dev.to 汇总与 arXiv 2508.14925。上面第三列是这些数字的不可外推边界——带出门时必须连边界一起带,否则就成了误导。
官方指引
2026 年 6 月,NSA 与 CISA 等发布《MCP: Security Design Considerations》,从架构设计角度给出安全建议,覆盖认证授权、供应链可信、注入面防护、部署边界。客户问「你们凭什么说 MCP 能安全落地」时,可以直接引用它作背书,并对照说明方案覆盖了其中哪几条。
获取方式见本模块电子书书单第 4 条。
防护组合拳:威胁与对策一一对位
| 对策 | 治哪一类 | 要点 |
|---|---|---|
| 人在环上 | 工具投毒 | 高危操作(删数据、发钱、对外发消息)默认人工审批,绝不开全自动批准——这一招最立竿见影 |
| 来源可信并锁版本 | rug pull、投毒 | 只用可信来源的 server,锁定版本,连接前审查工具描述 |
| 最小权限 | confused deputy | 每个 server 只给完成任务所需的最小权限与数据范围,能只读就别给写 |
| 集中管控与审计 | 裸奔 server | 走 MCP 网关统一认证、限流、留痕,别裸暴露公网,持续监控异常调用 |
最容易被忽视也最致命的两条:无鉴权裸暴露公网,以及图省事开全自动批准。这两条几乎是事故直通车,也最容易避免。
08上手路径与排错#mcp-cheatsheet
从零到能上生产的四步,以及出问题时的排查顺序。
| 阶段 | 做什么 | 这一步验证了什么 |
|---|---|---|
| ① stdio 起步 | 本机跑通最小 server | 零运维地验证「这件事有没有价值」 |
| ② Inspector 调通 | 官方调试器单测工具 | server 本身对不对,排除模型变量 |
| ③ HTTP 化加鉴权 | OAuth/OIDC 接现有 IAM | 能不能被多人多应用共享 |
| ④ 网关治理 | 白名单、审计、限权 | 能不能规模化,这是上生产的前提 |
排错三板斧
先用 Inspector 单测 server → 再接客户端分层定位 → 最后查工具描述是不是让模型误调。顺序反了会浪费大量时间:模型「不肯用」和 server「跑不通」是两类完全不同的问题。
现场高频追问
只收会改变某个决定的问题——会改变技术方案、风险判断、验收方法、对客沟通或下一步行动。每题给结论、给背后的机制或权衡、给一个可执行的下一步,并回链依据。
每题标出它加入本题库的日期:2026-07-08 的来自讲义首版对练页,2026-07-20 的是网页版新立、讲义里没有,2026-07-23 是按客户交锋场景补的四题(改造范围 / 权限越权 / 已有网关 / 上下文成本)。
MCP 和 Function Calling 到底什么关系,是不是替代?2026-07-08
不替代,是叠加。Function Calling 是模型「决定调哪个工具」的能力,MCP 是「工具怎么被标准接入」的协议;MCP 内部仍然用 function calling 做决策。
问混的代价是选型错位:以为二选一,就会在「已经有 FC 了」的理由下否掉 MCP,也就丢掉跨应用复用这件事本身。
下一步 让对方说出他那套工具将来要被几个应用接——一个就别上,两个以上再谈。
依据 是什么 / 为什么
这是不是 Anthropic 的私有协议,用了会被锁定吗?2026-07-08
我们已经在用 Function Calling 了,还有必要上 MCP 吗?2026-07-08
看复用面。工具只服务一个应用,直接写就好;一旦要被多应用或多团队反复接,MCP 才收得回这层标准的成本。
标准的价值来自复用面,没有复用面就只剩额外一层协议和一层部署。反过来,出现「两个以上 AI 应用要接」「工具方与应用方不是同一个团队」「要集中治理和审计」任一条,就值得上。
下一步 拿他手上三个真实集成场景逐个套这条判据,当场分出该上和不该上的。
依据 什么时候不该上 MCP
能不能不让模型自己决定调用?我们不放心。2026-07-20
能,而且这正是三原语的设计意图。工具(Tools)是模型控制的,但资源(Resources)由应用挂载、提示词(Prompts)由用户显式选用——把能力放在哪个原语上,就决定了谁来触发它。
这是全册最影响架构的一处:控制面决定展示方式、确认时机、权限与审计责任。把一个有副作用的动作做成资源,就绕过了本该有的确认环节;反过来,把只读上下文做成工具,就白白引入了模型误调的风险。
下一步 把他要接的每个能力过一遍「谁该触发它」,再决定落到哪个原语,而不是一律做成工具。
依据 三大原语:两把刀
月底新版发布,我现在的 server 要立刻改代码吗?2026-07-08
开发一个 MCP server 到底要多少工作量?2026-07-08
有现成 API 的话,一个中等复杂度的 server 通常几人天:描述工具、转调后端、整理返回、加鉴权,四件事,不是重写业务系统。
工作量的大头往往不在代码,在把工具描述写准——描述含糊会导致模型误调或不调,返工成本比写代码高。
下一步 先挑一个现成 REST 接口做包装原型,用 Inspector 点通,拿实测人天去报价。
依据 动手写 server
员工乱接外面的 server 怎么治?2026-07-08
上 MCP 网关做统一入口:白名单放行、集中审计、按部门限权。别让每个客户端各连各的、无人管控。
这个问题的实质是供应链风险——恶意 server 可以把攻击指令藏在工具描述里,客户端一连上、模型一读描述就被注入,发生在任何实际调用之前。网关是唯一能在流量层拦住它的位置。
下一步 画一张目标架构图:客户端 → 网关 → 若干 server,标出认证、审计、白名单各在哪一层。这张图是售前现场最常被要求画的。
依据 为什么要一个 MCP 网关 · 安全
我们内部系统的 server 能放到官方 Registry 吗?2026-07-08
不能。官方 Registry 只收公开 server,且仍是 preview、未正式发布。内部 server 必须自建私有 registry。
还有一层容易被忽略:官方 Registry 只是元数据货架,不托管代码、也不做安全审查——就算能放,也不该把它当企业应用商店用。
下一步 把「涉不涉及内部数据或私有网络」当判据,划出哪些 server 必须进私有目录。
依据 去哪儿发现 server · src-registry
MCP 出了这么多 CVE,还能用吗?2026-07-08
能,但要用对姿势。CVE 多恰恰说明它被广泛使用、被认真审视;官方已有安全指引和修复机制,关键是默认设防、及时更新。
两条几乎是事故直通车,也最容易避免:把 server 无鉴权裸暴露公网,以及图省事开全自动批准。注意 72.8% 那个投毒成功率有前提——它测的是「开启自动批准」的场景,关掉之后不适用,引用时必须带上这个限定。
下一步 对照 NSA/CISA 指引做一次安全自查表,逐条打勾或标注缺口——这张表是应对客户安全评审最有力的交付物。
依据 安全 · src-cve · src-mcptox
上线之后出了问题,怎么定位是谁的责任?2026-07-20
我们有几百个内部 API,是不是要全改造成 MCP server?2026-07-23
先定性再定量:不是改造,是包装——后端不动、业务不重写,MCP 层只做描述、转调、整理返回、鉴权四件事;而且不该全包。筛选判据就一条:这个能力会不会被两个以上 AI 应用或多个团队用到,会才包。落地上按业务域把相关接口聚成少数几个 server,第一批只包 AI 真用得上的那几个,其余按需再加。
客户听到「几百个」脑子里算的是重写业务系统的预算,一算就否掉。纠正成「加一层薄包装 + 只包该包的」,立项就从一个大项目变成可分批的小工程。而且包得越全越亏——工具定义随每条消息进上下文,没人调用的工具每一轮都在收费。
下一步 让他把接口清单按「哪几个是 AI 应用真会用到的」排一遍,第一批只取最前面那几个做包装原型,拿实测人天再谈范围。
依据 动手写 server · 什么时候不该上 MCP
让模型自己调工具,它是拿谁的权限在干活?出事怎么办?2026-07-23
拆三层答,客户真正担心的是第三层。①谁触发:高危操作默认人工审批,绝不开全自动批准——这一条最立竿见影。②拿谁的令牌:远程 server 走 OAuth 2.1,token 透传是规范里 MUST 级的禁令,server 不得把收到的令牌原样转给下游,RFC 8707 的 audience 校验是强制项,防的就是「拿着给 A 的令牌去调 B」。③后端还要再判一次:MCP 层的令牌只证明「这个用户能调这个工具」,不等于「这个用户能看这条数据」。
真正的事故形态不是模型乱调,是权限被放大:server 挂一个通用高权限账号连后端,前两层做得再干净,谁问都能问出全公司的数据。三层里第三层最常漏,因为它不在协议里、在客户自己的系统里——主动挑明这一点,安全评审会顺很多。
下一步 让他画一遍「令牌从谁手上来、在哪一层停、后端凭什么身份查数据」这条链,断在哪一层当场就看得出来。
依据 鉴权:就是标准 OAuth · 安全
我们已经有 API 网关和集成平台了,这不是重复建设吗?2026-07-23
不重复,而且你已有的那套大半能直接用上。MCP 流量就是标准 JSON-RPC over HTTP,TLS、限流、审计、认证这些通用治理现有网关本来就接得住,不用为 MCP 再买一套;要补的只是它看不懂的那层协议语义:按 server 与工具粒度授权、server 发现与白名单、连接前审查工具描述。至于集成平台,它接的是系统与系统之间事先编排好的流程;MCP 多出来的是让模型自己发现有哪些能力、自己决定用哪个——两者不解决同一件事。
这类问题答成「我们的更好」就输了:对方要保护的是已有投资和已有团队。改叙成「你的治理层继续用,我只补它看不懂 MCP 的那一小块」,决策就从换平台降级成加一层,阻力小一个量级。反过来,如果 AI 只是众多消费者之一、又已有成熟 API 治理,那把 MCP 当可选适配层就够,不必强推。
下一步 拿他现有网关的能力清单逐条对:能接管的划掉,划不掉的那几条就是这次立项的真实范围——范围小反而更容易过。
依据 为什么要一个 MCP 网关 · 什么时候不该上 MCP
加了这一层,成本和延迟要增加多少?2026-07-23
贵的地方和客户以为的不一样。网关那一跳通常不是瓶颈——调优后是 1–2ms 的量级,相对模型推理可以忽略。真正的成本在工具定义常驻上下文,而且它随每一条消息进上下文、不是每会话一次,所以是按轮次乘的:GitHub 官方 server 那 94 个工具,光定义就约 17.6k tokens。压缩描述能把它降下来,但描述质量直接决定模型会不会误调,不是免费的。
这改变的是选型时该问哪句话:不是「支持多少功能」,是「暴露多少工具」。工具多不等于能力强,但一定等于上下文贵。报价时要按轮次算上下文账,只算调用次数会漏掉大头。
下一步 把要接的 server 按工具数排一遍,当前场景用不上的先不挂;客户拿「多一层代理会不会慢」反对上网关时,把话题拉回加密配置,而不是要不要网关。
依据 运行期成本
09上云怎么落地#cloud
前面几节讲协议本身怎么工作。这一节换个视角:把 server 从 demo 搬进企业,每个环节在云上对应什么现成能力、该顺着追问客户什么、哪些事云替你做不了。同一环节给多厂商代表选项,不绑死一家。
同一环节给多厂商代表选项,不绑死单一供应商;只列有真实云关联的环节,没有就不硬凑。服务能力以各云 2026 年现状为准,报方案前按当期文档复核。
从 demo 到生产:server 放哪、谁能调、去哪找
| 技术环节 | 代表性云服务(多厂商,非绑定) | 给客户一句话 |
|---|---|---|
| Server 托管 | 函数计算 / 容器服务跑自建 server;主流云与平台提供托管 MCP 运行时与目录(如 Bedrock AgentCore Runtime、Gemini Enterprise) | server 就是个小服务,云上部署走熟路 |
| 统一鉴权 | API 网关 + OAuth,对接各云 IAM 做认证、限流、审计 | 把 MCP 流量纳入现有 API 治理,不另起炉灶 |
| 远程接入 | Cloudflare 等提供远程 MCP 托管与 Streamable HTTP 出口 | 远程 server 像普通 Web 服务一样上线 |
| 现成生态 | 官方 servers 仓库 + 各厂商官方 server(数据库、SaaS 类);API→MCP 桥(AgentCore Gateway、Apigee)把现有 API 转成 MCP 工具 | 先用现成的,只为私有系统写自己的 server |
| 私有目录 | 自建私有 registry(实现官方 OpenAPI 接口)管理内部 server | 内部 server 数据不出门、集中可控 |
顺着追问什么:你们打算暴露多少个工具?这个数直接乘进每一轮对话的上下文,比「支持哪些功能」更能预测账单。现有的 API 网关和 IAM 是哪一套,MCP 流量能不能直接挂上去、不另买一套治理?哪些 server 会碰内网数据——那些就是必须进自建私有目录的。
云替你做不了什么:末句改为:「官方 Registry 仍是 preview、未 GA,可能有破坏性变更,而且只是元数据货架——不托管代码、不做安全审查、不收私有 server,上面有条目不等于通过了安全审查,更不能直接当企业应用商店用。」
本节服务清单与「给客户一句话」与讲义各章的「上云怎么落地」页同源,未引入新事实;「顺着追问什么」与「云替你做不了什么」两格是网页版补的售前视角。不可外推边界:这是「哪个环节有云服务可用」的地图,不是选型结论——具体产品的地域可用性、配额、计价单位与生命周期状态会月级变动,出方案前按当期官方文档逐项复核。
11来源与核实#sources
本页时效性数字均经联网核实后写入,完整登记(事实 × 核实日期 × 信源)见本模块 MANIFEST。核实窗口 2026-07-08 至 2026-08-01(运行期成本三条为 2026-07-20 补核,SDK 版本口径为 2026-08-01 补核)。引用任何数字前先核日期。
| 来源 ID | 信源 | 支持什么 | 不能支持什么 |
|---|---|---|---|
src-aaif | aaif.io 官方博客 | 治理归属、SEP 机制、捐赠时间 | 不涉及协议技术细节 |
src-spec | modelcontextprotocol.io 规范页 | 现行规范口径、三原语与控制面定义 | 不代表尚未发布的新版行为 |
src-rc | MCP 官方博客 RC 发布文 | 2026-07-28 版的逐项改动清单与迁移路子 | RC 锁定不等于正式发布,条款可能微调 |
src-sdk | modelcontextprotocol.io/docs/sdk;python-sdk / typescript-sdk 两仓 GitHub releases | 官方 SDK 支持等级、语言覆盖,以及各语言正式版的发布日与版本号 | 支持等级是承诺,不是安全认证;发布节奏各语言不同步 |
src-registry | registry 官方页 | Registry 的定位与 preview 状态 | 不能作为企业级目录方案的依据 |
src-cve | dev.to 汇总 | 2026 年 1–4 月 CVE 体量与代表案例 | 二次汇总,单条 CVE 细节以官方通告为准 |
src-mcptox | arXiv 2508.14925(MCPTox) | 自动批准场景下的投毒成功率 | 基准环境结论,不可外推到关闭自动批准的部署 |
src-cost-tok | Atlassian 工程博客《MCP Compression》2026-03-29 | 工具定义常驻上下文的 token 量级(94 工具 ≈ 17.6k,压缩后 3.9k / 0.5k) | 未公布模型与计数方法,量级参考不作精确报价 |
src-cost-lat | Envoy AI Gateway 官方基准 2025-12-08 | 网关一跳额外延迟(调优后 1–2ms / 会话) | 单机 echo 工具、按会话计的基准,真实负载与 KDF 迭代数不同结果差异大 |