当前位置: 首页 > news >正文

Python 连接 MCP Server 全指南

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 httpx

2.2 连接建立:协议适配

方案 A:使用 SSE 连接

这是最常见的连接方式。

frommcp.client.sseimportsse_clientfrommcp.client.sessionimportClientSessionasyncdefconnect_via_sse(url:str,headers:dict=None):# sse_client 是一个 Async Context Manager# 它自动处理 EventSource 的连接与重连asyncwithsse_client(url=url,headers=headers)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:dict=None):# 必须显式创建 httpx client,以便复用连接池和配置超时asyncwithhttpx.AsyncClient(headers=headers,timeout=60.0)ashttp_client:# streamable_http_client 同样返回读写流asyncwithstreamable_http_client(url=url,http_client=http_client)as(read,write,_):asyncwithClientSession(read,write)assession:yieldsession

3. 核心交互流程

一旦ClientSession建立,后续的操作就是标准的 MCP 协议交互。

3.1 握手与初始化 (Initialize)

连接建立后的第一件事必须是握手。Server 会在此时返回它的能力(Capabilities)和元数据(Server Info)。

# 初始化会话# 这一步会协商协议版本和能力init_result=awaitsession.initialize()print(f"Connected to Server:{init_result.serverInfo.name}v{init_result.serverInfo.version}")# 技巧:这里往往藏着 Server 的 System Promptifhasattr(init_result,'instructions'):print(f"Server Instructions:{init_result.instructions}")

3.2 工具发现 (List Tools)

这是 Agent “获取技能” 的关键步骤。

# 获取工具列表list_tools_result=awaitsession.list_tools()tools=list_tools_result.toolsfortoolintools:print(f"Found Tool:{tool.name}")print(f"Description:{tool.description}")print(f"Schema:{tool.inputSchema}")# JSON Schema 格式的参数定义

工程提示:在实际应用中,你需要将这里的inputSchema转换为你的 LLM 框架(如 LangChain 或 OpenAI SDK)所需的格式。对于 LangChain,可以使用pydantic.create_model动态生成参数模型。

3.3 工具调用 (Call Tool)

当 LLM 决定调用工具时,Client 负责转发请求。

frommcp.typesimportCallToolResult tool_name="get_repo_list"arguments={"owner":"nvd11","limit":5}try:# 发送调用请求result:CallToolResult=awaitsession.call_tool(tool_name,arguments=arguments)# 解析结果# MCP 支持 Text 和 Image 两种内容类型output_text=""forcontentinresult.content:ifcontent.type=="text":output_text+=content.textelifcontent.type=="image":print(f"[Image Content:{content.mimeType}]")print(f"Tool Output:{output_text}")exceptExceptionase:print(f"Tool execution failed:{e}")

4. 常见问题 (FAQ)

Q: 我可以用aiohttp代替httpx吗?

A: 不可以直接替换。
mcp.client.streamable_http.streamable_http_client显式依赖于httpx.AsyncClient的接口。由于mcpSDK 本身就将httpx作为核心依赖,建议遵循官方实践使用httpx,以避免不必要的适配工作。

5. 总结

特性SSEStreamable HTTP

5. 总结

特性SSEStreamable HTTP
底层实现EventSource + POSTHTTP Streaming / Chunked
SDK 模块mcp.client.ssemcp.client.streamable_http
依赖管理SDK 内部管理需外部注入httpx.AsyncClient
适用性浏览器友好,兼容性高后端服务间通信,性能更优

对于大多数 Python 后端服务(如 Agent 平台),Streamable HTTP提供了更好的控制力(如自定义 Timeout、Proxy 配置),是更为推荐的选择。

http://www.jsqmd.com/news/249735/

相关文章:

  • AI系统安全加固方案:架构师如何保护AI系统的可恢复性
  • 强烈安利研究生必用TOP9 AI论文写作软件
  • 大模型如何重塑人才决策:从“拍脑袋用人“到“精准识人“的实战指南
  • 基于Copula函数的指数期权跨品种配对交易策略实现
  • 学长亲荐9个AI论文平台,专科生毕业论文轻松搞定!
  • 二分查找——算法总结与教学指南
  • VIX期货基差异常下的指数期权波动率互换套利策略实现
  • AI原生应用与决策支持:实现决策过程的透明化
  • C++跨平台开发的5大核心挑战与突破
  • Java性能优化实战:从原理到案例
  • C语言轮子大赛:从零打造经典轮子
  • TCP/IP协议栈全解析:从原理到实战
  • DeepSeek写的论文怎么降AI?6款工具实测对比推荐
  • Google Ads谷歌广告账户被封广告被拒:解封与规避全攻略
  • 毕业季救星:7款降AI率工具横评,帮你稳过查重
  • 通信原理篇---最佳接收机
  • 使用 nvm(不破坏系统)Linux 上把 Node.js / npm 升级到你指定版本(Node v23.x、npm 10.x)
  • Qt线程陷阱:为什么QPixmap不适合在子线程使用
  • Aloomix vs 降迹灵:2026年降AI工具谁更值得选?深度实测对比
  • Kimi降AI vs 人工降重:效果、价格、速度三维度横向评测
  • 【性能测试】4_JMeter _JMeter使用示例
  • DeepSeek写的论文太AI了?推荐3款降重工具一键搞定
  • Java全栈工程师的面试实战:从基础到高阶的技术对话
  • 【性能测试】5_JMeter _JMeter参数化
  • 导师推荐9个AI论文网站,助你轻松搞定本科生毕业论文!
  • Kimi生成的论文AI率爆表?这份降重操作指南收好
  • 解析大数据领域数据目录的发展趋势
  • sealos introduction (open-source cloud-native platform, Kubernetes Deployment, Cluster deployment)
  • 基于springboot的文化旅游小程序(源码+论文+部署+安装)
  • 导师推荐10个AI论文写作软件,助你轻松完成继续教育论文!