跳至主要內容

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