跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
PythonAI

Python 连接 MCP Server 实战指南

综述由AI生成Model Context Protocol (MCP) 重塑了 LLM 应用交互范式。 Python 环境下连接 MCP Server 的机制,对比 SSE 与 Streamable HTTP 两种传输协议。通过官方 SDK 提供生产级代码示例,涵盖握手初始化、工具发现及调用流程。针对常见问题如 aiohttp 兼容性给出解答,并推荐 Streamable HTTP 用于后端服务通信以获得更好的控制力。

静心发布于 2026/3/25更新于 2026/5/1318K 浏览

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 客户端实战

我们将使用官方 mcp SDK 来构建客户端。无论使用哪种传输协议,核心的 ClientSession 逻辑是一致的,区别仅在于 Transport 的初始化。

2.1 依赖安装
pip install mcp httpx
2.2 连接建立:协议适配
方案 A:使用 SSE 连接

这是最常见的连接方式。

from mcp.client.sse import sse_client
from mcp.client.session import ClientSession

async def connect_via_sse(url: str, headers: dict = None):
    # sse_client 是一个 Async Context Manager
    # 它自动处理 EventSource 的连接与重连
    async with sse_client(url=url, headers=headers) as (read_stream, write_stream):
        async with ClientSession(read_stream, write_stream) as session:
            yield session
方案 B:使用 Streamable HTTP 连接

这是更底层的连接方式,通常需要自行管理 httpx.AsyncClient 的生命周期。

import httpx
from mcp.client.streamable_http import streamable_http_client
from mcp.client.session import ClientSession

async def connect_via_http(url: str, headers: dict = None):
    # 必须显式创建 httpx client,以便复用连接池和配置超时
    async with httpx.AsyncClient(headers=headers, timeout=60.0) as http_client:
        # streamable_http_client 同样返回读写流
        async with streamable_http_client(url=url, http_client=http_client) as (read, write, _):
            async with ClientSession(read, write) as session:
                yield session

3. 核心交互流程

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

3.1 握手与初始化 (Initialize)

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

# 初始化会话
# 这一步会协商协议版本和能力
init_result = await session.initialize()
print(f"Connected to Server: {init_result.serverInfo.name} v{init_result.serverInfo.version}")
# 技巧:这里往往藏着 Server 的 System Prompt
if hasattr(init_result, 'instructions'):
    print(f"Server Instructions: {init_result.instructions}")
3.2 工具发现 (List Tools)

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

# 获取工具列表
list_tools_result = await session.list_tools()
tools = list_tools_result.tools
for tool in tools:
    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 负责转发请求。

from mcp.types import CallToolResult

tool_name = "get_repo_list"
arguments = {"owner": "nvd11", "limit": 5}

try:
    # 发送调用请求
    result: CallToolResult = await session.call_tool(tool_name, arguments=arguments)
    # 解析结果
    # MCP 支持 Text 和 Image 两种内容类型
    output_text = ""
    for content in result.content:
        if content.type == "text":
            output_text += content.text
        elif content.type == "image":
            print(f"[Image Content: {content.mimeType}]")
    print(f"Tool Output: {output_text}")
except Exception as e:
    print(f"Tool execution failed: {e}")

4. 常见问题 (FAQ)

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

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

5. 总结

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

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

目录

  1. 1. 传输层协议:SSE vs Streamable HTTP
  2. 1.1 Server-Sent Events (SSE)
  3. 1.2 Streamable HTTP (Chunked Transfer)
  4. 2. Python 客户端实战
  5. 2.1 依赖安装
  6. 2.2 连接建立:协议适配
  7. 方案 A:使用 SSE 连接
  8. 方案 B:使用 Streamable HTTP 连接
  9. 3. 核心交互流程
  10. 3.1 握手与初始化 (Initialize)
  11. 初始化会话
  12. 这一步会协商协议版本和能力
  13. 技巧:这里往往藏着 Server 的 System Prompt
  14. 3.2 工具发现 (List Tools)
  15. 获取工具列表
  16. JSON Schema 格式的参数定义
  17. 3.3 工具调用 (Call Tool)
  18. 4. 常见问题 (FAQ)
  19. Q: 我可以用 aiohttp 代替 httpx 吗?
  20. 5. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • CentOS 下定时执行 Python 邮件任务的五种方案
  • Qwen2.5-1.5B 实战:本地化 AI 写作助手搭建指南
  • OpenClaw 智能体框架环境搭建与模型接入指南
  • 网络安全学习指南:从零基础到网络攻防工程师进阶
  • MagicAnimate:基于单张图像的视频生成框架
  • Android 主流三方库源码分析:EventBus
  • OpenClaw 爆红启示:AI 助手如何改写开源规则
  • 鸿蒙金融理财全栈项目:生态合作、用户运营与数据变现优化
  • Llama-Factory与PyTorch版本兼容性问题排查手册
  • 使用 Git 上传超过限制的大文件至 GitHub
  • 2026 年大模型全景解析:国产登顶、百万上下文与 Agent 工业化
  • 基于 AI 工具组合的高效文献综述撰写指南
  • 企业微信群机器人添加点击链接教程:图文与 Markdown 实现
  • 基于 SpringBoot 的家庭财务管理系统设计与实现
  • 2026 年主流 AI 工具对比:豆包、DeepSeek、ChatGPT 及 Cursor
  • C++ 笔试刷题:排序子序列、消减整数与最长上升子序列
  • 国产 AI 大模型实测:文心一言、通义千问、Kimi、豆包横向对比
  • Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码
  • 本地化部署 GraphRAG+LangChain+Ollama 驱动 LLaMa 3.1 集成 Neo4j 实战
  • OpenClaw 机器人抓取平台搭建全流程详解

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online