MCP 使用 JSON-RPC 协议来编码消息。为了在客户端和服务器之间传递消息,需要相应的传输机制。根据版本的不同,MCP 协议定义了两类三种传输方式。两类方式是 stdio 和 HTTP。三种分别是 stdio、HTTP SSE 和 Streamable HTTP。HTTP SSE 定义在 MCP 协议 2024-11-05 版本中。Streamable HTTP 则是 2025-03-26 版本中定义的,用来替换 HTTP SSE。考虑到不同 SDK 对于协议的实现程度,仍然有大量 MCP 服务器使用 HTTP SSE 传输方式。
0 1
stdio
stdio 表示标准输入输出流。在这种方式下,MCP 客户端把 MCP 服务器以子进程的方式启动。运行的 MCP 服务器由客户端独占使用。客户端控制服务器的生命周期。服务器从它的标准输入流读取输入消息,并把输出消息写入到它的标准输出流。
以下是 stdio 传输方式中,客户端和服务器的交互流程。

stdio 的传输方式,要求客户端可以直接在本地启动服务器。这对服务器的分发和部署提出了更高的要求,因为服务器自身需要运行在用户的机器上。如果服务器不是以原生可执行文件的方式分发,那就要求本地机器上必须具备特定编程语言的运行时。举例来说,Java 开发的使用 stdio MCP 服务器,如果以 JAR 文件的形式分发,客户端需要安装 Java 运行时才能运行该 JAR 文件。该限制对使用 JavaScript 和 Python 开发的 MCP 服务器也是适用的。使用 Docker 运行 MCP 服务器是另外一个选项,但是同样也要求客户端安装 Docker。
stdio 传输方式最大的优势是可以访问用户的本地环境,尤其是用户的私有文件,适合于个人使用的场景。用户对 MCP 服务器有更大的控制权。对性能和安全的要求并不高。
在 HTTP 传输方式中,服务器以一个独立进程的方式运行,可以同时处理多个客户端连接。HTTP 传输方式有 SSE 和 Streamable HTTP 两种。
0 2
HTTP SSE
在 SSE 方式中,服务器提供两个终端:一个是 SSE 终端,用来建立连接和接收服务器端的消息。一个是 HTTP POST 终端,客户端通过此终端发送请求给服务器。
客户端连接到服务器的 SSE 终端,服务器发送 endpoint 类型的事件,数据是 HTTP POST 终端的 URI 地址。客户端的消息,都发送到该 POST 终端。服务器的消息以 message 类型的事件,发送给客户端。
以下是 HTTP SSE 传输方式中,客户端和服务器的交互流程。

0 3
Streamable HTTP
在 Streamable HTTP 传输方式中,SSE 不再是必须的,而是一个可选的功能。在接收到客户端的请求之后,服务器可以直接发送单个消息作为响应。这降低了 HTTP 传输方式的实现难度,客户端使用起来也更方便。
在 Streamable HTTP 传输方式中,使用HTTP POST 和 GET 请求,并可以使用 SSE 实现消息的流式传输。
MCP 服务器需要提供一个同时支持 POST 和 GET 请求的 HTTP 接口。
POST 请求用来从客户端发送消息给服务器。POST 请求的内容可以是单个 JSON-RPC 的请求、通知或响应,或多个请求或通知组成的数组,或多个响应组成的数组。如果 POST 请求的内容中包含了任意数量的JSON-RPC 请求,服务器可以返回一个SSE流,或是 JSON 格式的响应。如果使用 SSE 流,流中应该包含每个 JSON-RPC 请求所对应的响应。当全部响应被发送完成之后,该 SSE 流被关闭。如果使用 JSON 格式,只能发送单个 JSON-RPC 响应。
GET 请求用来接收从服务器发送的消息。通过这种方式,服务器可以使用 SSE 主动给客户端发送消息,而不用要求客户端首先通过 POST 请求来发送消息。如果服务器支持这种方式,GET 请求的响应必须是一个 SSE 流。如果服务器不支持这种方式,服务器直接返回 HTTP 405 Method Not Allowed 错误代码。
以下是 Streamable HTTP 中,客户端与服务器的交互流程。

与 stdio 相比,HTTP 传输方式的好处是,一个服务器可以被多个客户端共享。HTTP 传输方式增加了服务器的部署难度,但是对客户端来说简化了很多,只需要一个连接服务器的 URL 即可,服务器可以部署在云端。HTTP 传输方式有自己的适用场景。举例来说,已有的 SaaS 服务提供者可以开放 MCP 服务器,允许用户把自己的数据提供给大模型。当然了,这会涉及到用户认证,安全和隐私等方方面面的问题。
总结一下,MCP 的 stdio 和 HTTP 传输方式有各自的适用场景,可以根据需要选择。面向个人的工具类 MCP 服务器,优先选择 stdio。对外提供公开服务的 MCP 服务器,优先选择 HTTP。