mcp-lab-jma
MCP server providing weather forecast, warnings, AMeDAS observations, and area search from Japan Meteorological Agency JSON APIs. It normalizes responses and supports Japanese place names.
README
mcp-lab-jma
気象庁の JSON API をラップする、ステートレスなリモート MCP サーバー。 天気予報・気象警報・アメダス実況・エリアコード検索の4ツールを、正規化済みの構造で提供する。
[!WARNING] これは試作(プロトタイプ)です。
- 気象庁の非公式 API に依存しています。
bosai配下の JSON は気象庁サイト自身のための 非公式なエンドポイントで、無保証・予告なく構造が変わり、災害時には通常と異なるデータ構造に なる可能性が報告されています。- 防災上の判断には使用しないこと。 本サーバーはデータの正確性・可用性を一切保証しません。 避難などの判断は、気象庁の公式サイトや自治体の情報に従ってください。
- 出典はすべて気象庁です(各レスポンスの
sourceフィールドに明記)。
特徴
- 完全ステートレス — MCP 2026-07-28 のステートレス core に準拠。
createMcpHandlerを使い、 セッションハンドシェイクやMcp-Session-Idを持ちません。Durable Object / KV / D1 / R2 を使わず、 キャッシュは Cache API のみ。 - シークレット不要 — 気象庁 API はキー不要。認証情報を一切持ちません。
- 入力を外部に出さない — 地名の解決はビルド時に同梱したエリア索引で行うため、ユーザーが入力した
地名文字列は気象庁側に送信されません(外部に出るのは6桁コード等のみ)。
アプリケーションログは出力せず(ユーザー入力を
consoleに出しません)、有効化しているのは プラットフォーム側の稼働メトリクスのみです。ユーザー入力は POST ボディで扱い URL のクエリ パラメータには載せないため、リクエスト URL のログに入力値が残ることもありません。 - 生 JSON を素通ししない —
timeSeriesの多重ネストやアメダスの[値, 品質フラグ]組を サーバー側で正規化し、欠測はnullで返します。
ツール
| ツール | 役割 |
|---|---|
get_forecast |
天気予報(range="3days" で3日 / range="week" で週間) |
get_warnings |
発表中の気象警報・注意報(種別で束ね、市町村を畳む) |
get_observation |
アメダス観測所の最新実況(1地点。観測所は名称・かなの前方一致で解決) |
list_areas |
地名からエリアコード候補を検索(supports で利用可能ツールを提示) |
- 地域は地名でもコードでも指定できます(例:
"愛知県"/"名古屋市"/"230000")。 ただし解決先はツールごとに異なり、get_forecast/get_warningsは予報区・市町村、get_observationは アメダス観測所のプールから探します。予報用のエリアコードをget_observationに渡すとnot_foundです。 どのコードがどのツールで使えるかはlist_areasのsupportsで確認できます。 - 曖昧・未発見・上流障害はエラーにせず、正常応答として
statusとretryableを返します (isErrorが立つのは引数スキーマ違反のときだけ)。
技術スタック
- Cloudflare Workers + Hono + TypeScript
@cloudflare/agents(createMcpHandlerステートレスハンドラ) /@modelcontextprotocol/serverv2- zod v4(入出力スキーマ) / vitest(テスト) / pnpm
セットアップ
pnpm install
エリア索引の生成(ビルド時のみ)
src/data/areas.json は気象庁の area.json / amedastable.json を縮約した同梱データです。
実行時には気象庁へ取りに行きません。 再生成するときのみ実行します(生成物はコミット済み)。
pnpm build:area-index
開発サーバー
pnpm dev
公開パスは /lab/jma-weather 配下です。MCP エンドポイントは POST /lab/jma-weather/mcp
(開発サーバーなら http://localhost:8787/lab/jma-weather/mcp)。MCP Inspector 等から4ツールが見え、
呼び出せます。
GET /lab/jma-weather はブラウザ向けの仕様説明ページ(接続情報・ツール一覧・異常系・キャッシュ・
取り扱うデータ)を HTML で返します。Accept に application/json のみを指定したリクエスト(text/html を
含まないもの)には従来どおりヘルスチェック用の JSON(name / description / mcpEndpoint)を返すため、
監視用途はそのまま使えます。Accept: */*(curl の既定)は HTML になります。
テスト・型チェック
pnpm test # 正規化・解決ロジックの単体テスト(ネットワーク非依存、fixtures 固定)
pnpm typecheck # Worker コード + ビルドスクリプトの型チェック
テストは
test/fixtures/に固定した実レスポンスに対して検証し、気象庁 API へネットワークアクセス しません。テストランナーはプロジェクトパスの都合で Node 上の vitest を用います(下記メモ参照)。
設計上の判断(要点)
- ツール粒度: 目的別4ツール + エリア解決をサーバー内に隠蔽。汎用クエリDSLも過度な細粒度も採らない。
- レスポンスサイズ制御: 警報は種別で束ね市町村を畳む(最大20種別 / 各10市町村、超過は
truncated)。 アメダスは全国一括を取得しても返すのは1地点。 - 異常系:
isErrorにせず正常応答 +status/retryable。クライアントの無限リトライを防ぐためretryableをブール値で明示。 - レート制限: 気象庁の
bosaiAPI に公表されたレート制限は無く、クライアントに返すべきレート制限 エラーを定義できません。そのため上流の 429 を前提とした設計は行わず、Cache API による上流アクセス 抑制(予報 600s / 警報 120s / アメダス 60s)を代替手段としています。仮に上流が 429 を返した場合は 404 以外の非 2xx としてupstream_error/retryable: trueに落ちます。 - トランスポート: 2026-07-28 のステートレス core に準拠。
tools/listはttlMs/cacheScope(24時間・共有可)を持つ。 - 3days と week はマージしない。17時発表で当日の最低気温が落ちるのは正常系として
nullを返す。
補足メモ
- キャッシュ TTL(Cache API): 予報 600s / 警報 120s / アメダス 60s。気象庁サイトへの負荷を作らないため。
- 本リポジトリのパスに非 ASCII 文字が含まれるため、
@cloudflare/vitest-pool-workersの workerd モジュール解決が失敗します。テスト対象は Worker API 非依存の純関数(正規化・解決)なので、 plain vitest(Node 環境)で検証しています。Cache API やtools/listの挙動はpnpm devで確認できます。
v1 でやらないこと
MRTR / input_required による確認、フィールド選択、地震・津波・台風、欠測と非観測の区別、
過去データ遡及、認証・レート制限の実装。
出典・ライセンス
- データ出典: 気象庁(https://www.jma.go.jp/)。政府標準利用規約に基づき出典を明記しています。
- 本プロジェクトは学習・検証目的の試作です。
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.