话接上文:一文读懂如何使用MCP创建服务器
本篇文章我们接着讲MCP客户端的创建过程,参考MCP官方资料
如何创建MCP客户端
开始构建自己的客户端,该客户端可以与所有 MCP 服务器集成。
在本教程中,您将学习如何构建一个由 LLM 驱动的聊天机器人客户端,该客户端可以连接到 MCP 服务器。最好先完成一次服务器快速入门 ,该教程将引导您完成构建第一个服务器的基本步骤。
系统要求
开始之前,请确保您的系统满足以下要求:
- Mac 或 Windows 电脑
- 已安装的最新 Python 版本
- 已安装 uv 的最新版本
设置环境
首先,使用 uv 创建一个新的 Python 项目:
# 项目初始化
uv init mcp-client
cd mcp-client
# 创建虚拟环境
uv venv
# 激活虚拟环境
# On Windows:
.venv\Scripts\activate
# On Unix or MacOS:
source .venv/bin/activate
# 安装工具库
uv add mcp anthropic python-dotenv
# 删除无用main.py
# On Windows:
del main.py
# On Unix or MacOS:
rm main.py
# 创建客户端脚本
touch client.py
设置您的 API 密钥
您需要从 Anthropic 控制台获取 Anthropic API 密钥。
创建一个 .env 文件来存储它:
# Create .env file
touch .env
将你的密钥添加到 .env 文件中:
ANTHROPIC_API_KEY=<your key here>
将 .env 添加到你的 .gitignore 中:
echo ".env" >> .gitignore
创建客户端
导入客户端的依赖库
首先,让我们设置导入并创建基本的客户端类:
import asyncio # 异步IO模块,用于处理异步任务
from typing import Optional # 类型注解支持,表示可选类型
from contextlib import AsyncExitStack # 异步上下文管理器,用于安全地管理资源释放
# 导入 MCP 协议相关模块
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client # 基于标准输入输出的客户端通信方式
# 导入 Anthropic 提供的 Python SDK,用于访问 Claude 模型
from anthropic import Anthropic
# 从 dotenv 加载环境变量(例如 API Key)
from dotenv import load_dotenv
# 从 .env 文件中加载环境变量(如 API 密钥等敏感信息)
load_dotenv()
class MCPClient:
def __init__(self):
# 初始化会话和资源管理对象
self.session: Optional[ClientSession] = None # 存储与 MCP 服务器的会话对象
self.exit_stack = AsyncExitStack() # 异步资源管理栈,确保资源正确释放
self.anthropic = Anthropic() # 创建 Anthropic 客户端实例,用于调用 Claude 模型
服务器连接管理
接下来,我们将实现连接到 MCP 服务器的方法:
async def connect_to_server(self, server_script_path: str):
"""连接到 MCP 服务器
参数:
server_script_path: 服务器脚本路径(.py 或 .js 文件)
"""
# 判断服务器脚本是 Python 还是 JavaScript 文件
is_python = server_script_path.endswith('.py')
is_js = server_script_path.endswith('.js')
# 如果不是 .py 或 .js 文件,抛出异常
if not (is_python or is_js):
raise ValueError("Server script must be a .py or .js file")
# 根据文件类型选择执行命令:Python 或 Node.js
command = "python" if is_python else "node"
# 构建服务器启动参数
server_params = StdioServerParameters(
command=command, # 执行命令
args=[server_script_path], # 启动参数,即服务器脚本路径
env=None # 环境变量,使用当前进程的环境变量
)
# 使用 stdio_client 启动服务器并建立通信管道
stdio_transport = await self.exit_stack.enter_async_context(stdio_client(server_params))
self.stdio, self.write = stdio_transport # 保存 stdin/stdout 和写入函数
# 创建 ClientSession 实例,并绑定通信通道
self.session = await self.exit_stack.enter_async_context(ClientSession(self.stdio, self.write))
# 初始化会话(发送初始化请求)
await self.session.initialize()
# 获取服务器提供的可用工具列表
response = await self.session.list_tools()
tools = response.tools # 保存返回的工具列表
print("\nConnected to server with tools:", [tool.name for tool in tools])
查询处理逻辑
现在让我们添加处理查询和处理工具调用的核心功能,示例客户端的核心逻辑就在这里
async def process_quer

最低0.47元/天 解锁文章
1253

被折叠的 条评论
为什么被折叠?



