Skip to main content
This is the canonical self-hosted live path for AXON. It starts at clone and ends with a governed fetch reaching either settlement or the browser-signing/approval step required before settlement.

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.
If you are migrating an older mixed IDE setup, split it into two entries instead of broadening the runtime key. Runtime keeps the prepared wallet; operator/manage gets its own org-wide key. See Two-Surface Migration and IDE Setup for the exact client patterns. AXON also splits responsibility across two product planes:
  • 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
These are development-only credentials for initial localhost setup. Replace with strong credentials before deploying to any shared environment.
Self-signup is not the assumed first-pass live path. Create the operator manually unless you have configured your own signup/email flows.

Configure the Backend

The canonical backend env file is axon-402-mcp/.env. Copy the checked-in example and populate the required live values.
Fill in at least:
See Environment Variables for the full live matrix and defaults. Run readiness before bootstrap:
Expected pre-bootstrap result: needs_bootstrap.

Configure the Dashboard

Create platform/.env.local:
Start both services:

Bootstrap the Live 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

If the agent later hits 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:
In another shell:
Or via MCP, the minimum sequence:
  1. governed_fetch
  2. Complete any returned approval or browser-signing step
  3. get_receipt after 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_bootstrap
Operator can log into http://127.0.0.1:5173
Vault 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_key

Troubleshooting

Fix env or connectivity first. Common causes:
  • Missing SUPABASE_URL, SUPABASE_SERVICE_KEY, BASE_RPC_URL, or MASTER_MNEMONIC
  • Missing both AXON_DECISION_API_KEY and AXON_PLATFORM_AUTH_ENABLED
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.
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.
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.
The org is browser-signed (wallet_mode='browser'). The server has no vault signer and therefore cannot perform internal allocations. Deposit USDC directly to the pocket’s address instead, or use the dashboard’s Deposit to Wallet flow.
Check:
  • The pocket has been deposited to (external transfer) or allocated to (vault → pocket on server-signed orgs)
  • AGENT_WALLET_ID points to the intended pocket
  • The mandate allows the host/network/category you are using
  • The caller is keeping the same idempotency_key across approval retries