传输
ℹ️
协议版本: 草案
MCP 使用 JSON-RPC 来编码消息。JSON-RPC 消息必须使用 UTF-8 编码。
协议目前定义了两种用于客户端-服务器通信的标准传输机制:
- stdio,通过标准输入和标准输出进行通信
- HTTP 与服务器发送事件 (SSE)
客户端应该尽可能支持 stdio。
客户端和服务器也可以以可插拔方式实现自定义传输。
stdio
在 stdio 传输中:
- 客户端将 MCP 服务器启动为子进程。
- 服务器在其标准输入 (
stdin
) 上接收 JSON-RPC 消息,并将响应写入其标准输出 (stdout
)。 - 消息由换行符分隔,不得包含嵌入的换行符。
- 服务器可以为日志目的将 UTF-8 字符串写入其标准错误 (
stderr
)。客户端可以捕获、转发或忽略此日志。 - 服务器不得向其
stdout
写入任何不是有效 MCP 消息的内容。 - 客户端不得向服务器的
stdin
写入任何不是有效 MCP 消息的内容。
sequenceDiagram participant Client participant Server Process Client->>+Server Process: 启动子进程 loop 消息交换 Client->>Server Process: 写入 stdin Server Process->>Client: 写入 stdout Server Process--)Client: 可选的 stderr 日志 end Client->>Server Process: 关闭 stdin,终止子进程 deactivate Server Process
HTTP 与 SSE
在 SSE 传输中,服务器作为可以处理多个客户端连接的独立进程运行。
服务器必须提供两个端点:
- 一个 SSE 端点,供客户端建立连接并从服务器接收消息
- 一个常规 HTTP POST 端点,供客户端向服务器发送消息
当客户端连接时,服务器必须发送一个包含 URI 的 endpoint
事件,客户端使用该 URI 发送消息。所有后续客户端消息必须作为 HTTP POST 请求发送到此端点。
服务器消息作为 SSE message
事件发送,消息内容在事件数据中编码为 JSON。
sequenceDiagram participant Client participant Server Client->>Server: 打开 SSE 连接 Server->>Client: endpoint 事件 loop 消息交换 Client->>Server: HTTP POST 消息 Server->>Client: SSE message 事件 end Client->>Server: 关闭 SSE 连接
自定义传输
客户端和服务器可以实现额外的自定义传输机制以满足其特定需求。协议是传输不可知的,可以在任何支持双向消息交换的通信通道上实现。
选择支持自定义传输的实现者必须确保它们保留 MCP 定义的 JSON-RPC 消息格式和生命周期要求。自定义传输应该记录其特定的连接建立和消息交换模式,以帮助互操作性。