十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

客户端接入 MCP Server 实录:基于 Python SDK 的远程工具加载

客户端接入 MCP Server 实录:基于 Python SDK 的远程工具加载 客户端接入 MCP Server 实录基于 Python SDK 的远程工具加载在 Anthropic 发布的MCPModel Context Protocol模型上下文协议标准中整个生态被清晰地划分为两大核心阵营MCP Server能力提供方负责将底层的企业数据库、本地文件系统、Git 代码仓库或外部 SaaS 接口封装为标准化的 Tools 和 ResourcesMCP Client客户端 / Agent Host智能体编排宿主负责主动连接一个或多个远程 MCP Server动态拉取所有可用的工具元数据列表并在大模型做出工具调用决策时通过标准协议发起远程调用。在过去的实践中官方文档大多以 Claude Desktop 客户端为例进行可视化配置演示。然而在企业级后端微服务与自主智能体开发中我们需要在纯 Python 后端代码中扮演标准的 MCP Client动态连接分布在跨集群、跨机房的多个 SSE / HTTP 远程 MCP Server将拉取到的工具无缝注入到 LangGraph、AutoGen 或自研 Agent 编排流中。本文将手把手实录如何基于官方Python MCP SDK (mcp)构建一个生产级、高可用的远程工具加载与执行客户端。一、MCP Client 核心连接生命周期架构[ 智能体应用后端 (Python MCP Client Host) ] │ ▼ (1. 建立 SSE 异步会话通道) ┌────────────────────────────────────────────────────────┐ │ 步骤 1: 客户端握手与协议初始化 (Client Session Init) │ │ 发送 initialize 请求协商协议版本与能力边界 │ └─────────────────────┬──────────────────────────────────┘ │ ▼ (2. 动态发现与元数据拉取) ┌────────────────────────────────────────────────────────┐ │ 步骤 2: 工具与资源动态拉取 (tools/list resources/list)│ │ 拉取所有远端 Tool Name, Description 与 JSON Schema │ └─────────────────────┬──────────────────────────────────┘ │ ▼ (3. 转换为大模型标准 Function Calling) ┌────────────────────────────────────────────────────────┐ │ 步骤 3: 注入大模型上下文 (LLM Function Binding) │ │ 大模型输出 ToolCall: {name: query_db, args: {...}}│ └─────────────────────┬──────────────────────────────────┘ │ ▼ (4. 远程执行与结果回传) ┌────────────────────────────────────────────────────────┐ │ 步骤 4: 发起 JSON-RPC 远程工具调用 (tools/call) │ │ 跨网络透传至远程 MCP Server等待并接收标准返回值 │ └────────────────────────────────────────────────────────┘二、生产级异步 Python MCP 客户端完整实现实操利用官方mcp库中的sse_client与ClientSession实现支持鉴权与自动工具转换的客户端import asyncio from typing import List, Dict, Any from mcp import ClientSession from mcp.client.sse import sse_client from pydantic import BaseModel class ProductionMCPClient: def __init__(self, sse_server_url: str, auth_bearer_token: str ): self.server_url sse_server_url self.headers {Authorization: fBearer {auth_bearer_token}} if auth_bearer_token else {} self.session: ClientSession None self._exit_stack None async def connect_and_discover_tools(self) - List[Dict[str, Any]]: 1. 建立长连接并拉取全量工具定义 print(f【MCP Client】正在连接远程 MCP Server: {self.server_url} ...) # 建立底层 SSE 传输通道 self._sse_context sse_client(urlself.server_url, headersself.headers) streams await self._sse_context.__aenter__() # 创建客户端会话 self.session ClientSession(streams[0], streams[1]) await self.session.__aenter__() # 握手初始化 await self.session.initialize() print(【MCP Client】握手成功开始拉取远程工具元数据...) # 2. 拉取工具列表 tools_response await self.session.list_tools() formatted_tools [] for tool in tools_response.tools: # 转换为标准 OpenAI / 大模型兼容的 Function Calling 格式 formatted_tools.append({ type: function, function: { name: tool.name, description: tool.description, parameters: tool.inputSchema } }) print(f └── 成功加载远程工具: [{tool.name}]) return formatted_tools async def invoke_remote_tool(self, tool_name: str, arguments: Dict[str, Any]) - Any: 3. 执行远程工具调用 (tools/call) if not self.session: raise RuntimeError(MCP 会话未建立请先调用 connect_and_discover_tools()) print(f【MCP Client】发起远程工具执行: {tool_name} | 参数: {arguments}) # 通过 JSON-RPC 2.0 远程调用 result await self.session.call_tool(tool_name, argumentsarguments) # 提取文本或结构化返回值 output_chunks [] for content in result.content: if content.type text: output_chunks.append(content.text) return \n.join(output_chunks) async def close(self): 4. 优雅关闭会话与释放连接 if self.session: await self.session.__aexit__(None, None, None) if hasattr(self, _sse_context): await self._sse_context.__aexit__(None, None, None) print(【MCP Client】会话已安全关闭。)三、与大模型编排流端到端集成实战在真实业务脚本中MCP Client 能够以极其轻盈的方式嵌入任何编排逻辑async def run_agent_workflow(): # 1. 实例化远程 MCP 客户端 (连接我们在上一篇部署的安全 MCP Server) mcp_client ProductionMCPClient( sse_server_urlhttps://mcp-gateway.company.internal/sse, auth_bearer_tokenprod-secret-mcp-token-2026 ) try: # 2. 动态发现可用工具 tools_schema await mcp_client.connect_and_discover_tools() # 3. 假设大模型返回了工具调用决策 decision_tool_name query_financial_records decision_args {department: 技术研发部, year: 2026} # 4. 执行远程调用 result await mcp_client.invoke_remote_tool(decision_tool_name, decision_args) print(f【最终执行结果】:\n{result}) finally: await mcp_client.close() # asyncio.run(run_agent_workflow())四、生产治理避坑指南在客户端接入 MCP 时牢记三点连接池复用与单例会话管理客户端ClientSession必须作为长生命周期的单例常驻内存严禁在每次工具调用时重复进行 TCP 握手与initialize协商设置客户端调用超时看门狗在call_tool时通过asyncio.wait_for强行包裹 10 秒硬性超时防止远程 Server 挂死导致客户端协程泄漏断线自愈与重连机制监听底层 SSE 传输流的异常遇到网络抖动时自动触发指数退避重连。通过 Python SDK 深度掌控 MCP 客户端生态让智能体跨越网络物理边界自由调度全网海量标准化工具能力。
返回列表