MCP サーバー
DPIP MCP は読み取り専用の MCP(Model Context Protocol)サーバーです。ExpTech の地震、気象、雨量、雷、台風、津波、防災イベントのデータを 25 個のツールにまとめています。Claude Code や Claude Desktop など、MCP に対応した AI クライアントに追加すると、モデルが各 API の形式を自分で扱わなくても、現在と過去のデータを直接照会できます。
データライセンス
Section titled “データライセンス”表記の場所、例、商用利用の申請はデータの利用条件と出典表記をご覧ください。
現在は API Token は不要です。ツールはすべて読み取り専用で、データを変更しません。
Content-Typeapplication/json
Acceptapplication/json, text/event-stream
bodyMCP メッセージ。例:initialize、tools/list、tools/call
curl "https://api.core.exptech.dev/mcp" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ --data '{"jsonrpc":"2.0","id":1,"method":"<method>","params":{}}'curl "https://api.core-tnn1.exptech.dev/mcp" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ --data '{"jsonrpc":"2.0","id":1,"method":"<method>","params":{}}'curl "https://api.core-tyo1.exptech.dev/mcp" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ --data '{"jsonrpc":"2.0","id":1,"method":"<method>","params":{}}'const res = await fetch("https://api.core.exptech.dev/mcp", { method: "POST", headers: { "Content-Type": "application/json", Accept: "application/json, text/event-stream", }, body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "<method>", params: {} }),});if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);const res = await fetch("https://api.core-tnn1.exptech.dev/mcp", { method: "POST", headers: { "Content-Type": "application/json", Accept: "application/json, text/event-stream", }, body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "<method>", params: {} }),});if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);const res = await fetch("https://api.core-tyo1.exptech.dev/mcp", { method: "POST", headers: { "Content-Type": "application/json", Accept: "application/json, text/event-stream", }, body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "<method>", params: {} }),});if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);import requests
res = requests.post( "https://api.core.exptech.dev/mcp", headers={ "Content-Type": "application/json", "Accept": "application/json, text/event-stream", }, json={"jsonrpc": "2.0", "id": 1, "method": "<method>", "params": {}}, timeout=10,)res.raise_for_status()print(res.json())import requests
res = requests.post( "https://api.core-tnn1.exptech.dev/mcp", headers={ "Content-Type": "application/json", "Accept": "application/json, text/event-stream", }, json={"jsonrpc": "2.0", "id": 1, "method": "<method>", "params": {}}, timeout=10,)res.raise_for_status()print(res.json())import requests
res = requests.post( "https://api.core-tyo1.exptech.dev/mcp", headers={ "Content-Type": "application/json", "Accept": "application/json, text/event-stream", }, json={"jsonrpc": "2.0", "id": 1, "method": "<method>", "params": {}}, timeout=10,)res.raise_for_status()print(res.json())成功(tools/call のレスポンス)
{ "jsonrpc": "2.0", "id": 2, "result": { "content": [ { "type": "text", "text": "與 structuredContent 相同內容的 JSON 字串" } ], "structuredContent": { "fetched_at": "2026-11-14T14:00:05+08:00", "data": { "updateTime": 1794636120000, "forecast": [ { "time": "15:00", "temperature": 24, "apparentTemp": 26, "humidity": 75, "weather": "多雲", "weatherCode": 200, "pop": 20, "wind": { "direction": "NE", "speed": 3, "beaufort": 2 } } ] } } }}ブラウザのクロスオリジンリクエストは拒否されますレスポンスボディなし
| 項目 | 内容 |
|---|---|
| URL | https://api.core.exptech.dev/mcp。ノードを指定することもできます:https://api.core-tnn1.exptech.dev/mcp、https://api.core-tyo1.exptech.dev/mcp |
| トランスポート | Streamable HTTP(MCP 仕様 2025-03-26 以降)。同じ URL は旧版の HTTP + SSE(仕様 2024-11-05)にも対応します |
| セッション | Streamable HTTP はセッションを使いません(stateless)。サーバーは Mcp-Session-Id を発行せず、リクエストはそれぞれ独立して処理します |
| サーバー名 | dpip(表示名「DPIP 防災情報」) |
| 認証 | なし |
| 接続タイムアウト | 3600 秒 |
Streamable HTTP:POST /mcp で JSON-RPC メッセージを送ります。Accept は application/json と text/event-stream の両方を受け入れる必要があります。レスポンスは JSON のことも、SSE のこともあります(JSON-RPC メッセージは data: 行に入ります)。一般的な MCP クライアントと SDK は、どちらも自動で処理します。
旧版の HTTP + SSE:GET /mcp でイベントストリームを開きます(リクエストに Mcp-Session-Id と MCP-Protocol-Version ヘッダを付けません)。ストリームが、続く POST に使う URL /mcp?sessionid=... を知らせます。この方式のセッションは単一ノードにしかなく、api.core.exptech.dev は DNS がノードを割り当てるため、前後のリクエストが別のノードに落ちることがあります。旧版 SSE を使うときは api.core-tnn1 か api.core-tyo1 を指定してください。新しい組み込みには Streamable HTTP を使ってください。
MCP クライアントへの追加
Section titled “MCP クライアントへの追加”Claude Code
Section titled “Claude Code”claude mcp add --transport http dpip https://api.core.exptech.dev/mcp--scope user を付けると、すべてのプロジェクトで使えます。追加したあとは claude mcp list で接続状態を確認してください。
Claude Desktop
Section titled “Claude Desktop”「設定」→「コネクタ」(Connectors)→「カスタムコネクタを追加」を開き、名前に DPIP、URL に https://api.core.exptech.dev/mcp を入れます。カスタムコネクタを使えるかは、Claude のプランによります。
その他のクライアント
Section titled “その他のクライアント”リモート MCP に対応したクライアント(たとえば Cursor、Claude Code プロジェクトの .mcp.json)は、だいたい次の設定を受けます。フィールド名はクライアントによります。
{ "mcpServers": { "dpip": { "type": "http", "url": "https://api.core.exptech.dev/mcp" } }}stdio だけに対応したクライアントは、mcp-remote で中継できます。
{ "mcpServers": { "dpip": { "command": "npx", "args": ["-y", "mcp-remote", "https://api.core.exptech.dev/mcp"] } }}旧版 SSE だけに対応したクライアントは、ノードを指定してください。
{ "mcpServers": { "dpip": { "type": "sse", "url": "https://api.core-tnn1.exptech.dev/mcp" } }}レスポンスの形式
Section titled “レスポンスの形式”各ツールの結果は、structuredContent と、内容が同じ JSON テキストの両方に入ります。形は固定です。
| フィールド | 説明 |
|---|---|
source |
データを取った ExpTech API の URL。オフラインのツール(township_lookup)にはこのフィールドはありません |
fetched_at |
データを取得した時刻。RFC 3339、台湾時間(+08:00) |
note |
任意。上流が一時的に使えず、キャッシュしたデータに戻したときの説明 |
data |
ツールが返すデータ |
{ "source": "https://api.core-tnn1.exptech.dev/api/v5/meteor/weather/realtime/25.033,121.5654", "fetched_at": "2026-11-14T14:00:05+08:00", "data": { "id": "C0A9C0", "station": { "name": "信義", "lat": 25.0378, "lon": 121.5646, "altitude": 26, "distance": 0.55 }, "time": 1794636000, "data": { "weather": "多雲", "weatherCode": 200, "temperature": 24.6, "humidity": 72, "rain": 0, "wind": { "direction": "東北", "speed": 2.1, "beaufort": 2 }, "gust": { "speed": null, "beaufort": null }, "visibility": null, "visibility_text": "無觀測", "pressure": null, "sunshine": null } }}共通の慣例(サーバーは初期化のとき、これらの説明もクライアントに送ります):
- 時刻は Unix 秒です。フィールドに別の説明があるときは例外です。地震情報、津波、RTS の
tsは Unix ミリ秒です。TREM の検知は RFC 3339 の文字列です。 - 市区町村コードは 3 桁の郵便番号です(例:台北市中正区は
100)。township_lookupで地名または座標から調べられます。 - 震度は 0–9 の数値です。
5は震度5弱、6は震度5強、7は震度6弱、8は震度6強、9は震度7です。結果には別に_labelフィールド(例:int_label)が付きます。表示するときはそれを使ってください。 - 気象データの欠測
-99はnullに変換済みです。差分の時刻は実際の時刻に復元済みです。フィールドごとの配列は観測点ごとの 1 行に変換済みで、観測点名、県・市、郷鎮、座標が付きます。 - 時刻を指定するツールはパラメータ
at(Unix 秒)を使います。照会できる時刻はtimelineで取得します。
「必須」と書いたパラメータ以外は任意です。「ライセンス」の列は、各ツールが返すデータの区分です。データライセンスを参照してください。
| ツール | ライセンス | 用途 | パラメータ |
|---|---|---|---|
cwa_links |
非商用 | 地震情報と TREM の検知の対応 | cwa_id、cwa_event_id、trem_event_id、limit(1–500) |
earthquake_reports |
商用可 | 地震情報のリスト。震度、規模、深さ、日付、県・市で絞り込み、並べ替えできます | limit(1–100、既定 20)、page、min_intensity、max_intensity、min_magnitude、max_magnitude、min_depth、max_depth、start_date、end_date(YYYY-MM-DD)、sort(time、intensity、magnitude、depth)、order(desc、asc)、city、city_min_intensity、city_max_intensity |
earthquake_report |
商用可 | 単一の地震情報。各県・市と各市区町村の震度を含む | id(必須) |
gdms |
商用可 | 単一の地震情報の強震観測点の記録。PGA、PGV、計測震度、観測点の座標 | id(必須)、min_intensity、min_pga、limit(1–500、既定 40) |
tsunami_reports |
商用可 | 中央気象署の津波情報のリスト | なし |
tsunami_report |
商用可 | 単一の津波情報 | id(必須) |
TREM 地震観測網
Section titled “TREM 地震観測網”TREM データは非公式の観測で、中央気象署の発表が常に優先されます。気象法により、地震の予測や地震警報の発表に使うことはできません。 注意事項をすべて読む
| ツール | ライセンス | 用途 | パラメータ |
|---|---|---|---|
rts |
非商用 | 観測点のリアルタイムの揺れ。1 フレームは約 1 秒。強度順で、観測点の位置と市区町村が付きます | at、min_intensity、limit(1–1000、既定 30) |
trem_reports |
非商用 | TREM の地震検知のリスト | month、year、alert、limit(1–500、既定 30) |
trem_report |
非商用 | 単一の検知の報ごとの内容 | id(必須、14 桁) |
trem_shakes |
非商用 | 震度速報のリスト | month、year、limit(1–500) |
trem_shake |
非商用 | 単一の震度速報。各市区町村の計測震度を含む | id(必須)、min_intensity、town_limit(1–400、既定 120) |
trem_triggers |
非商用 | 単一の検知でトリガした観測点 | id(必須)、min_intensity、limit(1–500、既定 50) |
trem_trust |
非商用 | 各観測点の信頼度 | tier(NO_EVIDENCE、MISFIRING、BLOCKED、SEMI、FAST)、station、limit(1–500) |
trem_noise |
非商用 | 各観測点のノイズ倍率 | status(adjusted、normal、insufficient)、station、limit(1–500) |
trem_picks |
非商用 | 直近の P 波、S 波の検測記録 | range(24h、7d、既定 24h)、station、phase(P、S)、limit(既定 40) |
trem_debug_triggers |
非商用 | 直近の観測点トリガの記録。地震として成立しなかったものも含む | range(24h、7d、既定 24h)、station、coinc_result、event_id、limit(1–200、既定 40) |
| ツール | ライセンス | 用途 | パラメータ |
|---|---|---|---|
weather_realtime |
商用可 | 座標に最も近い観測点の現在の天気。現在の天気を参照 | lat(必須)、lng(必須) |
weather_forecast |
商用可 | 市区町村の 1 時間ごとの予報。市区町村の 1 時間ごとの予報を参照 | code(必須、3 桁) |
rain_hour_forecast |
商用可 | 市区町村の今後 1 時間の、分ごとの降水予報 | code(必須、3 桁) |
meteor_snapshot |
商用可 | 全部の観測点の天気、雨量、または雷のスナップショット。観測点ごとに 1 行。絞り込みと並べ替えができます | family(必須。weather、rain、lightning)、at、station_ids、city、town、sort_by、order(desc、asc)、limit(1–5000、既定 50) |
meteor_trend |
商用可 | 単一の天気または雨量の観測点の、直近 24 時間または 7 日の系列 | family(必須。weather、rain)、station_id(必須)、range(24h、7d、既定 24h) |
typhoon |
商用可 | 台風の一覧、進路、予報円、入る確率、または警報。台風を参照 | kind(cyclones、track、potential、probability、warning、既定 cyclones)、at(cyclones は非対応) |
timeline |
データにより異なる | 各データの照会できる時刻。レーダー、衛星、QPESUMS、風向・風速にはタイル URL のテンプレートが付きます | source(必須。weather、rain、lightning、typhoon_track、typhoon_potential、typhoon_probability、typhoon_warning、radar、satellite、qpesums、wind)、channel、style(normal、jma、bd)、model(gfs、ecmwf、既定 gfs)、limit(1–1000、既定 24) |
防災イベントとツール
Section titled “防災イベントとツール”| ツール | ライセンス | 用途 | パラメータ |
|---|---|---|---|
dpip_events |
商用可 | 有効、または直近の防災イベント。全国または単一の市区町村。新しい順。レスポンスの text.content と text.description は市区町村コードごとに分かれます |
state(active、history、既定 active)、code(3 桁。省略すると全国) |
township_lookup |
対象外 | 地名、市区町村コード、または座標から、市区町村コード、名称、中心を調べます。接続は不要です | query、lat、lng、limit(1–400、既定 10) |
curl でツールを呼び出す
Section titled “curl でツールを呼び出す”MCP クライアントを介さず、JSON-RPC メッセージを直接送ります。先に initialize、次に tools/call でツールを呼びます。実際の組み込みには MCP SDK の使用を推奨します。
curl https://api.core.exptech.dev/mcp \ -H 'Content-Type: application/json' \ -H 'Accept: application/json, text/event-stream' \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"1.0"}}}'
curl https://api.core.exptech.dev/mcp \ -H 'Content-Type: application/json' \ -H 'Accept: application/json, text/event-stream' \ -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"weather_forecast","arguments":{"code":"105"}}}'TypeScript SDK
Section titled “TypeScript SDK”公式 SDK(@modelcontextprotocol/sdk)がトランスポートとレスポンス形式を処理します。
import { Client } from "@modelcontextprotocol/sdk/client/index.js";import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
const client = new Client({ name: "my-app", version: "1.0.0" });await client.connect(new StreamableHTTPClientTransport(new URL("https://api.core.exptech.dev/mcp")));
const { tools } = await client.listTools();const result = await client.callTool({ name: "weather_forecast", arguments: { code: "105" } });console.log(result.structuredContent.data);- サーバーは上流のデータをキャッシュし、同時刻の同じ照会は上流リクエストを 1 回にまとめます。キャッシュ時間はデータによります。リアルタイムの RTS は 1 秒。リスト類は 30 秒。観測、台風、時刻リストは 1 分。予報と地震情報の内容は 10 分。指定時刻または番号の過去データと観測点一覧は 1 時間です。
- 上流が一時的に使えないとき(429、5xx、またはタイムアウト)は、最大でキャッシュ時間の 10 倍以内の古いデータに戻り、
noteに説明を入れます。fetched_atは、そのデータを実際に取得した時刻です。 - パラメータが不正、または照会が失敗したときは、ツール呼び出しはエラーメッセージを返します。空のデータは返しません。
- ブラウザからのクロスオリジン直接呼び出しには対応していません。クロスオリジンのリクエストは拒否されます(403)。MCP クライアントかサーバー側から接続してください。
- Streamable HTTP はセッションを保持しません。サーバーから通知を送ったり、クライアントへリクエストを出したりはしません。
