OSS · Python CLI · MCPサーバー
quake-lens
地震は予知できない。余震のレートは予測できる。
公開地震カタログ (気象庁・P2P地震情報・USGS) を取得し、余震予測の裏側にある統計量を計算するCLI。b値はAki (1965) の閉形式最尤推定、余震減衰は修正大森則をOgata (1983) の最尤法+pure PythonのNelder-Meadでフィット。ランタイム依存ゼロ。同じ計算をLLMクライアントへ4 toolsで公開するMCPサーバーを同梱。
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に当てて初めて見つかった挙動です。
-
USGSは日本の小さい地震が見えない
USGSのグローバルカタログは日本のM3級をほとんど拾えません。カタログが実際に記録している下限より低い完全性マグニチュードMcを設定すると、b値推定は静かに壊れます。同じ能登データでMc 4.5ならb = 1.04、Mc 3.0だとb = 0.27。データを増やしたら推定が悪化する、という現象です。統計の前にカタログの完全性が来ます。
-
気象庁はごく浅い深さを「正のゼロ」で書く
気象庁 list.json の震源は ISO 6709 風文字列で、深さはメートル単位の負の標高です。ただし、ごく浅い地震だけ "+0" (正のゼロ) で届きます。素直に符号反転すると IEEE 754 の -0.0 になり、出力テーブルに「-0.0」が現れます。ライブ実行で発見し、正のゼロへの正規化で修正しました。
-
P2Pは震源不明をnullでなくセンチネル値で返す
P2P地震情報APIは震源情報の欠落を null ではなく lat/lon -200、マグニチュード -1 で表します。nullチェックは素通りし、「-200.000 -200.000 -1.0」のゴミ行が出力に届きます。同じフィードは1つの地震につき最大3本の電文を返すので、発震時刻でdedupeして最新の詳報だけを採用します。
-
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 で両メジャーバージョンをカバーしています。
関連記事
関連する開発ツール
- hook-chain-lens Claude Codeのhook群(user / project / local / plugin)を全部読んで、今このcwdで実際にどう発火するかを出す読み取り専用CLI。
- private-lint 個人名・プライベートな名前 (家族名・私用メール・契約先ドメイン) の混入をcommit/push前に止めるgitフックゲート。pure Bash。検出パターンはマシンローカルのみでどのrepoにも置かず、repo公開直前の全履歴一括監査 (audit) を同梱。
- rhythm-lens 日本語・英語・ポルトガル語Markdownのリズム (文長の揺れ・段落構造・burstiness) を、2本の論文の実測分布とパーセンタイル照合するCLI。AI検出器ではなく、執筆フィードバックの計測器。
- claude-shift 複数のClaude Codeアカウントを管理するツール。activeアカウントをCLIから切り替えつつ、Claude Codeが実際に読んでいる2ファイル認証(~/.claude/.credentials.json + ~/.claude.json)を両方同期。5時間枠と週次の使用率をアカウント横断でChrome拡張から見られる。同じUIはブラウザとTauri v2デスクトップアプリでも動く。