跳转到内容

MCP 协议详解:agent 接外部世界的标准插头

📍 Agent 通用知识

中心一个 USB-C 接口形状,两侧用曲线连接到多个设备图标(笔记本/数据库/齿轮/云)

「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-11Anthropic 发布 MCP,作为 Claude Desktop 的工具接入协议
2025-032025-03-26 版规范:加入基于 OAuth 2.1(第三方授权)的授权框架,用 Streamable HTTP 取代旧的 HTTP+SSE 远程传输
2025-03 至 04OpenAI、Google 等大厂相继表态支持
2025-062025-06-18 版规范:修订授权规范,新增 elicitation(server 向用户补问信息)
2025-09MCP Registry 上线,到 2026 年初已有约 2000 个 server
2025-112025-11-25 版规范:以实验功能加入 async tasks(异步任务),sampling(server 借 client 的模型做推理)开始支持工具调用(server 侧 agent 化)
2025-12Anthropic 把 MCP 捐给 Linux 基金会旗下新成立的 Agentic AI Foundation(AAIF),移交中立开源治理
2026-01MCP Apps 成为第一个官方扩展 —— server 能返回可交互的 HTML 界面,不只是文字
2026-072026-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 吗?)”

左半 3 个 app 各自用奇形怪状的接头插进模型(乱糟糟),右半 3 个 app 用同一个标准化接头干净地插进模型

你做了一个 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 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,各家电脑都能插。


三层方块堆叠:上层机器人(宿主应用和它的 client)/中层带代码的纸卷(JSON-RPC 协议消息)/底层工具图标(server),箭头连接

按 MCP 官方架构文档的说法,参与者分三类:Host(宿主应用)、Client(客户端连接)、Server(服务端);它们之间说话用的协议分两层:数据层和传输层。

跟用户对话的应用。例子:

  • Claude Desktop / Claude Code(Anthropic)
  • ChatGPT(OpenAI)
  • Cursor / TraeCode(IDE)
  • Cline / Continue(VS Code 扩展)

Host 的工作:接用户输入 → 调 LLM → 如果 LLM 想用工具,就通过对应的 client 去问 server。

Host 为每个 server 各开一个 client,一对一维持连接。比如 Claude Code 同时连了 GitHub 和数据库两个 server,它里面就有两个 client。平时说「Claude Code 是 MCP 客户端」是口语简化,官方术语里它是 Host。

真正干活的程序:本地 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 用不着手拼。)


网络图(笔记本/手机/IDE) + 下方三个服务图标(GitHub/数据库/聊天气泡),通过中心 hub 互连

到 2026 年 9 月,几乎所有主流 AI 工具都接入了 MCP:

客户端平台MCP 支持
Claude DesktopAnthropic 桌面✅ 原生(第一个支持的)
Claude CodeAnthropic 编程助手✅ 原生
ChatGPT / OpenAI APIOpenAI✅ 原生(Responses API 能直连远程 MCP server;ChatGPT 的开发者模式能把远程 MCP server 加成 app)
CursorAI IDE✅ 原生
TraeCode字节 AI IDE(原名 Trae IDE,2026-08 起归入豆包体系)✅ 原生(国内版也支持)
ClineVS Code 扩展✅ 原生
ContinueVS Code 扩展✅ 原生
VS Code GitHub CopilotMicrosoft✅ 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 装新版。

Terminal window
python3 -m venv .venv
.venv/bin/pip install mcp

Windows(PowerShell)用下面这段:

Terminal window
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 以上):

Terminal window
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 所在目录的完整路径:

Terminal window
claude mcp add --transport stdio my-server -- /path/to/.venv/bin/python /path/to/my_server.py

Windows(PowerShell)用下面这行,C:\path\to 同样换成 my_server.py 所在目录的完整路径:

Terminal window
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 是官方维护的 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 流程:

  1. 上官方 MCP Registry 或 PulseMCP 浏览;国内能直连的中文入口是 魔搭 MCP 广场
  2. 看到喜欢的,复制它的安装命令
  3. 用 claude mcp add 装上(或把配置粘进项目的 .mcp.json / Claude Desktop 配置)
  4. 重启 Claude Code → 工具立刻可用

这跟「Chrome 插件市场」一个体验。


先说清楚:两者不是替代关系。MCP 负责把工具接进来,宿主应用把各个 server 的工具汇总后,模型最后还是通过自家的 Tool Use(工具调用)接口去调。所以真正的选择是「工具直接写在自己的程序里」还是「打包成 MCP server」:

维度Tool Use APIMCP
绑定跟具体 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 版规范对它们做了调整,下面按现在的状态讲:

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 内部可以自己跑 ReAct 循环,client 不用管中间步骤。

适用:复杂 agent(server 自己是一个小 agent,跑完了再回主 client)。

现在推荐的做法是 server 直接调模型厂商的 API 来跑这个循环。早年也有人借 client 的 Sampling 来实现(2025-11-25 版起 sampling 还能带工具调用),这条路已经跟着 Sampling 一起弃用。

反向调用:server 主动让 client 帮它跑一次 LLM 推理,好处是 server 不用自己接模型 API 和 key。2026-07-28 版规范把 Sampling(连同 Roots、Logging)列为弃用:弃用期内还能用(原则上至少保留 12 个月),但官方明确说新实现应该直接调模型厂商的 API。


MCP 干了三件事:

  1. 统一协议:LLM 调工具不再各家一套
  2. 生态分离:server 是独立程序 + 独立生命周期,跟 client 解耦
  3. 跨工具共用:写一次 server,所有支持 MCP 的客户端都能用

对个人开发者:写个 MCP server,可能比写 SaaS(在线订阅软件)起步更快。 对 agent 产品:不接 MCP 等于在 USB 时代还在用串口。 对企业:企业内部自建的 MCP server,会变成所有内部 AI 应用共用的「统一接口入口」(类似 API 网关)。