协议版本: 2024-11-05
MCP目前定义了两种用于客户端-服务器通信的标准传输机制:
  1. stdio, 通过标准输入和标准输出进行通信
  2. HTTP with Server-Sent Events (SSE)
客户端 应当 尽可能支持标准输入输出。 客户端和服务器还可以以插件式的方式实现 自定义传输

标准输入输出

标准输入输出 transport中:
  • 客户端将 MCP 服务器作为子进程启动。
  • 服务器在其标准输入(stdin)上接收JSON-RPC消息,并将响应写入其标准输出(stdout)。
  • 消息由换行符分隔,并且严禁包含嵌入式换行符。
  • 服务器可以将UTF-8字符串写入其标准错误流(stderr)用于日志记录目的。客户端可以捕获、转发或忽略此日志记录。
  • 服务器不得stdout写入任何非有效 MCP 消息的内容。
  • 客户端不得向服务器的stdin写入任何非有效MCP消息的内容。

HTTP与服务器发送事件

服务器端事件传输中, 服务器作为一个可以处理多个客户端连接的独立进程运行。

安全警告

当使用SSE传输层实现HTTP时:
  1. 服务器必须验证所有传入连接的Origin头部,以防止DNS重新绑定攻击
  2. 在本地运行时,服务器 应当 仅绑定到本地主机(127.0.0.1),而不是所有网络接口(0.0.0.0)
  3. 服务器应当对所有连接实施适当的认证机制
没有这些保护措施,攻击者可能利用DNS重绑定从远程网站与本地MCP服务器进行交互。 服务器 必须 提供两个端点:
  1. 一个SSE端点,供客户端建立连接并从服务器接收消息
  2. 一个常规的HTTP POST端点,用于客户端向服务器发送消息
当客户端连接时,服务器必须发送一个包含URI的endpoint事件,以供客户端用于发送消息。所有后续的客户端消息必须作为HTTP POST请求发送到此端点。 服务器消息以SSE message 事件的形式发送,消息内容以JSON格式编码在事件数据中。

自定义传输方案

Clients and servers 可以 implement additional custom transport mechanisms to suit their specific needs. The protocol is transport-agnostic and can be implemented over any communication channel that supports bidirectional message exchange. 选择支持自定义传输的实现者必须确保它们保留由MCP定义的JSON-RPC消息格式和生命周期要求。自定义传输应当记录其特定的连接建立和消息交换模式以促进互操作性。