open-meteo-mcp-server について
open-meteo-mcp-serverは、天気や環境データを取得するMCPサーバーです。予報、過去データ、場所の検索を必要とするクライアント向けで、ステージ済みデータへの読み取り専用SQLにも対応します。
主な機能
- 01地名のジオコーディング
- 02予報と過去の気候データ
- 03海洋・大気質データ
- 04標高・アンサンブル・洪水・気候データ
- 05ステージ済みデータへの読み取り専用SQL
活用シーン
- 01地名を指定して予報を取得
- 021940年以降の気象データを確認
- 03海洋状況や大気質を確認
- 04ステージ済み気象データをSQLで照会
MCP 対応
天気、ジオコーディング、標高、データフレームを扱う12種類のツールをMCPクライアントに公開します。STDIOとStreamable HTTPに対応し、公開ホストサーバーもあります。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://open-meteo.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-open-meteo https://open-meteo.caseyjhand.com/mcp{"mcpServers":{"cyanheads-open-meteo":{"type":"http","url":"https://open-meteo.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-open-meteo":{"type":"http","url":"https://open-meteo.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-open-meteo":{"type":"http","url":"https://open-meteo.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-open-meteo":{"serverUrl":"https://open-meteo.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
11| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| name | string | はい | 検索する地名です。修飾語を付けない都市、地域、ランドマークを指定してください("Seattle"、"Mount Rainier")。地域や国の修飾語を含めず("Baoding Hebei" ではなく "Baoding")、country 入力を使って候補を絞り込みます。1~2 文字の現地文字による地名("서울"、"大阪")では、完全な行政区名("서울특별시"、"大阪市")またはローマ字表記("Seoul"、"Osaka")が必要です。language フィールドを参照してください。天気ツールには座標が必要です。この結果の lat/lon を使用してください。 |
| count | integer | いいえ | 返す結果の最大数(1~10)。デフォルトは 5 です。"Springfield" や "Portland" のような一般的な地名を区別するには、より多くの結果を返してください。 |
| country | string | いいえ | 同名の場所を区別するための ISO 3166-1 alpha-2 国コード(例:"US"、"FR")。全世界を対象に検索する場合は省略してください。 |
| language | string | いいえ | 地名の照合と返却に使用する言語(ISO 639-1、例:"en"、"de"、"zh")。API はこの言語のローカライズ済みインデックスに対して name を照合するため、name の文字体系に合わせて設定してください。例:"上海"には言語 "zh"、"Москва"には "ru"。3 文字以上のネイティブ文字による名前は正規化されたプレフィックスで照合されます。1~2 文字の名前はインデックス項目と完全一致する必要があるため、言語を設定するだけでは "서울" や "大阪" は見つかりません。完全な行政区名("서울특별시"、"大阪市")またはローマ字表記("Seoul"、"Osaka")で再試行してください。デフォルトは "en" です。認識可能な非ラテン文字(CJK、ハングル、キリル文字、アラビア文字、ギリシャ文字、ヘブライ文字、タイ文字、デーヴァナーガリー文字)によるクエリが "en" で見つからない場合、文字体系から推定した言語で 1 回再試行します。再試行で結果が得られた場合、レスポンスの effective_language にその言語が示されます。 |
詳細
翻訳後に原文が更新されています。最新の内容は原文をご確認ください。
@cyanheads/open-meteo-mcp-server
MCP を介して、地名のジオコーディング、世界各地の天気予報、過去の気候、海洋状況、大気質、地形標高を取得できます。STDIO または Streamable HTTP に対応しています。
公開ホストサーバー: https://open-meteo.caseyjhand.com/mcp
概要
Open-Meteo の世界各地の気象情報を提供します。天気予報、1940 年までさかのぼる過去のデータ、海洋状況、大気質、確率アンサンブル、河川流量、気候予測に対応しています。地名で場所を検索し、時間別・日別の変数を取得して、大量の結果に対して SQL を実行できます。API キーは不要です。
ツール
| ツール | 説明 |
|---|---|
openmeteo_search_locations | 地名から、国、地域、タイムゾーン、人口を含む優先順位付きの座標を特定します |
openmeteo_get_forecast | 現在の状況と、最大 16 日先までの時間別・日別予報を取得します。過去 92 日分まで指定できます |
openmeteo_get_historical | 再解析アーカイブから、1940 年から現在までの時間別・日別の履歴を取得します |
openmeteo_get_marine | 波浪、うねり、海面の状況を取得します。最大 8 日先の予報、またはアーカイブ期間を指定できます |
openmeteo_get_air_quality | モデル化された CAMS の汚染物質、花粉、AQI を取得します。現在の値、最大 7 日先の予報、またはアーカイブ期間を指定できます |
openmeteo_get_elevation | 最大 100 組の座標について、Copernicus DEM の地形標高を取得します |
openmeteo_get_ensemble | 超過確率と不確実性の分析に向けて、メンバーごとのアンサンブル予報を取得します(最大 64 メンバー、最大 35 日先) |
openmeteo_get_flood | GloFAS の河川流量予報(最大 210 日先)、または 1984 年以降の再解析データを取得します |
openmeteo_get_climate | 最大 7 つのモデルによる、バイアス補正済みの日別 CMIP6 予測を取得します(1950~2050 年) |
openmeteo_dataframe_describe | DataCanvas に準備されたテーブルと列を一覧表示します |
openmeteo_dataframe_query | 準備されたテーブルに対して、読み取り専用の SQL SELECT を実行します |
openmeteo_dataframe_drop | DataCanvas から準備済みのテーブルまたはビューを 1 つ削除します(オプトイン) |
機能リファレンス
openmeteo_search_locations tool
- 場所の名前は「Paris, France」ではなく、単独の
name(「Paris」など)を指定します。任意でcountry(ISO 3166-1 alpha-2)とlanguage(デフォルトはen)を指定できます。countは1~10で、デフォルトは5です。 - 各結果には、座標、IANA
timezone、country/country_code、admin1/admin2、population、feature_codeが含まれます。一致する場所がない場合はno_resultsエラーになります。 - 上位の候補の人口が null または10万人未満の場合、
noticeで通知されます。これは、歴史的な別称(「Bangalore」「Calcutta」など)であることがよくあります。 enでネイティブスクリプトの検索に一致しなかった場合は、そのスクリプトが示す言語で1回再試行されます。再試行に成功すると、その言語がeffective_languageに示され(上海→zh)、結果は現地語で返されます。
openmeteo_get_forecast tool
current_variables、hourly_variables、daily_variablesのうち少なくとも1つを指定してください(各最大50項目)。forecast_daysは1~16(デフォルトは7)、past_daysは0~92(デフォルトは0)です。- 各タイムスタンプの
hourly/dailyレコードと、hourly_units/daily_unitsが返されます。current_variablesを指定すると、15分間隔のデータ(interval900)によるcurrentオブジェクトとcurrent_unitsも追加されます。 - 直近約5日間については、アーカイブのERA5コンポーネントに遅延があるため、
openmeteo_get_historicalよりpast_daysを優先してください。
openmeteo_get_historical tool
start_dateとend_date(YYYY-MM-DD、1940-01-01以降)が必須です。また、予報ツールと同じ名前のhourly_variables/daily_variablesのうち、少なくとも1つを指定してください。modelsを省略すると、Best Match(IFS HRES + ERA5 + ERA5-Land。データソースは日付によって異なります)が読み込まれます。modelsは最大8つ指定でき、データソースを固定できます。ERA5ファミリーは約5日遅れます。ecmwf_ifsに遅延はなく、cerraの対象範囲はヨーロッパのみです。- 出力には
modelsと返されたdate_rangeが含まれます。2つ以上のモデルを指定すると、各列にはモデル名のサフィックスが付きます。
openmeteo_get_marine tool
- 1回の呼び出しで指定できる期間は1つです。
forecast_daysは1~8(上流のデフォルトは7)で、past_daysは0~92です。または、2022年以降にさかのぼるアーカイブ期間としてstart_date/end_dateを指定します。両方を混在させるとforecast_window_conflictエラーになり、日付を片方だけ指定するとdate_range_incompleteエラーになります。 hourly_variables/daily_variables(波高、周期、方向、うねり、海面水温)のうち、少なくとも1つを指定してください。風雨から守られた水域では波高がほぼゼロになり、陸上の地点では null が返され(地点名はnoticeに記載されます)、外洋以外ではocean_current_velocityが null になります。
openmeteo_get_air_quality tool
- 1回の呼び出しで指定できる期間は1つです。
forecast_daysは1~7(上流のデフォルトは5)で、past_daysは0~92です。または、2022年8月以降のアーカイブ期間としてstart_date/end_dateを指定します(us_aqiは1日後から開始します)。海洋ツールと同じく、forecast_window_conflictおよびdate_range_incompleteの場合は拒否されます。 currentオブジェクト(interval3600)を返すcurrent_variables、またはhourly_variablesのうち、少なくとも1つを指定してください。対象はPM2.5、PM10、NO2、SO2、O3、CO、粉じん、花粉、欧州および米国のAQIです。花粉のモデルデータが提供されるのは、花粉シーズン中のヨーロッパのみです。それ以外の地域では null が返され、対象はnoticeに記載されます。data_source: "CAMS"は、すべての応答が観測所の測定値ではなく、モデルによるグリッドデータであることを示します。
openmeteo_get_elevation tool
- 最大100組の平行な
latitudes[]/longitudes[]配列を指定します。配列の長さが異なる場合はcoordinate_count_mismatchエラーになります。 elevations[]は入力順に並び、各要素はCopernicus DEM(約90 m)から取得した{ latitude, longitude, elevation_m }です。DEMに値がない場所(緯度90度)ではelevation_mがnullになりますが、呼び出し全体は失敗しません。
openmeteo_get_ensemble tool
hourly_variables/daily_variablesの少なくとも一方が必要です。forecast_daysは1~35(デフォルトは7)、past_daysは0~92です。ほとんどのモデルは16日以内に終了します(ncep_gefs05は約34日目まで実行されます)。それ以降の列はnullになり、データが終了する箇所はnoticeに記載されますmodelsには1つのアンサンブル名を指定します(例:ecmwf_ifs025_ensembleは51メンバー、gem_global_ensembleは21メンバー)。省略または空欄の場合はecmwf_ifs025_ensembleが選択され、modelに返されます- 各変数は最大64メンバー分の列(
temperature_2m_member01、…)として返されます。member_countにはコントロールランは含まれません。対象範囲外で地域モデルを照会すると、再試行できない入力エラーになります。グローバルモデルに切り替えてください
openmeteo_get_flood tool
daily_variablesが必須です(最大20個)。すべて単位はm³/sです。river_dischargeに加え、統計値river_discharge_mean/_median/_min/_max/_p25/_p75を指定できます。これらの統計値が予測モードでばらつきを表すのは予測モードのみです(再解析ではriver_dischargeと同じ値が繰り返されます)- 1回の呼び出しにつき、モードは1つです。
forecast_daysは1~210、または1984-01-01以降の再解析期間としてstart_date/end_dateを指定します。両方を混在させるとforecast_days_conflict、日付を片方だけ指定するとdate_range_incompleteで失敗します - 流量は、必ずしも最も近い川ではなく、5 km以内でモデル化された最も大きな川のデータを使用します。値が不自然な場合は、座標を約0.1°ずらしてください。GloFASの対象範囲外ではnullになります
openmeteo_get_climate tool
start_date/end_dateは1950-01-01~2050-12-31の範囲で指定し、daily_variablesは必須です(APIは日単位のみ対応)。CMIP6のmodelsは最大7つ指定できます。例:CMCC_CM2_VHR4、MRI_AGCM3_2_S- 2つ以上のモデルを指定すると、各変数名にモデル名が接尾辞として付きます。モデルが1つの場合、または省略した場合は、接尾辞のない名前が返されます。モデルに存在しない変数はnullになります
openmeteo_dataframe_describe tool
- データがスピルされた天気ツールから返された
canvas_idを受け取ります。各テーブルのname、kind、row_count、列(名前、型、null許容性)に加え、キャンバスのexpires_atを一覧表示します - キャンバスが無効な場合は
canvas_not_enabled、IDが不明または24時間のスライディングTTLを過ぎている場合はcanvas_not_foundで失敗します
openmeteo_dataframe_query tool
canvas_idと、ステージングされたtable_nameに対する読み取り専用のSELECTを指定します。rowsには最大100行が格納されます。ただし、行幅が広く、インライン出力上限の80,000文字を超える場合は、それより少ない行数になります(値が切り詰められることはありません)。row_countは正確な合計です。ORDER BYを指定し、OFFSET <rows.length>でページングしてください- 件数の取得に失敗するか5秒を超えると、行は引き続き返されますが、
row_countは下限値となり、count_errorに理由(例:count_timeout)が記載されます canvas_not_enabled、canvas_not_found、missing_table、system_catalog_access(システムカタログへのアクセスは禁止されています)、またはrow_too_large(最初の1行だけで上限を超える場合。列を減らすか、left()、substr()、list_slice()で値を短くしてください)で失敗します
openmeteo_dataframe_drop tool
- デフォルトでは無効です。
OPENMETEO_DATAFRAME_DROP_ENABLED=trueになるまでは無効として一覧表示されます canvas_idと、openmeteo_dataframe_describeから取得した正確なtable_nameを指定します。そのテーブルまたはビューを1つ削除し、droppedとremaining_tablesを返します。ステージングされていない名前を指定するとdropped: falseが返されるため、同じ削除を繰り返しても安全ですcanvas_not_enabled、canvas_not_found、またはinvalid_table_name(通常のSQL識別子ではない、または予約語)で失敗します
機能
@cyanheads/mcp-ts-core を基盤としており、stdio および Streamable HTTP トランスポート、切り替え可能な認証(none / jwt / oauth)、交換可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレースに対応した構造化ログを備えています。
Open-Meteo 固有の機能:
- 非商用利用では API キーは不要です。商用利用には Open-Meteo の有料 API ティアが必要です。
- 列指向の API レスポンスを、
*_unitsマップを含むタイムスタンプごとのレコードに再構成します。予報とアーカイブで同じ変数名を使用します。 - 7 つの気象ツールでは DataCanvas へのスピルオーバーに対応しています。
CANVAS_PROVIDER_TYPE=duckdbの場合、予算を超えた結果は DuckDB テーブルとして一時保存されます(レスポンスにはcanvas_id、table_name、truncated: trueが含まれます)。既定のnoneの場合は、上限付きのプレビューを返し、truncated: trueを設定します。 - 過去データ、アンサンブル、気候の各ツールにおける
modelsは許可リストではありません。そのため、Open-Meteo が後から追加するモデルも、サーバーを更新せずに利用できます。
エージェントに使いやすい出力:
- ロケーション優先のワークフロー:
openmeteo_search_locationsは座標とともに IANA のtimezoneを返すため、あらゆる気象ツールのtimezone入力にそのまま指定できます(既定値はauto)。 - 型付きの拒否理由:
variable_wrong_cadence(正しいフィールド名を示します)、request_too_large(絞り込む入力項目を示します)、rate_limitedを返します。最初に再試行されるのはToo many concurrent requestsのみです。 - リクエスト URL は、エラーデータにもクライアントから見えるログにも表示されません。
- データだけでは分からない情報を、レスポンスごとに 1 件の
noticeで知らせます。提供されない変数名、データセットの対象範囲外での null、およびスピルオーバーした行の保存先が含まれます。
はじめに
公開ホストインスタンス
公開インスタンスは https://open-meteo.caseyjhand.com/mcp で利用できます。インストールは不要です。Streamable HTTP 経由で任意の MCP クライアントを接続してください。
{
"mcpServers": {
"open-meteo-mcp-server": {
"type": "streamable-http",
"url": "https://open-meteo.caseyjhand.com/mcp"
}
}
}
セルフホスト/ローカル
以下を MCP クライアントの設定ファイルに追加してください。
{
"mcpServers": {
"open-meteo-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/open-meteo-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または、npx を使用します(Bun は不要です)。
{
"mcpServers": {
"open-meteo-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/open-meteo-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
または、Docker を使用します。
{
"mcpServers": {
"open-meteo-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/open-meteo-mcp-server:latest"]
}
}
}
Streamable HTTP を使用する場合は、トランスポートを設定してサーバーを起動してください。
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
前提条件
- Bun v1.4.0 以降(または Node.js v24+)。
- API キーは不要です。非商用利用は無料で、API キーなしで利用できます。
- 商用利用には Open-Meteo の有料 API ティア が必要です。
インストール
- リポジトリをクローンします:
git clone https://github.com/cyanheads/open-meteo-mcp-server.git
- ディレクトリに移動します:
cd open-meteo-mcp-server
- 依存関係をインストールします:
bun install
設定
すべての変数は任意です。
| 変数 | 説明 | デフォルト |
|---|---|---|
OPEN_METEO_API_BASE_URL | 予報および標高 API のベース URL です。 | https://api.open-meteo.com |
OPEN_METEO_ARCHIVE_BASE_URL | 過去データアーカイブ API のベース URL です。 | https://archive-api.open-meteo.com |
OPEN_METEO_MARINE_BASE_URL | 海洋 API のベース URL です。 | https://marine-api.open-meteo.com |
OPEN_METEO_AIR_QUALITY_BASE_URL | CAMS 大気質 API のベース URL です。 | https://air-quality-api.open-meteo.com |
OPEN_METEO_GEOCODING_BASE_URL | ジオコーディング API のベース URL です。 | https://geocoding-api.open-meteo.com |
OPEN_METEO_ENSEMBLE_BASE_URL | アンサンブル API のベース URL です。 | https://ensemble-api.open-meteo.com |
OPEN_METEO_FLOOD_BASE_URL | GloFAS 洪水 API のベース URL です。 | https://flood-api.open-meteo.com |
OPEN_METEO_CLIMATE_BASE_URL | CMIP6 気候 API のベース URL です。 | https://climate-api.open-meteo.com |
CANVAS_PROVIDER_TYPE | duckdb は予算を超えた気象データの結果を DataCanvas にステージングし、データフレームツールを有効にします。none は上限付きのプレビューを返します。 | none |
OPENMETEO_DATAFRAME_DROP_ENABLED | true にすると openmeteo_dataframe_drop を呼び出せるようになります。それ以外の場合は無効として一覧に表示されます。 | false |
MCP_TRANSPORT_TYPE | トランスポート:stdio または http です。 | stdio |
MCP_HTTP_PORT | HTTP サーバーのポートです。 | 3010 |
MCP_SESSION_MODE | HTTP セッションモード:stateless、stateful、または auto です。 | stateless |
MCP_AUTH_MODE | 認証:none、jwt、または oauth です。 | none |
MCP_LOG_LEVEL | ログレベル(debug、info、notice、warning、error)です。 | info |
LOGS_DIR | ログファイルのディレクトリです(Node.js のみ)。 | <project-root>/logs |
STORAGE_PROVIDER_TYPE | ストレージバックエンド:in-memory、filesystem、supabase、cloudflare-kv/r2/d1 です。 | in-memory |
OTEL_ENABLED | OpenTelemetry を有効にします。 | false |
任意のオーバーライドの全一覧については、.env.example を参照してください。
サーバーの実行
ローカル開発
-
本番バージョンをビルドして実行する:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdio -
チェックとテストを実行する:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite
Docker
docker build -t open-meteo-mcp-server .
docker run --rm -p 3010:3010 open-meteo-mcp-server
Dockerfile のデフォルトは HTTP トランスポート、ステートレスセッションモードで、ログは /var/log/open-meteo-mcp-server に出力されます。OpenTelemetry のピア依存関係はデフォルトでインストールされます。省略するには、--build-arg OTEL_ENABLED=false を指定してビルドしてください。
プロジェクト構成
| ディレクトリ | 用途 |
|---|---|
src/index.ts | createApp() のエントリーポイントです。ツールを登録し、Open-Meteo サービスと DataCanvas を初期化します。 |
src/config | サーバー固有の環境変数を解析し、Zod で検証します。 |
src/mcp-server/tools/definitions | ツール定義(*.tool.ts)を格納します。ツールごとに 1 ファイルです。 |
src/mcp-server/tools | 共通のツールヘルパーです。モデルカタログ、時間間隔の検証、列指向データの再構成、スピルオーバー、レスポンス通知が含まれます。 |
src/services/open-meteo | Open-Meteo API 用の HTTP クライアントです。リトライ、エラー分類、データ範囲不足の拒否を行います。 |
src/services/canvas-accessor.ts | スピルに対応するツールで共通利用する DataCanvas アクセサーです。 |
tests/ | 単体テスト、統合テスト、ファズテスト、スモークテストを格納します。 |
開発ガイド
開発ガイドラインとアーキテクチャルールについては、CLAUDE.md を参照してください。要点は次のとおりです。
- ハンドラーは例外をスローし、フレームワークが捕捉します。ツールのロジックで
try/catchを使わないでください。 - リクエスト単位のロギングには
ctx.logを、テナント単位のストレージにはctx.stateを使用してください。 - 新しいツールは
src/index.tsのtools[]配列に登録してください。 - 外部 API の呼び出しはラップしてください。生データを検証し、ドメイン型に正規化してから、出力スキーマに沿って返します。不足しているフィールドを捏造してはいけません。
クレジット
気象データは Open-Meteo.com によるもので、CC BY 4.0 のライセンスで提供されています。
貢献
問題の報告を歓迎します。提出前にチェックとテストを実行してください。
bun run devcheck
bun run test
ライセンス
Apache-2.0 — 詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。