面向客户端开发者
开始构建您自己的客户端,以便与所有 MCP 服务器集成。
在本教程中,您将学习如何构建一个由 LLM 驱动的聊天机器人客户端,并将其连接到 MCP 服务器。在此之前,建议您先阅读 服务器快速入门,该指南将帮助您完成搭建第一个服务器的基础知识。
支持的语言:
- Python
- Node
- Java
系统要求
在开始之前,请确保您的系统满足以下要求:
- Mac 或 Windows 计算机
- 已安装最新的 Python 版本
- 已安装最新版本的
uv
设置开发环境
首先,使用 uv 创建一个新的 Python 项目:
# 创建项目目录uv init mcp-clientcd mcp-client# 创建虚拟环境uv venv# 激活虚拟环境# 在 Windows 上:.venv\Scripts\activate# 在 Unix 或 macOS 上:source .venv/bin/activate# 安装所需的依赖包uv add mcp anthropic python-dotenv# 移除默认生成的示例文件rm hello.py# 创建我们的主文件touch client.py
配置 API 密钥
您需要从 Anthropic 控制台 获取一个 API 密钥。
创建 .env 文件以存储密钥:
# 创建 .env 文件touch .env
在 .env 文件中添加您的密钥:
ANTHROPIC_API_KEY=<your key here>
然后将 .env 文件添加到 .gitignore,避免泄露密钥:
echo ".env" >> .gitignore
请确保您的 ANTHROPIC_API_KEY 处于安全状态!
创建客户端
基本的客户端结构
首先,设置必要的导入,并创建基本的客户端类:
import asynciofrom typing import Optionalfrom contextlib import AsyncExitStackfrom mcp import ClientSession, StdioServerParametersfrom mcp.client.stdio import stdio_clientfrom anthropic import Anthropicfrom dotenv import load_dotenvload_dotenv() # 从 .env 文件加载环境变量class MCPClient:def __init__(self):# 初始化会话和客户端对象self.session: Optional[ClientSession] = Noneself.exit_stack = AsyncExitStack()self.anthropic = Anthropic()# 方法将在这里定义
管理服务器连接
接下来,我们实现连接 MCP 服务器的方法:
async def connect_to_server(self, server_script_path: str):"""连接到 MCP 服务器参数:server_script_path: 服务器脚本文件的路径 (.py 或 .js)"""is_python = server_script_path.endswith('.py')is_js = server_script_path.endswith('.js')if not (is_python or is_js):raise ValueError("服务器脚本必须是 .py 或 .js 文件")command = "python" if is_python else "node"server_params = StdioServerParameters(command=command,args=[server_script_path],env=None)stdio_transport = await self.exit_stack.enter_async_context(stdio_client(server_params))self.stdio, self.write = stdio_transportself.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.toolsprint("\n成功连接服务器,以下是可用工具:", [tool.name for tool in tools])
处理查询请求
现在,添加核心功能,用于处理用户查询并调用服务器提供的工具:
async def process_query(self, query: str) -> str:"""使用 Claude 和可用工具处理查询"""messages = [{"role": "user","content": query}]response = await self.session.list_tools()available_tools = [{"name": tool.name,"description": tool.description,"input_schema": tool.inputSchema} for tool in response.tools]# 调用 Claude API 处理初始查询response = self.anthropic.messages.create(model="claude-3-5-sonnet-20241022",max_tokens=1000,messages=messages,tools=available_tools)# 处理响应,并执行工具调用final_text = []assistant_message_content = []for content in response.content:if content.type == 'text':final_text.append(content.text)assistant_message_content.append(content)elif content.type == 'tool_use':tool_name = content.nametool_args = content.input# 执行工具调用result = await self.session.call_tool(tool_name, tool_args)final_text.append(f"[调用工具 {tool_name} 参数: {tool_args}]")assistant_message_content.append(content)messages.append({"role": "assistant","content": assistant_message_content})messages.append({"role": "user","content": [{"type": "tool_result","tool_use_id": content.id,"content": result.content}]})# 获取 Claude 的后续响应response = self.anthropic.messages.create(model="claude-3-5-sonnet-20241022",max_tokens=1000,messages=messages,tools=available_tools)final_text.append(response.content[0].text)return "\n".join(final_text)
交互式聊天界面
async def chat_loop(self):"""运行交互式聊天"""print("\nMCP 客户端已启动!")print("请输入查询,或输入 'quit' 退出。")while True:try:query = input("\n输入查询: ").strip()if query.lower() == 'quit':breakresponse = await self.process_query(query)print("\n" + response)except Exception as e:print(f"\n错误: {str(e)}")
运行客户端
要运行您的客户端,并连接到 MCP 服务器:
uv run client.py path/to/server.py # 连接 Python 服务器uv run client.py path/to/build/index.js # 连接 Node 服务器
如果您正在继续服务器快速入门教程(例如天气查询服务器),命令可能如下:
python client.py .../weather/src/weather/server.py
客户端将会:
- 连接到指定服务器
- 列出可用工具
- 启动交互式聊天,支持:
- 发送查询
- 执行工具调用
- 获取 Claude 生成的回复
常见问题排查
服务器路径问题
- 确保服务器脚本路径正确
- 如果相对路径无效,请使用绝对路径
- Windows 用户请使用
/或\\作为路径分隔符
示例:
# 相对路径uv run client.py ./server/weather.py# 绝对路径uv run client.py /Users/username/projects/mcp-server/weather.py# Windows 路径uv run client.py C:/projects/mcp-server/weather.pyuv run client.py C:\\projects\\mcp-server\\weather.py
响应延迟
- 首次查询可能需要 30 秒返回(服务器初始化、Claude 处理查询)
- 后续查询通常更快
- 避免在初始加载期间中断进程
这样,您就可以使用 MCP 搭建自己的 LLM 驱动的聊天机器人客户端了! 🚀
