Python实现入门
本教程将指导您如何使用Python开发MCP客户端,与MCP服务器进行交互,实现功能扩展。
环境准备
依赖安装
pip install requests websockets pydantic
项目结构
mcp-python-client/
├── mcp_client.py # MCP客户端核心代码
├── examples/ # 示例代码
│ ├── weather_query.py
│ └── document_analysis.py
└── README.md # 项目说明
基础客户端实现
创建基本客户端类
import json
import requests
from typing import Dict, List, Any, Optional, Union
class MCPClient:
"""MCP协议客户端实现"""
def __init__(self, server_url: str, api_key: Optional[str] = None):
"""
初始化MCP客户端
Args:
server_url: MCP服务器URL
api_key: 可选的API密钥
"""
self.server_url = server_url
self.headers = {
"Content-Type": "application/json"
}
if api_key:
self.headers["Authorization"] = f"Bearer {api_key}"
def get_server_info(self) -> Dict[str, Any]:
"""
获取服务器信息
Returns:
服务器信息字典
"""
response = requests.get(
f"{self.server_url}/",
headers=self.headers
)
response.raise_for_status()
return response.json()
def list_resources(self) -> List[Dict[str, Any]]:
"""
获取可用资源列表
Returns:
资源列表
"""
response = requests.get(
f"{self.server_url}/resources",
headers=self.headers
)
response.raise_for_status()
return response.json()
def get_resource(self, resource_name: str) -> Dict[str, Any]:
"""
获取特定资源详情
Args:
resource_name: 资源名称
Returns:
资源详情
"""
response = requests.get(
f"{self.server_url}/resources/{resource_name}",
headers=self.headers
)
response.raise_for_status()
return response.json()
def call_tool(self, tool_name: str, params: Dict[str, Any]) -> Dict[str, Any]:
"""
调用工具
Args:
tool_name: 工具名称
params: 工具参数
Returns:
工具调用结果
"""
response = requests.post(
f"{self.server_url}/tools/{tool_name}",
headers=self.headers,
json=params
)
response.raise_for_status()
return response.json()
def send_prompt(self, resource_name: str, prompt: str, history: Optional[List[Dict[str, str]]] = None) -> Dict[str, Any]:
"""
发送提示词
Args:
resource_name: 资源名称
prompt: 提示词内容
history: 对话历史
Returns:
模型响应
"""
payload = {
"prompt": prompt
}
if history:
payload["history"] = history
response = requests.post(
f"{self.server_url}/resources/{resource_name}/prompt",
headers=self.headers,
json=payload
)
response.raise_for_status()
return response.json()
高级功能实现
添加异步支持
import aiohttp
import asyncio
from typing import Dict, List, Any, Optional, Union
class AsyncMCPClient:
"""异步MCP客户端"""
def __init__(self, server_url: str, api_key: Optional[str] = None):
"""
初始化异步MCP客户端
Args:
server_url: MCP服务器URL
api_key: 可选的API密钥
"""
self.server_url = server_url
self.headers = {
"Content-Type": "application/json"
}
if api_key:
self.headers["Authorization"] = f"Bearer {api_key}"
self.session = None
async def __aenter__(self):
"""创建会话"""
self.session = aiohttp.ClientSession(headers=self.headers)
return self
async def __aexit__(self, exc_type, exc_val, exc_tb):
"""关闭会话"""
if self.session:
await self.session.close()
async def get_server_info(self) -> Dict[str, Any]:
"""
异步获取服务器信息
Returns:
服务器信息字典
"""
async with self.session.get(f"{self.server_url}/") as response:
response.raise_for_status()
return await response.json()
async def call_tool(self, tool_name: str, params: Dict[str, Any]) -> Dict[str, Any]:
"""
异步调用工具
Args:
tool_name: 工具名称
params: 工具参数
Returns:
工具调用结果
"""
async with self.session.post(
f"{self.server_url}/tools/{tool_name}",
json=params
) as response:
response.raise_for_status()
return await response.json()