MCP 源码解析 2
约 459 字大约 2 分钟...
思考题
上述 4 种 MCP 的传输实现方式,具体业务场景中应该如何选型?
思路:本地 / 调试:如果只是同机启动或者做调试,用 stdio 最简单;浏览器或 HTTP 服务:前端无法直接用 stdin/stdout,可用 SSE+POST,它在所有浏览器里原生支持;可靠生产:若要在 HTTP/1.1 上做断连重连、流复用、可恢复推流,就选 Streamable HTTP;高性能双向:需要真正双向、低延迟、长连接,且网络允许 WS 的场景,则用 WebSocket。
如果部署在不稳定的网络环境下,希望在 WebSocket 链路失败后自动切换到 HTTP + SSE,再切回 WebSocket,你会如何在 Host/ClientSession 层设计这一机制?哪些事件或回调最合适触发重连或降级?
一点点思路:
在发生异常的地方进行切换、重连或降级。如下:
except anyio.ClosedResourceError: 客户端断开连接异常
except Exception as e: 任意异常,判断是否为网络层错误
anyio.fail_after(timeout): 请求超时(RTT 过长)
切回 WebSocket 机制:定期探测 WebSocket 是否恢复,尝试切回 WebSocket。可以使用后台协程定期 ping WebSocket 地址来判断WebSocket 是否恢复。
假设要为 MCP 增加一个全新的传输方式(例如 gRPC 双向流),它需要实现哪些核心能力?请列出应实现的接口或函数,以及如何与现有的 BaseSession 集成。
核心能力:
- 消息的异步收发消息,支持双向流。
- 流的生命周期管理:能够正确打开、关闭、异常处理流。
- 与 BaseSession 的解耦:只需提供收、发消息流的接口。
接口:
- connect() 连接
- disconnect() 断开连接
- read()
- write()
与 BaseSession 集成,需要提供两个关键的流对象 read_stream、write_stream
Powered by Waline v3.3.0