news 2026/7/26 15:56:41

HoRain云--Python连接MCPServer全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HoRain云--Python连接MCPServer全指南

🎬 HoRain 云小助手:个人主页

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

目录

⛳️ 推荐

Python 连接 MCP Server 全指南

📊 MCP 核心概念速览

🚀 一、环境准备与安装

1.1 安装 Python SDK

1.2 验证安装

🔌 二、连接 MCP Server 的三种方式

2.1 方式一:使用官方 Python SDK(推荐)

2.2 方式二:通过 HTTP 连接远程 MCP Server

2.3 方式三:使用 FastMCP 简化连接

🛠️ 三、完整实战示例

3.1 创建简单的 MCP Server

3.2 创建功能完整的 MCP Client

3.3 集成 LLM 的智能客户端

🌐 四、连接第三方 MCP Server

4.1 连接天聚数行 MCP 服务

4.2 连接观测云 MCP Server

🔧 五、高级配置与最佳实践

5.1 配置管理

5.2 错误处理与重试

5.3 性能监控

🚨 六、常见问题与解决方案

6.1 连接问题排查

6.2 常见错误及解决方案

📚 七、学习资源与进阶

7.1 官方资源

7.2 社区资源

7.3 进阶主题

🎯 总结


Python 连接 MCP Server 全指南

MCP(Model Context Protocol,模型上下文协议)是由 Anthropic 推出的开放协议,旨在标准化 AI 模型与外部数据源、工具之间的交互方式。通过 MCP,你可以让大语言模型安全、可控地调用外部工具,就像给 AI 装上了"手脚"。

📊 MCP 核心概念速览

组件

作用

类比

MCP Server

提供工具和数据源

服务提供方

MCP Client

连接服务器并调用工具

服务消费方

Tools

服务器暴露的可调用函数

API接口

Resources

只读数据源(文件、数据库等)

数据源

Transport

通信方式(stdio/HTTP/SSE)

传输协议

🚀 一、环境准备与安装

1.1 安装 Python SDK

# 安装官方 MCP Python SDK pip install mcp # 或使用 FastMCP(简化版) pip install fastmcp # 使用 uv 包管理器(推荐) uv add mcp uv add httpx pydantic

1.2 验证安装

import mcp print(f"MCP SDK 版本: {mcp.__version__}")

🔌 二、连接 MCP Server 的三种方式

2.1 方式一:使用官方 Python SDK(推荐)

import asyncio from mcp import ClientSession from mcp.client.stdio import stdio_client, StdioServerParameters async def connect_via_stdio(): """通过 stdio 连接本地 MCP Server""" # 配置服务器参数 server_params = StdioServerParameters( command="python", # 运行命令 args=["server.py"], # 服务器脚本路径 env=None # 可选环境变量 ) # 建立连接 async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: # 初始化会话 await session.initialize() # 获取可用工具列表 tools_response = await session.list_tools() print(f"可用工具: {[tool.name for tool in tools_response.tools]}") # 调用工具 result = await session.call_tool("add", {"a": 3, "b": 5}) print(f"3 + 5 = {result}") return session # 运行 asyncio.run(connect_via_stdio())

2.2 方式二:通过 HTTP 连接远程 MCP Server

import httpx import asyncio from mcp.client.streamable_http import streamable_http_client from mcp.client.session import ClientSession async def connect_via_http(): """通过 HTTP 连接远程 MCP Server""" url = "https://mcp.example.com/mcp" headers = {"Authorization": "Bearer your_token"} async with httpx.AsyncClient(headers=headers, timeout=60.0) as http_client: async with streamable_http_client(url=url, http_client=http_client) as (read, write, _): async with ClientSession(read, write) as session: # 初始化会话 init_result = await session.initialize() print(f"已连接到: {init_result.serverInfo.name} v{init_result.serverInfo.version}") # 获取工具列表 tools = await session.list_tools() print(f"可用工具数量: {len(tools.tools)}") return session # 运行 asyncio.run(connect_via_http())

2.3 方式三:使用 FastMCP 简化连接

import asyncio from fastmcp import Client async def connect_with_fastmcp(): """使用 FastMCP 简化连接""" # 连接到本地服务器 client = Client("python server.py") async with client: # 获取工具列表 tools = await client.list_tools() print("可用工具:", tools) # 调用工具 result = await client.call_tool('greet', {'name': '技术爱好者'}) print("调用结果:", result) # 调用资源 resource = await client.read_resource("greeting://Alice") print("资源内容:", resource) # 运行 asyncio.run(connect_with_fastmcp())

🛠️ 三、完整实战示例

3.1 创建简单的 MCP Server

# server.py - 简单的数学计算服务器 from mcp.server.fastmcp import FastMCP # 创建 MCP 服务器实例 mcp = FastMCP("MathServer") @mcp.tool() def add(a: int, b: int) -> int: """两数相加""" return a + b @mcp.tool() def subtract(a: int, b: int) -> int: """两数相减""" return a - b @mcp.tool() def multiply(a: int, b: int) -> int: """两数相乘""" return a * b @mcp.tool() def divide(a: float, b: float) -> float: """两数相除""" if b == 0: raise ValueError("除数不能为零") return a / b @mcp.resource("math://constants/{name}") def get_constant(name: str) -> str: """获取数学常数""" constants = { "pi": "3.141592653589793", "e": "2.718281828459045", "golden_ratio": "1.618033988749895" } return constants.get(name, "未知常数") if __name__ == "__main__": # 启动服务器(支持多种传输方式) mcp.run() # 默认 stdio 模式 # mcp.run(transport="streamable-http", port=8000) # HTTP 模式 # mcp.run(transport="sse", port=8000) # SSE 模式

3.2 创建功能完整的 MCP Client

# client.py - 功能完整的客户端 import asyncio import sys from typing import Dict, Any from mcp import ClientSession, types from mcp.client.stdio import stdio_client, StdioServerParameters class MCPClient: """MCP 客户端封装类""" def __init__(self, server_script: str): self.server_script = server_script self.session = None async def connect(self): """连接到 MCP 服务器""" server_params = StdioServerParameters( command=sys.executable, args=[self.server_script], ) transport = stdio_client(server_params) stdio, write = await transport.__aenter__() self.session = await ClientSession(stdio, write).__aenter__() await self.session.initialize() print("✅ 已成功连接到 MCP 服务器") return self async def list_tools(self) -> list: """获取所有可用工具""" if not self.session: raise RuntimeError("请先调用 connect() 方法连接服务器") response = await self.session.list_tools() return [ { "name": tool.name, "description": tool.description, "parameters": tool.inputSchema } for tool in response.tools ] async def call_tool(self, tool_name: str, arguments: Dict[str, Any]): """调用指定工具""" if not self.session: raise RuntimeError("请先调用 connect() 方法连接服务器") try: result = await self.session.call_tool(tool_name, arguments) return result except Exception as e: print(f"❌ 调用工具 {tool_name} 失败: {e}") return None async def read_resource(self, uri: str): """读取资源""" if not self.session: raise RuntimeError("请先调用 connect() 方法连接服务器") try: response = await self.session.read_resource([types.Resource(uri=uri)]) if response.contents: return response.contents[0].text except Exception as e: print(f"❌ 读取资源 {uri} 失败: {e}") return None async def close(self): """关闭连接""" if self.session: await self.session.__aexit__(None, None, None) print("🔌 连接已关闭") async def main(): """主函数示例""" # 创建客户端 client = MCPClient("server.py") try: # 连接服务器 await client.connect() # 获取工具列表 tools = await client.list_tools() print("\n📋 可用工具列表:") for tool in tools: print(f" • {tool['name']}: {tool['description']}") # 调用工具示例 print("\n🧪 工具调用测试:") # 测试加法 result = await client.call_tool("add", {"a": 10, "b": 20}) print(f" 10 + 20 = {result}") # 测试除法 result = await client.call_tool("divide", {"a": 100, "b": 4}) print(f" 100 ÷ 4 = {result}") # 读取资源示例 print("\n📚 资源读取测试:") pi_value = await client.read_resource("math://constants/pi") print(f" π 的值: {pi_value}") e_value = await client.read_resource("math://constants/e") print(f" e 的值: {e_value}") except Exception as e: print(f"❌ 发生错误: {e}") finally: # 关闭连接 await client.close() if __name__ == "__main__": asyncio.run(main())

3.3 集成 LLM 的智能客户端

# smart_client.py - 集成 LLM 的智能客户端 import asyncio import os from typing import List, Dict, Any from dotenv import load_dotenv from openai import OpenAI from mcp import ClientSession from mcp.client.stdio import stdio_client, StdioServerParameters load_dotenv() class SmartMCPClient: """集成 LLM 的智能 MCP 客户端""" def __init__(self, server_script: str): self.server_script = server_script self.session = None self.llm_client = None self.tools = [] async def connect(self): """连接到 MCP 服务器和 LLM""" # 1. 连接 MCP 服务器 server_params = StdioServerParameters( command="python", args=[self.server_script], ) transport = stdio_client(server_params) stdio, write = await transport.__aenter__() self.session = await ClientSession(stdio, write).__aenter__() await self.session.initialize() # 2. 获取工具列表并转换为 LLM 格式 tools_response = await self.session.list_tools() self.tools = [ { "type": "function", "function": { "name": tool.name, "description": tool.description, "parameters": tool.inputSchema } } for tool in tools_response.tools ] # 3. 初始化 LLM 客户端 self.llm_client = OpenAI( api_key=os.getenv("OPENAI_API_KEY"), base_url=os.getenv("BASE_URL", "https://api.openai.com/v1"), ) print(f"✅ 已连接到 MCP 服务器,发现 {len(self.tools)} 个工具") return self async def process_query(self, query: str) -> str: """处理用户查询,自动调用工具""" if not self.session or not self.llm_client: raise RuntimeError("请先调用 connect() 方法") messages = [ { "role": "system", "content": "你是一个智能助手,可以调用数学计算工具。请根据用户需求选择合适的工具进行计算。" }, {"role": "user", "content": query} ] # 第一次 LLM 调用 response = self.llm_client.chat.completions.create( model="gpt-4", messages=messages, tools=self.tools, tool_choice="auto" ) message = response.choices[0].message # 检查是否需要调用工具 if message.tool_calls: for tool_call in message.tool_calls: tool_name = tool_call.function.name import json arguments = json.loads(tool_call.function.arguments) print(f"🛠️ 调用工具: {tool_name}({arguments})") # 调用 MCP 工具 tool_result = await self.session.call_tool(tool_name, arguments) # 将结果发送回 LLM messages.append(message) messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": str(tool_result) }) # 第二次 LLM 调用(包含工具结果) second_response = self.llm_client.chat.completions.create( model="gpt-4", messages=messages ) return second_response.choices[0].message.content else: return message.content async def interactive_chat(self): """交互式聊天""" print("\n🤖 智能数学助手已启动") print("输入 '退出' 或 'exit' 结束对话") print("-" * 50) while True: try: user_input = input("\n你: ").strip() if user_input.lower() in ['退出', 'exit', 'quit']: break if not user_input: continue print("思考中...", end="", flush=True) response = await self.process_query(user_input) print(f"\n助手: {response}") except KeyboardInterrupt: print("\n\n👋 再见!") break except Exception as e: print(f"\n❌ 错误: {e}") async def close(self): """关闭连接""" if self.session: await self.session.__aexit__(None, None, None) print("🔌 连接已关闭") async def main(): client = SmartMCPClient("server.py") try: await client.connect() await client.interactive_chat() finally: await client.close() if __name__ == "__main__": asyncio.run(main())

🌐 四、连接第三方 MCP Server

4.1 连接天聚数行 MCP 服务

import requests import json class TianAPI_MCP_Client: """天聚数行 MCP 服务客户端""" def __init__(self, api_key: str, toolset_name: str = "my-agent-tools"): self.base_url = f"https://mcp.tianapi.com/{toolset_name}/{api_key}" def list_tools(self): """获取可用工具列表""" response = requests.post(self.base_url, json={"method": "list_tools"}) return response.json() def call_tool(self, tool_name: str, arguments: dict): """调用工具""" payload = { "method": "call", "params": { "name": tool_name, "arguments": arguments } } response = requests.post(self.base_url, json=payload) return response.json() def get_weather(self, city: str): """查询天气(示例)""" return self.call_tool("tianqi", {"city": city}) def get_vehicle_limit(self, city: str): """查询限行(示例)""" return self.call_tool("vehiclelimit", {"city": city}) # 使用示例 def tianapi_example(): client = TianAPI_MCP_Client(api_key="your_api_key_here") # 获取工具列表 tools = client.list_tools() print("可用工具:", [tool["name"] for tool in tools.get("result", [])]) # 查询天气 weather = client.get_weather("北京") if not weather.get("error"): data = weather["result"] print(f"{data['city']} 天气:") print(f" 温度: {data['temp']}℃") print(f" 天气: {data['weather']}") print(f" 风力: {data['wind']}") print(f" 湿度: {data['humidity']}%") # 查询限行 limit = client.get_vehicle_limit("成都") if not limit.get("error"): data = limit["result"] print(f"\n{data['city']} 限行信息:") print(f" 限行: {data['limit_info']}") print(f" 区域: {data['area']}") if __name__ == "__main__": tianapi_example()

4.2 连接观测云 MCP Server

import httpx import asyncio from mcp.client.streamable_http import streamable_http_client from mcp.client.session import ClientSession async def connect_guance_mcp(): """连接观测云 MCP Server""" url = "https://obsy-ai.guance.com/obsy_ai_mcp/mcp" headers = { "Authorization": "DF-API-KEY your_api_key_here", "Endpoint": "cn1" # 根据地区选择 } async with httpx.AsyncClient(headers=headers, timeout=30.0) as http_client: async with streamable_http_client(url=url, http_client=http_client) as (read, write, _): async with ClientSession(read, write) as session: # 初始化连接 await session.initialize() # 获取工具列表 tools_response = await session.list_tools() print("观测云可用工具:") for tool in tools_response.tools: print(f" • {tool.name}: {tool.description}") return session # 运行 asyncio.run(connect_guance_mcp())

🔧 五、高级配置与最佳实践

5.1 配置管理

# config.py - 配置管理 import os from typing import Optional from dataclasses import dataclass from dotenv import load_dotenv load_dotenv() @dataclass class MCPConfig: """MCP 配置类""" # 传输方式 transport: str = os.getenv("MCP_TRANSPORT", "stdio") # stdio, http, sse # HTTP 配置 http_url: Optional[str] = os.getenv("MCP_HTTP_URL") http_headers: dict = None # Stdio 配置 server_command: str = os.getenv("MCP_SERVER_COMMAND", "python") server_args: list = None # 超时设置 timeout: int = int(os.getenv("MCP_TIMEOUT", "30")) # 重试配置 max_retries: int = int(os.getenv("MCP_MAX_RETRIES", "3")) retry_delay: float = float(os.getenv("MCP_RETRY_DELAY", "1.0")) def __post_init__(self): if self.http_headers is None: self.http_headers = {} if self.server_args is None: self.server_args = ["server.py"] # 添加认证头 if api_key := os.getenv("MCP_API_KEY"): self.http_headers["Authorization"] = f"Bearer {api_key}" class MCPClientFactory: """MCP 客户端工厂""" @staticmethod def create_client(config: MCPConfig): """根据配置创建客户端""" if config.transport == "stdio": return StdioMCPClient(config) elif config.transport == "http": return HttpMCPClient(config) elif config.transport == "sse": return SSEMCPClient(config) else: raise ValueError(f"不支持的传输方式: {config.transport}") # 使用示例 config = MCPConfig( transport="http", http_url="https://api.example.com/mcp", http_headers={"X-API-Key": "your_key"} ) client = MCPClientFactory.create_client(config)

5.2 错误处理与重试

import asyncio import time from typing import Callable, Any from functools import wraps def retry_with_backoff( max_retries: int = 3, initial_delay: float = 1.0, max_delay: float = 10.0, exponential_base: float = 2.0 ): """带指数退避的重试装饰器""" def decorator(func: Callable): @wraps(func) async def wrapper(*args, **kwargs): delay = initial_delay last_exception = None for attempt in range(max_retries + 1): try: return await func(*args, **kwargs) except Exception as e: last_exception = e if attempt == max_retries: break # 计算下一次重试的延迟 delay = min(delay * exponential_base, max_delay) jitter = delay * 0.1 # 添加随机抖动 actual_delay = delay + (jitter * (2 * random.random() - 1)) print(f"⚠️ 调用失败,{actual_delay:.1f}秒后重试 (尝试 {attempt + 1}/{max_retries})") await asyncio.sleep(actual_delay) raise last_exception return wrapper return decorator class RobustMCPClient: """健壮的 MCP 客户端""" def __init__(self, config: MCPConfig): self.config = config self.session = None @retry_with_backoff(max_retries=3, initial_delay=1.0) async def connect_with_retry(self): """带重试的连接""" try: if self.config.transport == "stdio": from mcp.client.stdio import stdio_client, StdioServerParameters server_params = StdioServerParameters( command=self.config.server_command, args=self.config.server_args, ) transport = stdio_client(server_params) stdio, write = await transport.__aenter__() self.session = await ClientSession(stdio, write).__aenter__() elif self.config.transport == "http": import httpx from mcp.client.streamable_http import streamable_http_client async with httpx.AsyncClient( headers=self.config.http_headers, timeout=self.config.timeout ) as http_client: async with streamable_http_client( url=self.config.http_url, http_client=http_client ) as (read, write, _): self.session = await ClientSession(read, write).__aenter__() # 初始化会话 await self.session.initialize() print("✅ 连接成功") return self except Exception as e: print(f"❌ 连接失败: {e}") raise async def safe_call_tool(self, tool_name: str, arguments: dict, fallback_value=None): """安全的工具调用""" try: result = await self.session.call_tool(tool_name, arguments) return result except Exception as e: print(f"⚠️ 工具调用失败: {e}") # 记录错误日志 self.log_error({ "tool": tool_name, "arguments": arguments, "error": str(e), "timestamp": time.time() }) # 返回降级值 if fallback_value is not None: return fallback_value raise def log_error(self, error_info: dict): """记录错误日志""" # 这里可以实现日志记录到文件、数据库等 import json print(f"📝 错误日志: {json.dumps(error_info, ensure_ascii=False)}")

5.3 性能监控

import time from typing import Dict, List from dataclasses import dataclass from datetime import datetime @dataclass class ToolCallMetrics: """工具调用指标""" tool_name: str start_time: float end_time: float success: bool error_message: str = "" @property def duration(self) -> float: return self.end_time - self.start_time class MCPClientWithMetrics: """带性能监控的 MCP 客户端""" def __init__(self, base_client): self.base_client = base_client self.metrics: List[ToolCallMetrics] = [] async def call_tool_with_metrics(self, tool_name: str, arguments: dict): """带监控的工具调用""" start_time = time.time() success = False error_msg = "" try: result = await self.base_client.call_tool(tool_name, arguments) success = True return result except Exception as e: error_msg = str(e) raise finally: end_time = time.time() metric = ToolCallMetrics( tool_name=tool_name, start_time=start_time, end_time=end_time, success=success, error_message=error_msg ) self.metrics.append(metric) def get_performance_report(self) -> Dict: """获取性能报告""" if not self.metrics: return {} total_calls = len(self.metrics) successful_calls = sum(1 for m in self.metrics if m.success) failed_calls = total_calls - successful_calls durations = [m.duration for m in self.metrics] avg_duration = sum(durations) / len(durations) if durations else 0 max_duration = max(durations) if durations else 0 min_duration = min(durations) if durations else 0 # 按工具统计 tool_stats = {} for metric in self.metrics: if metric.tool_name not in tool_stats: tool_stats[metric.tool_name] = { "total": 0, "success": 0, "fail": 0, "total_duration": 0 } stats = tool_stats[metric.tool_name] stats["total"] += 1 stats["total_duration"] += metric.duration if metric.success: stats["success"] += 1 else: stats["fail"] += 1 # 计算平均时长 for tool_name, stats in tool_stats.items(): if stats["total"] > 0: stats["avg_duration"] = stats["total_duration"] / stats["total"] return { "summary": { "total_calls": total_calls, "successful_calls": successful_calls, "failed_calls": failed_calls, "success_rate": successful_calls / total_calls if total_calls > 0 else 0, "avg_duration_seconds": avg_duration, "max_duration_seconds": max_duration, "min_duration_seconds": min_duration }, "tool_statistics": tool_stats, "timestamp": datetime.now().isoformat() } def print_performance_report(self): """打印性能报告""" report = self.get_performance_report() if not report: print("📊 暂无性能数据") return summary = report["summary"] print("\n" + "="*50) print("📊 MCP 客户端性能报告") print("="*50) print(f"总调用次数: {summary['total_calls']}") print(f"成功次数: {summary['successful_calls']}") print(f"失败次数: {summary['failed_calls']}") print(f"成功率: {summary['success_rate']:.2%}") print(f"平均耗时: {summary['avg_duration_seconds']:.3f}秒") print(f"最大耗时: {summary['max_duration_seconds']:.3f}秒") print(f"最小耗时: {summary['min_duration_seconds']:.3f}秒") print("\n🔧 工具统计:") for tool_name, stats in report["tool_statistics"].items(): print(f" {tool_name}:") print(f" 调用次数: {stats['total']}") print(f" 成功率: {stats['success']}/{stats['total']} ({stats['success']/stats['total']:.2%})") print(f" 平均耗时: {stats.get('avg_duration', 0):.3f}秒") print("="*50)

🚨 六、常见问题与解决方案

6.1 连接问题排查

# troubleshooting.py - 连接问题排查工具 import asyncio import sys import subprocess from typing import Optional class MCPTroubleshooter: """MCP 连接问题排查工具""" @staticmethod async def check_connection(config: dict) -> dict: """检查连接状态""" results = { "server_script_exists": False, "python_available": False, "dependencies_installed": False, "server_startup": False, "connection_test": False, "errors": [] } # 1. 检查服务器脚本是否存在 server_script = config.get("server_args", [""])[0] if server_script and os.path.exists(server_script): results["server_script_exists"] = True else: results["errors"].append(f"服务器脚本不存在: {server_script}") # 2. 检查 Python 是否可用 try: subprocess.run([sys.executable, "--version"], capture_output=True, check=True) results["python_available"] = True except: results["errors"].append("Python 不可用") # 3. 检查依赖是否安装 try: import mcp results["dependencies_installed"] = True except ImportError as e: results["errors"].append(f"依赖未安装: {e}") # 4. 测试服务器启动 if results["server_script_exists"] and results["python_available"]: try: process = subprocess.Popen( [sys.executable, server_script], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) # 等待一小段时间看是否启动成功 import time time.sleep(2) if process.poll() is None: results["server_startup"] = True process.terminate() else: _, stderr = process.communicate() results["errors"].append(f"服务器启动失败: {stderr}") except Exception as e: results["errors"].append(f"启动测试失败: {e}") return results @staticmethod def print_diagnostic_report(results: dict): """打印诊断报告""" print("\n" + "="*60) print("🔍 MCP 连接诊断报告") print("="*60) checks = [ ("服务器脚本", results["server_script_exists"]), ("Python 环境", results["python_available"]), ("依赖安装", results["dependencies_installed"]), ("服务器启动", results["server_startup"]), ("连接测试", results["connection_test"]) ] for check_name, status in checks: status_icon = "✅" if status else "❌" print(f"{status_icon} {check_name}") if results["errors"]: print("\n⚠️ 发现的问题:") for error in results["errors"]: print(f" • {error}") print("\n💡 建议解决方案:") for error in results["errors"]: if "脚本不存在" in error: print(" • 检查 server.py 文件路径是否正确") elif "Python 不可用" in error: print(" • 确保 Python 已正确安装并添加到 PATH") elif "依赖未安装" in error: print(" • 运行: pip install mcp") elif "服务器启动失败" in error: print(" • 检查服务器脚本是否有语法错误") print(" • 查看服务器日志获取详细信息") print("="*60) # 使用示例 async def diagnose_connection(): config = { "server_command": "python", "server_args": ["server.py"] } troubleshooter = MCPTroubleshooter() results = await troubleshooter.check_connection(config) troubleshooter.print_diagnostic_report(results) if __name__ == "__main__": asyncio.run(diagnose_connection())

6.2 常见错误及解决方案

错误类型

可能原因

解决方案

Connection refused

服务器未启动或端口被占用

检查服务器是否运行,更换端口

ModuleNotFoundError

依赖未安装

pip install mcpuv add mcp

TimeoutError

网络延迟或服务器响应慢

增加超时时间,检查网络连接

JSON-RPC error

协议版本不匹配

检查 MCP SDK 版本,更新到最新

Tool not found

工具名称错误或未注册

使用list_tools()查看可用工具

Invalid arguments

参数类型或格式错误

检查工具的参数定义和要求

📚 七、学习资源与进阶

7.1 官方资源

7.2 社区资源

7.3 进阶主题

  1. 自定义传输协议: 实现自己的 Transport 类

  2. 工具权限管理: 基于角色的访问控制

  3. 流式响应: 支持大型数据集的流式传输

  4. 批量操作: 优化多个工具调用的性能

  5. 缓存策略: 减少重复请求,提高性能

🎯 总结

Python 连接 MCP Server 的核心要点:

  1. 选择适合的连接方式:根据场景选择 stdio(本地)、HTTP(远程)或 SSE(实时)

  2. 使用正确的 SDK:官方mcp库功能最全,fastmcp更易上手

  3. 遵循标准流程:连接 → 初始化 → 发现工具 → 调用工具

  4. 做好错误处理:网络异常、工具调用失败、超时等都需要处理

  5. 考虑性能优化:连接池、缓存、批量操作等

通过 MCP,你可以将任何 Python 功能暴露给 AI 模型,构建强大的 AI 应用生态系统。无论是简单的工具调用,还是复杂的业务流程集成,MCP 都提供了标准化的解决方案。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

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

探索MS-DOS系统调用跟踪:终极调试与分析指南

探索MS-DOS系统调用跟踪:终极调试与分析指南 【免费下载链接】MS-DOS MS-DOS 1.25和2.0的原始源代码,供参考使用 项目地址: https://gitcode.com/GitHub_Trending/ms/MS-DOS MS-DOS作为早期个人计算机的标志性操作系统,其系统调用机制…

作者头像 李华
网站建设 2026/7/14 14:34:53

作用域与作用域链:JS的“找东西”逻辑,闭包到底是个啥?

为什么有的变量在函数里能用,在外面却报错?为什么循环里的i总是最后一个值?今天我们就来聊聊JavaScript的作用域和作用域链,顺便揭开闭包的神秘面纱。保证你看完之后,再也不用背面试题了。前言 想象一下这样的场景&…

作者头像 李华
网站建设 2026/7/14 14:34:52

51单片机带字库LCD12864液晶屏显示

目录1.LCD12864介绍1.1 带字库LCD128641.2 LCD12864管脚介绍1.3 功能设定1.4 清屏指令1.5 进入设定点1.6 显示状态开关设置1.7 显示区间1.8 不带字库LCD128642.硬件设计3.软件设计4.实验现象1.LCD12864介绍 LCD12864跟LCD1602是一样的,只是在行,列数&am…

作者头像 李华