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,我们实现两个核心功能:

  1. 美国各州气象预警查询
  2. 全球经纬度天气预报查询
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配置:

  1. 打开Claude Desktop设置 → 开发者选项
  2. 点击"Edit Config"按钮
  3. 添加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会:

  1. 解析地理位置"波士顿"
  2. 转换为经纬度坐标
  3. 调用get_location_forecast工具
  4. 提取未来24小时数据
  5. 用自然语言格式化输出

注意: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%的运行时问题。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐