再见,SSE!你好,Streamable HTTP!

大家好!我是韩老师。

之前和大家分享了三篇 MCP 相关的文章:

还是那句话:也许有一天,AI 程序员不懂 MCP,就犹如前端程序员不懂 JavaScript!

相信不少童鞋已经了解了甚至参与到了 MCP 相关的开发。

从 MCP 支持的两个协议 stdio 和 SSE 来看,MCP 确实有点“快而糙”。如果我当年本科的暑假大作业,还有一天就要deadline了,我也许才会选择这两个协议,能让我快速出活。

formulahendry,公众号:玩转VS CodeCode Runner MCP Server,来了!

在第一篇文章中,我就提到了 stdio 和 SSE 的的“快而糙”。

SSE 的最大缺陷之一,显而易见:SSE 需要 server 端保持一个长连接,而且,根据 MCP 的协议,在 MCP Client 与 MCP Server 建立 SEE 连接后,在整个 connection 的生命周期中,MCP Server 需要一直保持着这个 SSE 连接。

那么,对于要支持 SSE 的运行在 remote 的 MCP Server 来说,就需要保证高可靠性。在高并发的情况下,对 MCP Server 的负载更是一个挑战。

在 3 月 26 日,MCP 发布了最新的 spec,用 Streamable HTTP “取代”了 SSE。

简单来说,在新的 Streamable HTTP 协议中,MCP Server 可以根据自己实际的使用场景来决定自己是 Stateless 还是 Stateful 的,而不是像 SSE 那样,一定是 Stateful 的。

这对开发 Remote MCP Server 的开发者来说,真是一个极好的消息,因为在不少场景中,Stateless server 会对 MCP Server 的要求降低很多!

今天,我也要和大家分享个好消息,韩老师的 Code Runner MCP Server 和 Yeoman Generator for MCP Server 都已经支持 Streamable HTTP 啦!

现在,韩老师就用 Yeoman Generator for MCP Server,来带领大家快速开发一个 Streamable HTTP 的 MCP Server!

安装 Node.js

从 https://nodejs.org/en 安装 LTS 版的 Node.js 即可。

安装 Scaffolding Tool

在命令行运行下面命令,安装 Yeoman Generator for MCP Server:

npm install -g yo generator-mcp@latest

创建 MCP Server 项目

在命令行运行下面命令,创建 MCP Server 项目:

yo mcp -n 'Weather MCP Server'

实现代码逻辑

主要的代码逻辑在 src\streamableHttp.ts 文件中,可以不做修改直接使用。

启动项目

在命令行运行下面命令,启动 MCP Server 项目:

npm run buildnpm run start:streamableHttp

在 VS Code 运行

安装好最新的 VS Code Insiders 版本。

打开 .vscode\mcp.json,取消 weather-mcp-server-streamable-http 的注释,点击 “start” 按钮:

现在,就能在 VS Code Insiders 的 Agent Mode 调用你的 MCP Server 啦!

大功告成!

我的两个 MCP 项目完全开源,欢迎来围观或者一起共谋大业:

https://github.com/formulahendry/mcp-server-code-runner

https://github.com/formulahendry/generator-mcp

HTTP流式传输是一种在客户端与服务器之间持续传输数据的方式,允许服务器在响应生成过程中逐步发送数据,而无需等待整个响应完成。这种机制广泛用于实时数据更新、长轮询替代方案以及基于事件的通信。 ### HTTP流式传输机制 HTTP流式传输通常通过保持HTTP连接打开并在数据可用时立即发送来实现。常见的方法包括: - **Server-Sent Events (SSE)**:一种简单的文本协议,允许服务器向客户端推送实时消息。 - **Chunked Transfer Encoding**:使用分块编码将响应分成多个部分发送,每个部分都可以独立处理。 - **WebSocket**:虽然不是HTTP流式传输的一部分,但WebSocket提供了全双工通信通道,可以用于类似目的。 ### 实现流式API 要实现流式API,需要考虑以下几点: 1. **设置正确的Content-Type头**:对于SSE,应使用`text/event-stream`作为内容类型。 2. **禁用缓冲**:确保服务器不会缓存输出,以便能够即时发送数据给客户端。 3. **维护持久连接**:对于某些流式技术如Comet(长轮询),需要维持一个长时间存活的HTTP连接。 #### 示例代码 - Node.js中的简单SSE实现 ```javascript app.get('/stream', function(req, res) { res.setHeader('Content-Type', 'text/event-stream'); res.setHeader('Cache-Control', 'no-cache'); // 模拟定期发送事件 const intervalId = setInterval(() => { const data = `data: ${new Date()}\n\n`; res.write(data); }, 1000); req.on('close', () => { clearInterval(intervalId); // 当客户端关闭连接时清理定时器 res.end(); }); }); ``` #### 示例代码 - Python Flask应用中使用分块响应 ```python from flask import Flask, Response import time app = Flask(__name__) @app.route('/stream') def stream(): def generate(): for i in range(10): yield f"data: {i}\n\n" time.sleep(1) return Response(generate(), mimetype='text/plain') if __name__ == "__main__": app.run(debug=True) ``` ### 开发实践建议 - **性能优化**:考虑到网络延迟和带宽限制,合理控制数据发送频率以减少不必要的资源消耗。 - **错误处理**:设计健壮的重连逻辑,当连接中断时客户端能够自动尝试重新建立连接。 - **安全性考量**:对敏感信息进行适当的身份验证和授权检查,并采用HTTPS加密传输保证安全。 这些技术和模式可以根据具体需求选择适合的应用场景,比如构建实时仪表板、在线游戏或多用户协作工具等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值