理解MCP 通信机制

一、MCP通信机制全景透视

1. 客户端-服务器架构(Host-Client-Server三级结构)

MCP核心遵循客户端-服务器架构,其中主机应用程序(MCP client)可以连接到多个服务器(MCP Server):

2. 分层设计哲学:协议层与传输层

MCP 在通信机制的设计上,将协议层(**Protocol layer)**与传输层(**Transport layer)**解耦

  • Protocol layer: 协议层定义通信逻辑与消息语义,负责管理交互模式、消息关联性及生命周期。其核心在于标准化AI系统与资源的对话规则
  • Transport layer: 传输层负责客户端与服务器之间的物理通信机制,专注于数据包的实际传输。其核心目标是屏蔽底层传输方式的差异,为上层协议提供统一的数据交换接口

协议层依赖传输层提供的原始字节流,通过JSON-RPC封装为结构化消息,传输层可替换(如从Stdio切换为HTTP-SSE),而协议层逻辑保持不变,实现跨环境复用

通过这种分层设计,MCP既保证了通信的灵活性(如本地/云端场景切换),又实现了语义的统一性(如跨工具的标准请求格式),成为AI系统与数字世界交互的“通用插座”

二、Protocol 层简介

协议层负责消息封装、请求和响应的关联、高级通信模式的管理。

就具体实现而言,就是实现了下面四个接口:

  • 发送请求
  • 发送通知
  • 接收请求
  • 接收通知

以 Python 为例:

代码语言:javascript代码运行次数:0运行复制
class Session(BaseSession[RequestT, NotificationT, ResultT]):
    asyncdef send_request(
        self,
        request: RequestT,
        result_type: type[Result]
    ) -> Result:
        """Send request and wait for response. Raises McpError if response contains error."""
        # Request handling implementation

    asyncdef send_notification(
        self,
        notification: NotificationT
    ) -> None:
        """Send one-way notification that doesn't expect response."""
        # Notification handling implementation

    asyncdef _received_request(
        self,
        responder: RequestResponder[ReceiveRequestT, ResultT]
    ) -> None:
        """Handle incoming request from other side."""
        # Request handling implementation

    asyncdef _received_notification(
        self,
        notification: ReceiveNotificationT
    ) -> None:
        """Handle incoming notification from other side."""
        # Notification handling implementation

三、Transport 层简介

MCP 的 Transport layer 负责处理 MCP Client 和 MCP Server 的底层通信,它决定了消息如何发送和接收。

All transports use JSON-RPC 2.0 to exchange messages.

MCP 的 Transport layer 采用 JSON-RPC 2.0 协议 来传输数据,并且支持两种传输模式:

  • stdio:
    • 基于标准输入/输出流(stdio)
    • 适用于本地进程间通信(如IDE插件与本地服务的交互)
  • HTTP-SSE:
    • 客户端→服务端:通过HTTP POST发送请求
    • 服务端→客户端:使用Server-Sent Events(SSE)实现服务端推送(如云端API调用)
    • 满足真实的使用场景

消息格式与 JSON-RPC 2.0

MCP 使用 JSON-RPC 2.0 协议 作为传输数据的格式。 ****MCP 的传输层(Transports)负责处理底层通信细节,具体包括:

  • 编码转换: 将 MCP 协议消息(如请求或响应)转换为符合 JSON-RPC 2.0 格式的消息,以便通过 HTTP、WebSocket 等传输协议发送。
  • 解码转换: 将接收到的 JSON-RPC 消息解析并还原为 MCP 协议消息,供客户端或服务器处理。

传输层的转换过程确保了 MCP 协议的抽象性与传输无关性,即 MCP 可灵活适配多种传输方式而不影响其核心逻辑。

三种主要的消息类型

MCP 定义了三种主要的消息类型

Request

代码语言:javascript代码运行次数:0运行复制
{
  jsonrpc: "2.0",
  id: number | string,
  method: string,
  params?: object
}

Response

代码语言:javascript代码运行次数:0运行复制
{
  jsonrpc: "2.0",
  id: number | string,
  result?: object,
  error?: {
    code: number,
    message: string,
    data?: unknown
  }
}

Notifications

代码语言:javascript代码运行次数:0运行复制
{
  jsonrpc: "2.0",
  method: string,
  params?: object
}

Stdio 模式: 本地交互的“极简之道”

模式简介

stdio模式是MCP协议定义的两种标准传输机制之一,采用同步阻塞模型进行通信。该模式通过操作系统的管道机制实现数据交换,主要面向本地批处理任务或简单工具调用场景。其优势在于实现简单、低延迟且无需网络配置,但仅限本地使用,不支持分布式部署。

核心思想

MCP Server 作为 MCP Client 的一个子进程启动,通过进程的标准输入(stdin)和标准输出(stdout)传输数据,客户端和服务端通过管道(Pipe)或文件描述符直接交换信息。

工作机制

  1. 进程管理机制
    1. 客户端将MCP服务端作为子进程启动,通过fork/exec等系统调用建立进程间通信管道
    2. 服务端运行期间,客户端负责监控进程状态并处理异常终止。
  2. 消息传输规范
    1. 使用UTF-8编码的JSON-RPC 2.0格式
    2. 消息以换行符\n分隔,且禁止包含嵌入换行符
    3. 严格区分标准输出(stdout)与标准错误(stderr),前者仅传输协议消息,后者用于日志输出
  3. 错误处理机制
    1. 服务端通过stderr输出日志信息,客户端可选择捕获、转发或忽略这些日志。若检测到非法消息格式,通信双方应立即终止连接。

交互流程

适用场景

  • 构建命令行工具
  • 本地集成
  • 简单的进程通信
  • 与 Shell 脚本一起工作

SSE模式:远程通信的“流式革命”

模式简介

SSE(Server-Sent Events)是MCP协议中基于HTTP协议实现的远程传输模式,通过HTTP长连接实现服务端到客户端的实时单向数据推送,配合HTTP POST完成双向通信。该模式主要解决AI应用场景中对话式会话状态保持、流式输出等需求,适用于需要远程访问或实时数据推送的场景,如云服务调用、多客户端监控等。

工作机制

SSE 模式通过 两个独立通道 实现双向通信:

  1. SSE 通道(服务器→客户端)
    • 客户端通过 HTTP GET 请求建立长连接(如 /sse 端点),接收服务器推送的 JSON-RPC 格式事件流。
    • 数据以 text/event-stream 格式传输,支持自动重连机制。
  2. HTTP POST 通道(客户端→服务器)
    • 客户端通过向指定端点(如 /messages)发送 JSON-RPC 请求,触发服务器执行操作(如调用工具、查询资源)。
    • 请求与响应通过 会话 ID(session_id)请求 ID(request_id) 关联,确保异步处理的准确性。

关键特性

  • 伪双工通信:通过分离的 HTTP 请求和 SSE 流模拟双向交互,而非 WebSocket 的单一全双工通道。
  • 无状态与异步:服务器接收 POST 请求后立即返回 202 状态码(仅确认接收),处理结果通过 SSE 流异步返回。

交互流程

以下为一次完整会话的步骤(以调用远程工具为例):

连接建立

  • 客户端向 /sse 发送 GET 请求,建立 SSE 长连接。
  • 服务端生成唯一 session_id 并通过 SSE 流推送至客户端。

请求发送

  • 客户端构造 JSON-RPC 请求(包含 methodparamsrequest_id),通过 HTTP POST 发送至 /messages 端点,并在 Header 中携带 session_id
  • 示例请求格式: { "jsonrpc": "2.0", "id": 1, "method": "get_weather", "params": { "city": "北京" } }

服务端处理

  • 服务端返回 HTTP 202(Accepted),仅表示请求已接收,不包含处理结果。
  • 异步执行请求(如调用天气查询工具),完成后将结果封装为 JSON-RPC 响应,通过 SSE 通道推送。

结果推送与匹配

代码语言:javascript代码运行次数:0运行复制
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "temperature": 25,
    "humidity": "60%"
  }
}
  • 客户端根据 request_id 将响应与原始请求关联。
  • 服务端通过 SSE 流发送响应,包含与请求匹配的 request_id

连接终止

  • 客户端主动关闭 SSE 连接,或服务端在空闲超时后终止会话。

应用场景

  • 实时监控 AI 工具调用进度(如长文本生成)。
  • 多客户端共享远程资源(如集中式数据库查询服务)。
  • 浏览器兼容性要求高的实时交互应用(如 Web 端 AI 助手)。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-21,如有侵权请联系 cloudcommunity@tencent 删除服务端服务器客户端通信协议