MCP 协议设计与实现
前言:Agent 生态的 USB 标准
前言:Agent 生态的 USB 标准
"An open protocol won. An open protocol always wins." — 回看过去 40 年网络、操作系统、Web 的每一次标准化浪潮
写作动机:Agent 生态的碎片化困境
2025 年,AI Agent 生态面临一个尴尬的现实:每个 Agent 框架都在重新发明工具集成的轮子。
Claude Code 有自己的工具系统,LangChain 有自己的 Tool 抽象,Cursor 有自己的集成方式,Windsurf 又有自己的规范。一个开发者写了一个"搜索 Jira 工单"的工具,想在 Claude Code 里用——得按 Claude Code 的格式实现一遍。想在 LangChain 里用——得按 LangChain 的 BaseTool 重写一遍。想在 Cursor 里用——又得再来一遍。
graph LR
subgraph Before["MCP 之前的世界"]
T1[Jira Tool] -->|"API 写法 A"| CC1[Claude Code]
T1 -->|"API 写法 B"| LC1[LangChain]
T1 -->|"API 写法 C"| CU1[Cursor]
T1 -->|"API 写法 D"| WI1[Windsurf]
T1 -->|"每个平台都要重写"| N[N 次重复劳动]
end
subgraph After["MCP 之后的世界"]
T2[Jira MCP Server] -->|"MCP 协议"| H[Host<br/>统一接入]
H --> CC2[Claude Code]
H --> LC2[LangChain]
H --> CU2[Cursor]
H --> WI2[Windsurf]
end
style N fill:#fee2e2,stroke:#ef4444
style H fill:#dcfce7,stroke:#22c55e,stroke-width:2px
这就像 USB 标准出现之前的外设市场:每个厂商有自己的接口,买个鼠标还要看主板兼容性。每个外设厂商要为每个主板写一份驱动。最终的结果是:生态被分割,创新被锁死在各个孤岛内。
MCP(Model Context Protocol)就是 Agent 生态的 USB 标准。
它定义了一个开放的、标准化的协议,让任何工具只要实现一次 MCP Server,就能被所有支持 MCP 的 Client 调用——Claude Code、Claude Desktop、Cursor、Windsurf、Zed,以及未来更多的 Agent 平台。
MCP 的爆发式增长
2024 年 11 月 Anthropic 发布 MCP 的第一个版本时,社区的反应是"又一个协议?"。但短短半年内:
- MCP 的 GitHub 仓库获得了 数万星标
- 被 Claude Code、Cursor、Windsurf、Zed、Continue 等主流 AI 编程工具采纳
- 生态中涌现了 数百个 MCP Server——从 GitHub、Slack、Postgres 到专业工具
- OpenAI 在 2025 年 4 月宣布跟进支持
- 每周新增数十个社区 MCP Server
这种增长速度说明了一个事实:Agent 生态确实需要一个标准协议,MCP 来得正是时候。
为什么这次能成?
历史上有过很多"开放协议"试图统一 AI 生态——很多都失败了。MCP 能站住脚的关键因素有四个:
- Anthropic 作为主要客户率先验证——Claude Desktop 和 Claude Code 立刻原生支持,给了生态信心
- 协议设计克制——核心原语只有三个(Tool/Resource/Prompt),不臃肿
- 基于 JSON-RPC——成熟、可调试、语言无关
- SDK 先行——TypeScript 和 Python SDK 开源,立刻能用
这四点共同造就了临界质量的生态启动。
这本书讲什么
本书不是 MCP 的使用教程——官方文档已经做得很好了。
本书关注的是协议的设计与实现:为什么这样设计?SDK 是怎么实现的?集成时会踩什么坑?如何自己开发一个生产级的 MCP Server?
核心问题清单
本书回答以下具体问题:
协议设计
- 为什么选择 JSON-RPC 而不是 gRPC 或 REST?
- 能力协商(capability negotiation)机制如何保证前后向兼容?
- 三个核心原语(Tool / Resource / Prompt)的设计哲学是什么?
- 错误码的设计如何体现协议的健壮性?
传输层
- STDIO 和 Streamable HTTP 两种传输层各自的设计权衡是什么?
- 为什么从早期的 SSE 转向 Streamable HTTP?
- WebSocket 在 MCP 中的角色?
- 分布式部署中的会话粘性(session affinity)问题怎么解决?
安全与认证
- OAuth 2.1 认证框架为什么这么复杂?它解决了什么问题?
- PKCE 机制在 MCP 中如何防止 code interception 攻击?
- Dynamic Client Registration 给第三方集成带来了什么?
- 如何防止 MCP Server 的 Prompt Injection 攻击?
高级能力
- Sampling 机制如何让 Server 反向调用 LLM 而不暴露 API Key?
- Elicitation 机制如何让 Server 向用户请求额外信息?
- Completion 机制如何实现工具参数的自动补全?
- Roots 协议如何让 Client 告诉 Server 它的工作目录?
工程实现
- Claude Code 的 MCP 客户端是怎么集成的?
- 如何处理 MCP Server 崩溃和重启?
- 大规模 MCP Server 场景下的性能优化?
- 如何测试一个 MCP Server 的兼容性?
每一章从设计意图出发,深入 TypeScript SDK 和 Python SDK 的源码实现,最后提炼可迁移的协议设计模式。
本书的方法论:协议 = 规范 + 实现 + 生态
理解一个协议需要三个视角:
graph TD
Protocol[MCP 协议]
Protocol --> Spec[规范层<br/>官方文档说了什么]
Protocol --> Impl[实现层<br/>SDK 是怎么做的]
Protocol --> Eco[生态层<br/>社区在怎么用]
Spec --> S1[为什么这样设计]
Spec --> S2[设计权衡]
Spec --> S3[演进方向]
Impl --> I1[TypeScript SDK]
Impl --> I2[Python SDK]
Impl --> I3[Claude Code 集成]
Eco --> E1[主流 MCP Server]
Eco --> E2[常见坑点]
Eco --> E3[社区反馈]
style Protocol fill:#dbeafe,stroke:#3b82f6,stroke-width:2px
style Spec fill:#fef3c7,stroke:#f59e0b
style Impl fill:#dcfce7,stroke:#22c55e
style Eco fill:#f3e8ff,stroke:#a855f7
很多书只讲规范,读完你知道协议"是什么"但不知道"怎么用"。很多文档只讲实现,读完你会用但不理解"为什么"。本书三个视角同时推进——规范解释意图,实现展示机理,生态提供教训。
本书读者
- MCP Server 开发者:想构建自己的 MCP Server,需要理解协议细节和最佳实践
- Agent 框架开发者:想在自己的框架中集成 MCP Client,需要理解 SDK 内部
- 协议设计者:对开放协议的设计方法论感兴趣,想学习 MCP 的设计决策
- AI 应用架构师:需要评估 MCP 是否适合你的 Agent 平台
- SRE / DevOps:需要部署和运维 MCP Server 集群
- 安全工程师:需要理解 MCP 的攻击面和防御措施
前置知识
你需要:
- 熟悉至少一种 AI Agent 工具(Claude Code / Cursor / Claude Desktop)
- 掌握 JavaScript/TypeScript 或 Python
- 了解 HTTP、JSON-RPC 的基本概念
- 有 API 设计经验
你不需要:
- 协议设计经验——本书会从零解释
- OAuth 深度知识——第 15 章会从基础讲起
- 分布式系统经验——架构章节会讲清楚
本书组织:八个部分
graph TD
P1[开篇<br/>Ch00-01<br/>为什么需要 MCP] --> P2[协议基础<br/>Ch02-04<br/>架构·消息·生命周期]
P2 --> P3[三大原语<br/>Ch05-07<br/>Tool·Resource·Prompt]
P3 --> P4[SDK 实现<br/>Ch08-11<br/>TS/Python Server/Client]
P4 --> P5[传输层<br/>Ch12-14<br/>STDIO·HTTP·SSE·WS]
P5 --> P6[认证安全<br/>Ch15-16<br/>OAuth·发现·注册]
P6 --> P7[高级特性<br/>Ch17-19<br/>Sampling·Elicitation·Claude Code]
P7 --> P8[总结<br/>Ch20-21<br/>构建 Server·设计模式]
style P1 fill:#dbeafe,stroke:#3b82f6
style P2 fill:#dbeafe,stroke:#3b82f6
style P3 fill:#fef3c7,stroke:#f59e0b
style P4 fill:#fef3c7,stroke:#f59e0b
style P5 fill:#dcfce7,stroke:#22c55e
style P6 fill:#fecaca,stroke:#dc2626
style P7 fill:#f3e8ff,stroke:#a855f7
style P8 fill:#fef9c3,stroke:#eab308
第一部分:开篇(第 0-1 章)——MCP 存在的理由、生态位、和竞品的对比。读完建立全局认知。
第二部分:协议基础(第 2-4 章)——MCP 的架构层次(Host / Client / Server)、消息格式(JSON-RPC 2.0)、连接生命周期。这是后续所有章节的基础。
第三部分:三大原语(第 5-7 章)——Tool / Resource / Prompt 三个核心抽象的设计和使用。每一章深入到"为什么是这三个,而不是更多或更少"。
第四部分:SDK 实现(第 8-11 章)——TypeScript SDK 和 Python SDK 的内部实现。Server 和 Client 两个视角都有。这一部分看完,你能独立开发 MCP Server。
第五部分:传输层(第 12-14 章)——STDIO、Streamable HTTP、SSE、WebSocket 四种传输方式的实现和权衡。最务实的工程章节。
第六部分:认证安全(第 15-16 章)——OAuth 2.1、Discovery、Dynamic Client Registration。生产级 MCP Server 必读。
第七部分:高级特性(第 17-19 章)——Sampling(反向 LLM 调用)、Elicitation(向用户索要信息)、Claude Code 的实际集成方案。
第八部分:总结(第 20-21 章)——从零构建一个生产级 MCP Server 的完整流程;协议设计的可迁移模式。
每一章的写作节奏
- 问题域:这一章解决的具体问题是什么?
- 规范要点:MCP 官方文档对这一块怎么规定?
- 设计意图:为什么这样规定?替代方案是什么?
- 实现细节:TS SDK / Python SDK 怎么实现?
- 踩坑与最佳实践:真实生态里遇到的坑和对策
- 可迁移方法论:这个设计模式能应用到其他协议设计中吗?
一条核心论断:协议窗口期
每一代计算平台都有一个"协议窗口期":
| 计算时代 | 关键协议窗口 | 抓住的公司 |
|---|---|---|
| 1980s PC | 操作系统 API(Win32, POSIX) | Microsoft |
| 1990s 网络 | TCP/IP、HTTP | Cisco, Netscape(败给 IE) |
| 2000s Web | DOM、XHR、HTML5 | Google, Mozilla |
| 2010s Mobile | iOS/Android SDK | Apple, Google |
| 2020s Cloud | Kubernetes API | CNCF |
| 2025+ AI Agent | MCP | ? |
协议窗口期通常只有 2-3 年。过了窗口期,生态就锁定了,新进入者几乎不可能撼动。MCP 正处在这样一个窗口期内。
源码版本与环境
本书基于以下版本分析:
| 组件 | 版本 | 获取方式 |
|---|---|---|
| MCP 协议规范 | 2025-11-25 | git clone https://github.com/modelcontextprotocol/specification.git |
| TypeScript SDK | 2.0.0-alpha | git clone https://github.com/modelcontextprotocol/typescript-sdk.git |
| Python SDK | latest | git clone https://github.com/modelcontextprotocol/python-sdk.git |
| MCP Inspector | latest | npx @modelcontextprotocol/inspector |
核心源码目录:
specification/
├── docs/specification/2025-11-25/ # 协议规范
└── schema/2025-11-25/schema.ts # TypeScript 形式的 schema
typescript-sdk/
├── packages/
│ ├── core/ # 协议核心:消息、session、transport 抽象
│ ├── client/ # Client 实现
│ └── server/ # Server 实现
python-sdk/
├── src/mcp/
│ ├── client/ # Client 实现
│ ├── server/ # Server 实现
│ ├── shared/ # 共享组件
│ └── types.py # Pydantic 类型定义
实战工具推荐
读本书的时候,强烈推荐装这些工具:
# MCP Inspector - 可视化调试 MCP Server
npx @modelcontextprotocol/inspector <你的 server 命令>
# 官方示例 Server
npx @modelcontextprotocol/server-filesystem /tmp
npx @modelcontextprotocol/server-git /path/to/repo
npx @modelcontextprotocol/server-postgres postgres://...
# Claude Code CLI(用于测试 MCP 集成)
# 参考官方文档安装
阅读路径
根据不同目标,推荐的阅读顺序:
- 开发 MCP Server:Ch00-01 建立概念 → Ch05-07 三大原语 → Ch08-11 SDK 用法 → Ch12-14 按需选传输层 → Ch20 完整实战
- 集成 MCP Client:Ch00-04 基础 → Ch09/11 客户端章节 → Ch12-14 传输层细节 → Ch19 Claude Code 集成
- 设计自己的协议:Ch01-04 理解 MCP 的设计 → Ch21 设计模式总结 → 返回读感兴趣的具体协议决策
本书基于 2026 年 4 月时间点的 MCP 规范(2025-11-25)与对应 SDK 版本。协议仍在演进,但设计原则比具体规定更持久——读懂 MCP 为什么这样设计,也能迁移到下一代协议上。
杨艺韬 2026 年 4 月 · 于北京
延伸阅读的推荐起点
- MCP 官方规范:https://modelcontextprotocol.io
- MCP GitHub 组织:https://github.com/modelcontextprotocol
- TypeScript SDK:https://github.com/modelcontextprotocol/typescript-sdk
- Python SDK:https://github.com/modelcontextprotocol/python-sdk
- Claude Code MCP 集成文档:https://docs.claude.com/en/docs/claude-code/mcp
- Anthropic 的 MCP 介绍博客:https://www.anthropic.com/news/model-context-protocol
- 杨艺韬讲堂 MCP 系列首页:https://yangyitao.com/books/mcp/