MCP 传输方式,stdio、HTTP SSE 和 Streamable HTTP

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。

相关推荐
皮皮学姐分享-ppx7 小时前
政府绿色采购数据库(2015-2024.3)
大数据·网络·数据库·人工智能·制造
W_chuanqi8 小时前
联想M7615DNA网络打印方法
网络·联想·打印机网络连接
HavenlonLabs11 小时前
硬件 + SaaS 产品的工程化路径:从系统架构、PCB 设计到工程样机
网络·安全·架构·系统架构·安全架构
sweet丶14 小时前
MQTT消息通道-基础篇
网络协议
yychen_java15 小时前
当算法成为武器:AI泛滥时代的多维危机透视与治理路径
网络·人工智能·ai
漫途科技15 小时前
精准盯防危房隐患,智守人居安全|MTB46-4-2A 4G数据采集终端专项应用方案
网络·安全
奥利奥夹心脆芙16 小时前
辅助排查 HTTP 接口代码报错,实操完整案例分享
http
Misnearch16 小时前
抓包Packet Capture
网络·抓包
zhangfeng113316 小时前
ps aux讲解,结合国家超算中心 hpc apptainer
linux·服务器·网络
吠品16 小时前
一次 Nginx 报错 unexpected end of file 的排查记录
网络协议·https·ssl