MCP 协议详解:agent 接外部世界的标准插头
📍 Agent 通用知识

这一篇换个视角
Section titled “这一篇换个视角”「Claude Code 进阶」板块的 MCP(外部服务连接器) 那篇,讲的是「Claude Code 用户怎么装一个 MCP」—— 从应用层视角。
这一篇换协议设计者视角讲:
- MCP 协议本身长啥样
- 为啥需要它(不能每个工具自己写 Tool Use 吗?)
- 三个角色 + 两层协议
- 跨工具支持现状(Claude / ChatGPT / Cursor / Cline / VS Code / TraeCode / 扣子 / n8n 都支持)
- 自己写一个 MCP server(Python 十来行)
- MCP Registry:数以万计的 server 条目
适合做 agent 产品 / 想自己搭 MCP server / 想理解为啥 2025 年所有 AI 工具突然都支持 MCP 的人。
MCP = AI agent 圈的 USB-C。
它把「LLM 怎么调外部工具」这件事,从「每家自己一套」改成了「一套标准,大家都用」。
结果就是:你写一个 MCP server,Claude Code / Cursor / TraeCode 全都能直接接,不用为每家单独适配。
时间线:从 Anthropic 内部协议到 Linux Foundation 标准
Section titled “时间线:从 Anthropic 内部协议到 Linux Foundation 标准”| 时间 | 事件 |
|---|---|
| 2024-11 | Anthropic 发布 MCP,作为 Claude Desktop 的工具接入协议 |
| 2025-03 | 2025-03-26 版规范:加入基于 OAuth 2.1(第三方授权)的授权框架,用 Streamable HTTP 取代旧的 HTTP+SSE 远程传输 |
| 2025-03 至 04 | OpenAI、Google 等大厂相继表态支持 |
| 2025-06 | 2025-06-18 版规范:修订授权规范,新增 elicitation(server 向用户补问信息) |
| 2025-09 | MCP Registry 上线,到 2026 年初已有约 2000 个 server |
| 2025-11 | 2025-11-25 版规范:以实验功能加入 async tasks(异步任务),sampling(server 借 client 的模型做推理)开始支持工具调用(server 侧 agent 化) |
| 2025-12 | Anthropic 把 MCP 捐给 Linux 基金会旗下新成立的 Agentic AI Foundation(AAIF),移交中立开源治理 |
| 2026-01 | MCP Apps 成为第一个官方扩展 —— server 能返回可交互的 HTML 界面,不只是文字 |
| 2026-07 | 2026-07-28 版规范(现行版本,2025-11-25 之后改动最大的一版):协议改成无状态(去掉初始化握手和会话),Tasks 移出核心协议、变成官方扩展,新增多轮往返请求(MRTR),Sampling、Roots(可访问目录)、Logging(日志推送)进入弃用期;官方 Python SDK 同一天升到 2.0 |
到 2026 年 9 月,MCP 已经是事实上的 AI agent 工具协议,不再属于任何一家公司。
为啥需要 MCP?(不能用各家 Tool Use 吗?)
Section titled “为啥需要 MCP?(不能用各家 Tool Use 吗?)”
没 MCP 的世界
Section titled “没 MCP 的世界”你做了一个 GitHub 操作工具,想给 LLM 用。有 MCP 之前,你要这样做:
- 为 Claude 写一份 Anthropic Tool Use JSON
- 为 OpenAI 写一份 OpenAI Function Calling JSON
- 为 Gemini 写一份 Google Function Calling
- 为 Cursor 写一个 Cursor 插件
- 为 VS Code 写一个 VS Code extension
- 为 Slack bot 写一个 Slack app
- …
每家协议不一样,工具被绑死在用它的 app 上。
有 MCP 的世界
Section titled “有 MCP 的世界”你写一个 MCP server,所有支持 MCP 的客户端直接能用:
- Claude Desktop / Claude Code
- ChatGPT(开发者模式)/ OpenAI API(Responses API)
- Cursor / Cline / Continue
- VS Code(GitHub Copilot agent mode)
- TraeCode
- 扣子 / 文心 / 通义
- n8n / Zapier 等工作流平台
截至 2026 年初,已有数百个客户端实现了 MCP(PulseMCP 统计)。
类比:USB 之前,每个外设要自己一套接口(PS/2 鼠标、串口打印机、专用键盘接口);USB 之后,鼠标/键盘/U 盘/麦克风都用 USB,各家电脑都能插。
三个角色 + 两层协议
Section titled “三个角色 + 两层协议”
按 MCP 官方架构文档的说法,参与者分三类:Host(宿主应用)、Client(客户端连接)、Server(服务端);它们之间说话用的协议分两层:数据层和传输层。
1. Host(宿主应用)
Section titled “1. Host(宿主应用)”跟用户对话的应用。例子:
- Claude Desktop / Claude Code(Anthropic)
- ChatGPT(OpenAI)
- Cursor / TraeCode(IDE)
- Cline / Continue(VS Code 扩展)
Host 的工作:接用户输入 → 调 LLM → 如果 LLM 想用工具,就通过对应的 client 去问 server。
2. Client(客户端连接)
Section titled “2. Client(客户端连接)”Host 为每个 server 各开一个 client,一对一维持连接。比如 Claude Code 同时连了 GitHub 和数据库两个 server,它里面就有两个 client。平时说「Claude Code 是 MCP 客户端」是口语简化,官方术语里它是 Host。
3. Server(服务端)
Section titled “3. Server(服务端)”真正干活的程序:本地 server 是你电脑上的一个进程,远程 server 跑在服务商那边。一个 server 提供三类核心能力:
- Tools(工具):LLM 能调的函数,如
create_issue/query_db - Resources(资源):LLM 能读的数据,如文件、数据库记录
- Prompts(提示词模板):预定义的 prompt,LLM 选着用
(常被一起提到的 Sampling 是 client 侧的能力,不是 server 提供的,而且 2026-07-28 版已列为弃用,见后文「进阶能力」。)
- 数据层:JSON-RPC 2.0(一种「远程喊函数」的消息格式),规定消息长什么样、有哪些方法(
tools/list、tools/call等) - 传输层:本地用 stdio(标准输入输出),远程用 Streamable HTTP(它取代了早期的 HTTP+SSE,后者已列为弃用)
简化版例子(client 调 server):
{ "jsonrpc": "2.0", "method": "tools/call", "params": { "name": "create_issue", "arguments": { "title": "Bug", "body": "页面崩了" } }, "id": 1}Server 返回:
{ "jsonrpc": "2.0", "result": { "content": [{"type": "text", "text": "Issue #42 已创建"}] }, "id": 1}任何符合这个协议的双方都能通信,跟用什么编程语言无关。
(这是简化版。按 2026-07-28 版规范,每个请求的 params 里还要带 _meta(写明协议版本、client 能力等),返回的结果也要带 resultType 字段;新版 SDK 仍兼容旧的握手式连接。这些细节交给 SDK 处理就行,自己写 server 用不着手拼。)
跨工具支持现状
Section titled “跨工具支持现状”
到 2026 年 9 月,几乎所有主流 AI 工具都接入了 MCP:
| 客户端 | 平台 | MCP 支持 |
|---|---|---|
| Claude Desktop | Anthropic 桌面 | ✅ 原生(第一个支持的) |
| Claude Code | Anthropic 编程助手 | ✅ 原生 |
| ChatGPT / OpenAI API | OpenAI | ✅ 原生(Responses API 能直连远程 MCP server;ChatGPT 的开发者模式能把远程 MCP server 加成 app) |
| Cursor | AI IDE | ✅ 原生 |
| TraeCode | 字节 AI IDE(原名 Trae IDE,2026-08 起归入豆包体系) | ✅ 原生(国内版也支持) |
| Cline | VS Code 扩展 | ✅ 原生 |
| Continue | VS Code 扩展 | ✅ 原生 |
| VS Code GitHub Copilot | Microsoft | ✅ 2025-07 起正式支持(1.102 版) |
| 其他 OpenAI 兼容客户端 | 各家 | 看客户端自己有没有内置 MCP;只兼容 Chat Completions 接口的国内代理,用不上 Responses API 的 MCP 工具 |
| n8n / Zapier | 工作流平台 | ✅ 原生节点 |
| 扣子 Coze | 字节 Agent 平台(团队 2026-08 并入豆包体系) | ✅ 原生 |
这意味着:你写一个 MCP server,就开放给上面所有平台用(ChatGPT 这类网页端只能连公网上的远程 server,你电脑上的本地 server 它连不到)。
自己写一个 MCP server(Python 十来行)
Section titled “自己写一个 MCP server(Python 十来行)”
最快的方式 —— 用 MCPServer(官方 Python SDK 里的高层框架,1.x 版本时叫 FastMCP)。
先建一个虚拟环境(venv,把这个项目的 Python 包和系统隔开),再装官方 SDK(要求 Python 3.10 以上)。
macOS / Linux 用下面这段(命令叫 python3,不是 python)。先跑一下 python3 --version:要 3.10 以上;macOS 自带的是 3.9,不够用,先到 python.org 装新版。
python3 -m venv .venv.venv/bin/pip install mcpWindows(PowerShell)用下面这段:
python -m venv .venv.venv\Scripts\pip install mcp⚠️
pip install mcp现在装到的是 2.x:2.0 在 2026-07-28 随新版协议发布,截至 2026-09-26 最新是 2.2.0。2.x 把 FastMCP 改名成了 MCPServer,网上很多旧教程里的from mcp.server.fastmcp import FastMCP,在 2.x 下安装能成功,一运行就报ModuleNotFoundError。想照旧教程跑,就改装 1.x:把上面命令里的mcp换成"mcp<2",比如.venv/bin/pip install "mcp<2"。
写一个 my_server.py:
from mcp.server.mcpserver import MCPServer
mcp = MCPServer("我的服务器")
@mcp.tool()def add(a: int, b: int) -> int: """把两个数加起来""" return a + b
@mcp.tool()def get_weather(city: str) -> str: """查询某个城市当前天气""" # 这里可以调真实天气 API return f"{city} 今天 18 度,晴"
if __name__ == "__main__": mcp.run()就这样,完事。
@mcp.tool()装饰器:自动从函数签名生成工具 schema(参数格式说明:参数类型、必填项、描述)- 不用手写 JSON Schema
- 不用手写 JSON-RPC handler
这段代码在 mcp 2.2.0 下实测过:连上以后能列出 add、get_weather 两个工具,调用 add(2, 3) 返回 5。
先验一验(可选):这种 stdio 型 server,直接 python my_server.py 跑起来只会安静地等输入,什么都不显示,新手容易以为卡死了。其实这一步不需要,Claude Code 会自己把它拉起来。想先确认它能用,就用官方调试器 MCP Inspector(需要 Node.js 22.19 以上):
npx @modelcontextprotocol/inspector .venv/bin/python my_server.py按终端提示打开本地网页,就能看到两个工具,还能点着试调用。(Windows 把 .venv/bin/python 换成 .venv\Scripts\python.exe。)
然后在 Claude Code 里接它(一行命令)。命令里写虚拟环境里 python 的完整路径,保证用的是装了 mcp 的那个 Python,否则 server 会连不上。
macOS / Linux 用下面这行,/path/to 换成 my_server.py 所在目录的完整路径:
claude mcp add --transport stdio my-server -- /path/to/.venv/bin/python /path/to/my_server.pyWindows(PowerShell)用下面这行,C:\path\to 同样换成 my_server.py 所在目录的完整路径:
claude mcp add --transport stdio my-server -- C:\path\to\.venv\Scripts\python.exe C:\path\to\my_server.py(想跟团队共享的话,也可以把配置写进项目根目录的 .mcp.json——细节见Claude Code 怎么用 MCP那篇。)
装完重开 Claude Code,你的两个工具(add / get_weather)就出现了,LLM 能自己调;打 /mcp 能看到 my-server 的连接状态。
💡 TypeScript / Go / Java / C# / Rust 等也都有官方 SDK,跟 Python 的 MCPServer 概念一样。
MCP Registry:工具生态
Section titled “MCP Registry:工具生态”
MCP Registry 是官方维护的 server 目录,2025-09 上线,2026 年初还只有约 2000 个 server,现在已经数以万计:2026-09-26 用官方接口按最新版统计约 3.6 万条。条目数不等于高质量 server,里面有不少重复或测试性质的发布,挑的时候要看是谁维护的。
主要分类(部分示例):
| 类别 | 示例 server |
|---|---|
| 代码 / 开发 | github / gitlab / npm / brave-search |
| 数据库 | postgres / mysql / sqlite / redis |
| 聊天 / 通信 | slack / discord / telegram / gmail |
| 云服务 | aws / cloudflare / vercel |
| 文件 / 内容 | filesystem / fetch / google-drive |
| 浏览器自动化 | playwright / puppeteer / browserbase |
| 媒体 | youtube-dl / spotify / imagemagick |
| 知识库 | obsidian / notion / linear |
注意:表里 github、gitlab、postgres、sqlite、redis、slack、google-drive、puppeteer、brave-search 这些名字,早年都有官方参考实现,现在已经归档停更。优先装厂商官方维护的版本,比如 GitHub 官方的 github-mcp-server、Brave 官方的 @brave/brave-search-mcp-server;数据库可以用 DBHub(见 MCP 那篇的推荐表)。
装一个 MCP 流程:
- 上官方 MCP Registry 或 PulseMCP 浏览;国内能直连的中文入口是 魔搭 MCP 广场
- 看到喜欢的,复制它的安装命令
- 用
claude mcp add装上(或把配置粘进项目的.mcp.json/ Claude Desktop 配置) - 重启 Claude Code → 工具立刻可用
这跟「Chrome 插件市场」一个体验。
MCP vs Tool Use:什么时候用哪个
Section titled “MCP vs Tool Use:什么时候用哪个”先说清楚:两者不是替代关系。MCP 负责把工具接进来,宿主应用把各个 server 的工具汇总后,模型最后还是通过自家的 Tool Use(工具调用)接口去调。所以真正的选择是「工具直接写在自己的程序里」还是「打包成 MCP server」:
| 维度 | Tool Use API | MCP |
|---|---|---|
| 绑定 | 跟具体 LLM 厂商绑死(Anthropic / OpenAI 各一套) | 跨 LLM、跨客户端通用 |
| 协议层 | 通过 LLM API 请求直接传 | 独立的 server 通过 JSON-RPC 通信 |
| 复用 | 工具被绑在你的应用里 | server 装一次,所有客户端都能用 |
| 进程模型 | 工具跟应用同进程 | 本地 server 是独立进程(Python / Node / Go 写的都行),远程 server 通过网络访问 |
| 何时用 | 单 app、内部工具、跟特定 LLM 深度集成 | 多 app 共用、第三方分享、长期生态 |
实操建议:
- 快速原型:直接 Tool Use(少一层)
- 正式产品 / 跨工具:走 MCP(标准化、好维护)
- 跨团队共享:必须 MCP(每个团队装一次配置)
进阶能力:elicitation / tasks(sampling 已弃用)
Section titled “进阶能力:elicitation / tasks(sampling 已弃用)”除了基本的工具调用,MCP 还有几个进阶能力,让 server 能干更复杂的事。2026-07-28 版规范对它们做了调整,下面按现在的状态讲:
Elicitation(中途反问用户)
Section titled “Elicitation(中途反问用户)”server 中途反问用户:「我需要更多信息,请提供 X」,client 弹窗让用户填。
适用:多步任务(订机票:「请确认日期 / 座位 / 餐食」)。
2026-07-28 版里它改走「多轮往返请求」(MRTR):server 先返回一个「还缺信息」(input_required)的结果,client 问完用户,带着答案把原请求重发一遍。
Tasks(异步任务,现在是官方扩展)
Section titled “Tasks(异步任务,现在是官方扩展)”之前:调用 → 立即返回。 现在:调用 → 拿一个 task 句柄 → 后续轮询结果。
适用场景:长任务(比如「跑测试套件」「批量处理 1000 个文件」)—— 不用占住 LLM 一直等。
它在 2025-11-25 版以实验功能加入,2026-07-28 版移出了核心协议,变成官方扩展 io.modelcontextprotocol/tasks。扩展是可选的,用之前要看你的 client 和 server 支不支持。
Server 自己跑 agent 循环
Section titled “Server 自己跑 agent 循环”server 内部可以自己跑 ReAct 循环,client 不用管中间步骤。
适用:复杂 agent(server 自己是一个小 agent,跑完了再回主 client)。
现在推荐的做法是 server 直接调模型厂商的 API 来跑这个循环。早年也有人借 client 的 Sampling 来实现(2025-11-25 版起 sampling 还能带工具调用),这条路已经跟着 Sampling 一起弃用。
了解即可:Sampling(已弃用)
Section titled “了解即可:Sampling(已弃用)”反向调用:server 主动让 client 帮它跑一次 LLM 推理,好处是 server 不用自己接模型 API 和 key。2026-07-28 版规范把 Sampling(连同 Roots、Logging)列为弃用:弃用期内还能用(原则上至少保留 12 个月),但官方明确说新实现应该直接调模型厂商的 API。
MCP 干了三件事:
- 统一协议:LLM 调工具不再各家一套
- 生态分离:server 是独立程序 + 独立生命周期,跟 client 解耦
- 跨工具共用:写一次 server,所有支持 MCP 的客户端都能用
对个人开发者:写个 MCP server,可能比写 SaaS(在线订阅软件)起步更快。 对 agent 产品:不接 MCP 等于在 USB 时代还在用串口。 对企业:企业内部自建的 MCP server,会变成所有内部 AI 应用共用的「统一接口入口」(类似 API 网关)。
- 看 Claude Code 用户视角的 MCP → MCP(外部服务连接器):给 Claude 接上外部工具