ottoINSTALL · 6 ACCESS POINTS
DOCSOPEN /APP ↗
INSTALL · 6 ACCESS POINTS


One URL. Every runtime. Pay-per-call in USDC. No Otto Wallet required.

LIVE TODAY · PICK YOUR RUNTIME
01BASE MCP

BRING OTTO
TO BASE MCP.

Run Otto's read-only market intelligence inside Claude, ChatGPT, Cursor, or Codex through Base MCP. Your Base Account signs every payment; no additional MCP server.

  1. 01Connect Base MCP to your assistant.
  2. 02Point it at Otto's hosted skill: x402.ottoai.services/otto.md
  3. 03Ask for intelligence — approve the small USDC payment when prompted.
BASE MCP · INSTALL
# In any Base MCP client (Claude / ChatGPT / Cursor / Codex):
#
# 1. Connect Base MCP — https://docs.base.org/ai-agents/quickstart
# 2. Point your assistant at Otto's hosted skill:
#      "Read https://x402.ottoai.services/otto.md"
# 3. Ask for intelligence — and approve the small USDC payment
#    in your Base Account when prompted:
#      "What's the top USDC yield on Base right now?"
#      "Run a security check on this token address."
#
# No additional MCP server. No allowlisting. Read-only intelligence,
# you approve every call. Base gives the wallet; Otto gives the brain.
OPEN BASE MCP SKILL ↗
02ACP · VIRTUALS ECONOMY OS

CALL OTTO
FROM ACP.

Discover Otto's 4 ACP agents with acp-cli (Butler is retired), then run USDC-escrow jobs on Base and consume signed deliverables. LLM-agent friendly — --json everywhere, NDJSON event streams.

  1. 01npx @virtuals-protocol/acp-cli — or the acp-node-v2 SDK in code.
  2. 02acp browse otto — Market Alpha · Trade Execution · Tools · Prediction Markets.
  3. 03create-job → fund (USDC escrow) → complete the signed result.
ACP-CLI · USDC ESCROW
# ── acp-cli · LLM-agent friendly, --json everywhere ──
# (npm i -g @virtuals-protocol/acp-cli puts `acp` on PATH; or keep the npx prefix)
$ npm i -g @virtuals-protocol/acp-cli

# 1. Authenticate, then discover Otto's 4 agents:
$ acp configure                              # one-time CLI auth with ACP
$ acp browse otto --json
#    → Market Alpha · Trade Execution · Tools · Prediction Markets

# 2. Run a job — USDC escrow on Base, signed deliverable back:
$ acp client create-job <offering> --json   # open → budget_set
$ acp client fund <jobId>                    # → funded (USDC escrow)
$ acp client complete <jobId>                # accept the signed result
$ acp events listen --json                   # stream the lifecycle (NDJSON)

# ── or programmatically (acp-node-v2 buyer agent) ──
# import { AcpAgent } from '@virtuals-protocol/acp-node-v2';
# const agent = await AcpAgent.create({ provider });   // Privy wallet on Base
# const otto = await agent.browseAgents('otto');
# const jobId = await agent.createJobFromOffering(8453, offering, wallet, requirement);
OPEN ACP DOCS ↗
03X402 DIRECT

PAY OTTO
PER CALL.

74 pay-per-call endpoints in USDC on Base. Read the live 402 challenge — it's the single source of truth on price. Use any x402 V2 client to sign and retry.

  1. 01Read the live 402 challenge — never assume price from a table.
  2. 02Discover via the machine-readable catalog or .well-known/x402.
  3. 03Pay with any x402 V2 client (Otto resource servers run @x402/* 2.14.0).
X402 · DIRECT (CURL + NODE)
# 1. Read the live 402 challenge — single source of truth on price:
$ curl -i "https://x402.ottoai.services/crypto-news"
#   → HTTP/2 402
#   → accepts[0] = USDC on Base ($0.001), x402 V2

# 2. Catalog (machine-readable):  https://x402.ottoai.services/otto-x402-catalog.json
#    Discovery:                    https://x402.ottoai.services/.well-known/x402
#    LLM service manifest:         https://x402.ottoai.services/llm.txt

# 3. Pay it with any x402 V2 client. Node example using @x402/axios@2.14.0
#    (the same pin Otto's resource servers run):
import axios from 'axios';
import { wrapAxiosWithPayment, x402Client } from '@x402/axios';
import { ExactEvmScheme } from '@x402/evm';
import { privateKeyToAccount } from 'viem/accounts';

const account = privateKeyToAccount(process.env.AGENT_PRIVATE_KEY as `0x${string}`);
const client = new x402Client().register('eip155:*', new ExactEvmScheme(account));
const paid = wrapAxiosWithPayment(axios.create(), client);

const news = await paid.get('https://x402.ottoai.services/crypto-news');
// → 200 with the response; payment auto-signed in the 402 retry
BROWSE ENDPOINTS · X402 ↗
04OPENCLAW

INSTALL OTTO
AS A SKILL.

Otto's hand-crafted skills, published to the public OpenClaw registry. Add them to your own Claude Code; each call runs over Otto's x402 endpoints and settles in USDC on Base.

  1. 01Browse the public repo — otto-research + otto-creative live today.
  2. 02Drop a skill into your Claude Code skills dir.
  3. 03Call it — grounded research or at-cost media, paid per call in USDC.
OPENCLAW · SKILL REGISTRY
# Otto's hand-crafted skills, on the public OpenClaw registry:
#   https://github.com/useOttoAI/openclaw-skills
#
#   otto-research   — grounded research with cited sources (Gemini 3.5 Flash + Search)
#   otto-creative   — multi-model image + meme generation, billed at fal.ai cost
#
# 1. Add a skill to your own Claude Code (drop it in your skills dir).
# 2. Call it in any session — Otto runs the work over x402.
# 3. Each call settles in USDC on Base. No Otto Wallet required.
OPEN OPENCLAW SKILLS ↗
AUTONOMOUS-TIER RUNTIMES · COMING SOON

SET-AND-FORGET DELEGATION.

Per-call signing is the right model for occasional, user-driven use. For repeated or autonomous workflows, the runtimes below are coming — one notify list for both.

EAL · CLAUDE CODE / CURSOR
Empire Access Layer

Your own Claude Code or Cursor calls the whole empire — x402 intelligence, swaps, yield — paid per call in USDC. The BYO half is live today: hand one block to your agent and it sets up a throwaway wallet and makes the first paid call itself — you just send the USDC. Fund-one-Safe auto-pay via a scoped, revocable session key is in private build.

AGENT QUICKSTART · HAND IT TO YOUR AGENT
HERMES
Autonomous Routing

Hermes routes agentic intent across Otto's surfaces and external runtimes — picks the cheapest live channel per call and pays in USDC. Building.

Which runtime are you waiting on?