MCP 伺服器
DPIP MCP 是唯讀的 MCP(Model Context Protocol)伺服器,把 ExpTech 的地震、氣象、雨量、閃電、颱風、海嘯與防災事件資料包成 25 個工具。加到 Claude Code、Claude Desktop 等支援 MCP 的 AI 用戶端後,模型可以直接查詢即時與歷史資料,不必自己處理各個 API 的格式。
目前不需要 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 } } ] } } }}瀏覽器的跨來源請求被拒絕沒有回應本文
| 項目 | 內容 |
|---|---|
| 網址 | 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 起)。同一個網址也支援舊版 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 用的網址 /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,網址填 https://api.core.exptech.dev/mcp。自訂連接器能否使用依 Claude 方案而定。
支援遠端 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" } }}每個工具的結果都同時放在 structuredContent 與一段內容相同的 JSON 文字裡,形狀固定:
| 欄位 | 說明 |
|---|---|
source |
資料取自哪個 ExpTech API 網址;離線工具(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;差量時間已還原成實際時間;欄位化快照已轉成每站一列,並附上測站名稱、縣市、鄉鎮與座標。 - 需要指定時刻的工具使用參數
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 |
不可商用 | 測站即時震動,一幀約一秒,依強度排序並附測站位置與鄉鎮 | 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 |
可商用 | 鄉鎮逐時預報,見鄉鎮逐時預報 | code(必填,3 碼) |
rain_hour_forecast |
可商用 | 鄉鎮未來 1 小時的逐分鐘降雨預報 | code(必填,3 碼) |
meteor_snapshot |
可商用 | 全部測站的天氣、雨量或閃電快照,每站一列,可篩選與排序 | 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、風場則附圖磚網址模板 | 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);- 伺服器會快取上游資料,同時間相同的查詢共用一次上游請求。快取時間依資料而定:即時的 RTS 1 秒;列表類 30 秒;觀測、颱風與時間列表 1 分鐘;預報與地震報告內容 10 分鐘;指定時刻或編號的歷史資料與測站目錄 1 小時。
- 上游暫時無法使用(429、5xx 或逾時)時,會改回最多 10 倍快取時間內的舊資料,並在
note說明;fetched_at是那份資料實際取得的時間。 - 參數不合法或查詢失敗時,工具呼叫會回傳錯誤訊息,不會回傳空資料。
- 不支援瀏覽器跨網域直接呼叫,跨來源的請求會被拒絕(403)。請從 MCP 用戶端或伺服器端連線。
- Streamable HTTP 不保留工作階段,伺服器不會主動推送通知或向用戶端發出請求。
