mcpField
C
CometBFT validator ops

CometBFT validator ops

本地服务
github.com/wookja-0金融数据14 天前更新

关于 CometBFT validator ops

CometBFT validator ops 是面向 CometBFT 节点和验证者运维人员的只读 MCP 服务,支持 Cosmos SDK 及其他 CometBFT 链。它汇总节点、共识、惩罚和升级数据并给出稳定的发现结果,不能用于更改基础设施。

主要功能

  1. 01检查集群和节点状态
  2. 02分析验证者签名情况与入狱风险
  3. 03检查节点对等连接
  4. 04诊断共识停滞
  5. 05检查升级计划和版本偏差
  6. 06提供每日检查与事件分诊提示词

适用场景

  1. 01检查验证者签名状态并估算入狱风险
  2. 02查明链停止出块的原因
  3. 03升级前检查节点同步、对等连接和版本偏差

MCP 相关

它向 MCP 客户端提供只读工具和提示词,涵盖集群、验证者、对等连接、共识和升级检查。服务读取配置的 CometBFT RPC 端点,并可选读取 Cosmos SDK REST 数据。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"wookja-0-cometbft": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/wookja-0/cometbft-mcp:0.4.5"
]
}
}
}
启动命令docker run -i --rm ghcr.io/wookja-0/cometbft-mcp:0.4.5

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
ocighcr.io/wookja-0/cometbft-mcp:0.4.5

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

cometbft-mcp

CI e2e Release Go MCP Registry Glama Container License

面向 CometBFT 节点和验证者运营者的只读 MCP 服务。

向你的 Agent 提问:“我的验证者正在签名吗?”、“距离被监禁还有多久?”、“链为什么停止了?” 或 “我们准备好升级了吗?”,即可获得基于你自己的节点和链自身惩罚状态的回答——按照运营者的判断方式进行判断,并且无法更改任何内容。

适用于任何 CometBFT 链(Cosmos Hub、Osmosis、任何 Cosmos SDK 链、非 SDK CometBFT 应用)和任何 MCP 客户端(Claude Code、Claude Desktop、Cursor、VS Code、Codex、Gemini CLI,等等)。

警告

早期版本(v0.4)。工具 API 仍可能发生变化。

演示:集群检查结果正常;val3 宕机后,validator_health 报告距离停机监禁还会漏签 19 次;val2 也宕机后,consensus_diagnosis 报告 no_quorum,并指出 val3 和 val2
针对捆绑的本地网运行的真实工具输出——节点确实已停止;等待时间经过压缩。重现此演示。

目录: 你可以询问什么 · 快速开始 · 安装 · 连接客户端 · 配置 · 工具 · 安全模型 · 判定方式 · 故障排除 · 常见问题 · 开发

你可以询问什么

以下是捆绑的本地网络中的真实输出。

我的验证者正在签名吗?距离被监禁还有多久?

“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)

x/upgrade 计划及根据实测区块时间估算的预计时间、仍在投票中的升级提案,以及各节点之间的版本差异。<untrusted> 标记来自链上的文本——此处为治理提案——因此 Agent 会将其视为数据。

一切正常吗?

“运行每日检查”——或使用 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 会标记与使用公开地址的节点建立连接的验证者)、“是否有节点正在落后?”,以及使用 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

然后询问:“我的验证者在签名吗?距离被关进监狱还有多远?”

validator_address 是共识地址(…valcons1… 或 40 位十六进制字符串),不是钱包地址(cosmos1…)或运营者地址(cosmosvaloper1…)。可在验证者上运行 <appd> comet show-address 获取,也可从 /status → validator_info.address 或区块浏览器中获取。

安装

方法
二进制文件Linux 和 macOS(amd64/arm64),可从 Releases 获取,并附带构建来源证明:gh attestation verify <file> --repo wookja-0/cometbft-mcp
Gogo 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
Glamaglama.ai/mcp/servers/wookja-0/cometbft-mcp

cometbft-mcp MCP 服务 – Glama 上的质量与维护评分

连接客户端

请使用绝对路径:大多数客户端不会展开 ~。

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 指向容器本身:将配置指向 host.docker.internal(Docker Desktop),或添加 --network host(Linux),以访问主机上的 SSH 隧道。

## 配置

配置来源按以下顺序匹配,采用第一个匹配项:

  1. --config <path>
  2. $COMETBFT_MCP_CONFIG_YAML — YAML 内容本身,适用于支持环境变量但不支持文件的场景(容器、托管 MCP 运行器)。流式风格可以写在一行:
    COMETBFT_MCP_CONFIG_YAML='{cosmos: {rest: "https://cosmos-rest.publicnode.com"}, nodes: [{name: public, role: full, rpc: "https://cosmos-rpc.publicnode.com:443"}]}'
    
  3. $COMETBFT_MCP_CONFIG — 路径
  4. ~/.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[].nameAgent 用来指代节点的小写名称。
nodes[].rolevalidator、sentry 或 full。优先从哨兵节点和全节点读取提交,以减轻验证者节点的负载。
nodes[].rpcCometBFT RPC(端口 26657)。如果验证者节点设置了 validator_address,则此项可选。
nodes[].validator_address仅验证者节点需要:共识地址,十六进制或 bech32 格式 …valcons1…。

配置中刻意不提供密钥、助记词或令牌的位置;任何看起来像机密信息的字段都会被拒绝。

连接节点。 只会使用端口 26657(以及某个节点上可选的 1317 端口)。CometBFT 默认将 RPC 绑定到 127.0.0.1,因此 SSH 隧道无需修改节点设置,也无需开放端口:ssh -N -L 36657:127.0.0.1:26657 val-1。请勿为此将 RPC 暴露到互联网。

标志默认值
--config见上文配置文件路径
--concurrency4所有节点的并发请求数。对自有节点较为温和;公共 RPC 使用 8 也没问题。
--timeout10s单个请求的超时时间
--reveal-network关闭向模型显示原始对等节点 IP、节点 ID 和传输错误

cometbft-mcp check 会在本地打印 node_status 报告,无需 MCP 客户端即可验证配置。

即使没有可用的配置,服务仍会启动:其工具仍会列出,并在每次调用时说明需要创建什么(它绝不会回显配置内容,因为其中可能包含内部地址)。修复文件后,重启 MCP 服务。

工具

所有工具均为只读(readOnlyHint)。每个结果都包含 summary、level(ok / warn / critical / unknown)以及带有稳定代码的 findings。

fleet_overview — 一览所有情况

每个节点一行,列出其问题;每个验证器汇总一行(最近 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 个规范区块中的已签名/空投票/漏签/未入集合数量、链头处的连续漏签次数、最近签名的区块高度、投票权、排名和在集合中的占比、平均区块时间。配置了 cosmos.rest 时,还包括被监禁/被永久封禁/绑定状态、链上的漏块计数器、max_missed、misses_until_jail,以及验证器当前未签名时的 time_to_jail。

参数
node验证器名称;仅配置了一个验证器时可选
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 — 区块为何停止生成?

从一个节点的视角查看实时轮次:高度、轮次、步骤、在当前高度停留的时间、当前轮次中每个验证器的 prevote 和 precommit(block / nil / missing),以及投票权是否超过 2/3。验证器以配置名称或质押单名标识。

参数
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:优先依据证据进行诊断,最后列出需要在主机上检查的内容)。

安全模型

验证者运维人员不应被迫将基础设施交给大模型信任,因此本服务的设计原则是无法造成损害,而不是承诺不会:

  • 绝不使用密钥。 没有任何配置字段可以指向 priv_validator_key.json、密钥环或助记词;名称看起来像秘密的字段都会被拒绝。除配置外,不会读取文件系统中的任何内容。
  • 从设计上只读。 单个 HTTP 客户端只会向硬编码的允许列表发送 GET 请求:CometBFT 的 /status、/net_info、/validators、/commit、/consensus_state、/abci_info、/health,以及 Cosmos SDK 的 slashing、staking、upgrade 和 gov 查询。broadcast_*、unsafe_*、dial_*、check_tx、/dump_consensus_state(它会列出对等节点地址)和 /cosmos/tx/ 均会被直接拒绝;路径参数会进行模式检查;绝不跟随重定向;响应大小有限制。
  • 屏蔽网络详情。 对等节点 IP 只会显示为类别(private-ipv4、public-ipv4 等),节点 ID 会被截断,错误信息绝不包含地址,因此受哨兵保护的验证者 IP 不会出现在大模型提供商的日志中。使用 --reveal-network 可明确关闭此功能。
  • 节点文本不可信。 所有由节点或 REST 服务控制的内容——名称、版本、错误消息、升级计划——都会用 <untrusted> 标签包裹,或必须符合预期格式,因此恶意对等节点或公共 RPC 无法向你的 Agent 注入指令。
  • 尽量减轻节点负担。 设置全局并发上限并限制区块扫描范围;优先从哨兵或全节点读取提交信息。
  • 供应链。 发布压缩包和镜像均附带构建溯源证明;CI 操作和基础镜像均按摘要固定。

威胁模型和报告方式:SECURITY.md。

工作原理

活跃性。 CometBFT 的提交信息会按投票权顺序列出该高度的所有验证者,但缺失的签名不包含地址。因此,工具会在每个提交信息中查找验证者地址;如果找不到,就会读取该高度的验证者集合,并查看该验证者索引处的签名:没有签名表示漏签,没有索引表示不在集合中。它只扫描规范提交,扫描上限为 latest − 1:节点为最新高度返回的提交是其已见提交,只包含 +2/3 之前收到的预提交,因此位于哨兵后方的验证者经常会显示为缺席。停机惩罚的计算也使用规范提交。

监禁风险。 借助 Cosmos SDK 层,它会读取链自身的输入——x/slashing 参数和签名信息,以及按共识密钥匹配的 x/staking 信息——并完全按照 x/slashing 的方式计算阈值:window − round_half_even(window × min_signed_per_window),其中包括 start_height + window 之前的宽限期。如果 jailed_until 在未来,即使 staking 查询失败,也会视为已被监禁,因为监禁会重置漏签计数器,否则记录看起来会像没有漏签。

停滞。 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 多个 staking 验证者。validator_health(100 个区块)通过公共 RPC 在 --concurrency 8 时约需 5 秒,在默认值 4 时约需 10 秒。
不支持Tendermint2(gno.land)

故障排查

错误代码含义检查项
rpc_unreachable连接被拒绝或 DNS 解析失败URL 和端口、SSH 隧道、防火墙;节点进程
rpc_timeout在 --timeout 指定的时间内没有响应节点负载、网络延迟;增大 --timeout
rpc_http_status收到非 JSON 的 HTTP 错误RPC 前面的代理或负载均衡器;URL 路径
rpc_bad_response这不是 CometBFT JSON-RPC 响应URL 指向了其他内容(REST、gRPC-web、网页)
height_unavailable节点已裁剪该高度的数据使用保留了更多历史记录的节点,或减小 window
rest_wrong_chaincosmos.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 客户端,再由客户端发送给大模型提供商:节点名称、角色、高度、对等节点数量、验证者地址。IP 和节点 ID 会被隐藏。对于生产节点,请先获得所在组织的批准。

它支持 gno.land 吗? 暂不支持:Tendermint2 的 RPC 与 CometBFT 的 RPC 不同。有关 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

本地网络的 genesis 经过调整,可让故障在几秒内显现(50 区块惩罚窗口、50% 最低签名率、60 s 监禁时间、30 s 投票时间)。可交互式试用:

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 标签的拉取请求上运行。贡献指南:CONTRIBUTING.md。代码导览以及绝不能破坏的不变量:AGENTS.md。

路线图

  • ICS 消费者链(惩罚和监禁状态由提供者链处理)
  • secp256k1 共识密钥
  • Tendermint2(gno.land)适配器

许可证

Apache-2.0

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。