🚀 基于终端的聊天客户端与MCP服务器集成
本项目展示了如何构建一个基于终端的聊天客户端界面。该客户端可连接到MCP服务器,并集成了OpenAI API。此外,项目还包含一个简单的天气服务,作为MCP功能的示例。
🚀 快速开始
先决条件
- Python 3.8 或更高版本
- UV 包管理器(一种快速、可靠的 Python 包安装和解析工具)
安装
1. 安装 UV
UV 是一个现代的 Python 包管理器,相较于传统工具(如 pip),它能显著提升性能。它使用 Rust 编写,具备以下特性:
- 更快的包安装速度
- 可靠的依赖项解析
- 内置虚拟环境管理
- 与现有 Python 工具兼容
要安装 UV,请运行以下命令:
curl -LsSf https://astral.sh/uv/install.sh | sh
2. 项目设置
- 初始化新项目:
uv init
- 创建并激活虚拟环境:
uv venv
source .venv/bin/activate
.venv\Scripts\activate
- 安装所需的包:
uv pip install httpx mcp[cli] openai python-dotenv
使用说明
- 启动天气服务器:
python weather.py
- 启动聊天客户端并连接到天气服务器:
python client.py weather.py
- 在聊天界面中输入消息,例如:
- “What's the weather in California?”(加利福尼亚的天气如何?)
- “Are there any alerts in New York?”(纽约有警报吗?)
✨ 主要特性
- 实时聊天界面与 OpenAI 集成
- MCP 服务器集成以实现可扩展功能
- 天气服务带有警报和预报
- 异步操作以提高性能
- 正确的错误处理和资源清理
- 环境变量配置用于 API 密钥
📦 安装指南
安装 UV
UV 是一个现代的 Python 包管理器,提供比传统工具(如 pip)显著的性能改进。它用 Rust 编写,并提供:
- 更快的包安装
- 可靠的依赖项解析
- 内置虚拟环境管理
- 与现有 Python 工具兼容
要安装 UV,请运行:
curl -LsSf https://astral.sh/uv/install.sh | sh
项目设置
- 初始化新项目:
uv init
- 创建并激活虚拟环境:
uv venv
source .venv/bin/activate
.venv\Scripts\activate
- 安装所需的包:
uv pip install httpx mcp[cli] openai python-dotenv
💻 使用示例
基础用法
启动天气服务器
python weather.py
启动聊天客户端并连接到天气服务器
python client.py weather.py
高级用法
在聊天界面中输入消息,例如:
# 查询加利福尼亚的天气
What's the weather in California?
# 查询纽约是否有警报
Are there any alerts in New York?
📚 详细文档
项目结构和实现指南
该项目由两个主要组件组成:一个聊天客户端(client.py
)和一个天气服务(weather.py
)。以下为您详细介绍每个组件的构建方式和功能。
构建聊天客户端(client.py)
聊天客户端是一个异步 Python 应用程序,连接到 MCP 服务器并集成 OpenAI API。以下是它的构建步骤:
- 导入和设置
import asyncio
import os
import sys
from typing import Optional
from contextlib import AsyncExitStack
from dotenv import load_dotenv
import openai
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
- `asyncio`:用于异步编程
- `os` 和 `sys`:用于与操作系统交互
- `typing.Optional`:用于类型提示
- `AsyncExitStack`:用于管理异步上下文
- `dotenv`:用于加载环境变量
- `openai`:OpenAI API 客户端
- `mcp`:MCP 协议库
- 聊天客户端类
class ChatClient:
def __init__(self, server_address):
self.server_address = server_address
self.loop = None
self.client_session = None
async def run(self):
self.loop = asyncio.get_event_loop()
self.client_session = await ClientSession.create(
loop=self.loop,
server_address=self.server_address
)
await self.client_session.connect()
async def send_message(self, message):
if self.client_session.is_connected:
await self.client_session.send(message)
async def close(self):
if self.client_session:
await self.client_session.close()
- 使用聊天客户端
import logging
logging.basicConfig(level=logging.INFO)
client = ChatClient('weather.py')
try:
await client.run()
while True:
message = input('> ')
await client.send_message(message)
except KeyboardInterrupt:
await client.close()
构建天气服务(weather.py)
天气服务是一个 MCP 服务器,提供天气相关功能:
- 导入和设置
import asyncio
from mcp_server import MCPServer
from weather_api import WeatherAPI
- 天气服务类
class WeatherService:
def __init__(self):
self.server = None
self.weather_api = WeatherAPI()
async def start(self, host='127.0.0.1', port=8000):
self.server = await MCPServer.create(
host=host,
port=port,
handlers={
'get_weather': self.get_weather,
'get_alerts': self.get_alerts
}
)
await self.server.start()
async def get_weather(self, location):
return await self.weather_api.get_weather(location)
async def get_alerts(self, location):
return await self.weather_api.get_alerts(location)
- 运行天气服务
import logging
logging.basicConfig(level=logging.INFO)
service = WeatherService()
try:
await service.start()
except KeyboardInterrupt:
await service.stop()
项目结构
chat_client/
├── client.py # 聊天客户端实现
├── requirements.txt # 依赖项列表
└── README.md # 项目说明
weather_service/
├── weather.py # 天气服务实现
├── weather_api.py # 第三方天气 API 接口
└── setup.py # 安装脚本
🔧 技术细节
该项目使用 Python 3.8 或更高版本进行开发,借助 UV 包管理器来管理项目依赖。项目采用异步编程模型,使用 asyncio
库实现异步操作,提高了程序的性能。聊天客户端通过 mcp
库连接到 MCP 服务器,并集成了 OpenAI API 实现智能交互。天气服务则通过 mcp_server
库搭建 MCP 服务器,提供天气相关功能。同时,项目使用 python-dotenv
库来管理环境变量,确保 API 密钥等敏感信息的安全。
📄 许可证
文档中未提及相关许可证信息。
贡献
欢迎提交问题和增强请求!