1. MCP 整体架构
Model Context Protocol (MCP) 是一个用于 AI 模型与外部系统交互的标准化协议。 它由三个主要组件组成:Host、Client 和 Server,它们共同工作以实现 AI 模型与外部资源的安全、高效交互。
组件职责
- Host:运行 AI 程序的环境,如 Claude Desktop 或集成开发环境 (IDE)。负责执行 AI 模型并处理用户交互。
- Client:协议客户端,管理与服务器的连接,处理消息的编码和解码,并维护会话状态。
- Server:轻量级程序,实现 MCP 协议,暴露特定功能(如文件系统访问、数据库查询等)给 AI 模型。
通信路径
- 标准输入输出 (stdio):适用于本地集成和命令行工具,通过标准输入和输出流进行通信。
- Server-Sent Events (SSE):通过 HTTP POST 请求实现服务器到客户端的流式通信,适用于网络服务。
- JSON-RPC:所有通信都使用 JSON-RPC 2.0 规范进行编码,确保消息格式的标准化和互操作性。
2. MCP 通信流程
MCP 通信流程包括初始化、能力交换、请求/响应和通知等阶段。客户端与服务器之间的所有交互都遵循 JSON-RPC 2.0 规范, 通过 stdio 或 SSE 传输层进行通信。
传输层实现差异
特性 | stdio | SSE |
---|---|---|
传输方式 | 标准输入输出流 | HTTP POST 请求 |
适用场景 | 本地集成、命令行工具 | 网络服务、受限网络环境 |
消息格式 | JSON-RPC 2.0 | JSON-RPC 2.0 |
连接方式 | 进程间通信 | HTTP 长连接 |
错误处理流程
MCP 协议定义了标准的错误处理机制,包括:
- 协议错误:如无效请求、方法不存在等 JSON-RPC 标准错误
- 应用错误:特定于应用的错误,如资源不存在、权限不足等
- 运行时错误:服务器执行过程中的异常
错误响应包含错误代码、错误消息和可选的错误数据,客户端根据错误类型进行相应处理。
3. 服务器原语流程
MCP 服务器实现了三种核心原语:Prompts(提示)、Resources(资源)和 Tools(工具)。 这些原语为 AI 模型提供了与外部系统交互的标准化接口。
Prompts 原语
预定义的模板,用于塑造语言模型的响应方式。服务器可定义可重用的提示模板和工作流, 客户端能轻松将这些模板呈现给用户和语言模型。
Resources 原语
用于向 LLMs 暴露数据,类似于 REST API 中的 GET 端点,提供数据但不应执行大量计算或产生副作用。 可以是静态资源或带参数的动态资源。
Tools 原语
暴露给 LLM 的操作,允许 AI 执行计算、检索信息或与外部系统交互等任务, 由模型自主控制何时及如何使用。
参数验证机制
MCP 服务器使用 Zod(TypeScript)或 Pydantic(Python)进行参数验证:
TypeScript 示例(Zod)
server.tool("add", { a: z.number(), b: z.number() }, async ({ a, b }) => ({ content: [{ type: "text", text: String(a + b) }] }) );
Python 示例(Pydantic)
@mcp.tool() def add(a: int, b: int) -> int: """Add two numbers""" return a + b
4. 客户端原语流程
MCP 客户端负责与服务器交互,处理 Sampling(采样)和 Roots(根资源)等原语, 并管理与服务器的连接和会话状态。
Sampling 原语
Sampling 原语允许服务器请求 AI 模型进行推理,生成文本或执行其他任务。 这一过程需要用户明确授权,并且服务器只能看到有限的上下文信息。
- 用户授权:用户必须明确批准任何 LLM 采样请求
- 提示控制:用户控制实际提示内容及服务器可见结果
- 上下文限制:协议限制服务器对提示的可见性
Roots 原语
Roots 原语用于发现和访问服务器提供的资源。客户端可以查询服务器的根资源, 然后导航到特定资源,并可以订阅资源更新。
- 资源发现:查询服务器提供的根资源
- 资源导航:通过 URI 导航到特定资源
- 订阅管理:订阅资源更新,接收变更通知
- 缓存管理:维护本地资源缓存,减少网络请求
5. MCP 协议生命周期
MCP 协议定义了客户端与服务器交互的完整生命周期,从初始化到关闭,包括能力交换、请求处理和资源清理等阶段。
生命周期阶段
阶段 | 描述 | 关键事件 |
---|---|---|
初始化协商 | 客户端与服务器建立连接,协商协议版本 |
|
能力交换 | 客户端查询服务器支持的功能 |
|
请求处理 | 客户端发送请求,服务器处理并响应 |
|
资源清理 | 客户端发起关闭,服务器清理资源 |
|
状态转换
MCP 协议定义了明确的状态转换流程,确保客户端和服务器在任何时刻都处于一致的状态:
- 未初始化 → 就绪:通过初始化过程,建立连接并协商协议版本
- 就绪 → 运行:通过能力交换,客户端了解服务器支持的功能
- 运行 → 关闭:通过关闭过程,清理资源并断开连接
在任何状态下,如果发生错误,协议都定义了明确的错误处理机制和恢复路径。