返回市场
气象服务by-met

气象服务by-met

作者:zhenkai-dev0 星标更新:2025-11-10

项目介绍

🌦️ 马来西亚天气 MCP 服务器

这是一个生产就绪的 MCP(模型上下文协议)服务器,可将实时马来西亚天气预报带给您最喜欢的 AI 助手。

该项目实现了一个本地 MCP 服务器,该服务器从 MET 马来西亚的 API 获取实时天气数据,并将其无缝集成到任何兼容 MCP 的客户端(如 Claude Desktop、Cursor、Cline 等)。用户可以使用自然语言询问他们的 AI 助手关于马来西亚的天气情况,AI 助手将使用此服务器获取准确且最新的预报。

什么是 MCP?

模型上下文协议(MCP) 是一个标准,允许 AI 助手与外部工具和服务进行交互。通过将这个 MCP 服务器与您的 AI 助手集成,您可以使它能够:

  • 查询实时天气数据
  • 访问马来西亚任何地点的当前和未来预报
  • 在自然对话中提供天气信息
  • 使用天气数据来告知响应和建议

本项目做了什么

  1. 获取天气数据:每15分钟自动更新来自 MET 马来西亚的马来西亚天气预报
  2. 暴露 MCP 工具:提供两个工具(check_weather_todaycheck_7day_forecast),您的 AI 助手可以调用这些工具
  3. 管理数据:在本地 MySQL 数据库中存储预报,并自动清理旧记录
  4. 本地运行:所有内容都在您的机器上运行,无需云依赖
  5. 适用于任何 MCP 客户端:只需向您喜欢的 AI 工具添加一个简单的配置即可开始询问天气!

快速概览

┌─────────────────────────────────────────────────────┐
│          您的本地机器                                │
├─────────────────────────────────────────────────────┤
│  您的 MCP 客户端(Claude、Cursor、Cline等)         │
│  ↓                                                   │
│  MCP 服务器(weather-by-met)← 本项目              │
│  ├─ server.py    (MCP 服务器)                     │
│  ├─ scheduler.py (更新天气数据)                   │
│  └─ MySQL DB     (存储预报)                       │
│  ↓                                                   │
│  MET 马来西亚 API(天气数据源)                    │
└─────────────────────────────────────────────────────┘

用户:"吉隆坡的天气怎么样?"
  ↓
AI 向 MCP 服务器询问 → MCP 查询数据库 → AI 回应

🎯 特性

  • 实时天气数据:每15分钟自动获取天气预报
  • 7天预报:访问最多7天的预报
  • 多地点支持:查询马来西亚各州、区、城镇、休闲中心及分区的天气
  • AI友好格式:返回结构化数据,适用于任何 AI 助手
  • 优化数据库:高效 MySQL 存储并自动清理旧记录
  • Telegram 警报:错误通知发送到您的 Telegram 频道以立即知晓
  • 生产就绪:全面的错误处理和日志记录

🚀 快速开始

五分钟内启动!这将在您的机器上设置一切。

先决条件

开始前,请确保您拥有:

  • Python 3.8+ - 从 python.org 安装
  • MySQL 8.0+ - 从 mysql.com 安装(或使用 Homebrew: brew install mysql
  • 一个 MCP 客户端 - 选择以下之一:Claude Desktop、Cursor IDE、Cline VSCode 扩展,或其他兼容 MCP 的客户端
  • Git - 用于克隆此仓库

安装步骤

步骤 1:克隆仓库

git clone https://github.com/zhenkai-dev/weather-by-met.git
cd weather-by-met

步骤 2:安装 Python 依赖项

pip install -r requirements.txt

这会安装:

  • fastmcp - MCP 服务器框架
  • mysql-connector-python - MySQL 数据库驱动程序
  • pydantic - 输入验证
  • requests - 用于 API 调用
  • 及其他实用工具

步骤 3:设置 MySQL 数据库

# 从模板创建 .env 文件
cp .env.example .env

现在编辑 .env 文件,填写您的 MySQL 凭证:

# macOS/Linux
nano .env

# Windows - 使用记事本或其他编辑器

.env 文件的内容:

DB_HOST=localhost
DB_USER=root
DB_PASSWORD=your_mysql_password_here
DB_NAME=weather_by_met

然后初始化数据库:

python init_db.py

这会自动创建 weather_by_met 数据库和 weather_forecasts 表。

步骤 4:启动调度器(保持运行)

在一个终端中启动调度器以获取天气数据:

python scheduler.py

您将看到如下输出:

[2025-11-10 10:30:00] 开始调度器...
[2025-11-10 10:30:05] ✓ 获取了38个地点的天气
[2025-11-10 10:30:07] ✓ 调度器已准备好 - 将每15分钟更新一次

在后台保持此终端运行。它将:

  • 立即获取天气数据
  • 每15分钟自动更新
  • 每天凌晨12:05(马来西亚时间)清理旧记录

步骤 5:配置您的 MCP 客户端

选择下面的 MCP 客户端之一并按照配置步骤操作。

选项 A:Claude Desktop

步骤 5.1:打开配置文件

macOS/Linux

nano ~/Library/Application\ Support/Claude/claude_desktop_config.json

Windows: 使用 %APPDATA%\Claude\claude_desktop_config.json 打开记事本

步骤 5.2:添加配置(替换路径为您实际路径):

{
  "mcpServers": {
    "weather-malaysia": {
      "command": "python",
      "args": ["/path/to/weather-by-met/server.py"],
      "env": {
        "DB_HOST": "localhost",
        "DB_USER": "root",
        "DB_PASSWORD": "your_mysql_password",
        "DB_NAME": "weather_by_met"
      }
    }
  }
}

步骤 5.3:重启 Claude Desktop

  • 完全关闭应用程序
  • 等待2秒后重新打开

选项 B:Cursor IDE

步骤 5.1:打开 Cursor 设置

  • 打开 Cursor 设置(Cmd+, 或 Ctrl+,)
  • 搜索 "MCP"

步骤 5.2:添加 MCP 服务器配置

  • 点击 "添加 MCP 服务器"
  • 选择 "标准 I/O"
  • 填写:
    • 命令python
    • 参数/path/to/weather-by-met/server.py
    • 环境变量
      {
        "DB_HOST": "localhost",
        "DB_USER": "root",
        "DB_PASSWORD": "your_mysql_password",
        "DB_NAME": "weather_by_met"
      }
      

步骤 5.3:重启 Cursor

  • 完全关闭 Cursor
  • 重新打开应用程序

选项 C:Cline(VSCode 扩展)

步骤 5.1:打开 Cline 设置

  • 点击 VSCode 侧边栏中的 Cline 图标
  • 打开设置 → MCP 服务器

步骤 5.2:添加 MCP 服务器配置

  • 点击 "添加 MCP 服务器"
  • 填写:
    • 类型stdio
    • 命令python
    • 参数/path/to/weather-by-met/server.py
    • 环境变量
      {
        "DB_HOST": "localhost",
        "DB_USER": "root",
        "DB_PASSWORD": "your_mysql_password",
        "DB_NAME": "weather_by_met"
      }
      

步骤 5.3:重启 Cline

  • 点击 Cline 图标以重启
  • 或重新加载 VSCode 窗口(Cmd+Shift+P → "重新加载窗口")

路径示例(替换为您实际路径):

  • macOS/Users/john/weather-by-met/server.py
  • WindowsC:\Users\john\weather-by-met\server.py
  • Linux/home/john/weather-by-met/server.py

步骤 6:测试一下!

尝试询问您的 AI 助手:

"今天吉隆坡的天气怎么样?"
"给我彭亨的3天预报"
"显示本周日兰卡威的天气"

您应该能看到真实的天气数据!🎉

每个文件的作用

文件目的
server.pyMCP 服务器 - 您的 AI 助手连接到此
scheduler.py在后台运行 - 每15分钟获取一次天气数据
init_db.py一次性设置 - 初始化 MySQL 数据库
.env您的配置 - 数据库凭证(不要提交!)
.env.example模板展示 .env 应包含的内容

重要配置细节

  • "command": "python" - 告诉您的 MCP 客户端运行 Python
  • "args" - 到 server.py 的完整绝对路径(不是相对路径如 ./server.py
  • "env" - 传递给服务器的环境变量
    • DB_HOST:MySQL 运行的位置(通常为 localhost
    • DB_USER:MySQL 用户名(默认为 root
    • DB_PASSWORD:您在 MySQL 安装期间设置的密码
    • DB_NAME:数据库名称(保留为 weather_by_met

验证您的路径是否正确

# 运行此命令检查您的 weather-by-met 路径
ls -la /path/you/entered/server.py
# 应显示:server.py(而不是说“没有这样的文件或目录”)

🛠️ 可用工具

您的 MCP 客户端可以使用这些工具来获取天气数据:

1. check_weather_today

检查特定马来西亚地点的今日天气预报

何时使用:当询问今日天气且未提及具体时间段时(例如,“今天的天气怎么样?”、“告诉我吉隆坡的天气”)。

参数

  • location_query(字符串,可选):地点名称(例如城市、城镇、州)。如果没有提供,您的 AI 助手可能会使用设备/浏览器位置(如果可用)。

返回

  • 以 JSON 格式返回马来语天气预报,包括早晨、下午和夜晚的预报
  • 包含今天的日期

示例

"今天兰卡威的天气怎么样?"
"告诉我吉隆坡的天气"
"今天雪兰莪的天气怎么样?"

2. check_7day_forecast

获取马来西亚地点的自定义时间段或特定日期天气预报

两种模式可用

模式 1:时间段(使用 days 参数)

当请求特定时间段时使用(例如,“给我2天预报”,“明天的天气怎么样?”,“显示下周的天气”)。

参数

  • location_query(字符串,可选):地点名称(例如城市、城镇、州)。如果没有提供,您的 AI 助手可能会使用设备/浏览器位置(如果可用)。
  • days(整数):天数(1-7)。您的 AI 助手从用户的时段查询中提取此值。

预报语义(与 MET 马来西亚的定义一致):

  • days=1(“明天”):仅返回明天的预报
  • days=2+(“N天预报”):返回今天加上接下来的(N-1)天(包括今天作为第1天)
    • “2天预报” → 今天 + 明天
    • “7天预报” → 今天至第7天(符合 MET 的官方7天预报)

示例

"明天下龙的天气怎么样?"
→ 仅返回明天

"给我兰卡威的2天预报"
→ 返回今天 + 明天

"显示吉隆坡的7天预报"
→ 返回今天至第7天

模式 2:特定日期(使用 specific_day_name 参数)

当请求特定日期时使用(例如,“这个星期天的天气怎么样?”、“显示下个星期二的天气”,“星期三会怎样?”)。

参数

  • location_query(字符串,可选):地点名称(例如城市、城镇、州)。如果没有提供,您的 AI 助手可能会使用设备/浏览器位置(如果可用)。
  • specific_day_name(字符串):日期名称(例如 '星期天'、'星期一'、'星期二' 等)。您的 AI 助手从用户的查询中提取此值。

返回仅返回所请求日期的预报

示例

"这个星期天雪兰莪的天气怎么样?"
→ 仅返回星期天的预报

"显示下个星期二的天气"
→ 仅返回星期二的预报

"星期三吉隆坡会怎样?"
→ 仅返回星期三的预报

返回(两种模式):

  • 以 JSON 格式返回马来语天气预报
  • 包含每个预报日期的星期几

响应格式: 您的 AI 助手以紧凑易读的格式呈现 JSON 数据,按日期分组:

周五,11月7日 - 23-32°C
柔佛(一般):
  早晨:内陆地区有雨
  下午:雷暴
  夜间:无雨
柔佛巴鲁:
  早晨:有雨
  下午:无雨
  夜间:无雨

周六,11月8日 - 23-32°C
柔佛(一般):
  早晨:无雨
  下午:雷暴
  夜间:无雨
柔佛巴鲁:
  早晨:无雨
  下午:雷暴
  夜间:无雨

总结:[天气模式分析]

重要说明

  • 您的 AI 助手按工具返回的所有日期的确切顺序显示

    • 对于“2天预报” → 显示今天 + 明天(例如,周五 + 周六)
    • 对于“明天” → 仅显示明天(例如,周六)
    • 助手不会跳过今天或重新解释返回的日期
  • 数据可用性:此工具仅提供从今天起的预报

    • 过去的历史天气数据不可用
    • 如果用户询问“昨天的天气怎么样?”或类似问题,助手应告知他们只有当前和未来的预报可用

所有地点都包含在每个日期中,其早晨、下午和夜晚的预报分别显示以提高清晰度。

🔄 自动任务

任务 1:更新天气预报(每15分钟)

自动从 MET 马来西亚 API 获取最新天气预报数据。

  • 频率:每15分钟
  • APIhttps://api.data.gov.my/weather/forecast
  • 动作:插入新记录或更新现有记录

任务 2:清理旧记录(每天凌晨12:05)

删除过时的天气预报记录。

  • 频率:每天凌晨12:05(马来西亚时间,GMT+8)
  • 动作:删除 forecast_date < today 的记录

🌐 数据来源

⚙️ 配置

环境变量

变量描述默认值是否必需
DB_HOSTMySQL 主机localhost
DB_USERMySQL 用户root
DB_PASSWORDMySQL 密码(空)
DB_NAME数据库名称weather_by_met
TELEGRAM_BOT_TOKENTelegram 机器人 API 令牌(空)
TELEGRAM_CHAT_IDTelegram 聊天 ID 用于警报(空)

Telegram 警报设置(可选)

当调度器作业遇到问题时,通过 Telegram 接收错误警报:

  1. 创建 Telegram 机器人

    • 打开 Telegram 并消息 @BotFather
    • 发送 /newbot 并按照指示操作
    • 复制提供的 API 令牌
  2. 获取您的聊天 ID

    • 创建一个私人的 Telegram 群组或与您的机器人直接对话
    • 向群组发送一条测试消息
    • 将消息转发给 @userinfobot
    • 记录聊天 ID(群组的负数)
  3. 配置环境变量

    # 添加到您的 .env 文件:
    TELEGRAM_BOT_TOKEN=your_bot_token_here
    TELEGRAM_CHAT_ID=your_chat_id_here
    
  4. 如何工作

    • 调度器作业(天气更新、记录清理)中的错误触发 Telegram 警报
    • 成功的操作静默运行(无警报)
    • 每个警报包含作业名称、时间戳和错误详情
    • 如果凭据缺失,调度器将继续正常工作

🎉