Skip to main content
Glama
LiuKeTong713

Weather MCP

by LiuKeTong713
README.md
# Weather MCP (Model Context Protocol) 天气查询服务

## 🌤️ 服务介绍

Weather MCP 是一个基于 Model Context Protocol (MCP) 的天气查询服务,通过集成 OpenWeather API 提供全球天气信息查询功能。该服务支持自然语言交互,用户可以用中文描述需求,系统会自动调用相应的天气查询工具并返回格式化的天气信息。

## 📋 服务描述

### 主要功能
- **全球天气查询**: 支持查询全球任意城市的实时天气信息
- **多语言支持**: 支持中文查询和中文天气描述
- **智能交互**: 通过大语言模型理解用户意图,自动调用天气查询工具
- **格式化输出**: 提供美观易读的天气信息展示

### 技术特点
- 基于 MCP 协议,支持与各种 AI 客户端集成
- 异步 HTTP 请求,提高响应速度
- 完善的错误处理和容错机制
- 支持 stdio 通信方式

## 🏗️ 类型

### 服务类型
- **MCP Server**: 提供天气查询工具的 MCP 服务器
- **MCP Client**: 支持与大语言模型交互的客户端
- **API Integration**: 集成 OpenWeather API 的天气数据服务

### 架构类型
- **微服务架构**: 服务器和客户端分离,支持独立部署
- **异步架构**: 基于 asyncio 的异步处理
- **协议驱动**: 基于 MCP 协议的标准化通信

## ⚙️ 服务配置

### 服务器配置 (server.py)

```python
# MCP 服务器配置
mcp = FastMCP("WeatherServer")

# OpenWeather API 配置
OPENWEATHER_API_BASE = "https://api.openweathermap.org/data/2.5/weather"
API_KEY = "your_api_key_here"
USER_AGENT = "weather-app/1.0"

# 请求参数配置
DEFAULT_PARAMS = {
    "units": "metric",  # 使用摄氏度
    "lang": "zh_cn"     # 中文语言
}
```

### 客户端配置 (client.py)

```python
class MCPClient:
    def __init__(self):
        self.openai_api_key = os.getenv("OPENAI_API_KEY")
        self.base_url = os.getenv("BASE_URL")
        self.model = os.getenv("MODEL")
        self.client = OpenAI(api_key=self.openai_api_key, base_url=self.base_url)
```

### 项目依赖配置

#### Python 依赖 (pyproject.toml)
```toml
[project]
name = "weather-mcp"
version = "0.1.0"
description = "Weather MCP Server for global weather queries"
dependencies = [
    "mcp>=1.0.0",
    "httpx>=0.24.0",
    "openai>=1.0.0",
    "python-dotenv>=1.0.0"
]

[project.optional-dependencies]
dev = [
    "pytest>=7.0.0",
    "black>=23.0.0",
    "flake8>=6.0.0"
]
```

#### Node.js 依赖 (package.json)
```json
{
  "name": "weather-mcp",
  "version": "0.1.0",
  "description": "Weather MCP Server",
  "dependencies": {
    "commander": "^11.0.0"
  }
}
```

## 🔧 环境变量配置

### 必需环境变量

创建 `.env` 文件并配置以下环境变量:

```bash
# OpenAI API 配置
OPENAI_API_KEY=your_openai_api_key_here
BASE_URL=https://api.openai.com/v1
MODEL=gpt-3.5-turbo

# OpenWeather API 配置 (在 server.py 中配置)
# API_KEY=your_openweather_api_key_here
```

### 环境变量说明

| 变量名 | 描述 | 示例值 | 是否必需 |
|--------|------|--------|----------|
| `OPENAI_API_KEY` | OpenAI API 密钥 | `sk-...` | ✅ 必需 |
| `BASE_URL` | OpenAI API 基础 URL | `https://api.openai.com/v1` | ✅ 必需 |
| `MODEL` | 使用的 OpenAI 模型 | `gpt-3.5-turbo` | ✅ 必需 |

### 获取 API 密钥

#### OpenAI API Key
1. 访问 [OpenAI Platform](https://platform.openai.com/)
2. 登录或注册账号
3. 进入 API Keys 页面
4. 创建新的 API Key
5. 复制密钥到 `.env` 文件

#### OpenWeather API Key
1. 访问 [OpenWeather API](https://openweathermap.org/api)
2. 注册免费账号
3. 获取 API Key
4. 在 `server.py` 中替换 `API_KEY` 变量

## 🚀 快速开始

### 1. 安装依赖
```bash
# 使用 uv 安装 Python 依赖
uv sync

# 或使用 pip
pip install -r requirements.txt
```

### 2. 配置环境变量
```bash
# 复制环境变量模板
cp .env.example .env

# 编辑 .env 文件,填入你的 API 密钥
nano .env
```

### 3. 启动服务器
```bash
# 启动 MCP 服务器
python server.py
```

### 4. 运行客户端
```bash
# 在另一个终端中运行客户端
python client.py server.py
```

### 5. 开始使用
```
你: 查询北京的天气
🤖 OpenAI: 我来为您查询北京的天气信息。

[Calling tool query_weather with args {'city': 'Beijing'}]

🤖 OpenAI: 根据查询结果,北京今天的天气情况如下:

📍 北京, CN
🌡️ 温度: 25°C
💧 湿度: 65%
💨 风速: 3.2 m/s
☁️ 天气: 多云
```

## 📁 项目结构

```
weather_mcp/
├── server.py          # MCP 服务器主文件
├── client.py          # MCP 客户端主文件
├── main.py            # 项目入口文件
├── config.py          # 配置文件
├── pyproject.toml     # Python 项目配置
├── package.json       # Node.js 项目配置
├── .env               # 环境变量文件
├── .gitignore         # Git 忽略文件
├── README.md          # 项目说明文档
└── requirements.txt   # Python 依赖列表
```

## 🔍 API 文档

### 可用工具

#### query_weather
- **描述**: 查询指定城市的天气信息
- **参数**: 
  - `city` (string): 城市名称(英文)
- **返回**: 格式化的天气信息字符串

### 使用示例

```python
# 查询天气
result = await session.call_tool("query_weather", {"city": "Shanghai"})
print(result.content[0].text)
```

## 🛠️ 开发指南

### 添加新的天气工具

1. 在 `server.py` 中添加新的工具函数
2. 使用 `@mcp.tool()` 装饰器注册工具
3. 实现工具逻辑和错误处理
4. 更新文档和测试

### 自定义配置

可以通过修改 `config.py` 文件来自定义服务配置:

```python
# 自定义天气 API 配置
WEATHER_CONFIG = {
    "api_base": "https://api.openweathermap.org/data/2.5/weather",
    "timeout": 30.0,
    "retry_count": 3
}
```

## 📝 许可证

本项目采用 MIT 许可证。详见 [LICENSE](LICENSE) 文件。

## 🤝 贡献

欢迎提交 Issue 和 Pull Request 来改进这个项目!

## 📞 支持

如果你遇到问题或有建议,请:
1. 查看 [Issues](https://github.com/LiuKeTong713/Weather_mcp/issues)
2. 创建新的 Issue
3. 联系项目维护者

---

**注意**: 请确保妥善保管你的 API 密钥,不要将其提交到版本控制系统中。

## 🔧 标准服务配置

```json
{
  "mcpServers": {
    "weather_mcp": {
      "args": [
        "server.py"
      ],
      "command": "python",
      "env": {
        "OPENAI_API_KEY": "your_openai_api_key_here",
        "BASE_URL": "your_model_base_url",
        "MODEL": "YOUR_Model_Name",
        "WEATHER_API_KEY": "your_openweather_api_key_here"
      }
    }
  }
}
```

### 字段说明
- `"args"`:传递给 MCP 服务器的参数(如 `server.py`)。
- `"command"`:启动命令(Python 项目用 `"python"`)。
- `"env"`:自动提取的环境变量,**请将 `your_openai_api_key_here` 和 `your_openweather_api_key_here` 替换为你自己的密钥**。

---

如需多个服务配置,可以用 JSON 数组格式填写多个 `mcpServers`。  
如需进一步定制或有其他字段需求,请告知!