news 2026/9/19 9:28:44

Python 连接 MCP Server 全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 配置),是更为推荐的选择。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 5:35:12

Java全栈工程师的面试实战:从基础到高阶的技术对话

Java全栈工程师的面试实战:从基础到高阶的技术对话 面试场景还原:技术与业务的深度融合 今天,我作为一位经验丰富的Java全栈开发工程师,正在参与一场针对互联网大厂的面试。这次面试的候选人是一位28岁的硕士毕业生,拥…

作者头像 李华
网站建设 2026/9/17 11:59:33

Kimi降AI vs 人工降重:效果、价格、速度三维度横向评测

Kimi降AI vs 人工降重:效果、价格、速度三维度横向评测 TL;DR:Kimi降AI效果有限,AIGC检测指数有时不降反升,因为AI改写依然带有明显的AI痕迹。人工降重效果稳定但耗时长、成本高。综合效果、价格、速度三个维度,专业降…

作者头像 李华
网站建设 2026/9/18 9:12:27

解析大数据领域数据目录的发展趋势

解析大数据领域数据目录的发展趋势:从"数据字典"到"智能管家"的进化之旅 关键词:数据目录、元数据管理、智能搜索、数据治理、云原生、多模态数据、隐私计算 摘要:在数据量以"天量"增长的今天,企业正面临"数据多到找不到,找到不敢用&q…

作者头像 李华
网站建设 2026/9/18 9:11:25

别再“等”生活:掌握主动幸福力

主动幸福力:在日常琐碎中构建你想要的生活你是在“生活”,还是在“等生活”?咱们先来聊个大实话。你有没有这种感觉?每天早上闹钟一响,大脑就开始像一台老旧的服务器一样加载任务:挤地铁、回邮件、开不完的…

作者头像 李华
网站建设 2026/9/18 9:13:11

linux清理缓存命令“echo 3 > /proc/sys/vm/drop_caches”

命令: echo 3 > /proc/sys/vm/drop_caches 是 Linux 系统中手动释放页缓存(Page Cache)的一种方式。下面详细解释其作用、原理和使用注意事项。 🔍 一、作用:清空内核的缓存(非应用程序内存)…

作者头像 李华
网站建设 2026/9/12 1:07:48

旧 Win7 转 Win11/10 文件传输难题?2 款实用工具快速搞定

很多朋友在将旧 Windows 7 电脑的数据迁移到 Win11/10 新机时,都会遇到一个尴尬问题:Win11/10 早已移除了 Windows 轻松传送功能,之前备份的大文件包没法直接用。其实不用慌,分享两款亲测好用的文件传输方案,不管是局域…

作者头像 李华