🚀 基于终端的聊天客户端与MCP服务器集成
该项目展示了如何构建一个基于终端的聊天客户端界面,此客户端可连接到MCP服务器并集成了OpenAI API。此外,项目还包含一个简单的天气服务,作为MCP功能的示例。
🚀 快速开始
此项目旨在构建一个能与MCP服务器相连的终端聊天客户端,同时集成OpenAI API,并提供简单的天气服务。以下是快速开始的步骤:
先决条件
- 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密钥
📦 安装指南
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
高级用法
在聊天界面中输入消息,与OpenAI集成的聊天客户端会根据输入提供相应的回复,同时可查询天气服务:
# 在聊天界面输入消息示例
> 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 # 安装脚本
🤝 贡献
欢迎提交问题和增强请求!