Claude中调用mcp天气服务

之前很早就听说mcp了,但是一直没尝试下,今天试了下官方示例感觉还不错的样子。

官方的示例是一个调用天气接口获取天气预警和预报的服务

python 复制代码
from typing import Any

import httpx
from mcp.server.fastmcp import FastMCP

# 初始化 FastMCP server
mcp = FastMCP("weather")

# 定义天气查询工具
NWS_API_BASE = "https://api.weather.gov"
USER_AGENT = "weather-app/1.0"



async def make_nws_request(url:str)->dict[str,Any] | None:
    """使用NWS API进行天气查询"""
    headers = {
        "User-Agent": USER_AGENT,
        "Accept": "application/geo+json",
    }
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(url, headers=headers, timeout=30.0)
            response.raise_for_status()
            return response.json()
        except Exception:
            return None
        
def format_alert(feature: dict)-> str:
    """格式化天气预警"""
    props = feature.get("properties", {})
    if not props:
        return "无预警信息"
    alert = feature.get("properties", {})
    title = alert.get("title", "无标题")
    description = alert.get("description", "无描述")
    area_desc = alert.get("areaDesc", "未知区域")
    return f"标题: {title}\n描述: {description}\n区域: {area_desc}"

@mcp.tool()
async def get_alerts(state:str)-> str:
    """获取天气预警"""
    url = f"{NWS_API_BASE}/alerts/active?area={state}"
    data = await make_nws_request(url)
    if not data or "features" not in data:
        return "无法获取天气预警信息"
    if not data['features']:
        return "没有天气预警信息"
    
    alerts = [format_alert(feature) for feature in data['features']]
    return "\n------\n".join(alerts)


@mcp.tool()
async def get_forecast(latitude:float, longitude:float) -> str:
    """获取天气预报"""
    points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}"
    points_data = await make_nws_request(points_url)

    if not points_data:
        return "无法获取此位置的天气预报信息"
    
    forecast_url = points_data['properties']['forecast']
    forecast_data = await make_nws_request(forecast_url)

    if not forecast_data:
        return '无法获取天气预报信息'
    
    periods = forecast_data['properties']['periods']
    forecasts = []
    for period in periods[:5]:
        forecast = f"""
        {period['name']}:
        温度: {period['temperature']}°{period['temperatureUnit']}
        风速: {period['windSpeed']} {period['windDirection']}
        预测: {period['detailedForecast']}
        """
        forecasts.append(forecast)

    return "\n---\n".join(forecasts)


if __name__ == '__main__':
    mcp.run(transport="stdio")

代码很简单,有两个mcp服务get_alerts是获取天气预警的,get_forecast是获取天气预报的

写完这些代码后,还需要配置Claude的配置文件,主要是配置程序运行路径

json 复制代码
{
    "mcpServers": {
        "weather": {
            "command": "uv",
            "args": [
                "--directory",
                "C:\\Users\\jesse\\Documents\\workspace\\mcp\\weather",
                "run",
                "weather.py"
            ]
        }
    }
}

重新启动后,会有两个mcp服务

这是mcp的使用效果

参考资料

天气应用官方示例

uv的安装

uv-速度飞快的pip替代 - 知乎

相关推荐
钝挫力PROGRAMER5 小时前
Chrome-devtools-mcp:闭环Agent的自我验证
ai·agent·chrome devtools·mcp·dsh
sp426 小时前
一个支持 Java 8 的 MCP SDK(支持最新 2026-07-28 协议)
后端·mcp
光依旧8 小时前
MCP实战手记(十一):MCP接飞书,从机器人到事件订阅的三层深度接入
websocket·事件驱动架构·大模型应用开发·spring ai·企业系统集成·mcp·飞书开放平台
Danny转行做跨境9 小时前
亚马逊选品流水线半夜进程被杀, 断点续跑怎么从任意层复活?
跨境电商·mcp·sorftime
ZealSinger19 小时前
SpringAI的MCP改STREAMABLE怎么配
协议·springai·mcp·streamable
崎岖Qiu1 天前
MCP 的架构、协议分层与通信过程
后端·ai·架构·agent·mcp
我的旅行Agent开发实战1 天前
10000个MCP Server之后:生态繁荣还是碎片化?
mcp
跨境Jacky1 天前
六道闸门拦住带病文:我的AI发布流水线质检实录
跨境电商·mcp·sorftime
跨境Jacky1 天前
选品数据采集的容错设计:爬虫断更和MCP降级的差距
跨境电商·mcp·sorftime
酒旅Agent开发实战1 天前
10000个MCP Server之后:生态繁荣还是碎片化?
人工智能·大模型·酒店预订·ai agent·mcp