Claude Desktop + MCP实战:5分钟搭建本地天气查询AI助手(附完整代码)
·
Claude Desktop与MCP实战:5分钟构建智能天气查询系统
窗外暴雨突至时,你是否想过让AI助手自动推送预警?出差前能否一键获取目的地未来5天精准天气预报?今天我们将用Claude Desktop和MCP技术,打造一个能理解自然语言、实时对接气象数据的智能系统。这个方案特别适合需要快速验证AI工具集成能力的开发者,整个过程仅需基础Python知识,无需复杂部署。
1. 环境配置与工具准备
工欲善其事,必先利其器。我们先来准备开发所需的"工具箱":
- Claude Desktop:从官网下载最新版本,建议选择稳定版而非测试版
- Python 3.10+:MCP对Python版本有严格要求,3.10以下可能遇到兼容性问题
- UV工具链:新一代Python项目管理工具,比传统pip更高效
安装UV只需在终端执行:
curl -LsSf https://astral.sh/uv/install.sh | sh
安装完成后验证版本:
uv --version
提示:如果使用conda管理环境,请先创建并激活Python 3.10+环境后再安装UV
常见问题排查:
- 权限不足时在命令前加
sudo - 网络问题可尝试更换国内镜像源
- M1/M2芯片Mac用户需确认Rosetta转译是否正常
2. 创建MCP天气服务项目
现在开始构建我们的核心服务。新建名为weather-mcp的目录,执行项目初始化:
uv init --no-workspace weather-mcp
cd weather-mcp
uv venv
source .venv/bin/activate
uv add "mcp[cli]" httpx
关键依赖说明:
| 依赖包 | 用途 | 版本要求 |
|---|---|---|
| mcp[cli] | MCP核心库及命令行工具 | ≥0.5.0 |
| httpx | 异步HTTP客户端 | ≥0.25.0 |
创建服务主文件:
touch weather_service.py
项目结构应如下所示:
weather-mcp/
├── .venv/
├── pyproject.toml
└── weather_service.py
3. 编写气象数据服务核心代码
打开weather_service.py,我们实现两个核心功能:
- 美国各州气象预警查询
- 全球经纬度天气预报查询
from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("weather")
# 配置NWS API参数
NWS_API = "https://api.weather.gov"
HEADERS = {
"User-Agent": "MCP-Weather/1.0",
"Accept": "application/geo+json"
}
async def fetch_weather_data(url: str) -> dict:
"""通用天气数据获取函数"""
async with httpx.AsyncClient(timeout=30.0) as client:
try:
resp = await client.get(url, headers=HEADERS)
resp.raise_for_status()
return resp.json()
except httpx.HTTPStatusError as e:
print(f"API请求失败: {e}")
return None
@mcp.tool()
async def get_state_alerts(state_code: str) -> str:
"""获取州级气象预警"""
api_url = f"{NWS_API}/alerts/active/area/{state_code}"
data = await fetch_weather_data(api_url)
if not data or not data.get("features"):
return "无有效预警信息"
alerts = []
for alert in data["features"]:
desc = alert["properties"]["description"]
area = alert["properties"]["areaDesc"]
alerts.append(f"【{area}】{desc}")
return "\n\n".join(alerts) if alerts else "该地区当前无预警"
@mcp.tool()
async def get_location_forecast(lat: float, lng: float) -> str:
"""获取坐标点天气预报"""
points_url = f"{NWS_API}/points/{lat},{lng}"
points_data = await fetch_weather_data(points_url)
if not points_data:
return "无法获取该位置气象数据"
forecast_url = points_data["properties"]["forecast"]
forecast_data = await fetch_weather_data(forecast_url)
if not forecast_data:
return "无法获取详细预报"
periods = forecast_data["properties"]["periods"][:3] # 仅显示最近3个时段
report = []
for p in periods:
report.append(
f"{p['name']}:\n"
f"温度: {p['temperature']}°{p['temperatureUnit']}\n"
f"风速: {p['windSpeed']}\n"
f"详情: {p['detailedForecast']}"
)
return "\n\n".join(report)
if __name__ == "__main__":
mcp.run(transport="stdio")
代码亮点解析:
- 采用异步IO处理网络请求,避免阻塞
- 完善的错误处理和空值检查
- 输出信息经过本地化处理,更符合中文习惯
- 限制返回数据量,保证响应速度
4. 配置Claude Desktop集成
服务端就绪后,需要让Claude Desktop识别我们的MCP服务。编辑Claude配置:
- 打开Claude Desktop设置 → 开发者选项
- 点击"Edit Config"按钮
- 添加MCP服务器配置:
{
"mcpServers": {
"weather": {
"command": "/path/to/uv",
"args": [
"--directory",
"/absolute/path/to/weather-mcp",
"run",
"weather_service.py"
]
}
}
}
路径获取方法:
uv路径:执行which uv获取- 项目路径:在终端执行
pwd获取绝对路径
保存配置后重启Claude Desktop,在聊天界面左下角会出现"Search and tools"图标,点击即可看到注册成功的weather服务。
5. 实战应用与效果演示
现在可以通过自然语言查询天气了!试试这些示例:
基础查询:
- "旧金山现在天气如何?"
- "德克萨斯州有气象预警吗?"
复杂查询:
- "我下周要去纽约出差,当地天气怎么样?"
- "比较洛杉矶和芝加哥本周末的天气情况"
系统会智能识别查询意图,自动调用对应的MCP工具获取数据。例如查询"波士顿未来24小时天气预报"时,Claude会:
- 解析地理位置"波士顿"
- 转换为经纬度坐标
- 调用get_location_forecast工具
- 提取未来24小时数据
- 用自然语言格式化输出
注意:NWS API主要覆盖美国地区,国际城市需先获取正确坐标
性能优化技巧:
- 添加本地缓存减少API调用
- 实现批量查询接口
- 设置请求频率限制
- 使用CDN加速地理编码服务
6. 扩展开发思路
这个基础框架可以无限扩展:
数据源增强
- 接入中国气象局API
- 整合空气质量数据
- 添加雷达图等可视化数据
功能扩展
- 极端天气自动提醒
- 行程天气建议
- 农业气象预警
- 航班延误预测
企业级优化
- 添加JWT认证
- 实现负载均衡
- 接入监控系统
- 设计灾备方案
# 扩展示例:添加空气质量查询
@mcp.tool()
async def get_air_quality(city: str) -> str:
"""查询城市空气质量"""
aqi_data = await fetch_aqi_api(city)
return format_aqi_report(aqi_data)
开发过程中发现几个实用技巧:使用类型注解能显著提升代码可维护性;异步编程虽然学习曲线陡峭,但性能提升明显;合理的错误处理可以避免90%的运行时问题。
更多推荐


所有评论(0)