Solfleet

io.github.sanjeevkkansal由 GitHub 账号 sanjeevkkansal 发布v0.1.1更新于 Oct 24, 2026

Agent-safe fleet management for independent Solana validators and RPC nodes

概览

AI 生成的概览

Solfleet 是本地 MCP 服务器,用于管理 Solana 验证节点与 RPC 节点集群:Solana 感知的健康状态、受控原地升级、重启和 DNS 故障转移

可以做什么
读取集群健康:状态、节点详情、版本漂移、投票状态、出块者排程、校验与审计日志,按 slot 落后和失职判断而非仅看 HTTP 健康。规划并执行节点变更:初始化构建主机、开通节点、重启与原地升级,默认演练,仅在 confirm=true 时执行。管理 DNS 故障转移池:查看池状态、剔除故障成员、恢复已恢复成员,且不会清空整个池。查看记录每次演练与执行操作的 SQLite 审计日志。
适用场景
适合在 devnet、testnet 和 mainnet 上运行独立 Solana 验证节点或 RPC 节点的运维人员,希望由助手检查集群健康、规划升级与重启,并在策略门控下执行 DNS 故障转移。
运行要求
以 Python 包形式通过 stdio 本地运行(用 pipx 或 uvx 安装)。需要描述节点的集群配置文件、可选的策略文件、对节点和构建主机的 SSH/scp 访问、节点与参考 RPC 的 JSON-RPC 连通性,以及 Cloudflare 或 Route53 故障转移所需的 DNS 提供商凭据。
安装前请注意
受控工具会在真实节点上重启、升级、开通并修改 DNS 记录;watch 循环可自主变更。DNS 故障转移需要提供商凭据,README 说明它从不读取或移动密钥对。确认前请检查策略设置并使用演练计划。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Solfleet,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

solfleet

[tests] [license] [python]

Agent-safe fleet management for independent Solana validators and RPC nodes. One config file describes your fleet across devnet, testnet, and mainnet. An MCP server (and a CLI) exposes Solana-aware status, safe in-place upgrades, and health-driven DNS failover to Claude or any MCP client. Every operation that changes a node is dry-run by default, policy-gated, and audited. solfleet never reads or moves your keypairs.

See PLAN.md for the roadmap and design notes.

Architecture

solfleet runs on the operator's machine (or a small VM). It talks to the fleet over JSON-RPC (read) and SSH/scp (act), builds artifacts on a separate build host, computes slot lag against each cluster's reference RPC, and manages failover records at the DNS provider. Every mutation flows through one gate and is written to a SQLite audit log.

mermaid
flowchart TB  claude["Claude / any MCP client"]
  subgraph operator["operator machine"]    mcp["solfleet-mcp (stdio)"]    cli["solfleet CLI"]    core["core: probe · safety gate · executor · dns"]    audit[("audit log (SQLite)")]    claude -->|MCP| mcp    mcp --> core    cli --> core    core --> audit  end
  builder["build host (agave + geyser from source)"]  ref["cluster reference RPC"]  dns["DNS provider (Cloudflare / Route53)"]
  subgraph fleet["fleet: devnet / testnet / mainnet"]    rpc["RPC nodes"]    val["voting validators"]  end
  core -->|JSON-RPC :8899| rpc  core -->|JSON-RPC :8899| val  core -->|SSH / scp| rpc  core -->|SSH / scp| val  core -->|SSH build, fetch artifacts| builder  builder -. "artifact set + sha256" .-> core  core -->|slot lag / delinquency| ref  core -->|eject / restore A records| dns

How an in-place upgrade runs

mermaid
sequenceDiagram  actor Op as Claude / operator  participant SF as solfleet  participant B as build host  participant N as node  participant R as reference RPC  Op->>SF: upgrade node to version (confirm)  SF->>SF: gate, policy + preflight (else stop)  SF->>B: build agave + geyser (or reuse cache)  B-->>SF: artifact set + sha256  SF->>N: scp artifacts as dest.solfleet-new  SF->>N: sha256 on node matches builder (else abort)  alt RPC node    SF->>N: systemctl stop    SF->>N: atomic swap (binary + geyser + marker)    SF->>N: systemctl start  else voting validator    SF->>N: atomic swap (binary + geyser + marker)    SF->>N: agave-validator exit (leader-aware), systemd relaunches  end  loop until healthy and caught up    SF->>R: getSlot    SF->>N: getHealth / getSlot  end  SF->>SF: verify reported version, write audit entry

How failover runs

mermaid
sequenceDiagram  participant SF as solfleet watch  participant N as pool members  participant R as reference RPC  participant D as DNS provider  loop every interval    SF->>N: getHealth / getSlot    SF->>R: getSlot (cluster head)    SF->>SF: per member: unhealthy, lag over limit, or delinquent    alt every member failing      SF->>SF: keep current records (never empty the pool)    else at least one healthy      SF->>D: ensure TXT ownership marker      SF->>D: remove A record of each failing member      SF->>D: add A record of each recovered member      SF->>SF: write audit entry    end  end

Why

  • Solana-aware health. A generic health check sees HTTP 200; a Solana node can be 500 slots behind and still return 200. solfleet checks slot lag against the cluster, delinquency, and version drift.
  • Build-and-distribute. Agave v3.0 dropped prebuilt validator binaries, so every operator now has to build from source. solfleet builds once on a dedicated builder node (with the ABI-matched Yellowstone geyser .so), caches it, and distributes the artifact set to the fleet.
  • Leader-aware restarts. Restarting a voting validator during its own leader slots skips blocks. solfleet restarts validators via a leader-aware safe-exit; RPC nodes cycle via systemctl.
  • Safe failover. The watch loop pulls lagging/unhealthy nodes out of DNS and restores them on recovery, and refuses to ever empty a pool.

Status

v1. Built and unit-tested (91 tests, CI on Python 3.11-3.13). Most paths are also proven live against a disposable devnet node and a real Cloudflare zone.

Proven live:

  • read path: status, validate, vote-status, inspect
  • restart (RPC via systemctl; validator via leader-aware safe-exit)
  • in-place upgrade end to end (build agave from source on a builder, distribute, sha256-verify on the target, atomic swap, catch-up) for both RPC and voting-validator nodes
  • bootstrap-builder (toolchain + deps on a bare builder)
  • provision a voting validator from bare disks (format NVMe, install, render the voting unit, start, catch up, vote)
  • DNS driver plus dns status / eject / restore and last-member protection, against a live Cloudflare zone

Unit-tested but not yet run live:

  • the autonomous watch loop (probe -> decide -> act); its decision logic is unit-tested and it reuses the now-proven Cloudflare driver
  • the Route53 driver (no AWS zone to point at yet)

Not built yet: HTTP transport (MCP is stdio-only today). See PLAN.md (M6).

Install

sh
pipx install solfleet            # not yet published; for now:pipx install git+https://github.com/sanjeevkkansal/solfleetpipx install 'solfleet[route53]' # if you use Route53 for DNS

Quick start

sh
cp fleet.example.yaml fleet.yaml     # edit with your nodescp policy.example.yaml policy.yaml   # optional; sane defaults if absentsolfleet status                      # probe the fleetsolfleet status --watch              # refreshing live tablesolfleet validate                    # structural + live readiness checksolfleet vote-status mn-val-1        # voting health: credits, balance, delinquency, leadersolfleet inspect mn-val-1            # read-only SSH detail for one nodesolfleet bootstrap-builder b1        # install build toolchain on a builder; --confirmsolfleet provision rpc-1 4.1.0       # dry-run bring-up plan; --confirm to runsolfleet plan-upgrade mn-val-1 4.1.0 # dry-run upgrade plansolfleet upgrade mn-val-1 4.1.0      # dry-run; add --confirm to executesolfleet watch --dry-run             # DNS failover loop, decide-only

MCP (Claude Code):

sh
claude mcp add solfleet -- solfleet-mcp

Example session

Pointed at a small devnet fleet. With no flags, commands are read-only or dry-run.

Fleet health is Solana-aware, not just an HTTP 200:

console
$ solfleet statusCLUSTER  NODE   ROLE  HEALTH  VERSION     SLOT LAG  VOTEdevnet   rpc-1  rpc   ok      4.1.0-rc.1  0         -devnet   rpc-2  rpc   ok      4.1.0-rc.1  0         -

An upgrade is dry-run by default. It returns the ordered plan and the gate decision and changes nothing until you pass --confirm:

console
$ solfleet plan-upgrade rpc-1 4.1.0{  "decision": {    "operation": "upgrade",    "cluster": "devnet",    "node": "rpc-1",    "mode": "dry-run",    "allowed": true,    "plan": [      "on builder 'build-1': build agave 4.1.0 from source",      "distribute artifact set to rpc-1; checksum-verify each (abort on mismatch)",      "stop solana-validator, swap, start",      "swap /usr/local/bin/agave-validator + geyser .so + version marker atomically",      "wait until healthy + caught up to https://api.devnet.solana.com",      "verify reported version == 4.1.0; record before/after"    ],    "reasons": [      "dry-run: preflight checks pass; pass confirm=true to execute"    ]  },  "target_version": "4.1.0"}

Over MCP, the same operations are tools (fleet_status, plan_node_upgrade, upgrade, ...). Claude gets that same plan back and has to pass confirm=true to execute, so an agent cannot mutate a node by accident.

Tools

Read-only: fleet_status, node_detail, version_drift, vote_status, leader_schedule, validate, plan_node_upgrade, dns_pool_status, audit_log.

Gated (dry-run by default; confirm=true to execute): bootstrap_builder_host, provision, restart, upgrade, dns_pool_eject, dns_pool_restore.

Every mutation is dry-run by default, checked against policy.yaml (allowed versions, disk floor, leader-window minimum), and written to a SQLite audit log. The watch loop is the one autonomous mutator; it is bounded by the same audit log and the never-empty-a-pool rule.

Safety model

  • Dry-run by default. Mutations return their ordered plan and preflight unless called with confirm=true.
  • Policy gate. Per-cluster policy.yaml: allowed version globs, disk floor, and require_leader_window_minutes for validators.
  • Checksum-verified distribution. Upgrade artifacts are sha256-checked on the target against the builder before any swap.
  • No keys, ever. solfleet does not read, move, or generate identity/vote keypairs. Voting-validator identity failover is out of scope by design (double-signing risk).
  • Audit log. Every dry-run and execute is recorded in SQLite.

Development

sh
uv venv && uv pip install -e '.[dev]'uv run pytest

MCP registry

Published to the MCP Registry.

mcp-name: io.github.sanjeevkkansal/solfleet

来源:README.md,提交 4fb5c9e

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v0.1.1最新Sep 16, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分