npm aeron-walletstdioMITupdated 8d ago
A non-custodial wallet for agents. It holds USDG on Robinhood Chain and pays 402 Payment Required responses on its own, so an agent can call a metered API without a card, an account, or a human in the loop.
What can you do with aeron wallet?
aeron-wallet
A non-custodial wallet for agents. It holds USDG on Robinhood Chain and pays
402 Payment Required responses on its own, so an agent can call a metered API
without a card, an account, or a human in the loop.
Ships two ways: a CLI, and an MCP server for Claude and other MCP clients.
Quickstart
npx -y aeron-wallet address
That prints your wallet address and creates a key on first run. Send USDG to that address, then pay for a call:
npx -y aeron-wallet pay https://inference.aeron.sh/v1/chat/completions \
'{"model":"deepseek/deepseek-chat","messages":[{"role":"user","content":"hi"}]}'
The wallet reads the 402 challenge, checks it against your budget caps, signs an EIP-3009 transfer, and retries the request with the payment attached. You do not need ETH: the facilitator relays the transaction and pays gas.
Commands
| Command | What it does |
|---|---|
address |
Print the wallet address. Creates the key if none exists. |
balance |
ETH and USDG balances, read from chain. |
pay <url> [json] |
Call an x402 endpoint, paying if it answers 402. |
history |
The last 10 payments, from the local log. |
session create |
Mint a scoped session: hosts, budget, per-call cap, expiry. |
session list |
Every session, what it spent, and whether it is still live. |
session revoke <id> |
Kill a session. It stops paying on its next call. |
mcp |
Run as an MCP server over stdio. The default with no arguments. |
Install it in an agent
Claude Code
/plugin marketplace add aeronlabs/aeron-wallet
/plugin install aeron-wallet@aeronlabs
Cursor
Gemini CLI
gemini extensions install https://github.com/aeronlabs/aeron-wallet
VS Code
code --add-mcp '{"name":"aeron-wallet","command":"npx","args":["-y","aeron-wallet","mcp"]}'
Anything else that speaks MCP
{
"mcpServers": {
"aeron-wallet": {
"command": "npx",
"args": ["-y", "aeron-wallet", "mcp"]
}
}
}
Four tools: get_address, get_balance, pay, history. An unbound server
also gets create_session, list_sessions, and revoke_session.
Sessions
A session is a scope you can hand to an agent without handing over the wallet. It names the hosts that may be paid, a total budget, a per-call cap, and an expiry:
aeron-wallet session create --host inference.aeron.sh --budget 0.25 --ttl 2h
That prints a token, once. Bind a server to it and every call through that server inherits the scope:
{
"mcpServers": {
"aeron-wallet": {
"command": "npx",
"args": ["-y", "aeron-wallet", "mcp"],
"env": { "AERON_WALLET_SESSION": "<token>" }
}
}
}
A bound server deliberately has no session tools. An agent that could mint itself a wider session would not be contained by one. It also cannot reach a host outside the scope: the wallet refuses before the request goes out, so an agent talked into paying an attacker's endpoint never contacts it.
Revoking takes effect on the next call, including for a server already running, because the scope is re-read every time rather than captured at startup.
aeron-wallet pay --session <token> <url> applies a scope to a single call.
Sessions narrow the wallet; they never widen it. The caps below still apply underneath, so a $5 session on a $1/day wallet spends $1 a day.
Your key
The key is generated on your machine on first run and written to
~/.aeron/wallet/key with 0600 permissions. It never leaves the machine and
nobody else can derive your address. Every install creates a different wallet.
Two consequences worth planning for:
- Ephemeral containers. If
$HOMEis wiped between runs, the wallet regenerates and any USDG left on the old address is stranded. Mount a volume for~/.aeron, setAERON_WALLET_DIRto a path that persists, or supply the key yourself withAERON_WALLET_KEY. - Hot wallet. The key sits unencrypted on disk so an agent can sign without a prompt. Keep the balance small. Fund it the way you would top up a prepaid card, not the way you would fund savings.
Budget caps
The wallet refuses to sign above either cap, so a loop cannot drain it.
| Variable | Default | Meaning |
|---|---|---|
MAX_PER_CALL_USD |
0.05 |
Largest single payment. |
DAILY_CAP_USD |
1 |
Total for the current UTC day. |
What a result means
A request that comes back 4xx is not one situation, it is three, and they
differ in the only way that matters: whether the money left the wallet. The
signal is the settlement receipt — a service that settled returns
X-PAYMENT-RESPONSE with a transaction hash, and one that did not, does not.
status |
Charged | What happened |
|---|---|---|
settled |
yes | The service answered. reason is set only in the bad case below. |
rejected |
no | HTTP 402. The service refused the payment; the authorization is unspent. |
failed |
no | The service returned an error and declined to charge — usually its own upstream failed. |
The case worth naming: a settled row with a reason means the money
moved and nothing came back. That is the only outcome where the wallet is out
of pocket for nothing, so it is reported as itself rather than folded in with
refusals that cost nothing.
Only settled counts against DAILY_CAP_USD. A refusal and an upstream
failure leave the balance untouched, so neither eats into the cap.
reason quotes the service's own message when it gave one, instead of a
generic phrase — an agent operator reading a log needs to know whether to
retry, top up, or fix the seller.
Configuration
| Variable | Default |
|---|---|
RPC_URL |
https://rpc.mainnet.chain.robinhood.com |
CHAIN_ID |
4663 |
USDG_ADDRESS |
0x5fc5360d0400a0fd4f2af552add042d716f1d168 |
AERON_WALLET_DIR |
~/.aeron/wallet |
AERON_WALLET_KEY |
unset. Overrides the stored key. |
AERON_WALLET_SESSION |
unset. Binds the whole process to one session. |
Releases
Published from a tag by GitHub Actions using npm trusted publishing, so no
long-lived npm token exists to leak and every tarball carries a provenance
attestation: proof of the commit and workflow it was built from. Verify with
npm audit signatures after installing.
Where payments go
Payments settle on Robinhood Chain mainnet in USDG through the Aeron
facilitator at x402.aeron.sh. The wallet works with any x402 endpoint on the
same network, not only Aeron's.
More at aeron.sh/wallet.
Install
Add aeron wallet to your client. Pick the one you use.
claude mcp add aeron-wallet -- npx -y aeron-walletcodex mcp add aeron-wallet -- npx -y aeron-walletamp mcp add aeron-wallet -- npx -y aeron-wallet{
"mcpServers": {
"aeron-wallet": {
"command": "npx",
"args": [
"-y",
"aeron-wallet"
]
}
}
}Add to `claude_desktop_config.json`, then restart Claude Desktop.
{
"mcpServers": {
"aeron-wallet": {
"command": "npx",
"args": [
"-y",
"aeron-wallet"
]
}
}
}Add to `~/.cursor/mcp.json`, or `.cursor/mcp.json` for a single project.
code --add-mcp '{"name":"aeron-wallet","command":"npx","args":["-y","aeron-wallet"]}'Or add the block manually to `.vscode/mcp.json` under `servers`.
{
"mcpServers": {
"aeron-wallet": {
"command": "npx",
"args": [
"-y",
"aeron-wallet"
]
}
}
}Add to `~/.codeium/windsurf/mcp_config.json`.
{
"mcpServers": {
"aeron-wallet": {
"command": "npx",
"args": [
"-y",
"aeron-wallet"
]
}
}
}Add to `cline_mcp_settings.json` via the MCP Servers panel.
{
"mcpServers": {
"aeron-wallet": {
"command": "npx",
"args": [
"-y",
"aeron-wallet"
]
}
}
}Add to `~/.gemini/settings.json`.
{
"mcpServers": {
"aeron-wallet": {
"type": "local",
"command": "npx",
"args": [
"-y",
"aeron-wallet"
],
"tools": [
"*"
]
}
}
}Add to `~/.copilot/mcp-config.json`, or run `/mcp add` inside the CLI.
{
"context_servers": {
"aeron-wallet": {
"command": {
"path": "npx",
"args": [
"-y",
"aeron-wallet"
]
}
}
}
}Add to your Zed `settings.json`.
npx -y aeron-walletRun `goose configure`, choose **Add Extension → Command-line Extension**, and paste this command.
Score
39 / 100
Incomplete
- Documentation25/25
- Maintenance19/25
- Trust13/20
- Capability0/15
- Install experience12/15
- Documents what it does and how to connect
- Has a resolvable package or endpoint
- Exposes at least one tool, prompt or resource
- README has substantive content
- Includes a code example
- Documents its configuration
- Mentions credentials or security posture
- Last commit 0 days ago
- Has a release history
- Repository is not archived
- Licensed MIT
- Namespace verified in the official MCP registry
- Claimed by its owner
- Published under an organisation
- 0 tool(s) documented
- Provides prompt templates
- Provides resources
- 12 documented install method(s)
- Published to a package registry
- Offers a hosted endpoint — no local install
Version history
| Versions | Published |
|---|---|
| 0.2.0Latest | Aug 29, 2026 |
| 0.1.1 | Aug 29, 2026 |