mcpField
W
weather-skill

weather-skill

github.com/mateeb11その他0123 回インストール31 週間前に更新
リポジトリ

weather-skill について

Nominatimで場所をジオコーディングし、Open-Meteoから現在の天気、予報、過去の天気を取得するスキルです。エージェントによる場所と期間の特定を支援し、旅行の場合は服装の案内も加えます。

主な機能

  1. 01Nominatimによる場所のジオコーディング
  2. 02Open-Meteoからの天気取得
  3. 03現在・毎時・毎日のデータ
  4. 04過去の天気の検索
  5. 05旅行時の服装案内

活用シーン

  1. 01現在の天気と翌日の見通しの確認
  2. 02旅行に向けた毎時または複数日の予報比較
  3. 03場所を指定した直近の過去天気の確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mateeb11/weather-forecast --skill weather-skill

インストール後、Claude Code で/weather-skillを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

README.md
references/
clothing_guide.md
scripts/
fetch_weather.py
geocode.py

詳細

天気スキル

2つの無料 API を使用して、あらゆる場所の現在の天気と予報を提供します。

  • Nominatim(OpenStreetMap):場所のジオコーディング → scripts/geocode.py
  • Open-Meteo:気象データ → scripts/fetch_weather.py

ワークフロー

  1. ユーザーのリクエストを理解します。 場所、時間範囲、旅行を計画しているかどうかを抽出します。以下の例を参照してください。
  2. 場所をジオコーディングします。 scripts/geocode.py "<location>" を実行します。display_name、lat、lon、ambiguous フラグを含む JSON が返されます。曖昧な場合は、ユーザーに確認を求めます。
  3. 天気を取得します。 緯度・経度と適切なフラグを指定して scripts/fetch_weather.py を実行します。スクリプトの使用方法は以下を参照してください。
  4. ユーザーに回答します。 明確に要約して伝えます。出力例は以下を参照してください。
  5. 旅行の意図が検出された場合は、 references/clothing_guide.md も読み、関連する服装のアドバイスを含めます。

スクリプト

ジオコーディング:scripts/geocode.py

場所の文字列を座標に変換します。

python scripts/geocode.py "Tokyo"
python scripts/geocode.py "King Abdullah Financial District, Riyadh"
python scripts/geocode.py "Times Square, New York"

以下の JSON を返します。

{
  "display_name": "Tokyo, Japan",
  "lat": 35.6764,
  "lon": 139.6500,
  "importance": 0.82,
  "ambiguous": false
}

ambiguous が true の場合、alternatives リストが含まれます。どの場所を指しているのか、ユーザーに確認してください。

天気:scripts/fetch_weather.py

指定された座標の気象データを取得します。

# Current conditions only
python scripts/fetch_weather.py --lat 35.6764 --lon 139.65 --resolution current

# Hourly forecast (good for today, tomorrow, next 12 hours, specific day)
python scripts/fetch_weather.py --lat 35.6764 --lon 139.65 --resolution hourly

# Daily forecast (good for multi-day ranges, next week, etc.)
python scripts/fetch_weather.py --lat 35.6764 --lon 139.65 --resolution daily

# Custom timezone (default is "auto" which uses the location's timezone)
python scripts/fetch_weather.py --lat 35.6764 --lon 139.65 --resolution hourly --timezone Asia/Tokyo

# Include historical data when user asks about past weather
python scripts/fetch_weather.py --lat 35.6764 --lon 139.65 --resolution daily --past-days 7

解像度に応じて、meta、current、hourly、および/または daily セクションを含む JSON を返します。

JSON レスポンスの例(--resolution current):

{
  "meta": {
    "lat": 35.6764,
    "lon": 139.65,
    "timezone": "Asia/Tokyo",
    "resolution": "current",
    "forecast_days": 16,
    "past_days": 0
  },
  "current": {
    "time": "2026-02-25T14:00",
    "temperature_c": 12.3,
    "apparent_temperature_c": 10.8,
    "weather_code": 1,
    "weather_description": "Mainly clear",
    "wind_speed_kmh": 14.2,
    "humidity_pct": 48,
    "precipitation_mm": 0.0
  },
  "hourly": null,
  "daily": null
}

スクリプトは常に forecast_days=16(予報期間の上限)をリクエストします。 過去の天気をリクエストする場合にのみ、--past-days を使用してください(0..92)。


ユーザーリクエストの解釈方法

エージェントは、ユーザーの自然言語から次の3点を判断します。

1. 場所

クエリから地名を抽出します。例:

  • 「今のジェッダの天気」→ "Jeddah"
  • 「今週末のロンドンの予報」→ "London"
  • 「来週、東京に行きます」→ "Tokyo"
  • 「金曜日、アルウラはどれくらい風が強いですか?」→ "AlUla"

場所が指定されていない場合は、ユーザーに尋ねてください。

2. 時間範囲、解像度、過去の天気
ユーザーの表現解像度past_days備考
「今」/「現在」/時間の指定なしcurrent(今後24時間の時間別予報も含める)0予報リクエストでは常に16日分を使用します。
「今日」/「今夜」/「明日」/「明日の朝」hourly0特定の時間帯に答えるには、時間別データを使用します。
「今週末」/「金曜日」/「今後12時間の時間別予報」hourly0回答では、返された時系列データを絞り込みます。
「今後3日間」hourly0時間別データを要約します。
「今後7日間」/「来週」/「3月の第1週」daily0日別データから該当する日を要約します。
「3月」/「4月に」/「05/01 から 06/30」daily0予報期間を超える場合は、制限を明確に伝えます。
「過去の天気」/「過去3日間」/「昨日」daily(短い期間の場合は hourly)リクエストに応じて設定数字を指定せずに「過去」と言われた場合は、7 を既定値として使用します。

ユーザーはさまざまな形式(MM/DD、DD/MM、「May 1st」、「1 March」など)で日付を指定することがあります。文脈に基づいて解釈し、返された時系列データを適宜絞り込んでください。別の年が明示または示唆されていない限り、現在の年を使用します。

3日を超える範囲には daily、より短い範囲には hourly、現在の天気を尋ねるクエリには current を使用します(ただし、状況を補足するために時間別データも含めます)。

既定値(時間の指定なし):現在の状況と、今後24時間の時間別予報。

注意: 予報期間は16日間で固定です。過去の天気をリクエストする場合は、past_days(0..92)を使用してください。

3. 旅行の意図

ユーザーがどこかへ行く予定かどうかを検出します。次のようなキーワードを探します。 荷造りする、着る、旅行する、訪問する、行く、向かう、旅行、休暇、休日、外出、フライト、持っていくべきか

旅行の意図が検出された場合は、服装に関するアドバイスも含めます(以下を参照)。


出力例

例1:現在のシンプルな天気

ユーザー:「ジェッダの今の天気は?」

回答:

サウジアラビア、ジェッダの天気

現在は快晴で、気温は28°C(体感温度は30°C)です。北からの風は弱く、風速は12 km/h、湿度は45%です。降水の予報はありません。

今後数時間:

  • 午後3時:29°C、快晴、降水確率0%
  • 午後4時:28°C、晴れ時々曇り、降水確率0%
  • 午後5時:26°C、快晴、降水確率0% (以下同様...)
例2:週末の予報

ユーザー:「今週末のロンドンの天気予報」

回答:

英国、ロンドンの週末の天気予報

3月1日(土): 最高気温11°C、最低気温5°Cです。まとまった雨が予想されます(確率70%、約4mm)。風速は最大25 km/hです。

3月2日(日): 最高気温13°C、最低気温6°Cです。晴れ時々曇りで、降水確率は20%です。風は弱まり、風速は15 km/hです。

全体として、土曜日は雨ですが、日曜日には天気が回復し、雨が少なくなる見込みです。土曜日は傘をお持ちください。

例3:服装アドバイスを含む旅行計画

ユーザー:「来週、東京に行きます。何を持っていけばいいですか?」

回答:

日本、東京 — 来週の天気予報(3月3日~9日)

曜日最高気温最低気温天気降水確率風速
月12°C4°C晴れ時々曇り10%15 km/h
火10°C3°C小雨65%20 km/h
..................

服装のアドバイス: 寒い日が続き、週の半ばには雨が予想されます(最低気温は3°C前後)。以下をお持ちください。

  • 暖かい重ね着:フリースまたはウールのセーター+防寒ジャケット
  • 火曜日・水曜日用の防水ジャケットと傘
  • つま先が覆われた防水靴
  • 朝晩用のマフラーと薄手の手袋

参照:clothing_guide.md — セクション:寒い日、雨の日

例4:特定の気象条件についての質問

ユーザー:「金曜日のアルウラはどれくらい風が強くなりますか?」

回答:

サウジアラビア、アルウラの風予報 — 2月28日(金)

風速は午後の早い時間帯に最大35 km/hに達し、夕方には15 km/h前後まで落ち着く見込みです。朝の風は比較的弱く、約10 km/hです。

⚠️ 正午ごろはやや風が強くなる見込みです。飛ばされやすい物を固定し、屋外で過ごす場合はウインドブレーカーの着用をご検討ください。


警告

以下のような特筆すべき気象条件がある場合は、警告を含めてください。

  • 猛暑: 気温 ≥ 40°C
  • 極寒: 気温 ≤ -10°C
  • 強風: ≥ 50 km/h
  • 大雨: 降水量 ≥ 20mm

服装の案内

旅行の意図が検出された場合は、references/clothing_guide.mdを読み込み、回答に関連するアドバイスを含めてください。


エラー処理

  • 場所が見つからない: 市や国を追加するなど、より具体的に指定するようユーザーに尋ねてください。
  • 場所が曖昧: 候補を提示し、どれを指しているか尋ねてください。
  • API エラー/ネットワークがブロックされている: スクリプトはトレースバックの代わりに、次のJSONエラーエンベロープを返します。
    {
      "error": {
        "code": "NETWORK_UNAVAILABLE",
        "message": "Unable to reach remote weather service.",
        "details": "URLError: ...",
        "retryable": true,
        "hint": "Enable outbound network access or rerun with elevated permissions."
      }
    }
    
  • エラーコード:
    • INVALID_INPUT:ユーザー入力が不正です(past_daysが無効、場所が指定されていない、結果がない)。
    • NETWORK_UNAVAILABLE:上流の天気APIへのDNS解決/接続/タイムアウトの問題です。
    • UPSTREAM_API_ERROR:上流のHTTP/API応答に関する問題です。
  • 終了コード:
    • 0:成功。
    • 1:使用方法または入力検証の失敗。
    • 2:ネットワーク/上流APIの失敗。
  • 運用上の案内: サンドボックス内でネットワークがブロックされている場合は、権限の引き上げを依頼するか、外部インターネットにアクセスできる環境からスクリプトを実行してください。
  • 予報期間を超える場合: 16日間の制限を伝え、取得可能な情報を返してください。
  • 時刻が指定されていない場合: 現在から今後24時間を既定とします。

コメント