2026/2/15 6:56:07
网站建设
项目流程
php一台电脑做网站,建设商城网站的书籍钱,微信开放平台怎么扫码登录游戏,专业教育网站建设Model Context Protocol (MCP) 正在重塑 LLM 应用与外部系统的交互范式。作为客户端开发者#xff0c;理解如何高效、稳定地连接 MCP Server 是构建 Agent 的第一步。本文将深入剖析 Python 环境下的连接机制#xff0c;重点对比 SSE 与 Streamable HTTP 两种传输协议#x…Model Context Protocol (MCP) 正在重塑 LLM 应用与外部系统的交互范式。作为客户端开发者理解如何高效、稳定地连接 MCP Server 是构建 Agent 的第一步。本文将深入剖析 Python 环境下的连接机制重点对比 SSE 与 Streamable HTTP 两种传输协议并提供生产级的代码示例。1. 传输层协议SSE vs Streamable HTTP在 MCP 的架构中传输层Transport Layer负责在 Client 和 Server 之间搬运 JSON-RPC 消息。目前主流的两种远程传输协议各有千秋。1.1 Server-Sent Events (SSE)SSE 是 Web 标准中用于服务器向客户端单向推送数据的技术。在 MCP 中它通常结合 HTTP POST 使用。机制Client 建立一个长连接GET /sse用于接收 Server 的消息Events。Client 发送消息则通过另一个独立的 HTTP POST 请求。适用场景浏览器环境、需要穿越防火墙、标准 Web 服务。连接模型双通道一条长读通道一条短写通道。1.2 Streamable HTTP (Chunked Transfer)这是一种更现代、更纯粹的 HTTP 交互方式通常基于 HTTP/1.1 的 Chunked Transfer Encoding 或 HTTP/2。机制Client 和 Server 通过一个双向流或长轮询变体进行通信。在 MCP 的 Python SDK 实现中它往往复用了底层 HTTP 客户端如httpx的流式能力。适用场景Server-to-Server 通信、高性能后端服务。连接模型单通道或复用通道通常更节省资源且不需要处理跨域CORS的复杂性如果在同域后端。2. Python 客户端实战我们将使用官方mcpSDK 来构建客户端。无论使用哪种传输协议核心的ClientSession逻辑是一致的区别仅在于Transport的初始化。2.1 依赖安装pipinstallmcp httpx2.2 连接建立协议适配方案 A使用 SSE 连接这是最常见的连接方式。frommcp.client.sseimportsse_clientfrommcp.client.sessionimportClientSessionasyncdefconnect_via_sse(url:str,headers:dictNone):# sse_client 是一个 Async Context Manager# 它自动处理 EventSource 的连接与重连asyncwithsse_client(urlurl,headersheaders)as(read_stream,write_stream):asyncwithClientSession(read_stream,write_stream)assession:yieldsession方案 B使用 Streamable HTTP 连接这是更底层的连接方式通常需要自行管理httpx.AsyncClient的生命周期。importhttpxfrommcp.client.streamable_httpimportstreamable_http_clientfrommcp.client.sessionimportClientSessionasyncdefconnect_via_http(url:str,headers:dictNone):# 必须显式创建 httpx client以便复用连接池和配置超时asyncwithhttpx.AsyncClient(headersheaders,timeout60.0)ashttp_client:# streamable_http_client 同样返回读写流asyncwithstreamable_http_client(urlurl,http_clienthttp_client)as(read,write,_):asyncwithClientSession(read,write)assession:yieldsession3. 核心交互流程一旦ClientSession建立后续的操作就是标准的 MCP 协议交互。3.1 握手与初始化 (Initialize)连接建立后的第一件事必须是握手。Server 会在此时返回它的能力Capabilities和元数据Server Info。# 初始化会话# 这一步会协商协议版本和能力init_resultawaitsession.initialize()print(fConnected to Server:{init_result.serverInfo.name}v{init_result.serverInfo.version})# 技巧这里往往藏着 Server 的 System Promptifhasattr(init_result,instructions):print(fServer Instructions:{init_result.instructions})3.2 工具发现 (List Tools)这是 Agent “获取技能” 的关键步骤。# 获取工具列表list_tools_resultawaitsession.list_tools()toolslist_tools_result.toolsfortoolintools:print(fFound Tool:{tool.name})print(fDescription:{tool.description})print(fSchema:{tool.inputSchema})# JSON Schema 格式的参数定义工程提示在实际应用中你需要将这里的inputSchema转换为你的 LLM 框架如 LangChain 或 OpenAI SDK所需的格式。对于 LangChain可以使用pydantic.create_model动态生成参数模型。3.3 工具调用 (Call Tool)当 LLM 决定调用工具时Client 负责转发请求。frommcp.typesimportCallToolResult tool_nameget_repo_listarguments{owner:nvd11,limit:5}try:# 发送调用请求result:CallToolResultawaitsession.call_tool(tool_name,argumentsarguments)# 解析结果# MCP 支持 Text 和 Image 两种内容类型output_textforcontentinresult.content:ifcontent.typetext:output_textcontent.textelifcontent.typeimage:print(f[Image Content:{content.mimeType}])print(fTool Output:{output_text})exceptExceptionase:print(fTool execution failed:{e})4. 常见问题 (FAQ)Q: 我可以用aiohttp代替httpx吗A: 不可以直接替换。mcp.client.streamable_http.streamable_http_client显式依赖于httpx.AsyncClient的接口。由于mcpSDK 本身就将httpx作为核心依赖建议遵循官方实践使用httpx以避免不必要的适配工作。5. 总结特性SSEStreamable HTTP5. 总结特性SSEStreamable HTTP底层实现EventSource POSTHTTP Streaming / ChunkedSDK 模块mcp.client.ssemcp.client.streamable_http依赖管理SDK 内部管理需外部注入httpx.AsyncClient适用性浏览器友好兼容性高后端服务间通信性能更优对于大多数 Python 后端服务如 Agent 平台Streamable HTTP提供了更好的控制力如自定义 Timeout、Proxy 配置是更为推荐的选择。