Give a Hermes agent an x402 wallet
Hermes (NousResearch) agents get a budget-bound payment wallet with PipRail: they can pay x402-gated APIs, data feeds, and AI services on their own, across every supported chain, and they cannot spend more than the cap you set.
How it works
Section titled “How it works”PipRail plugs into Hermes as a standard MCP server, the published
@piprail/mcp (npx -y @piprail/mcp). Hermes spawns it over stdio, the agent
gets all the PipRail tools (namespaced mcp_piprail_*, e.g. mcp_piprail_piprail_pay_request;
Hermes prefixes the server name, so the piprail_pay_request tool surfaces as
mcp_piprail_piprail_pay_request; the doubled prefix is expected, not a typo), and a spend policy the model
cannot exceed is baked in. There’s no bespoke plugin to build. Hermes is Python and
@piprail/sdk is TypeScript, so the MCP server is the integration, plus one config entry.
Quickest, one command. Adds the server and (after a quick “enable all tools?” prompt) saves it to
~/.hermes/config.yaml:
hermes mcp add piprail --command npx --args -y @piprail/mcpOnce the catalog entry lands it gets shorter still: hermes mcp install piprail.
Or wire it by hand. Hermes nests MCP servers under the top-level mcp_servers key in
~/.hermes/config.yaml:
mcp_servers: piprail: command: "npx" args: ["-y", "@piprail/mcp"] enabled: true env: PIPRAIL_PRIVATE_KEY: "${PIPRAIL_PRIVATE_KEY}" # from ~/.hermes/.env PIPRAIL_CHAIN: "base" PIPRAIL_MAX_AMOUNT: "0.10" PIPRAIL_MAX_TOTAL: "5.00" PIPRAIL_TOKENS: "USDC" tools: prompts: false resources: false include: - piprail_discover - piprail_quote_payment - piprail_plan_payment - piprail_pay_request - piprail_register - piprail_budget - piprail_guide - piprail_verify_receiptRun /reload-mcp in a session (or start a new one) and the mcp_piprail_* tools appear.
Read-only first run: omit the key and PipRail boots key-less. Discover/quote/register/budget/guide all work; only pay/plan need the wallet.
Configure
Section titled “Configure”| Variable | Required | Default | Purpose |
|---|---|---|---|
PIPRAIL_PRIVATE_KEY | only to pay | none | Self-custodial wallet key/seed (EVM 0x…, Solana base58, or a mnemonic). Omit it for read-only, since discover/quote/register/budget/guide still work. Not an API key. |
PIPRAIL_CHAIN | no | base | Which chain to pay on: any EVM, or solana/ton/tron/near/sui/aptos/algorand/stellar/xrpl. NEAR also requires PIPRAIL_NEAR_ACCOUNT_ID to pay (e.g. you.near). |
PIPRAIL_CHAINS | no | none | Pay across several chains (instead of PIPRAIL_CHAIN), e.g. base,polygon,solana, each with its own PIPRAIL_<CHAIN>_KEY; pays whichever chain a 402 asks for. See Configuration. |
PIPRAIL_MAX_AMOUNT | no | 0.10 | Max per payment, in the token’s units (≈ $ for USDC/USDT; native-coin units on a native rail) |
PIPRAIL_MAX_TOTAL | no | 10.00 | Lifetime budget per token; in multi-chain mode, per chain+token |
PIPRAIL_TOKENS | no | chain stables | Allowed tokens, comma-separated |
PIPRAIL_SCHEMES | no | onchain-proof | Add exact to also pay standard x402 servers |
PIPRAIL_RPC_URL | no | chain default | Custom RPC (recommended in production) |
Defaults are deliberately small and safe (0.10 per payment, 10.00 lifetime, USDC on Base). The full env reference is on the Configuration page; the wallet key format your chain expects is in Wallets by family.
The tools
Section titled “The tools”| Tool | What it does | Moves money? |
|---|---|---|
piprail_discover | Find payable x402 APIs on the open indexes | no |
piprail_quote_payment | Get a URL’s price without paying | no |
piprail_plan_payment | Check you can afford it (balance + gas + recipient-ready) | no |
piprail_pay_request | Pay the 402 and return the resource | yes |
piprail_register | List your own x402 API so other agents find it | no |
piprail_budget | Read remaining spend + time leash | no |
piprail_guide | Read the agent contract (quote → plan → pay) | no |
piprail_verify_receipt | Re-verify a receipt against the chain (wallet-free) | no |
Only piprail_pay_request moves funds; in Hermes they surface as mcp_piprail_*. To let the agent
read and plan but never auto-spend, drop piprail_pay_request from the server’s tools.include. Full
reference: the tools.
The agent workflow
Section titled “The agent workflow”discover → quote → plan → pay.
User: Find me a crypto price API I can pay for.Agent: [piprail_discover("crypto price")] → cheapest is 0.001 USDC/call on Base.User: Can I afford it?Agent: [piprail_plan_payment(url)] → yes; 4.82 USDC left of 5.00, recipient ready, gas ~$0.05.User: Get me the ETH price.Agent: [piprail_pay_request(url)] → paid 0.001 USDC (tx 0x…). ETH: $3,247.18. 4.819 USDC left.Discover & publish
Section titled “Discover & publish”PipRail is added to Hermes two ways, both PRs into
NousResearch/hermes-agent:
- MCP catalog (primary). A
optional-mcps/piprail/manifest.yamlentry makeshermes mcp install piprailwork natively, carrying the “Nous-approved” label. - Skills Hub. A
SKILL.mdpublished viahermes skills publish, or contributed tooptional-skills/.
Both ship in the runnable folder below.
Verify
Section titled “Verify”- Quote the live demo.
piprail_quote_payment("https://piprail.com/x402/demo")returns a real price (0.01 USDC on Base). - Pay it.
piprail_pay_request("https://piprail.com/x402/demo")returns a200+ a receipt. - Budget holds. Set
PIPRAIL_MAX_TOTALbelow the price and confirm the agent is refused (declined: true), no funds moved.
The runnable folder lives at
integrations/hermes/piprail/:
manifest.yaml (the catalog entry), config.yaml, SKILL.md, .env.example, and a zero-dep
verify.mjs (node verify.mjs --live).
See also
Section titled “See also”- MCP overview · Client setup · Tools
- Spend controls, how the cap is enforced
- Chains, every chain PipRail supports