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

相关推荐
花千树-0103 分钟前
ReAct 思考-行动-观察循环的底层实现机制
langchain·agent·react·ai编程·ai agent·langgraph·mcp
JaydenAI4 分钟前
[FastMCP设计、原理与应用-17]从服务器向客户端的反向通知
python·ai编程·ai agent·mcp·fastmcp
阿杰学AI16 小时前
AI核心知识137—大语言模型之 CLI与MCP(简洁且通俗易懂版)
人工智能·ai·语言模型·自然语言处理·cli·mcp·模型上下文协议
薛定谔的猫36920 小时前
深入浅出 MCP (Model Context Protocol):开启 AI Agent 的标准化连接时代
ai·llm·agent·技术分享·mcp
花千树-0101 天前
ReAct Agent是什么?与传统LLM/Chatbot的本质区别(原理篇)
langchain·react·ai编程·chatbot·ai agent·langgraph·mcp
薛定谔的猫3692 天前
深入浅出 MCP:重塑 LLM Agent 的能力边界与生态标准
llm·ai agent·智能化·mcp·model context protocol
花千树-0102 天前
AI Agent 模型成本控制实战:Token 消耗优化与监控技巧
人工智能·agent·token·function call·ai agent·mcp·agent memory
薛定谔的猫3692 天前
深度解析 MCP (Model Context Protocol):重塑 AI Agent 的生态连接
自动化·llm·ai agent·技术架构·mcp·model context protocol
探险的机器猫2 天前
使用 java 搭建一个基于 StreamableHTTP 的 MCP 服务
java·mcp
不会敲代码12 天前
MCP 实战第二弹:集成高德地图、文件系统、Chrome DevTools,打造能看能写能操控浏览器的超级 Agent
langchain·llm·mcp