OSS · Python CLI · MCPサーバー

quake-lens

地震は予知できない。余震のレートは予測できる。

公開地震カタログ (気象庁・P2P地震情報・USGS) を取得し、余震予測の裏側にある統計量を計算するCLI。b値はAki (1965) の閉形式最尤推定、余震減衰は修正大森則をOgata (1983) の最尤法+pure PythonのNelder-Meadでフィット。ランタイム依存ゼロ。同じ計算をLLMクライアントへ4 toolsで公開するMCPサーバーを同梱。

GitHub で見る 解説記事を読む

ターミナルデモ: quake-lens recent が気象庁の地震リストをライブ取得し、能登半島地震2024の余震130件から b = 1.0449 ± 0.1306 を推定、大森・宇津則を p = 0.8861 でフィットする様子。
気象庁フィードのライブ取得と、能登半島地震 (2024) の余震系列の実測。b値 1.04 ± 0.13 (世界平均 ~1.0 と整合)、大森・宇津則 p = 0.89。実データ・実出力です。

4 subcommand + 4 MCP tools

CLIはJSONをパイプで繋ぐ設計。MCP tools は取得と推定をサーバー側で完結させて統計値だけを返すため、巨大なイベント配列がLLMのコンテキストを往復しません。

コマンド / tool 内容
recent --src p2p|jma Latest quakes from the P2P or JMA feed, normalized to one event schema (sentinel filtering + telegram dedupe included).
catalog USGS FDSN catalog query: time window, minimum magnitude, bounding box. JSON or table output.
bvalue --mc <m> Gutenberg-Richter b-value via Aki’s closed-form MLE, with standard error b/√N.
omori --mainshock <t> Modified Omori fit via Ogata’s MLE: grid search, then Nelder-Mead in log space. Returns K, c, p, logL.
get_recent / get_catalog (MCP) The same fetchers exposed as MCP tools for LLM clients.
estimate_bvalue / fit_omori (MCP) Fetch + estimate server-side; only statistics return to the LLM context.

インストール

clone だけで依存ゼロのまま動きます。optional extra で MCPサーバーが有効化されます (mcp SDK 1.x / 2.x 両対応)。

git clone https://github.com/kenimo49/quake-lens.git
cd quake-lens
python3 -m quake_lens --help     # zero dependencies, runs as-is

# optional: MCP server (mcp SDK 1.x / 2.x)
pip install ".[mcp]"
claude mcp add quake-lens -- quake-lens-mcp

使い方

能登半島地震 (2024) のフルパイプライン。解説記事の実測そのままです:

quake-lens recent --src jma --limit 5

quake-lens catalog --start 2024-01-01 --end 2024-01-11 \
  --min-mag 4.0 --format json > noto.json

quake-lens bvalue noto.json --mc 4.5
# b = 1.0449   se = 0.1306   n_used = 64

quake-lens omori noto.json --mainshock 2024-01-01T07:10:00Z
# K = 23.3856  c = 0.0224  p = 0.8861  n_used = 130

作りながら踏んだ4つの罠

どれもドキュメントではなく、実APIと実SDKに当てて初めて見つかった挙動です。

  1. USGSは日本の小さい地震が見えない

    USGSのグローバルカタログは日本のM3級をほとんど拾えません。カタログが実際に記録している下限より低い完全性マグニチュードMcを設定すると、b値推定は静かに壊れます。同じ能登データでMc 4.5ならb = 1.04、Mc 3.0だとb = 0.27。データを増やしたら推定が悪化する、という現象です。統計の前にカタログの完全性が来ます。

  2. 気象庁はごく浅い深さを「正のゼロ」で書く

    気象庁 list.json の震源は ISO 6709 風文字列で、深さはメートル単位の負の標高です。ただし、ごく浅い地震だけ "+0" (正のゼロ) で届きます。素直に符号反転すると IEEE 754 の -0.0 になり、出力テーブルに「-0.0」が現れます。ライブ実行で発見し、正のゼロへの正規化で修正しました。

  3. P2Pは震源不明をnullでなくセンチネル値で返す

    P2P地震情報APIは震源情報の欠落を null ではなく lat/lon -200、マグニチュード -1 で表します。nullチェックは素通りし、「-200.000 -200.000 -1.0」のゴミ行が出力に届きます。同じフィードは1つの地震につき最大3本の電文を返すので、発震時刻でdedupeして最新の詳報だけを採用します。

  4. mcp SDK 2.0がFastMCPを改称してもCIは緑のままだった

    mcp 2.0.0 で mcp.server.fastmcp が削除され、FastMCP は MCPServer に改称されました。新規に pip install するとサーバーは import 時点で壊れます。それでもCIが緑だったのは、SDKが optional 依存で importorskip がテストファイルごとskipしていたから。optional依存のコードにはSDKを実インストールしたvenvでの検証が必要です。現在は try/except の dual import で両メジャーバージョンをカバーしています。

関連記事

関連する開発ツール

プロダクト一覧 →

← プロダクト一覧へ