What AXON Is and Is Not
AXON gives agents safe access to paid services over x402. It surfaces discovery and trust signals, and on the spend side it evaluates policy, budget, provider trust, approvals, and payment settlement before a request is retried. AXON is not the autonomous agent runtime itself. You still need an agent host such as Claude Desktop, Claude Code, OpenClaw, or your own process that calls the MCP tools or REST endpoints. AXON now splits MCP into two explicit surfaces:- Runtime is the default story. It is the wallet-scoped path for
governed_fetch, approvals, receipts, and other worker-agent actions. - Operator/manage is the advanced story. It is for org-wide keys, admin automation, treasury actions, and other control-plane work.
- Control plane is the dashboard and
@axon402/cli(axon-op). This is where wallets, mandates, vault funding, key issuance, approvals, and emergency stops live. - Runtime plane is MCP, OpenClaw, or direct runtime REST calls. A worker agent gets one wallet-scoped credential and spends through policy.
Required Primitives
Clone, Install, and Build
From an AXON source checkout:npm run verify:demo is the repeatable CLI baseline. It validates onboarding docs, builds the repo, and runs the zero-secrets demo smoke flow.
Apply the Supabase Schema
1
Open your Supabase project
Navigate to the SQL Editor in your Supabase dashboard.
2
Run the base schema
Execute
platform/supabase/setup_database.sql.3
Apply migrations
Run each file in
platform/supabase/migrations/ in order.Alternatively, with the Supabase CLI:4
Create the first operator
In Supabase Dashboard under Authentication > Users, create:
- Email:
admin@axon.dev - Password:
password123
Configure the Backend
The canonical backend env file isaxon-402-mcp/.env. Copy the checked-in
example and populate the required live values.
needs_bootstrap.
Configure the Dashboard
Createplatform/.env.local:
Bootstrap the Live Organization
- Dashboard Bootstrap (Recommended)
- CLI Bootstrap
The recommended path if you want the operator to use the dashboard immediately.
- Start the backend and dashboard.
- Sign in as the operator you created in Supabase Auth.
- Open
/onboarding. - Create the organization.
- Copy the vault deposit address.
- Wait for readiness to pass the initial vault checks.
- Deploy the first agent pocket and mandate.
- A real organization
- A live vault derived from the mnemonic at
m/44'/60'/0'/0/0 - One live agent pocket and mandate
- Dashboard access bound to the organization
Deposit to the Vault, Allocate to the Agent
1
Deposit USDC to the vault (external on-chain transfer)
Deposit to Wallet = send USDC on Base (chain 8453) from any wallet you control to the vault’s deposit address shown in the dashboard or bootstrap output. This is a normal on-chain transfer and is the universal funding path — it works for both
full and browser signing modes.2
Allocate from vault to the agent pocket (internal transfer)
Allocate from Vault = internal vault → pocket transfer, server-signed only. Available when
AXON_SIGNING_MODE=full (the server holds the vault private key). Browser-signed orgs cannot allocate; fund the target pocket with Deposit to Wallet instead.Dashboard path: Open /vault and use “Allocate to Pockets”.REST path:If gasless treasury is disabled, the source wallet also needs ETH on Base for gas.
Browser-signed orgs skip the allocation step entirely. Their funding path is:
open the target wallet, copy its Deposit to Wallet address, and send USDC
there directly.
Register MCP or OpenClaw
- MCP
- OpenClaw
TOOL_NOT_AVAILABLE_IN_RUNTIME_SURFACE, that is a surface mismatch, not a runtime failure. Move the action to the operator/manage surface or axon-op instead of giving the worker a broader key.
Run the First Paid Flow
Start the daemon and run the live test:governed_fetch- Complete any returned approval or browser-signing step
get_receiptafter settlement completes
read_spending_policy and get_financial_status are useful context tools,
but governed_fetch is the default paid-call path. New integrations should not
expect a raw public signer tool.
Final Success Checklist
Backend is healthy and
/ready is no longer misconfigured or needs_bootstrapOperator can log into
http://127.0.0.1:5173Vault exists and has USDC on Base
At least one agent pocket exists
Pocket has received treasury allocation
MCP or OpenClaw is configured against the live daemon
One governed fetch reaches settlement, or returns the expected approval/browser-signing handoff before settlement
Approval-required retries complete without changing the original
idempotency_keyTroubleshooting
misconfigured
misconfigured
Fix env or connectivity first. Common causes:
- Missing
SUPABASE_URL,SUPABASE_SERVICE_KEY,BASE_RPC_URL, orMASTER_MNEMONIC - Missing both
AXON_DECISION_API_KEYandAXON_PLATFORM_AUTH_ENABLED
needs_bootstrap
needs_bootstrap
The env is valid, but the org/vault/mandate is not fully created yet. Use the dashboard onboarding flow or run
npm run bootstrap:live.Dashboard login works, but org pages are empty
Dashboard login works, but org pages are empty
The signed-in Supabase user probably does not have a
user_organizations membership for that org. This is the common CLI-bootstrap follow-up step.Vault exists, but treasury allocation stays blocked
Vault exists, but treasury allocation stays blocked
Deposit USDC on Base to the vault address first. If gasless treasury is disabled, also make sure the source wallet has ETH for gas. Allocation is a vault → pocket internal transfer and requires a funded vault to move from.
Agent exists, but paid calls fail immediately
Agent exists, but paid calls fail immediately
Check:
- The pocket has been deposited to (external transfer) or allocated to (vault → pocket on server-signed orgs)
AGENT_WALLET_IDpoints to the intended pocket- The mandate allows the host/network/category you are using
- The caller is keeping the same
idempotency_keyacross approval retries