MCP 完全指南:它是什么、怎么来的、为什么管用
写于 2026-10-01。协议细节依据 modelcontextprotocol.io 官方文档与规范(当前最新版本号为
2026-07-28);发展时间线中的早期日期与厂商采用情况来自第三方汇总,文中已标明。MCP 迭代很快,写代码前请以官方规范为准。
0. 一句话版本
MCP(Model Context Protocol)是一个开放协议,规定了"AI 应用"如何以统一方式连接"外部系统"(数据、工具、工作流)。 官方的比喻是 AI 应用的 USB-C 接口:设备和外设不用互相适配,都遵守同一个接口标准就能连。
记三件事:
- 解决的问题:M 个 AI 应用 × N 个外部系统,原本要写 M×N 套对接;有了协议,变成 M+N。
- 形态:Client–Server 架构,消息是 JSON-RPC 2.0,传输方式有 stdio(本地进程)和 Streamable HTTP(远程)。
- 服务端提供三类东西:Tools(模型可调用的函数)、Resources(供读取的上下文数据)、Prompts(可复用的提示模板)。
MCP 只管"上下文怎么交换",不管模型怎么用这些上下文——官方原话大意是它"不规定 AI 应用如何使用 LLM 或管理所提供的上下文"。
1. 先看一个眼前的例子
我现在用的 Claude Code 会话里,工具列表里有一大堆名字长这样的东西:
mcp__Claude_Browser__navigate |
mcp__<服务器名>__<工具名> 就是 Claude Code
给 MCP
工具起名的约定。每个"服务器"是一个独立的程序:有的跑在本机(控制浏览器、终端、桌面),有的在云端(Figma、Notion、GitHub
等需要登录授权的连接器)。Claude Code 本身不知道怎么操作
Figma,它只是个 MCP Host:连上 Figma 的 MCP
服务器,问它"你有什么工具",然后把这些工具交给模型用。
另外一个有意思的现象:这些工具里很多一开始只显示名字,要先调一次"ToolSearch"才能拿到完整参数定义再使用——这是为了省上下文,后面第 5 章会解释为什么这是 MCP 的一个真实痛点。
2. 为什么需要 MCP:M×N 问题
2.1 没有协议的时代
大模型要"做事",得能调用外部能力。2023 年 6 月起 OpenAI 提出的 Function Calling 让模型能输出结构化的函数调用,各家随后都有类似机制。但:
- 每个 AI 应用(IDE、聊天客户端、Agent 框架)都要自己写每个外部系统的对接代码;
- 每个外部系统(GitHub、Slack、数据库)也得为每个 AI 应用各做一套插件。
没有协议: 有 MCP: |
2.2 它借鉴了谁
官方规范里明确写道:MCP 的灵感来自 LSP(Language Server Protocol)。LSP 让"支持一门语言"和"编辑器"解耦——写一个语言服务器,所有支持 LSP 的编辑器都能用。MCP 把同样的思路用在"AI 应用 × 外部上下文"上。
2.3 它和 Function Calling 的关系
Function Calling 是模型层的能力:模型怎么表达"我要调用函数 X,参数是 Y"。MCP 是应用层的协议:这些函数从哪来、怎么发现、怎么执行。二者是上下两层,不是替代关系——Host 把 MCP 服务器提供的工具转换成模型 API 里的工具定义,模型用 Function Calling 的方式调用,Host 再把调用转发给 MCP 服务器执行。
3. 来龙去脉:发展时间线
3.1 规范版本(官方版本号,以日期命名)
| 版本 | 主要内容 |
|---|---|
| 2024-11-05 | 初版:Client–Server 架构、JSON-RPC 2.0、三大原语(tools / resources / prompts)、两种传输(stdio、HTTP+SSE) |
| 2025-03-26 | 引入 OAuth 2.1 授权;用 Streamable HTTP 取代 HTTP+SSE;工具注解、音频内容、参数补全 |
| 2025-06-18 | 结构化工具输出、Elicitation(服务器向用户追问信息)、资源链接、MCP 服务器被归类为 OAuth 资源服务器 |
| 2025-11-25 | 授权引入 OpenID Connect Discovery、图标元数据、JSON Schema 2020-12 等 |
| 2026-07-28(当前) | 协议无状态化、server/discover、Multi
Round-Trip Requests、Tasks 与 Apps 扩展机制、正式的特性弃用政策 |
上表以第三方整理为底稿,并与官方 changelog 交叉核对过 2026-07-28 一版的内容(见第 4.5 节);更早几个版本的细节以官方各版本规范页为准。
3.2 关键事件
- 2024-11 下旬:Anthropic 开源发布 MCP(据公开资料,由 David Soria Parra 与 Justin Spahr-Summers 在 Anthropic 创建),同时放出 Python / TypeScript SDK 和一批参考服务器(Google Drive、Slack、GitHub、Git、Postgres 等)。首批合作方包括 Block、Apollo,以及 Zed、Replit、Codeium、Sourcegraph 等开发工具。(各来源对发布日期有 11-25 与 11-26 的出入,这里只写"11 月下旬"。)
- 2025-03 ~ 05:据第三方汇总,OpenAI 在 Agents SDK 里支持 MCP,Microsoft 把它接入 Copilot Studio 并逐步成为各平台的一等公民,Google 也表态让 Gemini 支持 MCP——竞争对手相继采用,使它从"Anthropic 的协议"变成了行业事实标准。
- 2025-09:官方 MCP Registry(服务器注册表)预览上线。
- 2025-12:Anthropic 把 MCP 捐给 Linux Foundation 旗下新成立的 Agentic AI Foundation(AAIF),据报道由 Anthropic、Block、OpenAI 共同发起——协议治理从单一公司转向中立基金会。
- 2026-07-28:规范大改(无状态),见 4.5。
3.3 一条主线
2023 Function Calling:模型能"表达"调用 |
可以看出方向:从"本地进程间的小玩具"演变成"可大规模部署的远程服务协议"。
4. 协议到底长什么样
4.1 三个角色
| 角色 | 是什么 | 例子 |
|---|---|---|
| Host(宿主) | 面向用户的 AI 应用,负责协调一个或多个 Client | Claude Code、Claude Desktop、VS Code、Cursor |
| Client(客户端) | Host 里的连接器组件,每连一个服务器就实例化一个,维持专用连接 | VS Code 连 Sentry 就有一个 Client,连文件系统服务器再有一个 |
| Server(服务器) | 提供上下文和能力的程序,本地还是远程都叫 server | 本地的 filesystem server;Sentry 官方的远程 server |
┌────────────── Host(AI 应用)──────────────┐ |
4.2 两层结构
- 数据层(内层):基于 JSON-RPC 2.0 的消息格式与语义——发现、原语(tools / resources / prompts)、通知、进度。
- 传输层(外层):消息怎么送达——连接建立、成帧、认证。
两种传输:
| 传输 | 适用 | 特点 |
|---|---|---|
| stdio | 本地:Host 把服务器当子进程启动,通过标准输入输出通信 | 零网络开销;通常一对一;服务器以你的用户权限运行 |
| Streamable HTTP | 远程:POST 发请求,可选用 SSE 流式返回 | 一个服务器服务很多客户端;支持 Bearer Token、API Key 等;规范推荐用 OAuth |
(早期的 HTTP+SSE 传输已被弃用,新实现应使用 Streamable HTTP。)
4.3 服务器能提供的三种原语
| 原语 | 是什么 | 谁来控制 | 典型例子 |
|---|---|---|---|
| Tools | 可执行的函数 | 模型决定何时调用 | 查数据库、发消息、操作文件 |
| Resources | 提供上下文的数据源 | 应用/用户选择放进上下文 | 文件内容、数据库表结构、API 响应 |
| Prompts | 可复用的提示模板 | 用户显式触发 | 带示例的系统提示、工作流模板 |
每种原语都有统一的方法:*/list 发现,*/get
获取,tools/call
执行。比如一个数据库服务器可以:提供查询工具,暴露表结构资源,再附带一个含
few-shot 示例的提示。
客户端也能向服务器提供能力:目前核心的是 Elicitation(服务器中途向用户追问信息或请求确认)。
4.4 一次真实交互是什么样
下面是官方文档里的简化例子(2026-07-28 版)。
① 工具发现——客户端问有哪些工具:
{ "jsonrpc": "2.0", "id": 2, "method": "tools/list", |
服务器返回每个工具的 name、description 和
inputSchema(JSON Schema):
{ "name": "weather_current", |
② 工具调用——模型决定调用后,Host 通过 Client 发出:
{ "jsonrpc": "2.0", "id": 3, "method": "tools/call", |
③ 返回结果——一个 content
数组,可以是文本、图片、资源等:
{ "jsonrpc": "2.0", "id": 3, |
整个流程对模型是透明的:模型看到的只是"有一个叫
weather_current 的工具,参数如此",调用后得到一段文本。MCP
的全部工作都发生在 Host 与服务器之间。
4.5 2026-07-28:为什么改成"无状态"
之前(到 2025-11-25)的流程是:连接建立后先 initialize
握手协商版本和能力,服务器再通过 Mcp-Session-Id
维持会话。会话是有状态的,意味着请求必须落到同一台服务器,不利于负载均衡和无服务器部署。
2026-07-28 版的主要改动(来自官方 changelog):
| 改动 | 含义 |
|---|---|
移除协议级会话与 Mcp-Session-Id |
列表接口不再随连接而异;需要跨调用状态的,由服务器发"句柄",作为普通工具参数传递 |
移除 initialize 握手 |
每个请求自带协议版本和客户端能力(放在
_meta 字段),服务器逐请求独立处理 |
新增 server/discover |
服务器必须实现,用来声明支持的版本、能力、身份;客户端可选地在最前面调一次,结果可缓存 |
subscriptions/listen |
取代原来的 GET 端点和 resources 订阅:一个长连接流,客户端主动声明想收哪些变更通知 |
| Multi Round-Trip Requests | 取代"服务器反向发请求":服务器返回
input_required,客户端带着答案重试原请求 |
| Tasks 移出核心 | 长任务变成官方扩展:轮询 tasks/get |
| 缓存提示 | 列表类结果必带
ttlMs、cacheScope,减少轮询 |
| 弃用 Roots、Sampling、Logging | 保留一个弃用窗口(政策要求至少 12 个月);建议直接对接 LLM 供应商 API、用 stderr/OpenTelemetry 打日志 |
| Dynamic Client Registration 弃用 | 授权侧改推 Client ID Metadata Documents |
这是我的归纳:整体方向是"让 MCP 服务器像普通 HTTP API 一样好部署"——无状态请求可以随便打到任意实例后面,配合缓存头就能放到 CDN/网关之后。
4.6 扩展机制
核心协议之外,规范定义了可选扩展(双方协商启用)。官方列出的包括:
- Tasks:长任务(轮询、中途输入、持久句柄)。
- MCP Apps:在对话里直接渲染交互式界面(图表、表单、视频播放器)。
- Skills over MCP:通过 MCP 发现和使用结构化的 Agent 工作流说明——也就是说,上一篇的 Skill 与 MCP 正在融合(见第 8 章)。
5. 原理:模型是怎么"用上"MCP 的
5.1 完整链路
启动 Host 读配置 → 为每个 server 建立 Client → server/discover |
关键认识:模型对 MCP 一无所知。它面对的永远是"一组带 JSON Schema 的工具"。MCP 是 Host 与外部系统之间的管道标准。这也解释了为什么同一个 MCP 服务器能被不同厂商的不同模型使用。
5.2 description
又是路由规则
和 Skill 一样,模型选哪个工具、怎么填参数,完全靠工具的
description 与 inputSchema 理解。所以:
- 工具名称要清晰(官方示例建议
calculator_arithmetic而不是calculate); - 描述要写"做什么、什么时候用";
- Schema 里每个参数的
description也是给模型看的提示词。
5.3 代价:工具定义吃上下文
这是 MCP 实践中最现实的问题:所有已连接服务器的所有工具定义,默认全量放进上下文。
- 一个服务器十几二十个工具,每个带完整 Schema,很容易占掉几千上万 token;
- 连几个服务器,工具上百个,既费 token,又会降低模型选对工具的准确率;
- 中间结果(比如先读一个大文档、再把内容塞进另一个工具)还会反复穿过模型的上下文。
业界的应对方式(这一段是行业做法的归纳,细节各家不同):
- 按需加载工具定义:初始只给工具名,需要时再取完整 Schema。官方客户端最佳实践里也有"progressive tool discovery(渐进式工具发现)";本会话里看到的 "ToolSearch" 就是这种做法。
- 让模型写代码来编排工具:不是一个一个调用工具,而是让模型生成一段程序,在沙箱里批量调用并只返回最终结果——中间数据不进上下文。我另一篇笔记讲的 DeepSeek Harness 的 PTC 模式就是这个思路:[[AI Agent/DeepSeek Harness:PTC 模式是如何用 TypeScript 编排工具调用的|DeepSeek Harness:PTC 模式与 TypeScript 工具编排]]。
- 缓存:服务器按确定顺序返回工具列表(规范建议),有利于客户端缓存和模型的 prompt cache 命中。
这是个有意思的对照:Skill 的核心设计就是"渐进式披露"来省上下文,而 MCP 的原生设计是"全量暴露",所以两边都在互相借鉴对方的优点——MCP 加上渐进式工具发现,Skill 加上 MCP 的远程分发。
6. 授权:远程服务器怎么安全地"认人"
stdio 本地服务器通常直接从环境变量里取凭证,规范说它不应走下面这套流程。远程(HTTP)服务器才用 OAuth 授权,规范里授权是可选的,但一旦支持,应遵循规范。
6.1 角色
- MCP 服务器 = OAuth 2.1 资源服务器(接受并校验访问令牌);
- MCP 客户端 = OAuth 2.1 客户端(代表用户去请求受保护资源);
- 授权服务器:与用户交互、签发令牌,可以和 MCP 服务器是同一个,也可以是独立的。
6.2 流程(简化)
1. 客户端不带令牌访问 MCP 服务器 → 401 + WWW-Authenticate(指向元数据地址) |
6.3 几条硬规则(规范原文要求)
- 令牌必须放在 Authorization 头,不得放进 URL 查询串;
- 令牌必须是签发给这个服务器本身的(resource / audience 绑定),服务器不得接受或转发其他令牌——防止"令牌透传"和混淆代理攻击;
- 客户端发请求必须带
resource参数标明目标服务器; - 权限不够时返回
403+insufficient_scope,客户端可走逐步升级授权(step-up); - 遵循最小权限原则:只申请当前操作需要的 scope。
7. 和相邻概念的区别
| 它是什么 | 与 MCP 的关系 | |
|---|---|---|
| Function Calling / Tool Use | 模型 API 层:怎么表达和接收工具调用 | 下层。MCP 工具最终都被转成这种形式交给模型 |
| ChatGPT 插件(2023) | 单厂商的插件机制 | MCP 是跨厂商开放协议,且不绑定某个产品 |
| 直接调 REST API | 应用自己对接每个服务 | MCP 把"发现 + 描述 + 调用"标准化,AI 应用不必为每个服务写适配 |
| LSP | 编辑器 ↔︎ 语言服务器 | MCP 的灵感来源,思路相同、领域不同 |
| Skill(Agent Skill) | 教模型"怎么做"的手册,按需读取,可带脚本 | 互补:MCP 给手,Skill 给手册。见第 8 章 |
| Subagent | 隔离上下文的子执行者 | 正交。子代理内部也可以用 MCP 工具 |
| A2A(Agent2Agent)等 | Agent 之间互相通信的协议 | 层次不同:MCP 是 Agent↔︎工具/数据;A2A 是 Agent↔︎Agent(本文未逐项查证 A2A 的细节) |
8. MCP 与 Skill:到底怎么选
我上一篇讲 Skill 时给过一个对照:[[AI Agent/Agent Skill 完全指南:它是什么、怎么来的、为什么管用|Agent Skill 完全指南]]。把两者放一起:
| MCP | Skill | |
|---|---|---|
| 给模型什么 | 能力(能调用什么外部功能/数据) | 知识(遇到这类任务该怎么做) |
| 本质 | 运行中的程序/服务 + 协议 | 磁盘上的文件夹(Markdown + 可选脚本) |
| 上下文成本 | 工具定义默认全量常驻(可优化为按需) | 简介常驻,正文按需加载 |
| 需要部署吗 | 要(起进程或有远程服务) | 不要,拷文件即可 |
| 能访问外部系统吗 | 能,这正是它的目的,并带授权机制 | 自身不能;只能让模型用已有工具做 |
| 适合 | 连接 Figma、GitHub、数据库、内部系统 | 公司流程、写作规范、操作手册、"用 X 工具时的最佳实践" |
典型的组合方式:MCP 提供"能操作 Figma 的工具";Skill 写明"在我们公司,把设计转成代码时先查设计系统 token、命名遵循 …、完成后跑 …"。工具负责"能不能做",手册负责"做得对不对"。
怎么选:
- 要访问外部系统/数据 → MCP(或一个脚本,若只有你自己用);
- 要固化流程/规范/经验 → Skill;
- 只是几条"永远成立"的规矩 →
AGENTS.md/CLAUDE.md; - 必须 100% 发生的动作 → Hook / 脚本,不要指望模型自觉。
趋势上两者在融合:MCP 规范里已经列出 Skills over MCP 扩展,设想通过 MCP 来发现和分发 Skill;Skill 里也可以写"怎么用某个 MCP 服务器"。
9. 动手:怎么用、怎么写
命令与 SDK 接口细节变化较快,下面是常见形态,以官方文档为准。
9.1 在 Claude Code 里接一个 MCP 服务器
# 远程服务器(Streamable HTTP) |
项目级配置通常放在仓库根目录的 .mcp.json,形如:
{ |
接入之后,工具会以 mcp__<服务器名>__<工具名>
出现。需要登录的远程服务器会走第 6 章的 OAuth 流程。
9.2 自己写一个最小服务器(Python SDK 的常见写法)
from mcp.server.fastmcp import FastMCP |
SDK 会根据函数签名自动生成
inputSchema,用函数的 docstring 作为
description——所以 docstring
就是写给模型看的提示词。官方提供 Python、TypeScript 等多语言
SDK,以及调试工具 MCP Inspector,可以不接任何 AI
应用就直接测试你的服务器。
9.3 设计工具时的几点经验(归纳)
- 工具要少而精:每个工具的定义都吃上下文;不要把 REST API 的几十个接口一股脑包成几十个工具。
- 按"任务"而不是按"接口"设计:一个工具完成一件有意义的事,比让模型串联五次调用更可靠。
- 名称与描述写清楚,参数给
description和enum。 - 返回精简的结果:别把几万字原始数据直接返回,先在服务端过滤、摘要。
- 有副作用的操作要可确认:可以用 Elicitation 让用户确认;Host 一般也会在调用前请求授权。
- 工具列表保持确定的顺序,利于缓存。
10. 局限与安全风险
规范开篇就说得很直白:MCP 通过任意数据访问和代码执行路径提供能力,因此带来重要的安全与信任问题,而且 "协议本身无法在协议层强制执行这些安全原则",需要实现者自己做好。
10.1 规范强调的原则
- 用户同意与控制:用户必须明确同意并理解所有数据访问与操作。
- 数据隐私:Host 在把用户数据暴露给服务器前必须获得明确同意,不得擅自转发。
- 工具安全:工具等同于任意代码执行;工具行为的描述(包括注解)应被视为不可信,除非来自可信服务器;调用任何工具前必须获得用户明确同意。
10.2 具体的攻击面(归纳,非规范原文)
| 风险 | 说明 |
|---|---|
| 提示注入(间接) | 工具返回的内容(网页、邮件、工单)里夹带指令,诱导模型执行别的操作。工具结果是数据,不是指令。 |
| 工具投毒 | 恶意服务器在工具 description
里写入隐藏指令,模型读到就照做 |
| "地毯式更换"(rug pull) | 服务器先以无害工具获得批准,之后通过变更通知悄悄改掉工具定义 |
| 本地服务器 = 以你的权限跑任意程序 | stdio 服务器是你机器上的进程,npx 某个包
等同于执行该包 |
| 混淆代理 / 令牌透传 | 服务器拿着不是发给自己的令牌去访问别的服务——规范明确禁止接受或转发其他令牌 |
| 过度授权 | 一个令牌给了太宽的 scope;规范要求最小权限与逐步升级 |
| 上下文膨胀 | 工具太多既费钱,又降低选对工具的概率(见 5.3) |
| 跨服务器组合 | 多个服务器同时连着时,一个服务器的内容可能影响模型对另一个服务器工具的使用(数据外泄路径) |
10.3 实践建议
- 只装来源可信的服务器;第三方 stdio 服务器像安装软件一样审查;
- 读写分离、最小权限:只给需要的 scope,能只读就只读;
- 危险操作保持人工确认,别全局"自动批准";
- 把工具结果当不可信输入;
- 对远程服务器检查它的授权方式与数据留存政策;
- 保持工具集精简,不用的服务器及时断开。
11. 回到这个博客
- 我的 AGENTS.md 里"密钥绝不进仓库或前端"这条规矩,对
MCP 同样适用:MCP 服务器的令牌和 API Key
应该放在环境变量或密钥管理里,不要写进
.mcp.json提交到仓库(项目级配置会随源码一起推送)。 - 看板喵目前是自己的 Cloudflare Worker 接口,没必要为了"用 MCP"而改造。一个可选的想法:如果以后想让别的 Agent 直接检索我的笔记(比如"按标签列文章""读某篇全文"),可以把这些能力包成一个远程 MCP 服务器——但要先想清楚认证与限流,否则等于把内容接口公开。
- 做判断时可以直接套第 8 章的选择表:要连系统用 MCP,要固化流程用 Skill,要永远成立的规矩放 AGENTS.md,要必须发生的动作写脚本。
12. 术语表
| 术语 | 含义 |
|---|---|
| MCP | Model Context Protocol,连接 AI 应用与外部系统的开放协议 |
| Host / Client / Server | 宿主应用 / 宿主内每个连接的连接器 / 提供上下文的程序 |
| JSON-RPC 2.0 | MCP 的消息格式(请求、响应、无需响应的通知) |
| stdio / Streamable HTTP | 两种传输:本地子进程标准输入输出 / 远程 HTTP + 可选 SSE 流 |
| Tools / Resources / Prompts | 服务器的三大原语:可执行函数 / 上下文数据 / 提示模板 |
| inputSchema | 工具参数的 JSON Schema,既是校验规则也是给模型看的说明 |
| Elicitation | 服务器中途向用户追问或请求确认 |
| Sampling / Roots / Logging | 已在 2026-07-28 弃用的客户端特性 |
server/discover |
服务器声明版本、能力与身份的必备请求 |
_meta |
每个请求携带协议版本、客户端能力等元数据的字段 |
| Tasks / MCP Apps / Skills over MCP | 官方扩展:长任务 / 对话内交互界面 / 通过 MCP 分发技能 |
| OAuth 2.1 / PRM / PKCE | 授权框架 / 受保护资源元数据(RFC 9728)/ 防授权码截获 |
| AAIF | Agentic AI Foundation,Linux Foundation 旗下,2025-12 起托管 MCP |
| MCP Inspector | 官方调试工具,直接连服务器测试 |
附:参考来源
- 官方介绍:What is MCP?
- 官方架构文档:Architecture overview
- 规范(最新):Specification,其中 2026-07-28 Key Changes 与 Authorization
- 第三方版本与采用时间线(仅作参考):hidekazu-konishi:MCP Specification Version Timeline、Wikipedia:Model Context Protocol
关于可信度的说明:第 4 章(协议结构、2026-07-28 变更)、第 6 章(授权)和第 10.1 节直接依据官方文档;第 3 章的早期发布日期、厂商采用与基金会捐赠来自第三方汇总,各来源之间日期略有出入;第 5.3、第 7、第 9、10.2 节含我的归纳与经验判断,已尽量标明;A2A 与 Claude Code 命令行细节未逐项对照官方页面核实。