🌦️ 马来西亚气象MCP服务器
一个生产就绪的MCP(模型上下文协议)服务器,将实时马来西亚天气预报带给您最喜欢的人工智能助手。
该项目实现了一个本地MCP服务器,该服务器从MET Malaysia的API获取实时天气数据,并将其与任何兼容MCP的客户端(Claude Desktop、Cursor、Cline等)无缝集成。用户可以用自然语言向他们的人工智能助手询问马来西亚的天气情况,它将使用此服务器获取准确、最新的预报。
什么是MCP?
模型上下文协议(MCP) 是一个允许AI助手与外部工具和服务交互的标准。通过将此MCP服务器与您的AI助手集成,您可以使其:
- 查询实时天气数据
- 访问马来西亚任何地点的当前和未来预测
- 在自然对话中提供天气信息
- 使用天气数据为响应和建议提供信息
这个项目做什么
- 获取天气数据:马来西亚气象局每15分钟自动更新一次马来西亚天气预报
- 显示MCP工具:提供两个工具(
check_weather_today,check_7day_forecast)你的人工智能助手可以打电话 - 管理数据:将预测存储在本地MySQL数据库中,并自动清理
- 本地运行:所有内容都在您的机器上运行,不依赖于云
- 适用于任何MCP客户端:在你最喜欢的人工智能工具中添加一个简单的配置,开始询问天气!
快速概览
┌─────────────────────────────────────────────────────┐
│ Your Local Machine │
├─────────────────────────────────────────────────────┤
│ Your MCP Client (Claude, Cursor, Cline, etc) │
│ ↓ │
│ MCP Server (weather-by-met) ← This Project │
│ ├─ server.py (MCP server) │
│ ├─ scheduler.py (Updates weather data) │
│ └─ MySQL DB (Stores forecasts) │
│ ↓ │
│ MET Malaysia API (weather data source) │
└─────────────────────────────────────────────────────┘
User: "What's the weather in Kuala Lumpur?"
↓
AI asks MCP Server → MCP queries database → AI responds🎯 特性
- 实时天气数据:每15分钟自动获取一次天气预报
- 7天预测:提前7天获取预测
- 多位置支持:查询马来西亚各州、地区、城镇、娱乐中心和部门的天气
- AI友好格式:返回适用于任何AI助手的结构化数据
- 优化数据库:高效的MySQL存储,自动清理旧记录
- 电报警报:错误通知发送到您的Telegram频道,以便立即发现
- 生产准备就绪:全面的错误处理和记录
🚀 快速开始
5分钟后起床跑步!这将在您的计算机上本地设置所有内容。
先决条件
在开始之前,请确保您已经:
- 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数据库
# Create a .env file from the template
cp .env.example .env现在编辑 .env 使用您的MySQL凭据:
# macOS/Linux
nano .env
# Windows - use Notepad or your editor的内容 .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] Starting scheduler...
[2025-11-10 10:30:05] ✓ Fetched weather for 38 locations
[2025-11-10 10:30:07] ✓ Scheduler ready - will update every 15 minutes保持此终端运行 在背景中。它将:
- 立即获取天气数据
- 每15分钟自动更新一次
- 每天上午12:05(马来西亚时间)清理旧记录
步骤5:配置MCP客户端
在下面选择您的MCP客户端,并按照配置步骤进行操作。
选项A:克劳德桌面
步骤5.1:打开配置文件
macOS/Linux:
nano ~/Library/Application\ Support/Claude/claude_desktop_config.json视窗: 打开 %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:重新启动克劳德桌面
- 完全关闭应用程序
- 等待2秒,然后重新打开
______________________________________________________________________
选项B:光标IDE
步骤5.1:打开光标设置
- 打开光标设置(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:重新启动游标
- 完全关闭光标
- 重新打开应用程序
______________________________________________________________________
选项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 - 视窗:
C:\Users\john\weather-by-met\server.py - Linux:
/home/john/weather-by-met/server.py
第六步:测试一下!
试着问你的人工智能助手:
"What's the weather in Kuala Lumpur today?"
"Give me a 3-day forecast for Penang"
"Show me weather for this Sunday in Langkawi"你应该看到真实的天气数据! 🎉
每个文件的作用
| 文件 | 目的 |
|---|---|
server.py | MCP服务器-您的AI助手连接到此服务器 |
scheduler.py | 在后台运行-每15分钟获取一次天气数据 |
init_db.py | 一次性设置-初始化MySQL数据库 |
.env | 您的配置-数据库凭据(不要提交!) |
.env.example | 显示内容的模板 .env 应包含 |
重要配置细节
"command": "python"-告诉您的MCP客户端运行Python"args"-完整的绝对路径server.py(不是相对路径./server.py)"env"-传递给服务器的环境变量
- DB_HOSTMySQL在哪里运行(通常 localhost) - DB_USER:MySQL用户名(默认为 root) - DB_PASSWORD:MySQL安装时设置的MySQL密码 - DB_NAME:数据库名称(保留为 weather_by_met)
验证您的路径是否正确:
# Run this to check your weather-by-met path
ls -la /path/you/entered/server.py
# Should show: server.py (and not say "No such file or directory")🛠️ 可用工具
您的MCP客户端可以使用这些工具获取天气数据:
1.今天检查
检查 今天的天气预报 针对马来西亚的特定地点。
使用时当询问今天的天气时 未提及具体时间表 (例如,“今天天气怎么样?”,“告诉我吉隆坡的天气”)。
参数:
location_query(字符串,可选):位置名称(例如,城市、城镇、州)。如果没有提供,您的AI助手可能会使用设备/浏览器位置(如果可用)。
退货:
- JSON格式的天气数据,包含马来语早上、下午和晚上的预报
- 包括今天的星期几
例子:
"What's the weather in Langkawi today?"
"Tell me the weather in Kuala Lumpur"
"What's the weather in Selangor today?"2.检查\_ 7天_预测
获取 自定义时间范围或特定日期的天气预报 马来西亚的地点。
有两种模式可供选择:
模式1:时间框架(使用 days 参数)
在特定情况下使用 时间范围 被要求(例如,“给我一个两天的天气预报”,“明天天气怎么样?”,“告诉我下周的天气”)。
参数:
location_query(字符串,可选):位置名称(例如,城市、城镇、州)。如果没有提供,您的AI助手可能会使用设备/浏览器位置(如果可用)。days(int):天数(1-7)。您的AI助手从用户的时间段查询中提取此信息。
预测语义 (与MET马来西亚的定义一致):
days=1(“明天”):返回 只有明天的预报days=2+(“N天预测”):回报 今天+接下来(N-1)天 (包括今天作为第一天)
- “2天预报”→ 今天+明天 - “7天预报”→ 从今天到第7天(与MET的官方7天预测相匹配)
例子:
"What's the weather tomorrow in Penang?"
→ Returns only tomorrow
"Give me a 2-day forecast for Langkawi"
→ Returns today + tomorrow
"Show me a 7-day forecast for Kuala Lumpur"
→ Returns today through day 7模式2:特定日期(使用 specific_day_name 参数)
使用时 特定日期 被要求(例如,“这个星期天的天气怎么样?”,“给我看看下周二的天气”,“周三会怎么样?”)。
参数:
location_query(字符串,可选):位置名称(例如,城市、城镇、州)。如果没有提供,您的AI助手可能会使用设备/浏览器位置(如果可用)。specific_day_name(string):日期名称(例如,“周日”、“周一”、“周二”等)。您的AI助手从用户的查询中提取此信息。
退货: 仅提供所要求的当天预报
例子:
"What's the weather for this Sunday in Selangor?"
→ Returns ONLY Sunday's forecast
"Show me weather for next Tuesday"
→ Returns ONLY Tuesday's forecast
"How will it be on Wednesday in Kuala Lumpur?"
→ Returns ONLY Wednesday's forecast退货 (两种模式):
- JSON格式的天气数据与马来预报
- 包括每个预测日期的星期几
响应格式: 您的AI助手以紧凑、易于阅读的格式按日期分组显示JSON数据:
Friday, Nov 7 - 23-32°C
Johor (General):
Morning: Rain in inland areas
Afternoon: Thunderstorms
Night: No rain
Johor Bahru:
Morning: Rain
Afternoon: No rain
Night: No rain
Saturday, Nov 8 - 23-32°C
Johor (General):
Morning: No rain
Afternoon: Thunderstorms
Night: No rain
Johor Bahru:
Morning: No rain
Afternoon: Thunderstorms
Night: No rain
Summary: [Weather pattern analysis]重要说明:
- 您的AI助手显示 工具按收到的确切顺序返回的所有日期
- “2天预报”→ Shows 今天+明天 (例如,周五+周六) - 仅限“明天”→ Shows 只有明天 (例如,星期六) - 助理不会跳过今天或重新解释返回的日期
- 数据可用性:该工具仅提供以下预测 从今天开始
- 过去/历史天气数据为 无法使用的 - 如果用户问“昨天天气怎么样?”或类似问题,助手应通知他们只有当前和未来的预报可用
为了清楚起见,每个日期的所有地点都包括在单独的行中显示其上午、下午和晚上的预报。
🔄 自动化作业
作业1:更新天气预报(每15分钟一次)
自动从马来西亚气象局API获取最新天气预报数据。
- 频率:每15分钟
- API:
https://api.data.gov.my/weather/forecast - 行动:插入新记录或更新现有记录
工作2:清理旧记录(每天凌晨12:05)
删除过时的天气预报记录。
- 频率:每日凌晨12:05(马来西亚时间,GMT+8)
- 行动:删除以下记录
forecast_date < today
🌐 数据源
- 提供者:MET马来西亚(马来西亚气象局)
- 官方门户: https://www.met.gov.my/
- API文档: https://developer.data.gov.my/realtime-api/weather
⚙️ 配置
环境变量
| 变量 | 描述 | 默认值 | 必填 |
|---|---|---|---|
DB_HOST | MySQL主机 | 本地主机 | 是 |
DB_USER | MySQL用户 | root | 是 |
DB_PASSWORD | MySQL密码 | (空) | 是 |
DB_NAME | 数据库名称 | weather_by_met | 是 |
TELEGRAM_BOT_TOKEN | 电报机器人API令牌 | (空) | 否 |
TELEGRAM_CHAT_ID | 用于提醒的电报聊天ID | (空) | 否 |
电报警报设置(可选)
当调度程序作业遇到问题时,通过Telegram接收错误警报:
- 创建Telegram Bot:
- 打开电报和消息 @植物学家 - 发送 /newbot 并遵循指示 - 复制提供的API令牌
- 获取您的聊天ID:
- 创建一个私人Telegram群组或与您的机器人使用直接消息 - 向组发送测试消息 - 将邮件转发至 @用户信息机器人 - 注意聊天ID(群组为负数)
- 配置环境变量:
# Add to your .env file:
TELEGRAM_BOT_TOKEN=your_bot_token_here
TELEGRAM_CHAT_ID=your_chat_id_here- 运作原理:
- 调度程序作业中的错误(天气更新、记录清理)会触发Telegram警报 - 成功的操作以静默方式运行(无警报) - 每个警报都包括作业名称、时间戳和错误详细信息 - 如果缺少凭据,调度程序将继续正常工作
🎉 试试看
配置后,请使用您的AI助手尝试以下操作:
"What's the weather in Kuala Lumpur today?"
"Give me a 3-day forecast for Penang"
"Show me today's weather for all Malaysian states"
"What's the weather like in Langkawi this week?"🌐 语言支持
服务器返回马来西亚气象局提供的马来语天气数据。你的人工智能助手懂马来语,会:
- 自动将预测翻译成您的首选语言
- 提供上下文感知的天气解释
- 用任何语言回答有关天气的后续问题
与固定的服务器端翻译相比,这种方法提供了更好的多语言支持。
🧪 测试
通过测试组件验证一切正常:
1.测试数据库连接:
python init_db.py
# Should show: "Database connection successful" or create/verify the schema2.测试服务器 (在新航站楼中):
python server.py
# Should start the MCP server without errors3.测试调度器 (在另一个终端中):
python scheduler.py
# Should fetch initial weather data and show:
# "✓ Fetched weather for X locations"4.使用您的MCP客户端进行测试:
- 问你的人工智能助理:“吉隆坡的天气怎么样?”
- 应返回数据库中的真实天气数据
📝 日志记录和警报
调度程序将所有操作记录到 weather_scheduler.log:
# View logs
tail -f weather_scheduler.log
# View last 100 lines
tail -n 100 weather_scheduler.log
# Monitor Telegram alerts
grep "✉️" weather_scheduler.log日志条目:
- ✅ 在INFO级别记录成功操作
- ⚠️ 错误级别记录的错误
- ✉️ 成功发送时确认电报警报
🚨 故障排除
数据库连接失败
# Check MySQL is running
sudo systemctl status mysql
# Test connection
mysql -u root -p -e "SELECT 1;"无天气数据
# Check scheduler is running
ps aux | grep scheduler.py
# Check logs
tail -f weather_scheduler.log电报警报不起作用
验证是否设置了凭据:
# Check if credentials exist in .env
grep TELEGRAM .env检查Telegram机器人令牌:
- 确保从@BotFather正确复制令牌
- 确保机器人已启动(@BotFather
/start)
验证聊天ID:
- 确保聊天ID正确(组为负数)
- 通过手动向组发送消息进行测试
在日志中查看Telegram发送尝试:
# See if Telegram sends were attempted
grep -i "telegram\|✉️" weather_scheduler.log缺少Telegram凭据?:
- 如果
TELEGRAM_BOT_TOKEN和TELEGRAM_CHAT_ID如果为空,则调度程序仍将正常工作 - 警报被简单地禁用;不会发生错误
📜 许可证
MIT许可证-有关详细信息,请参阅许可证文件。
数据由马来西亚气象局通过马来西亚开放API倡议提供。
🙏 致谢
- MET马来西亚 -提供免费天气API
- Anthropic -对于FastMCP框架
- 马来西亚政府 -开放数据倡议
📚 文档
- MCP_CLIENT_SETUP.md -Claude Desktop、Cline和其他MCP客户端的设置指南
- 贡献.md -如何为这个项目做出贡献
- 代码_OF_CONDUCT.md -社区指南
所有时间都在 马来西亚时间(GMT+8)
