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.mzph.cn/news/1164988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI系统安全加固方案:架构师如何保护AI系统的可恢复性

AI系统安全加固方案:架构师如何保护AI系统的可恢复性 (示意图:AI系统可恢复性的多层防御架构) 1. 引入与连接:当AI系统"生病"时 2023年,某自动驾驶公司的AI决策系统因意外数据污染导致识别功能…

强烈安利研究生必用TOP9 AI论文写作软件

强烈安利研究生必用TOP9 AI论文写作软件 2026年研究生论文写作工具测评:为何值得关注 在当前学术研究日益数字化的背景下,研究生群体面临越来越多的写作挑战。从选题构思到文献综述,再到格式排版与语言润色,每一个环节都可能成为影…

大模型如何重塑人才决策:从“拍脑袋用人“到“精准识人“的实战指南

AI人才罗盘结合大模型与HR专业模型,通过四步流程(岗位画像定义、数据向量化、标签体系构建、双模型推荐),将企业内部人才数据转化为战略资产,实现从"拍脑袋用人"到"精准识人"的转变。它解决了人才…

基于Copula函数的指数期权跨品种配对交易策略实现

策略功能与风险说明 本策略通过Copula函数量化尾部相关性,构建指数期权跨品种配对交易组合。核心功能包括:1) 利用高斯Copula和t-Copula捕捉标的资产间的非线性依赖关系;2) 基于尾部相关系数(τ)筛选高相关性品种;3) 采用协整检验…

学长亲荐9个AI论文平台,专科生毕业论文轻松搞定!

学长亲荐9个AI论文平台,专科生毕业论文轻松搞定! AI工具,让论文写作不再难 在专科生的求学路上,毕业论文往往是一道难以逾越的难关。面对繁杂的文献资料、复杂的结构要求以及严格的查重要求,很多同学感到无从下手。而如…

二分查找——算法总结与教学指南

📚 算法核心思想 二分查找的本质 在有序集合中通过不断折半缩小搜索范围每次比较都能排除一半的错误答案核心前提:数据必须有序(直接或间接) 三种二分查找模式模式特点适用场景关键判断标准二分查找确切存在的值有序数组查找nums[…

VIX期货基差异常下的指数期权波动率互换套利策略实现

""" 功能:基于VIX期货基差异常的波动率互换套利系统 作用:通过监测VIX期货与现货溢价异常,构建Cboe VXST与VIX跨期价差组合,捕捉S&P 500指数期权隐含波动率与实际波动率的预期偏差 风险:1. 基差收敛…

AI原生应用与决策支持:实现决策过程的透明化

AI原生应用与决策支持:实现决策过程的透明化关键词:AI原生应用、决策支持系统、可解释性AI(XAI)、透明化决策、人机协同摘要:本文将带你走进“AI原生应用”与“透明化决策支持”的世界。我们会用“餐厅智能点餐系统”“…

C++跨平台开发的5大核心挑战与突破

C跨平台开发的核心挑战平台差异性 硬件架构差异(x86、ARM等)导致的内存对齐、字节序问题。操作系统API差异(Windows Win32、Linux POSIX、macOS Cocoa)。编译器行为不一致(MSVC、GCC、Clang对标准支持程度不同&#xf…

Java性能优化实战:从原理到案例

Java性能优化实战技术文章大纲性能优化的核心原则理解性能优化的基本理念,包括权衡、测量和持续改进的重要性 避免过度优化,确保优化措施与业务需求相匹配JVM调优基础分析JVM内存模型,包括堆、栈、方法区等关键区域 选择合适的垃圾收集器&…

C语言轮子大赛:从零打造经典轮子

用C语言造轮子大赛技术文章大纲大赛背景与意义介绍“造轮子”在编程中的概念,强调重复实现经典轮子的学习价值分析C语言作为系统级语言在轮子实现中的独特优势说明此类比赛对开发者底层能力、算法理解、工程实践的提升作用典型轮子实现方向基础数据结构:…

TCP/IP协议栈全解析:从原理到实战

TCP/IP协议栈深度解析技术文章大纲 协议栈概述 TCP/IP协议栈的定义与历史背景四层模型(应用层、传输层、网络层、链路层)与OSI七层模型的对比协议栈的核心设计原则与目标 链路层(数据链路层) 链路层的作用与功能(帧…

DeepSeek写的论文怎么降AI?6款工具实测对比推荐

DeepSeek写的论文怎么降AI&#xff1f;6款工具实测对比推荐 TL;DR&#xff1a;用DeepSeek写的论文AI率飙到70%&#xff1f;本文实测6款降AI工具&#xff0c;推荐嘎嘎降AI&#xff08;达标率99.26%&#xff0c;能把78%降到9%以下&#xff09;、比话降AI&#xff08;知网AI率<…

Google Ads谷歌广告账户被封广告被拒:解封与规避全攻略

账户被拒不仅仅是广告被暂停&#xff0c;更意味着账户整体信任度下降、审核门槛提高、广告效果和投放策略都会受到影响。本文将带你从根源分析账户被拒的原因&#xff0c;逐步讲解如何快速解封、秒过审核&#xff0c;同时提供长期防护策略&#xff0c;帮助你的广告账户重回稳定…

毕业季救星:7款降AI率工具横评,帮你稳过查重

毕业季救星&#xff1a;7款降AI率工具横评&#xff0c;帮你稳过查重 TL;DR&#xff1a;毕业季来了&#xff0c;AI率成了悬在头上的达摩克利斯之剑。本文横评7款主流降AI工具&#xff0c;从效果、价格、售后三个维度打分。结论是嘎嘎降AI&#xff08;达标率99.26%&#xff0c;4.…

通信原理篇---最佳接收机

让我们把“最佳接收机”变成一个破案游戏&#xff0c;你完全不需要任何数学公式就能理解它的精髓。第一幕&#xff1a;犯罪现场——嘈杂的通信现场想象一下&#xff0c;你是一个情报员&#xff0c;你的上线要通过一个非常嘈杂的公共频道&#xff08;比如一个人声鼎沸的菜市场&a…

使用 nvm(不破坏系统)Linux 上把 Node.js / npm 升级到你指定版本(Node v23.x、npm 10.x)

一、安装nvm这是开发环境、服务器都最推荐的方式。1️⃣ 安装 nvmcurl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash安装完成后&#xff0c;必须重新加载环境&#xff1a;source ~/.bashrc # 或 source ~/.zshrc确认 nvm 可用&#xff1a;nv…

Aloomix vs 降迹灵:2026年降AI工具谁更值得选?深度实测对比

Aloomix vs 降迹灵&#xff1a;2026年降AI工具谁更值得选&#xff1f;深度实测对比 TL;DR&#xff1a;实测对比嘎嘎降AI、比话降AI和降迹灵AI三款主流降AI工具。嘎嘎降AI达标率99.26%性价比最高&#xff0c;比话降AI知网AI率可降至15%以下且不达标全额退款&#xff0c;降迹灵AI…

Qt线程陷阱:为什么QPixmap不适合在子线程使用

在使用Qt进行图像处理时&#xff0c;QPixmap和QImage是两个非常常见的类。它们在图像显示和操作方面都非常有用&#xff0c;但它们也有一些需要特别注意的地方。特别是在多线程编程中&#xff0c;这两个类的使用可能会带来一些问题&#xff0c;特别是QPixmap。今天我们就来聊一…

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

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