CometBFT validator ops について
CometBFT validator ops は、Cosmos SDK 系やその他の CometBFT チェーンでノードとバリデーターを監視する運用者向けの読み取り専用 MCP サーバーです。ノード、コンセンサス、スラッシング、アップグレードのデータを安定した検出結果にまとめ、インフラを変更する機能はありません。
主な機能
- 01フリートとノードの状態確認
- 02バリデーターの署名状況とジャイルリスク分析
- 03ピア接続の確認
- 04コンセンサス停止の診断
- 05アップグレード計画とバージョン差の確認
- 06日次チェックとインシデントトリアージのプロンプト
活用シーン
- 01バリデーターの署名状況とジャイルリスクを確認
- 02チェーンがブロック生成を停止した原因を特定
- 03アップグレード前に同期、ピア接続、バージョン差を確認
MCP 対応
フリート、バリデーター、ピア、コンセンサス、アップグレードを確認する読み取り専用ツールとプロンプトを MCP クライアントに提供します。設定された CometBFT RPC エンドポイントを読み取り、任意で Cosmos SDK REST データも参照します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm ghcr.io/wookja-0/cometbft-mcp:0.4.5ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/wookja-0/cometbft-mcp:0.4.5stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
CometBFT ノードおよびバリデーター運用者向けの読み取り専用 MCP サーバーです。
エージェントに 「バリデーターは署名していますか?」、「ジャイルまであとどれくらいですか?」、「チェーンが停止したのはなぜですか?」、「アップグレードの準備はできていますか?」 と尋ねると、自分のノードとチェーン固有のスラッシング状態に基づく回答が得られます。運用者と同じ視点で状況を判断し、何も変更することはできません。
あらゆる CometBFT チェーン(Cosmos Hub、Osmosis、あらゆる Cosmos SDK チェーン、非 SDK の CometBFT アプリ)と、あらゆる MCP クライアント(Claude Code、Claude Desktop、Cursor、VS Code、Codex、Gemini CLI、…)で動作します。
警告
初期リリース(v0.4)です。ツール API は今後変更される可能性があります。
同梱のローカルネットに対する実際のツール出力です。ノードは実際に停止され、待ち時間は短縮されています。再現する。
目次: 質問できること · クイックスタート · インストール · クライアントの接続 · 設定 · ツール · セキュリティモデル · 判定方法 · トラブルシューティング · FAQ · 開発
質問できること
同梱のローカルネットワークからの実際の出力です。
バリデーターは署名していますか — ジャイルまでどれくらいですか?
「val3 は署名していますか?ジャイルされるまでどれくらいですか?」
val3 [critical]: signed 26/30 blocks (88–117), missed 4 (13.33%), 4 missed in a row at the head;
21 more misses until downtime jail (~37s at the current rate)
コミット署名(バリデーター自体が停止している間も機能します)と、チェーン固有の x/slashing カウンターを読み取り、SDK とまったく同じ方法でジャイルのしきい値を計算します。
ブロックが停止したのはなぜですか?
「チェーンがブロックを生成していません。なぜですか?」
height 115 round 0 (Prevote) for 60s [critical]: prevotes 50.1%, precommits 0.0% of power —
no_quorum; not voting: val3, val2
「オンラインの投票力が足りない — そして応答していないのは誰か」と、「バリデーターはオンラインだがコミットしていない」(アップグレードによる停止、アプリハッシュエラーなど)を区別して伝えます。50.1%は誤植ではありません。この実行中に val2 は以前、ダウンタイムにより1%のスラッシングを受けていました。
アップグレードの準備はできていますか?
「アップグレードは予定されていますか? すべてのノードが同じバージョンですか?」
localnet-1 [ok]: upgrade <untrusted>v2-e2e</untrusted> at height 10000000 in ~164d20h (9999969 blocks)
測定したブロック時間に基づくETA付きのx/upgrade計画、投票中のアップグレード提案、ノード間のバージョン差を確認できます。<untrusted>は、チェーンに由来するテキスト(ここではガバナンス提案)を示すため、エージェントはこれをデータとして扱います。
すべて問題ありませんか?
「毎日のチェックを実行して」 — または
daily_checkプロンプトを使用してください。
[critical] 5 nodes (4 ok, 1 critical), 4 validators (3 ok, 1 critical); localnet-1 [ok]: no upgrade scheduled — needs attention: val3
ほかにも、「val0は本当にセンチネルの背後にいますか?」(peer_healthは、パブリックアドレスのピアを持つバリデーターを検出します)、「遅れ始めているノードはありますか?」、そして1つのノードを証拠優先で診断するincident_triageがあります。
クイックスタート(1分、パブリックRPC)
ノードへのアクセスは不要です。パブリックRPCを指定し、コンセンサスアドレスを使って任意のバリデーターを監視できます。
go install github.com/wookja-0/cometbft-mcp/cmd/cometbft-mcp@latest
cat > hub.yaml <<'EOF'
cosmos:
rest: https://cosmos-rest.publicnode.com
nodes:
- name: public
role: full
rpc: https://cosmos-rpc.publicnode.com:443
- name: my-validator
role: validator
validator_address: cosmosvalcons1... # yours, or any validator's
EOF
cometbft-mcp check --config hub.yaml
claude mcp add cometbft -- cometbft-mcp --config "$PWD/hub.yaml" --concurrency 8
次に、*「my-validatorは署名していますか? ジェイルまでどのくらいですか?」*と尋ねます。
validator_addressはコンセンサスアドレス(…valcons1…または40文字の16進数)です。ウォレット(cosmos1…)やオペレーター(cosmosvaloper1…)のアドレスではありません。バリデーター上で<appd> comet show-addressを実行するか、/status → validator_info.addressから、またはエクスプローラーで確認できます。
インストール
| 方法 | |
|---|---|
| バイナリ | Releasesから入手できるLinuxおよびmacOS(amd64/arm64)版。ビルドの来歴を証明するアテステーション付き:gh attestation verify <file> --repo wookja-0/cometbft-mcp |
| Go | go install github.com/wookja-0/cometbft-mcp/cmd/cometbft-mcp@latest |
| コンテナ | ghcr.io/wookja-0/cometbft-mcp — distroless、非root。必要なホストアクセスは、読み取り専用でマウントする設定ファイルのみです |
| MCP Registry | io.github.wookja-0/cometbft-mcpとして登録 |
| Glama | glama.ai/mcp/servers/wookja-0/cometbft-mcp |
クライアントを接続する
絶対パスを使用してください。ほとんどのクライアントは~を展開しません。
Claude Code
claude mcp add cometbft -- cometbft-mcp --config /Users/you/.config/cometbft-mcp/config.yaml
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json(macOS):
{
"mcpServers": {
"cometbft": {
"command": "cometbft-mcp",
"args": ["--config", "/Users/you/.config/cometbft-mcp/config.yaml"]
}
}
}
Cursor
~/.cursor/mcp.json:
{
"mcpServers": {
"cometbft": {
"command": "cometbft-mcp",
"args": ["--config", "/Users/you/.config/cometbft-mcp/config.yaml"]
}
}
}
VS Code
.vscode/mcp.json:
{
"servers": {
"cometbft": {
"type": "stdio",
"command": "cometbft-mcp",
"args": ["--config", "/Users/you/.config/cometbft-mcp/config.yaml"]
}
}
}
Codex CLI
~/.codex/config.toml:
[mcp_servers.cometbft]
command = "cometbft-mcp"
args = ["--config", "/Users/you/.config/cometbft-mcp/config.yaml"]
Gemini CLI
~/.gemini/settings.json:
{
"mcpServers": {
"cometbft": {
"command": "cometbft-mcp",
"args": ["--config", "/Users/you/.config/cometbft-mcp/config.yaml"]
}
}
}
Docker(任意のクライアント)
{
"mcpServers": {
"cometbft": {
"command": "docker",
"args": ["run", "-i", "--rm",
"--mount", "type=bind,src=/Users/you/.config/cometbft-mcp/config.yaml,dst=/config/config.yaml,readonly",
"ghcr.io/wookja-0/cometbft-mcp:0.4.2"]
}
}
}
または、マウントを省略し、設定をインラインで渡します。イメージ名の前に"-e", "COMETBFT_MCP_CONFIG_YAML={nodes: [...]}"を指定してください。
コンテナ内の127.0.0.1はコンテナ自体を指します。ホスト上のSSHトンネルに接続するには、設定でhost.docker.internal(Docker Desktop)を指定するか、Linuxでは--network hostを追加してください。
設定の読み込み元は、次の順に確認され、最初に見つかったものが使われます。
--config <path>$COMETBFT_MCP_CONFIG_YAML— ファイルではなく環境変数を受け取る環境(コンテナ、ホスト型の MCP ランナーなど)向けの YAML そのものです。フロースタイルなら 1 行に収まります。COMETBFT_MCP_CONFIG_YAML='{cosmos: {rest: "https://cosmos-rest.publicnode.com"}, nodes: [{name: public, role: full, rpc: "https://cosmos-rpc.publicnode.com:443"}]}'$COMETBFT_MCP_CONFIG— パス~/.config/cometbft-mcp/config.yaml
コメント付きの config.example.yaml をひな形として使用してください。
# Optional: the Cosmos SDK layer (jail status, slashing margin, upgrades, monikers).
# Chain state is the same on every node: use a sentry's or full node's REST API.
cosmos:
rest: http://127.0.0.1:1317
nodes:
- name: sentry-1
role: sentry # validator | sentry | full
rpc: http://127.0.0.1:26657 # CometBFT RPC
- name: val-1
role: validator
rpc: http://127.0.0.1:36657
validator_address: cosmosvalcons1... # keeps validator_health working while it is down
- name: val-2
role: validator # no rpc: watched by address only
validator_address: cosmosvalcons1...
| フィールド | |
|---|---|
cosmos.rest | 同期済みの任意のノードの Cosmos SDK REST(app.toml の [api]、ポート 1317)です。SDK 以外のチェーンでは省略してください。 |
nodes[].name | エージェントがノードを参照するときに使用する小文字の名前です。 |
nodes[].role | validator、sentry、full のいずれかです。コミットはまず sentry と full ノードから読み取り、validator の負荷を抑えます。 |
nodes[].rpc | CometBFT RPC(ポート 26657)です。validator_address が設定されている validator では省略できます。 |
nodes[].validator_address | validator のみ:コンセンサスアドレスです。16 進数または bech32 の …valcons1… を指定します。 |
キー、ニーモニック、トークンを指定する場所は意図的に設けていません。シークレットに見えるフィールドは拒否されます。
ノードへの接続。 使用するのはポート 26657(および 1 台のノードのポート 1317、任意)のみです。CometBFT の RPC はデフォルトで 127.0.0.1 にバインドされるため、SSH トンネルを使えばノードの変更もポートの開放も不要です:ssh -N -L 36657:127.0.0.1:26657 val-1。このために RPC をインターネットに公開しないでください。
| フラグ | デフォルト | |
|---|---|---|
--config | 上記を参照 | 設定ファイルへのパス |
--concurrency | 4 | すべてのノードに対する同時進行リクエスト数です。自分のノードへの負荷を抑えられます。パブリック RPC では 8 でも問題ありません。 |
--timeout | 10s | リクエストごとのタイムアウト |
--reveal-network | オフ | 生のピア IP、ノード ID、トランスポートエラーをモデルに表示します。 |
cometbft-mcp check は、設定を検証するために MCP クライアントを介さず、ローカルで node_status レポートを出力します。
使用可能な設定がなくてもサーバーは起動します。ツールは一覧に表示されたままになり、各呼び出しで作成すべき内容が説明されます(内部アドレスが含まれている可能性があるため、設定の内容がそのまま出力されることはありません)。ファイルを修正して、MCP サーバーを再起動してください。
ツール
すべてのツールは読み取り専用です(readOnlyHint)。各結果には、summary、level(ok / warn / critical / unknown)、および安定したコードを持つfindingsが含まれます。
fleet_overview — すべてを一度に確認
各ノードの問題を1行ずつ、各バリデーターのサマリー(直近50ブロック)、コンセンサスラウンド、アップグレードの状態を表示します。「すべて問題ないか」を確認するための出発点です。
引数はありません。
node_status — 各ノードは同期していますか?
ブロック高、前回のブロックからの経過秒数、catching_up、フリート内で最も高いノードからの遅延ブロック数、CometBFTとアプリのバージョンを表示します。バリデーターの場合は、コンセンサスアドレスと投票力も表示します。
| 引数 | |
|---|---|
node | ノード名。すべてのノードを対象にする場合は省略 |
検出結果:unreachable、catching_up、stale_head、behind_fleet、no_voting_power、address_mismatch。
peer_health — 各ノードは適切に接続されていますか?
ピア数、受信/送信の内訳、公開アドレス上のピア数、別のチェーン上のピア数、および最長接続順のピア一覧(最大40件)を表示します。アドレスはクラスのみ表示されます。
| 引数 | |
|---|---|
node | ノード名。すべてのノードを対象にする場合は省略 |
検出結果:no_peers、few_peers、no_outbound_peers、not_listening、validator_public_peers(セントリーの背後に配置する想定のバリデーターに公開ピアがある)、peers_on_other_chain。
validator_health — バリデーターは署名していますか?ジャイルまでどのくらいですか?
直近N個の正規ブロックにおける署名済み/nil投票/未署名/セット外の内訳、最新ブロックでの連続未署名数、最終署名ブロック高、投票力、セット内の順位と割合、平均ブロック時間を表示します。cosmos.restがある場合は、ジャイル/トゥームストーン化/ボンディングの状態、チェーンの未署名ブロックカウンター、max_missed、misses_until_jail、およびバリデーターが現在署名していない場合のtime_to_jailも表示します。
| 引数 | |
|---|---|
node | バリデーター名。設定済みのバリデーターが1つだけの場合は省略可能 |
window | スキャンするブロック数。10~500(デフォルトは100) |
検出結果:not_signing、missed_blocks、left_active_set、not_in_active_set、partial_data、no_data。Cosmosの場合:jail_risk、jail_imminent、time_to_jail、jailed、tombstoned、not_bonded、jail_after_grace、no_signing_info、cosmos_unavailable。
consensus_diagnosis — ブロックが停止した原因は?
1つのノードから見たライブのラウンドを表示します。ブロック高、ラウンド、ステップ、このブロック高での経過時間、現在のラウンドにおける各バリデーターのprevoteとprecommit(block/nil/missing)、および投票力の3分の2超が投票しているかどうかを確認できます。バリデーターは設定名またはステーキングモニカーで表示されます。
| 引数 | |
|---|---|
node | 読み取り元のノード。デフォルトは同期済みのセントリーまたはフルノード |
検出結果:no_quorum(投票していない名前)、stuck_with_quorum、many_rounds、vote_set_mismatch。
upgrade_readiness — アップグレードが近づいていますか? (cosmos.restが必要です)
x/upgradeプラン(名前、ブロック高、残りブロック数、予定時刻)、投票期間中のソフトウェアアップグレード提案、各ノードのアプリとCometBFTのバージョンを表示します。cosmos.restが設定されている場合(またはサーバーにまだ設定がなく、ディレクトリにすべてのツールを表示する場合)にのみ登録されます。各ホストで新しいバイナリが配置済みかどうかは確認できず、その旨を示します。
引数はありません。
検出結果:upgrade_soon、upgrade_height_reached、upgrade_halt、version_skew、plan_unavailable、proposals_unavailable。
プロンプト: daily_check(全体を確認し、フラグが立った項目を詳しく調べ、オペレーター向けブリーフィングとして報告)とincident_triage(引数はnode、任意のsymptom:証拠を優先して診断し、最後にホスト上で確認すべき項目を提示します)。
セキュリティモデル
バリデーターの運用者が、インフラストラクチャについて LLM を信頼しなくても済むように、このサーバーは「問題を起こさない」と約束するのではなく、問題を起こせないように構築されています。
- 鍵は一切扱いません。
priv_validator_key.json、キ―リング、ニーモニックを指す設定項目はありません。秘密情報に見える項目名は拒否されます。設定以外のファイルシステムは読み取りません。 - 設計上、読み取り専用です。 1 つの HTTP クライアントが、ハードコードされた許可リストにある CometBFT の
/status、/net_info、/validators、/commit、/consensus_state、/abci_info、/healthと、Cosmos SDK のスラッシング、ステーキング、アップグレード、ガバナンス関連クエリに対してのみGETを実行します。broadcast_*、unsafe_*、dial_*、check_tx、ピアアドレスを列挙する/dump_consensus_state、および/cosmos/tx/は全面的に拒否されます。パスパラメーターはパターンチェックされ、リダイレクトは追跡されず、レスポンスのサイズには上限が設けられています。 - ネットワークの詳細はマスクされます。 ピアの IP は
private-ipv4、public-ipv4などのクラスとしてのみ表示され、ノード ID は一部が省略されます。また、エラーにアドレスが含まれることはありません。そのため、セントリーで保護されたバリデーターの IP が LLM プロバイダーのログに残ることはありません。--reveal-networkを指定すると、明示的にこの機能が無効になります。 - ノードからのテキストは信頼されません。 モニカー、バージョン、エラーメッセージ、アップグレード計画など、ノードまたは REST サーバーが制御するすべての内容は
<untrusted>タグで囲むか、想定される形式と一致する必要があります。これにより、悪意のあるピアや公開 RPC がエージェントに指示を注入することを防ぎます。 - ノードに負荷をかけません。 全体の同時実行数に上限を設け、ブロックスキャンの範囲を制限しています。コミットはまずセントリーまたはフルノードから読み取ります。
- サプライチェーン。 リリースアーカイブとイメージにはビルド来歴の証明が付属し、CI のアクションとベースイメージはダイジェストで固定されています。
脅威モデルと報告方法については、SECURITY.md を参照してください。
判定方法
ライブネス。 CometBFT のコミットには、その高さにおけるバリデーターセットの全バリデーターが投票力順に列挙されますが、署名がない場合、その署名にはアドレスが含まれません。 そこで、このツールは各コミット内でバリデーターのアドレスを探します。見つからない場合は、その高さのバリデーターセットと、バリデーターのインデックスに対応する署名を読み取ります。署名がなければ missed、インデックスがなければ not in the set です。スキャン対象は latest − 1 までの正規コミットのみです。ノードが最新の高さに対して返すコミットは seen commit で、+2/3 より前に到着したプリコミットのみを含みます。そのため、セントリーの背後にいるバリデーターは通常、存在しないように見えます。ダウンタイムによるスラッシングの計算にも、正規コミットが使用されます。
ジャイルのリスク。 Cosmos SDK レイヤーでは、チェーン自体の入力である x/slashing のパラメーターと署名情報、およびコンセンサスキーを使って照合した x/staking を読み取り、x/slashing とまったく同じ方法でしきい値を計算します。つまり、猶予期間である start_height + window までの期間も含めて、window − round_half_even(window × min_signed_per_window) を計算します。ステーキング情報の照会に失敗しても、未来の jailed_until はジャイル中として扱われます。ジャイルされるとミスカウンターがリセットされるため、そうしないと問題のない記録に見えてしまうからです。
停止。 CometBFT でプリボートとプリコミットを行うには、投票力の 2/3 を超える支持が必要です。consensus_diagnosis は現在のラウンドの投票を読み取ります。CometBFT は次のラウンドも列挙しますが、まだ空なのでスキップされます。各投票をその位置に対応するバリデーターと照合し、投票済みの投票力を合計します。
互換性
| CometBFT | v0.38.25(Cosmos Hub メインネット)および v0.39.4(ローカルネット)でテスト済みです。v0.34 / v0.37 は同じ RPC フィールドを使用しますが、未テストです。 |
| Cosmos SDK | v0.53.8(Cosmos Hub)および v0.54.4(ローカルネット)の REST でテスト済みです。ed25519 コンセンサスキーを使用します。 |
| チェーン | CometBFT チェーンであれば動作します。フォーク(celestia-core、sei-tendermint)と ICS コンシューマーチェーンは未テストです。 |
| 規模 | Cosmos Hub:アクティブなバリデーター 180 件、ステーキング中のバリデーター 450 件以上。validator_health(100 ブロック)の実行時間は、公開 RPC で --concurrency 8 の場合は約 5 秒、デフォルトの 4 の場合は約 10 秒です。 |
| 非対応 | Tendermint2(gno.land) |
トラブルシューティング
| エラーコード | 意味 | 確認する項目 |
|---|---|---|
rpc_unreachable | 接続拒否または DNS の失敗 | URL とポート、SSH トンネル、ファイアウォール、Node プロセス |
rpc_timeout | --timeout 以内に応答がない | Node の負荷、ネットワーク遅延、--timeout の延長 |
rpc_http_status | JSON 以外の HTTP エラー | RPC の前段にあるプロキシまたはロードバランサー、URL パス |
rpc_bad_response | CometBFT の JSON-RPC 応答ではない | URL が別のもの(REST、gRPC-web、ウェブページなど)を指している |
height_unavailable | ノードがその高さのデータをプルーニング済み | より多くの履歴を保持するノードを使うか、window を小さくする |
rest_wrong_chain | cosmos.rest がノードとは別のチェーンを参照している | REST URL |
rest_not_found / no_signing_info | チェーンがそのアドレスを認識していない | validator_address が cosmos1… / cosmosvaloper1… ではなく、コンセンサスアドレスであること |
watched by validator_address only | rpc を指定せずにバリデーターのノードツールが呼び出された | 想定どおりです。そのバリデーターで動作するのは validator_health のみです |
よくある質問
バリデーターのアンジェイル、ノードの再起動、トランザクションの送信はできますか? いいえ。設計上できません。署名や書き込みを行うコードパスはありません。セキュリティモデルをご覧ください。
バリデーターの RPC は必要ですか? いいえ。バリデーターは validator_address だけで監視できます。署名はセンティネル、フルノード、またはパブリック RPC から読み取ります。
自分のマシンから送信される情報は何ですか? ツールの結果は MCP クライアントに送られ、クライアントを介して LLM プロバイダーに送信されます。送信される情報は、ノード名、ロール、高さ、ピア数、バリデーターアドレスです。IP とノード ID はマスクされます。本番環境のノードで使用する場合は、事前に所属組織の承認を得てください。
gno.land に対応していますか? まだ対応していません。Tendermint2 の RPC は CometBFT のものとは異なります。gno.land 自体については、gnoverse/gno-mcpをご覧ください。
ディスクやメモリのチェックがないのはなぜですか? 意図的なものです。ホストのメトリクスは node_exporter と既存のアラート機能で確認できます。cometbft-mcp は、チェーンルールが必要な判定に特化しています。
開発
make test # unit tests, no network
make lint
make localnet-up # 4 validators + 1 sentry (simd) in Docker; writes localnet/config.yaml
make e2e # MCP over stdio: downtime, a real jail + unjail, an upgrade proposal, a chain halt (~5 min)
go test -tags mainnet -v ./test/mainnet/ # read-only smoke test on Cosmos Hub public endpoints
ローカルネットのジェネシスは、問題が数秒で発生するように調整されています(スラッシング期間は50ブロック、最低署名率は50%、ジェイル期間は60秒、投票時間は30秒)。対話形式で試すには、次を実行します。
make build
claude mcp add cometbft-local -- "$PWD/bin/cometbft-mcp" --config "$PWD/localnet/config.yaml"
make localnet-stop VAL=val3 # "is val3 signing? how long until it's jailed?"
make localnet-stop VAL="val2 val3" # halt the chain; wait a minute: "why did blocks stop?"
make localnet-down
CI では、プッシュとプルリクエストのたびに lint とユニットテストが実行されます(ドキュメントのみの変更ではスキップされます)。E2E テストスイートは毎日、手動実行時、および e2e ラベルが付いたプルリクエストで実行されます。コントリビューションについては、CONTRIBUTING.mdをご覧ください。コードの構成と、決して壊してはならない不変条件については、AGENTS.mdをご覧ください。
ロードマップ
- ICS コンシューマーチェーン(スラッシングとジェイルはプロバイダー上で実行)
- secp256k1 コンセンサスキー
- Tendermint2(gno.land)アダプター
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。