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。

相关推荐
二狗mao2 小时前
Uniapp使用websocket进行ai回答的流式输出
websocket·网络协议·uni-app
7***u2163 小时前
显卡(Graphics Processing Unit,GPU)架构详细解读
大数据·网络·架构
河北瑾航科技5 小时前
广西水资源遥测终端 广西水利遥测终端 广西用水监测遥测终端 河北瑾航科技遥测终端机HBJH-B01说明书
网络·科技·水文遥测终端机·遥测终端机·广西水资源遥测终端机·广西水利遥测终端·广西用水终端
羑悻的小杀马特6 小时前
轻量跨云·掌控无界:Portainer CE + cpolar 让远程容器运维像点外卖一样简单——免复杂配置,安全直达对应集群
运维·网络·安全·docker·cpolar
愚戏师7 小时前
Python3 Socket 网络编程复习笔记
网络·笔记
降临-max7 小时前
JavaSE---网络编程
java·开发语言·网络·笔记·学习
156082072197 小时前
基于7VX690T FPGA实现万兆TCP/IP资源和性能测试
网络协议·tcp/ip·fpga开发
赖small强8 小时前
【Linux 网络基础】libwebsockets HTTPS 服务端实现机制详解
linux·网络·https·tls·libwebsockets
大白的编程日记.8 小时前
【计算网络学习笔记】MySql的多版本控制MVCC和Read View
网络·笔记·学习·mysql
布朗克16810 小时前
HTTP 与 HTTPS 的工作原理及其区别
http·https