evernode-mcp
evernode-mcp is a read-only, advisory MCP server that lets an AI agent build, lint, cost, and deploy HotPocket dApps on Evernode/Xahau without holding keys or moving funds.
List the 10 available HotPocket dApp templates.
Generate deterministic-by-construction contract file sets for templates like escrow, subscription, voting, oracle_consumer, payment_splitter, multisig_treasury, etc.
Heuristically scan contract source for non-deterministic consensus-breakers (wall-clock, randomness, network I/O, env, timers, unordered iteration, etc.).
Heuristically check correct HotPocket contract API usage (hpc.init, ctx, consensused state, lclSeqNo, async consensus ops).
Recommend a HotPocket pattern from a plain-English use case (node count, state model, oracle/NPL, Xahau settlement, determinism caveats).
Return the Xahau Hook settlement workflow: write with xahc, simulate with xahau-mcp, prove with xahc-prover, install guardrail.
Generate cluster-side Xahau payout code, unsigned guardrail Hook install, and the exact xahc prove command for value-moving dApps.
Estimate EVR lease cost from per-moment rate, moments, and node count.
Rank live Evernode hosts from OnLedger (or a supplied list) by cheap/capacity/reputation with filters.
Diagnose a single Evernode host live from OnLedger (or a supplied object): registration, reputation, slots, lease, specs, red flags.
Generate deploy command sequences for local hpdevkit, single-host evdevkit, N-node cluster, or Offledger Cluster Manager.
Explain common HotPocket/Evernode errors with likely cause and fix.
All tools are advisory/read-only; only recommend_hosts and host_diagnostics use live read-only network calls.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@evernode-mcp Generate an escrow dApp template"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
evernode-mcp — Evernode AI Builder
A Model Context Protocol server that lets an AI agent build, check, cost, and deploy HotPocket dApps on Evernode / Xahau. Point any MCP-capable agent (Claude, etc.) at it and ask for a dApp — it scaffolds a contract from templates written to avoid the known consensus-breakers, lints contract code for non-deterministic patterns, estimates the EVR lease, ranks live Evernode hosts, generates the deploy commands, and — when the dApp moves value on Xahau — emits the commands to install a spend-limit Hook and prove its invariant with the Hooks toolchain.
HotPocket is Evernode's contract runtime: it runs your Node.js/WASM contract on every node of a cluster and puts the output + state through consensus. The single biggest beginner mistake is non-deterministic code (
Date.now(),Math.random(),fetch(), …) — two nodes compute different results and the ledger stalls. This server is built around catching the common causes of that before deploy (heuristically — see what it does / doesn't catch).
It is advisory and read-only: it generates files + guidance, never holds keys, never spends EVR, never acquires a lease, never signs or submits, and it connects to the Offledger Cluster Manager rather than replacing its orchestration. No API keys or accounts are needed; the only network calls are read-only HTTPS GETs to the public OnLedger API from two tools (see Network access).
Where it fits — the layer-2 companion to the Hooks trifecta
The Hooks pipeline secures layer-1 Hooks — write → simulate one tx → prove all inputs → watch live:
stage | tool | what it does |
write | author + compile a safe Hook to clean, lint-passed WASM | |
simulate one | run the real bytecode against one live transaction | |
prove all | prove an invariant holds for every input in scope — or return the counterexample | |
watch live | bind a proof to the deployed hook and continuously attest it (alerts on a |
evernode-mcp is the layer-2 companion: it builds the HotPocket dApps that run on
Evernode hosts. Whenever a dApp settles value on Xahau through a Hook-guarded account, it hands
off to the trifecta — it never re-asserts settlement safety itself (check_hook_compat /
generate_settlement emit the trifecta's prove/install commands, not a safety verdict).
Related MCP server: XRP Ledger Testnet MCP Server
Tools
All twelve tools are read-only / advisory. Every tool sets readOnlyHint: true; only the two
live OnLedger tools (recommend_hosts, host_diagnostics) set openWorldHint: true (they may reach
a live external endpoint, OnLedger). Each tool publishes an output schema, so an agent gets a
validated structuredContent shape (not just text) — no guessing field names.
tool | open world? | returns |
| no |
|
| no |
|
| no |
|
| no |
|
| no |
|
| no |
|
| no |
|
| no |
|
| yes |
|
| yes |
|
| no |
|
| no |
|
Templates
generate_contract ships 10 templates. Each is written to avoid the known non-determinism
sources (no wall-clock, no randomness, no network in the contract path; time is the consensus
ledger seq ctx.lclSeqNo; state persists only through the contract's own consensused state file)
and is lint-clean: the smoke test and the suite run every template through check_determinism
(no HIGH findings) and check_contract_api. That is a heuristic check, not a proof of
determinism — test on a multi-node cluster before mainnet.
template | what it is | determinism note |
| minimal echo contract — a starting point. | echoes input + |
| depositor locks an amount-claim for a beneficiary, released after a deadline. | deadlines are ledger sequences, not timestamps. |
| users subscribe for N ledger-rounds; access granted while | pure ledger-seq accounting. |
| turn-based per-user scores + leaderboard. | leaderboard sorts with a code-point pubkey tiebreaker (not |
| one-vote-per-pubkey poll with tally. | tally iterates a sorted key view; votes keyed by pubkey dedupe. |
| gated access via an admin-maintained allowlist. | does not read an on-chain balance from contract logic (non-deterministic) — uses a consensused allowlist/oracle attestation. |
| records deposits, computes weighted splits in integer drops. | remainder to the last recipient so payouts sum exactly (no rounding leak); actual payout is a separate Xahau multisig step (see |
| the canonical hard pattern: brings external data in via NPL agreement (nodes agree on the value before acting), never a direct fetch. | nodes PROPOSE their observation over the Node Party Line and only ACT on a strict-majority agreed value (a primitive, so its canonical form is byte-identical); disagreement is a deterministic no-op; the agreed datum is stamped with |
| per-ledger-seq vesting: releasable amount is | pure function of the consensus clock, integer drops only (no float divergence); the contract RECORDS the release — the actual transfer is deferred to |
| records spend proposals + M-of-N approvals (threshold). | approvals keyed by signer pubkey, counted over a sorted view; on reaching the threshold it emits the settlement step to |
Each generated file set carries notes including "before deploy: run check_determinism on
src/index.js — HIGH findings break consensus."
Why the determinism check matters (and exactly what it does / doesn't catch)
HotPocket consensuses contract output across every node. If two nodes diverge — because you
called Date.now(), Math.random(), fetch(), or read process.env, or iterated an unordered
collection built in a non-consensused order — consensus breaks and the ledger stalls.
check_determinism flags these before you deploy.
It is a heuristic linter, not a prover — a source scan (mostly per-line regex, plus a small cross-line alias pass), so it is guidance, never a guarantee. Design bias (deliberate): for this tool a false-negative (silently missing a real consensus breaker) is the worst outcome, so when a construct could iterate/serialize an unordered collection but can't be proven sorted, it is flagged. A false-positive (flagging safe code) only costs you a justification.
Now covered (each with a why + a concrete fix):
Wall-clock —
Date.now,performance.now,process.hrtime[.bigint],new Date()(HIGH).Randomness —
Math.random,crypto.randomBytes/randomUUID/randomInt/randomFill[Sync]/getRandomValues(HIGH).Network I/O —
fetch/axios/got/node-fetch,require('https'|'net'|'dns')(HIGH).Per-node env —
process.env/process.pid,os.hostname/networkInterfaces/cpus/freemem/loadavg/uptime/userInfo/platform/arch/tmpdir/endianness(HIGH).Timers / race —
setTimeout/setInterval/setImmediate,Promise.race/any(MEDIUM).Filesystem —
fs.read*/write*/stat/readdiroutside the sanctioned state file (MEDIUM).Unordered iteration —
for..in, andObject.keys/values/entries+ Map/Setfor..of(LOW). Sorted views (Object.keys(o).sort(),Object.entries(o).sort(...)) are recognized and not flagged.Aliased Map/Set (LOW) — a variable or a member (
this.m = new Map(),state.m = new Set()) bound tonew Map()/new Set()then iterated / spread /forEach'd /Array.from'd /.entries()/.keys()/.values()on a later line (the cross-line alias pass — now covers member-expression aliases, not just plain identifiers).Member-expression
for..of(LOW) —for (const x of this.m / state.m / obj.m)even with no Map/Set evidence: order-unprovable, so flagged. Known deterministic array members (user.inputs/outputs) and call expressions (ctx.users.list()) are recognized and not flagged.Spread /
Array.frommaterialization (LOW) —[...map],[...Object.values(o)],Array.from(set)that materialize insertion order into an array; suppressed when immediately.sort()-ed..forEach(LOW) — over an Object view ornew Map/Set; suppressed when sorted first.JSON.stringifyof an unordered object (LOW) — a bare object identifier or a spread/merge whose key order isn't provably consensused (the serialized output/state is consensused byte-for-byte). Fixed-key object literals, arrays, primitives, a sorted replacer array, and.sort()-ed arguments are recognized as safe and not flagged.Locale / timezone / ICU (MEDIUM) —
toLocaleString/toLocaleDateString/toLocaleTimeString,localeCompare, andIntl.*. These depend on the host's locale + ICU collation/format data (and timezone), which differ across nodes — the produced string or sort order diverges. Fix: locale-independent formatting + a code-point comparison (a < b ? -1 : a > b ? 1 : 0), neverlocaleCompare.Floating-point literals (LOW) — a non-integer float literal (e.g.
0.1, or a negative-exponent scientific literal1.5e-3/1e-3) orparseFloat(feeding contract math: float rounding / NaN /-0can differ across engines/hosts. Fix: integer math only (work in drops,Math.floor(a*n/d)). Integer literals, integer-valued positive-exponent literals (1.5e3= 1500), and integer division/floor are not flagged.
Still out of scope (documented honestly — these are NOT caught):
Bare float math / untyped division —
a / bof two unknown-typed variables (no float literal /parseFloatsignal) is too noisy to flag soundly, so it isn't. Only float literals andparseFloatare flagged.Deeper data-flow — order divergence behind multi-hop aliases (
const n = m), function-return values (const m = makeMap()), Map passed in as a parameter, object spreads merged across several statements, dynamically-built call expressions, or a Map reached through a separate-statement reassignment (let m; m = new Map()). The alias pass covers the directconst x = new Map()and the direct memberthis.m = new Map()cases, not arbitrary data-flow.Known acceptable false-positives — e.g.
[...Object.keys(o)].sort()still fires the baseiteration-orderrule (the spread hides the.sort()from it); aDate.now()used only for a local log; an order-independent reduction over a Map; an honest array iterated asfor (const x of this.list)(a member with no array-allowlist entry). These flag safe code (the acceptable direction) — justify or refactor.
So: it catches the breakers beginners hit, and biases toward over-flagging the iteration/serialize
classes — it does not prove determinism. Settlement safety is proven separately by the
trifecta (xahc-prover). Always test on a real multi-node cluster before mainnet.
Settlement → the trifecta handoff
When a value-moving dApp (escrow / subscription payout / payment_splitter) pays out on Xahau, it
does so from the cluster's multisig account. generate_settlement produces a three-part bundle:
Cluster-side payout code (
xahau/settle.js, a starting point) — the contract decides amounts under consensus; signing happens OUTSIDE consensus via the cluster's threshold/multisig signer. The generated file signs with a single key as a placeholder; replace it with multisig aggregation.The install of the reference
agent_guardrailHook (from xahc-prover; exercised on Xahau testnet) on the cluster account, with your per-txLIM(spend cap, 8-byte big-endian HookParameter) + optionalDST(destination lock) — emitted as an unsignedxahc install-txSetHook to sign offline.The exact
xahc provecommand to prove the guardrail invariant on your built WASM.
The bundle emits the prove/install commands — it does not assert a safety verdict itself. While
the Hook is installed, an outgoing Payment over LIM or to a non-allowed DST is rejected by the
ledger even if the payout code or a signer is wrong. Limits: the Hook fires on Payment only,
so it does not stop the account's signers from removing it (SetHook) or moving value with other
transaction types — protect the signer quorum. A PROVEN verdict from xahc prove holds within the
prover's modeled scope; deploy only on PROVEN for your build.
Install
Requires Node.js 20+. The server speaks MCP over stdio; your MCP client launches it.
From npm
npx -y evernode-mcp --help # run without installing (prints usage and exits)
npm install -g evernode-mcp # or install the `evernode-mcp` command globally
evernode-mcp --smoke # offline self-test (templates lint-clean, checker + math work)Run with no arguments, evernode-mcp waits for an MCP client on stdin/stdout — it is not an interactive CLI.
Add it to an MCP client
Claude Code:
claude mcp add evernode -- npx -y evernode-mcpClaude Desktop (claude_desktop_config.json), or any client that takes an mcpServers block:
{
"mcpServers": {
"evernode": { "command": "npx", "args": ["-y", "evernode-mcp"] }
}
}If you installed globally, "command": "evernode-mcp" with no args works too. No environment
variables, API keys, or wallet are needed.
From GitHub / source
npm install -g github:Hugegreencandle/evernode-mcp # builds on install via `prepare`Or clone and build:
git clone https://github.com/Hugegreencandle/evernode-mcp && cd evernode-mcp
npm install # the `prepare` script compiles dist/ automatically
npm run smoke # offline self-test
npm test # the full Vitest suite (offline)Network access
Ten of the twelve tools are fully offline. Only recommend_hosts and host_diagnostics make
network calls, and only when you don't supply host data yourself:
tool | request | notes |
|
| public, no key; 10 s timeout; 30 s in-memory cache |
|
| public, no key; 10 s timeout; 30 s in-memory cache |
OnLedger is a third-party service, not run by this project; its data is only as current as its
index. On any failure the tools return an empty result with a note — never fabricated hosts.
Nothing is ever written to a ledger. (The generated xahau/settle.js file connects to
wss://xahau-test.net when you run it; the server itself never does.)
Usage
Point any MCP-capable agent at the server and just ask, e.g.:
"Scaffold an escrow HotPocket dApp called
vault." →generate_contract"Is this contract safe for cluster consensus?" (paste source) →
check_determinism"Does this contract use the HotPocket API correctly?" (paste source) →
check_contract_api"Scaffold an oracle dApp that agrees on a price via NPL." →
generate_contract(oracle_consumer)"Is host rHostAddr… healthy enough to lease?" →
host_diagnostics(live)"What pattern should I use for a token-gated forum?" →
recommend_pattern"Find me the 5 cheapest active Evernode hosts in Germany." →
recommend_hosts(live)"Estimate the EVR to run a 3-node cluster for 720 moments at 2 EVR/moment." →
estimate_lease_cost"Generate the safe Xahau settlement for my splitter, capped at 50 XAH." →
generate_settlement→ then run the emittedxahc provecommand.
Dev / test / CI
npm run build # tsc → dist/
npm test # build + Vitest (offline; mocks the live OnLedger fetch)
npm run smoke # node dist/index.js --smoke — offline self-test
node dist/index.js # run as a stdio MCP serverTests (
tests/):determinism(rule coverage incl. the regression floor + new gaps),contractApi(good contract clean + each API-misuse flagged),advisor(lease math, host ranking, error mapping, pattern/deploy branches),templates(per-template build + determinism-clean + per-template invariants),settlement(LIM encoding + trifecta handoff shape),outputSchemas(each handler's real output validates against its published schema),index(end-to-end: every tool driven through an in-memory MCP client, input-schema rejection),hostDiagnostics(healthy / red-flag / not-found / fetch-failure honesty, mocked fetch), andfetch(live-path hardening, mocked).CI (
.github/workflows/ci.yml): on push + PR tomain, runsnpm ci,npm run build,npm test, andnpm run smokeon Node 20.createServer()is exported fromsrc/index.tsso the server can be driven over an in-memory transport in tests without starting the stdio transport.
Honest scope (recap)
Generates code + guidance; does not acquire leases, sign, or move EVR/XAH. No key custody.
recommend_hostsfetches live from OnLedger (or ranks a list you supply) — it never fabricates host addresses/specs; on fetch failure it returns empty hosts + a note explaining why, never a fabricated fallback.check_determinismandcheck_contract_apiare heuristic source scans (mostly per-line regex) — guidance, not a proof;check_determinismis biased to over-flag the iteration/serialize classes and has documented blind spots (bare float math, multi-hop data-flow). Test on a real multi-node cluster before mainnet.Settlement safety (Hook spend limits) is delegated to the Hooks toolchain (
xahc prove) — this server emits the prove/install commands, never a verdict. The guardrail Hook covers outgoingPayments only.generate_deploy_commandsandexplain_errorare static guidance. The command syntax was checked againstevdevkit0.7.22 andhpdevkit0.6.9 (npm, 2026-10-01); check the Evernode docs or--helpif your version differs.estimate_lease_costis arithmetic on the rate you supply; hosts set their own rates.
License
MIT © 2026 Dane Brown. Open source; see LICENSE. Not affiliated with Evernode Labs
or the Xahau project. check_determinism findings are heuristic guidance, not a guarantee — always
test on a multi-node cluster and review before mainnet.
Available Tools
12 toolscheck_contract_apiCheck HotPocket contract API usageARead-onlyIdempotent
Heuristic static check that a HotPocket Node.js contract uses the contract API correctly: an hpc.init(...) entry point, reading ctx (users / lclSeqNo), persisting ONLY through the consensused state mechanism (no arbitrary fs writes to non-state paths), handling ctx.users I/O, using ctx.lclSeqNo for time (not Date.now), and awaiting async consensus ops. Severity-rated with fix + why. Sibling to check_determinism — guidance, NOT a proof.
Inputs: source (required). Returns: summary, findings
check_determinismCheck contract determinismARead-onlyIdempotent
Heuristic scan of HotPocket contract source for non-deterministic patterns (wall-clock, randomness, network I/O, env, timers, unordered iteration) that break cluster consensus. HIGH findings are likely consensus breakers. Guidance, not a proof.
Inputs: source (required). Returns: summary, findings
check_hook_compatCheck Xahau Hook / WASM compatibilityARead-onlyIdempotent
When a dApp settles value on Xahau through a Hook-guarded account, hands off to the trifecta: build/lint the Hook with xahc, simulate it with xahau-mcp, and PROVE the spend invariant with xahc-prover. Returns the recommended workflow.
Inputs: involves_hook (required), what. Returns: repos, workflow, involvesHook
estimate_lease_costEstimate EVR lease costARead-onlyIdempotent
Estimate tenant EVR lease cost = evrPerMoment × moments × nodes. Rates are host-set (no network standard); registration fees are host-side, not included.
Inputs: nodes (required), moments (required), evr_per_moment (required), moment_minutes. Returns: notes, inputs, totalEVR, perNodeEVR, +1 more
explain_errorExplain an Evernode/HotPocket errorARead-onlyIdempotent
Map a HotPocket/Evernode error message to its likely cause and fix (connection, consensus stall, no hosts, insufficient EVR, lease expiry, docker, Hook rejection).
Inputs: error_text (required). Returns: matched, message, explanations
generate_contractGenerate a HotPocket dAppARead-onlyIdempotent
Generate a deterministic-by-construction HotPocket dApp file set (contract + state helper + hp.cfg.override + package.json + client) for a template.
Inputs: template (required), name. Returns: files, notes, template
generate_deploy_commandsGenerate deploy commandsARead-onlyIdempotent
Generate the command sequence for: local (hpdevkit dev cluster), single (evdevkit acquire one host), cluster (evdevkit N-node cluster), or cluster-manager (connect to Offledger Cluster Manager).
Inputs: mode (required), host, nodes, instance_name. Returns: notes, steps
generate_settlementGenerate safe Xahau settlementARead-onlyIdempotent
For a value-moving dApp, generate the cluster-side Xahau payout code + the install of the trifecta's PROVEN agent_guardrail Hook (per-tx LIM + optional DST lock) on the cluster account + the exact xahc prove command. 'Safe by construction → proven safe' — the ledger enforces the spend cap even if the contract/signer is wrong.
Inputs: template (required), limit_drops (required), dest, cluster_account. Returns: files, notes, prove, install, +2 more
host_diagnosticsDiagnose an Evernode host (live)ARead-onlyIdempotent
Health view of a single Evernode host by r-address: registration status, reputation, active/total instance slots, lease terms (rate/moments if available), and red-flags (low reputation, full capacity, stale/inactive). Fetches live from OnLedger (api.onledger.net, real-time from the Xahau registry) — or pass a host object to diagnose it. REAL data only: unknown fields are OMITTED (never invented); honest empty + note on not-found / fetch failure.
Inputs: host, address. Returns: note, found, lease, slots, +6 more
list_templatesList dApp templatesARead-onlyIdempotent
List the available HotPocket dApp templates (escrow, subscription, game_backend, voting, token_gated, payment_splitter, oracle_consumer, streaming_payment, multisig_treasury, blank).
Inputs: no named parameters. Returns: templates
recommend_hostsRecommend Evernode hosts (live)ARead-onlyIdempotent
Fetch + rank live Evernode hosts from OnLedger (api.onledger.net, real-time from the Xahau registry) by cheap | capacity | reputation, with optional filters. Or pass your own hosts list to rank it. Real data only — never invents hosts.
Inputs: hosts, limit, prefer, country, +3 more. Returns: mode, note, query, prefer, +2 more
recommend_patternRecommend a HotPocket patternARead-onlyIdempotent
Given a plain-English use-case, recommend the HotPocket pattern (node count, state model, oracle/NPL usage, Xahau settlement) with the determinism caveats that matter.
Inputs: use_case (required). Returns: nodes, notes, pattern
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 12 tools
Each tool targets a distinct aspect of Evernode development: templates, deployment, contract checking, pattern recommendation, host management, and error handling. No two tools have overlapping purposes; even the two static check tools (check_determinism and check_contract_api) address different concerns.
Tool names predominantly follow a verb_noun pattern (list_templates, generate_deploy_commands, check_determinism). Minor abbreviations like 'compat' and 'diagnostics' are clear and consistent with the pattern. No mixed casing or inconsistent verb styles.
With 12 tools, the server covers the full pre-deployment workflow for Evernode dApps: template selection, contract generation, static analysis, pattern recommendation, settlement, host discovery, and diagnostics. The count is well-scoped for its purpose.
The tool surface is thorough for the development and deployment planning phase, but lacks post-deployment operations such as listing existing dApps, updating, or deleting instances. This is a minor gap, as the core workflow is well-covered.
Maintenance
Related MCP Connectors
Escrow for AI agents on the XRP Ledger. 51 tools. Free testnet sandbox (no real XRP).
Trustless XRPL escrow oracle for AI agents. Create jobs, verify work, release XRP/RLUSD payments.
Build, validate, deploy — HTTP APIs, cron jobs, webhooks and MCP tools — from your AI client.
AI-native programming language and toolchain for accountable, verifiable agent-driven development.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to deploy, initialize, and upgrade NEAR smart contracts with cost estimation and status checks.5MIT
- AlicenseCqualityDmaintenanceEnables AI systems to interact with the XRP Ledger Testnet, supporting XRP payments, token operations, NFTs, escrow, DEX trading, and more.51MIT
- AlicenseAqualityDmaintenanceEnables AI agents to build, test, deploy, invoke, and inspect Soroban smart contracts on the Stellar network through structured MCP tools and resources.66 npmMIT

Flux Cloud MCP serverofficial
AlicenseAqualityBmaintenanceEnables AI agents to price, deploy, pay for, monitor, update, and cancel applications on a decentralized cloud using a generated key pair, with plain-language specs converted into validated network specifications. Also provides container logs, live instance stats, and network or pricing guidance as read-only tools.1581 npmMIT