准备工作

安装vscode,以及在vscode中安装扩展cline,并准备uv工具

其中uv是一个极速的 Python 包管理器和项目管理工具,安装参考官方github仓库。

windows使用终端命令即可

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

使用uv --version查看是否成功

然后随便选择一个工作目录,创建项目文件夹

uv init weather

cd weather

创建虚拟环境并安装依赖

uv venv

#然后按照终端的提示,激活虚拟环境

.\.venv\Scripts\Activate.ps1

#如出现(weather)则说明激活成功

uv add "mcp[cli]" httpx 

#安装依赖

好处是weather项目文件夹有自己独立的虚拟环境,删除这个文件夹,虚拟环境也会被删除

创建脚本文件

使用vscode打开这个项目

创建脚本文件weather.py,代码如下

# 导入类型注解支持

from typing import Any

# 导入 httpx 用于异步 HTTP 请求

import httpx

# 导入 FastMCP 用于快速构建 MCP 服务器

from mcp.server.fastmcp import FastMCP


 

# 初始化 FastMCP 服务器,命名为 "weather",日志级别设为 ERROR

mcp = FastMCP("weather", log_level="ERROR")


 

# 常量定义:NWS(美国国家气象服务)API 基础 URL

NWS_API_BASE = "https://api.weather.gov"

# 用户代理标识,NWS API 要求请求必须包含 User-Agent

USER_AGENT = "weather-app/1.0"

#async def: 定义“协程函数”的关键字。url: str表示参数 url 应该是字符串类型。-> dict[str, Any] | None: 这是对返回值的类型注解。

async def make_nws_request(url: str) -> dict[str, Any] | None:

    """向 NWS API 发送异步请求,并进行错误处理

    Args:

        url: 请求的 API 地址

    Returns:

        成功时返回解析后的 JSON 数据字典,失败时返回 None

    """

    # 设置请求头,包含 User-Agent 和接受的响应格式

    headers = {

        "User-Agent": USER_AGENT,

        "Accept": "application/geo+json"

    }

    # 使用异步 HTTP 客户端发送请求

    async with httpx.AsyncClient() as client:

        try:

            response = await client.get(url, headers=headers, timeout=30.0)

            # 如果状态码不是 2xx,抛出异常

            response.raise_for_status()

            return response.json()

        except Exception:

            # 发生任何异常时返回 None

            return None


 

def format_alert(feature: dict) -> str:

    """将天气警报特征格式化为可读字符串

    Args:

        feature: 包含警报信息的字典

    Returns:

        格式化后的警报字符串

    """

    # 提取警报的属性部分

    props = feature["properties"]

    return f"""

Event: {props.get('event', 'Unknown')}           # 事件类型

Area: {props.get('areaDesc', 'Unknown')}           # 受影响区域

Severity: {props.get('severity', 'Unknown')}       # 严重程度

Description: {props.get('description', 'No description available')}  # 描述

Instructions: {props.get('instruction', 'No specific instructions provided')}  # 应对建议

"""


 

#@mcp.tool()是装饰器,告诉 MCP 服务器:这个函数是一个工具,AI模型可以调用它,工具说明书也会发给AI模型

@mcp.tool()

async def get_alerts(state: str) -> str:

    """获取美国某个州的天气警报

    Args:

        state: 美国州的两字母代码(如 CA、NY)

    Returns:

        该州的活跃天气警报信息,格式化为字符串

    """

    # 构建获取特定州活跃警报的 API URL

    url = f"{NWS_API_BASE}/alerts/active/area/{state}"

    # 发送异步请求获取数据

    data = await make_nws_request(url)

    # 检查数据是否有效

    if not data or "features" not in data:

        return "Unable to fetch alerts or no alerts found."

    # 如果没有活跃警报

    if not data["features"]:

        return "No active alerts for this state."

    # 格式化所有警报并用分隔符连接

    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:

    """获取指定位置的天气预报

    Args:

        latitude: 纬度

        longitude: 经度

    Returns:

        该位置的天气预报信息,格式化为字符串

    """

    # 第一步:获取该坐标对应的预报网格端点

    points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}"

    points_data = await make_nws_request(points_url)

    if not points_data:

        return "Unable to fetch forecast data for this location."

    # 第二步:从网格响应中提取实际预报 URL,并获取预报数据

    forecast_url = points_data["properties"]["forecast"]

    forecast_data = await make_nws_request(forecast_url)

    if not forecast_data:

        return "Unable to fetch detailed forecast."

    # 格式化各个时段的预报信息

    periods = forecast_data["properties"]["periods"]

    forecasts = []

    # 只显示前 5 个时段的预报

    for period in periods[:5]:

        forecast = f"""

{period['name']}:

Temperature: {period['temperature']}°{period['temperatureUnit']}

Wind: {period['windSpeed']} {period['windDirection']}

Forecast: {period['detailedForecast']}

"""

        forecasts.append(forecast)

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

#如果这个文件是被 import 导入到其他文件中,下面这段代码不会执行。

if __name__ == "__main__":

    # 程序入口:启动 MCP 服务器,使用标准输入输出进行通信

    mcp.run(transport='stdio')

    #transport='stdio'通过管道与客户端进行文本数据交换。

准备 MCP 服务器配置的 JSON 文件

在Cline窗口中按下这里的configure Mcp Servers,会自动创建cline_mcp_settings.json文件

注意项目地址需要修改成你当前使用的目录

{

  "mcpServers": {

    "weather":{

      "disabled":false,

      "timeout":60,

      "command":"uv",

      "args":[

        "--directory",

        "C:\\Users\\Temp\\Desktop\\t\\weather",

        "run",

        "weather.py"

      ],

      "transportType":"stdio"

    }

  }

}

这是一个 __MCP (Model Context Protocol) 服务器配置文件__,用于定义如何运行一个名为 "weather" 的 MCP 服务器。

## 详细说明:

__mcpServers__: MCP 服务器的根配置对象

__weather__: 服务器的名称(标识符)

- __disabled: false__: 服务器已启用,可以正常使用

- __timeout: 60__: 超时时间为 60 秒,如果服务器响应超过这个时间会被视为超时

- __command: "uv"__: 使用 `uv` 命令来启动服务器(`uv` 是 Python 包管理器和运行工具)

- __args__: 启动参数数组

  - `"--directory"`, `"C:\\Users\\Temp\\Desktop\\t\\weather"`: 指定工作目录
  - `"run"`, `"weather.py"`: 运行 weather.py 脚本

- __transportType: "stdio"__: 使用标准输入/输出 (stdin/stdout) 作为通信方式

## 作用:

这个配置让 AI 助手(如 Cline)能够与 `weather.py` 这个 Python 脚本通信,通过 MCP 协议调用其中定义的工具。例如:

- 获取天气预报 (`get_forecast`)
- 获取天气警报 (`get_alerts`)

通过这种方式,MCP 服务器将 Python 脚本的功能暴露给 AI 助手,使 AI 能够执行特定的任务(如查询天气)。

cline运行结果

AI agent配置weather MCP---以Claude code为例

要让它可用,需要在 Claude Code 的配置文件中注册。

  你使用的是 FastMCP,这是目前推荐的 MCP 开发方式。配置方法:

  1. 找到配置文件位置(Windows):
  %APPDATA%\Claude\.claude.json   

   #可能不同的人安装位置不一样


  2. 添加 MCP 服务器配置:

#找到配置文件之后,发给claude code这一步可以让claude code帮你完成

3.重启claude code(连续按下两次Ctrl + C 再启动即可)

claude -c恢复最近的会话

claude --resume 选择要恢复的对话

或者启动后 输入/resume切换历史会话

效果如下

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐