天气数据服务

一个基于TypeScript/Node.js的天气数据服务,提供天气预报、雪况、空气质量指标和位置搜索功能,适用于AI助手集成。

  • by schlpbch
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 schlpbch/open-meteo-mcp-ts

使用说明

打开Meteo MCP TypeScript

TypeScript/Node.js的实现 模型上下文协议(MCP) 服务器 开放天气 天气数据。提供AI助手,如 克劳德提供全面的天气预报、雪况、空气质量 例如位置、度量和位置搜索能力。

现代堆栈:此TypeScript实现在Node.js 20 LTS+上运行 完全支持Docker。最初用Deno编写,迁移到Node.js(2026年2月) 为了更广泛的生态系统兼容性。早期版本可在 python.

特性

11 MCP工具

  • 🌤️ 天气预报:当前状况、小时和每日预报 (温度、降水、风、紫外线)
  • ❄️ 雪况:雪深、降雪量和适合滑雪的山地天气 度假村
  • 🌫️ 空气质量:空气质量指数(欧洲和美国)、污染物(PM2.5、PM10、O3、NO2)、紫外线 花粉数据索引
  • 🗺️ 位置搜索:使用模糊搜索和国家过滤的地理编码
  • 📊 天气警报:极端条件(热、冷、冷)的自动警报, 风暴、紫外线)
  • 🏔️ 瑞士地点:100多个瑞士城市和山区的预配置数据 通过
  • 📈 历史天气:用于分析的过去天气数据
  • 🌊 海洋条件:海洋天气、海浪、洋流
  • 🧭 舒适度指数:基于温度的人体舒适度计算, 湿度、风
  • 🌅 天文数据:日出、日落、黄金时段、蓝色时段
  • 🔀 位置比较:比较多个地点的天气

4 MCP资源

  • weather://codes -WMO天气代码参考(28个代码)
  • weather://parameters -可用的API参数文档
  • weather://aqi-reference -空气质量指数量表与健康 建议
  • weather://swiss-locations -100多个瑞士城市、山脉、滑雪胜地 坐标

3个MCP提示

  • 滑雪旅行天气 -滑雪旅行计划,包括雪况和度假村 建议
  • 计划户外活动 -天气感知活动规划(徒步旅行、骑自行车、, 等等)
  • 天气感知旅行 -结合天气的旅行计划

安装

先决条件

  • Node.js 20.0.0或更高
  • pnpm 8.0.0或更高版本(或npm/yarn)
  • 不需要API密钥(Open-Meteo是免费的)

本地设置

# Clone the repository
git clone https://github.com/schlp/open-meteo-mcp-ts.git
cd open-meteo-mcp-ts

# Install dependencies
pnpm install

# Run tests
pnpm test

# Start the server
pnpm start

用法

使用克劳德桌面

配置Claude Desktop以使用MCP服务器:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json 视窗: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "open-meteo": {
      "command": "node",
      "args": ["/path/to/open-meteo-mcp-ts/dist/main.js"]
    }
  }
}

或者使用Docker:

{
  "mcpServers": {
    "open-meteo": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "open-meteo-mcp:latest"]
    }
  }
}

重新启动Claude Desktop,天气工具将可用。

与MCP检查员一起

首先构建项目,然后进行交互式测试:

pnpm build
npx @modelcontextprotocol/inspector node dist/main.js

这将打开一个web界面来测试所有工具、资源和提示。

发展

可用命令

# Development with hot reload (tsx)
pnpm dev

# Run tests
pnpm test

# Watch mode for tests
pnpm test:watch

# Generate coverage report
pnpm coverage

# Linting (ESLint)
pnpm lint

# Format code (Prettier)
pnpm fmt

# Type checking (TypeScript)
pnpm check

# Build TypeScript to JavaScript
pnpm build

项目结构

open-meteo-mcp-ts/
├── src/
│   ├── main.ts          # Entry point (MCP server initialization)
│   ├── server.ts        # MCP tools, resources, prompts
│   ├── client.ts        # Open-Meteo API client
│   ├── models.ts        # Zod schemas and TypeScript types
│   ├── helpers.ts       # Utility functions
│   └── data/            # JSON resources
├── tests/               # Test suite (168 tests)
├── dist/                # Compiled JavaScript (generated)
├── .github/
│   └── workflows/       # CI/CD configuration
├── package.json         # Node.js/pnpm configuration
├── tsconfig.json        # TypeScript configuration
├── Dockerfile           # Docker image definition
├── docker-compose.yml   # Docker Compose configuration
├── DEPLOYMENT.md        # Deployment guide
└── README.md            # This file

部署

使用Docker部署以供生产使用。多阶段构建优化了安全性 以及尺寸。

快速入门-Docker

# Build the image
docker build -t open-meteo-mcp:latest .

# Run the container
docker run -it open-meteo-mcp:latest

# Or use Docker Compose
docker-compose up -d

快速入门-Node.js

# Install and build
pnpm install
pnpm build

# Run in production
pnpm start

# View logs
node dist/main.js

看 部署.md 包括Docker在内的详细说明, docker编写和裸Node.js选项。

测试

全部168项测试通过:

$ pnpm test
✔ 168 passed | ✖ 0 failed (1.1s)

测试覆盖率

  • 6测试:空气质量边缘案例
  • 21测试:API客户端(模拟)
  • 9测试:地理编码功能
  • 48测试:辅助功能
  • 12项测试:集成改进
  • 26测试:模型验证(Zod模式)
  • 22次测试:服务器集成(工具、资源、提示)
  • 24次测试:服务器工具调用处理程序(所有11个MCP工具)

API使用

示例:获取天气

import { OpenMeteoClient } from "./src/client.js";

const client = new OpenMeteoClient();

// Search for location
const location = await client.searchLocation("Zurich");
const zurich = location.results![0];

// Get weather forecast
const weather = await client.getWeather(
  zurich.latitude,
  zurich.longitude,
  7, // forecast days
  true, // include hourly
  "Europe/Zurich", // timezone
);

console.log(`Current temperature: ${weather.current_weather.temperature}°C`);
console.log(`Condition: ${weather.current_weather.weathercode}`);

示例:获取空气质量

const airQuality = await client.getAirQuality(
  47.3769, // Zurich latitude
  8.5417, // Zurich longitude
  5, // forecast days
  true, // include pollen
  "Europe/Zurich",
);

console.log(`European AQI: ${airQuality.current.european_aqi}`);
console.log(`PM2.5: ${airQuality.current.pm2_5} μg/m³`);

技术栈

  • 运行时: Node.js 20.0.0+(从Deno迁移, 2026年2月)
  • 包管理器: pnpm 8+
  • MCP-SDK: @模型上下文协议/sdk
  • 验证: 黄道带 模式
  • 日期/时间: 日期fns 和 日期fns tz
  • 构建:通过TypeScript tsc
  • 测试:Node.js本机测试运行器
  • 代码检查:ESLint与TypeScript插件
  • 格式化:更漂亮
  • HTTP客户端:带有gzip压缩的本机Fetch API
  • 部署:Docker(多阶段Alpine构建,200MB镜像)

演出

Python版本的主要改进:

  • ⚡ 响应时间加快50% (目标:≤125ms P95)
  • 💾 内存使用率降低30% (目标:≤70 MB)
  • 📊 吞吐量提高40% (目标:≥280 RPS)
  • 🚀 冷启动速度提高60% (目标:≤160ms)

看 docs/PERFORMANCE.md 详细的基准测试(即将发布 很快)。

迁移历史

python→ TypeScript(原始重写)

TypeScript实现与 Python版本:

特性 Python(FastMCP) TypeScript
MCP工具 11 11✅
MCP资源 4 4✅
MCP提示 3 3✅
测试 137 168✅
Gzip压缩 ✅ ✅

Deno → Node.js(2026年2月)

迁移到Node.js 20 LTS+以实现更广泛的生态系统兼容性:

特性 Deno(v4.0.0) Node.js(v4.1.0)
运行时 Deno 1.40+ Node.js 20 LTS+
包管理器 JSR/NMP pnpm/NMP
构建系统 esbuild tsc
测试运行器 deno测试 节点--测试
部署 Deno部署 Docker
测试计数 144 168✅

关键变化

  • 运行时:Deno→ Node.js 20 LTS+实现通用兼容性
  • 包管理器:迪诺→ pnpm用于性能和一致性
  • 构建:通过tsc进行TypeScript本机编译
  • 部署:Deno部署→ Docker(多阶段构建)
  • 命令行界面:deno任务命令→ pnpm命令
  • 重大变更:无-MCP协议完全兼容

贡献

欢迎投稿!拜托:

  1. 分叉存储库
  2. 创建要素分支(git checkout -b feature/amazing-feature)
  3. 提交更改(git commit -m 'Add amazing feature')
  4. 推送到分支(git push origin feature/amazing-feature)
  5. 打开拉取请求

开发指南

  • 遵循Prettier风格指南(pnpm fmt)
  • 为新功能添加测试
  • 更新文档
  • 确保所有测试通过(pnpm test)
  • 运行类型检查(pnpm check)
  • 跑linting(pnpm lint)

许可证

MIT许可证-请参阅 许可证 文件以获取详细信息。

致谢

相关项目

支持


建于❤️ Claude Code社区