天气数据服务

一个基于Open-Meteo API的MCP服务器,为语言模型提供天气数据和工具。

  • by bhuppal
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 bhuppal/mcp_server_weather

使用说明

MCP服务器:Open-Meteo天气示例

此存储库包含一个最小化的MCP(模型连接器协议)服务器,用于演示如何使用Open-Meteo API将天气数据和工具暴露给语言模型。该示例特意设计得小巧且本地化,以便轻松通过Claude桌面应用程序(或其他MCP客户端)运行。

概述

MCP服务器通过将语言模型连接到数据源和服务,扩展了其功能。它们提供了三种主要的原始接口:

  • 资源(客户端控制):在请求时提供数据,以便用作上下文。适用于被动数据访问。
  • 工具(模型控制):提供模型可调用的可执行功能,用于获取或转换数据。
  • 提示(用户控制):向用户展示可重用的提示和工作流。

这个示例重点介绍如何构建一个小型MCP服务器,该服务器利用Open-Meteo API提供获取当前天气和预报的工具。

为什么选择Open-Meteo?

  • 免费供非商业使用,且无需API密钥。
  • 可通过查询参数进行配置(按小时、按天、当前、地理编码)。
  • 非常适合需要将原始结构化数据返回给模型的大语言模型(LLM)集成场景。

内容

  • server.py — 本教程中使用的MCP服务器入口点。
  • pyproject.toml — 项目元数据和依赖项。
  • README.md — 这个文件。

要求

  • 一个 Claude.ai 帐户和 Claude 桌面应用程序(用于 MCP 客户端测试)。
  • 代码编辑器(推荐使用VS Code)。
  • uv(基于Rust的Python包管理器)——在macOS上通过Homebrew安装:
brew install uv

或者在 Windows 上通过 winget:

winget install --id=astral-sh.uv -e

快速设置(推荐的工作流程)

  1. 创建项目文件夹并在你的编辑器中打开它(如果你还没有这样做的话):
mkdir mcp-server-weather
cd mcp-server-weather
  1. 初始化一个uv项目和虚拟环境,然后安装运行时依赖项:
uv init
uv venv
source .venv/bin/activate
uv add "mcp[cli]" httpx

注:

  • 使用 deactivate 退出虚拟环境。
  • 这个仓库已经包含 pyproject.toml 并且 server.py — 你可以跳过创建文件的步骤,直接运行服务器。

搭建MCP服务器(示例)

一个最小的 server.py 本教程包含:

  • 强类型和 httpx 对于HTTP请求
  • FastMCP 来自用于构建MCP服务器的Python MCP SDK
  • 一个用于调用Open-Meteo API的助手
  • 一个或多个 @mcp.tool() 返回原始JSON给模型的函数

示例代码片段(已在 server.py):

from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP

# Initialize FastMCP server
mcp = FastMCP("weather")

# Constants
OPENMETEO_API_BASE = "https://api.open-meteo.com/v1"
USER_AGENT = "weather-app/1.0"

async def make_openmeteo_request(url: str) -> dict[str, Any] | None:
    headers = {"User-Agent": USER_AGENT, "Accept": "application/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

@mcp.tool()
async def get_current_weather(latitude: float, longitude: float) -> str:
    """Get current weather for a location.

    Args:
        latitude: Latitude of the location
        longitude: Longitude of the location
    """
    url = f"{OPENMETEO_API_BASE}/forecast?latitude={latitude}&longitude={longitude}&current=temperature_2m,is_day,showers,cloud_cover,wind_speed_10m,wind_direction_10m,pressure_msl,snowfall,precipitation,relative_humidity_2m,apparent_temperature,rain,weather_code,surface_pressure,wind_gusts_10m"
    data = await make_openmeteo_request(url)
    if not data:
        return "Unable to fetch current weather data for this location."
    return data

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

工具说明

  • 工具是通过(某种方式)定义的 @mcp.tool()。
  • 初始函数的文档字符串作为大型语言模型(LLM)的工具提示(解释何时以及如何使用它)。
  • 工具应返回结构化数据(避免为人类显示进行预格式化),以便大型语言模型(LLM)能够解释并呈现这些数据。

运行并测试MCP服务器

  1. 以开发者模式启动MCP服务器(这也将运行MCP检查器):
mcp dev server.py
  1. 在 http://localhost:5173 打开 MCP 检查器
  2. 点击“连接”并打开“工具”选项卡
  3. 使用“工具列表”来查找可用工具并运行 get_current_weather 带有纬度/经度(例如: 63.4463991, 10.8127596)。
  4. 检查“工具结果”下的原始JSON。

扩展服务器

  • get_forecast — 提供可配置范围的小时/日预报。
  • get_location 使用Open-Meteo地理编码API将地名转换为坐标。
  • 添加资源以向客户端提供缓存或聚合的天气摘要。

故障排除

  • 如果MCP服务器的行为不符合预期,请将其与参考标准进行比较 open-meteo-weather 课程材料中的示例。
  • 检查你运行命令时的终端输出 mcp dev server.py 用于堆栈跟踪。
  • 确保你的虚拟环境已激活,并且 mcp[cli] 和 httpx 在那个环境中被安装。

许可证

此项目作为学习示例提供。请随意使用和修改。


如果你愿意,我还可以:

  • 加上一点 CONTRIBUTING.md 包含开发提示和测试步骤。
  • 添加一个最小值 requirements.txt 或者更新 pyproject.toml 明确列出依赖项。
  • 添加一个简短示例 server.py 或者,如果你想让我在这个仓库中创建/修改文件,请进行测试。