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替代 - 知乎

相关推荐
kaika15 小时前
通过 1Panel MCP 自动部署静态网站
1panel·halo·mcp·ai建站
大模型真好玩9 小时前
深入浅出LangChain AI Agent智能体开发教程(十)—LangChain搭建数据分析智能助手
人工智能·python·mcp
聚客AI1 天前
🔥如何选择AI代理协议:MCP、A2A、ACP、ANP实战选型手册
人工智能·llm·mcp
JolyouLu1 天前
LangChain4J-基础(整合Spring、RAG、MCP、向量数据库、提示词、流式输出)
大模型·提示词·向量数据库·rag·mcp·langchain4j
Always_Passion2 天前
一、对于MCP的理解
mcp
IT·陈寒2 天前
新手小白零基础搭建MCP教程
python·ai·tools·mcp
一个处女座的程序猿3 天前
LLMs之Agent:Windows-MCP的简介、安装和使用方法、案例应用之详细攻略
windows·mcp
Dontla3 天前
Claude Code接入Serena mcp
mcp
大模型教程3 天前
dify+MCP多应用,构建灵活的AI应用生态系统
程序员·llm·mcp
RainbowSea3 天前
Spring AI 快速接入 DeepSeek 大模型
ai编程·deepseek·mcp