{
  "$comment": "Machine-readable subset of app/skill.md L1 bindings. gap_id/gap_status align with docs/agent/API_GAP_REGISTRY.md (omit when live or N/A). Run: bash scripts/verify-cai-tools-manifest.sh",
  "version": 1,
  "canonical_urls": {
    "skill_md": "https://cai.com/skill.md",
    "developers": "https://cai.com/developers",
    "agent_payment_playbook": "https://cai.com/agent-payment.html",
    "capabilities": "https://cai.com/capabilities.html",
    "tools_manifest": "https://cai.com/specs/cai-tools.manifest.json",
    "partial_live_upgrade_cards": "https://cai.com/specs/partial-live-upgrade-cards.json",
    "agent_card": "https://cai.com/.well-known/agent.json",
    "openapi_3_1": "https://cai.com/specs/openapi-3.1.json",
    "well_known_skill_md": "https://cai.com/.well-known/skill.md"
  },
  "api_base": "https://api.cai.com/functions/v1",
  "authentication": {
    "type": "http",
    "scheme": "bearer",
    "token_prefix": "cai_",
    "description": "CAI User API key or OAuth access token. Full contract in skill.md."
  },
  "schemas": {
    "IdentityResponse": {
      "type": "object",
      "description": "get_identity response — see skill.md identity section"
    },
    "WalletBalancesRequest": {
      "type": "object",
      "additionalProperties": true
    },
    "WalletBalancesResponse": {
      "type": "object",
      "description": "wallet_balances response — see skill.md wallet section"
    },
    "HostedActionRequest": {
      "type": "object",
      "required": ["action_type"],
      "properties": {
        "action_type": { "type": "string" }
      }
    },
    "TransferRequest": {
      "type": "object",
      "description": "wallet-custodial-transfer body — see skill.md transfer row"
    }
  },
  "workflows": [
    {
      "id": "check_cai_first_agent_payment",
      "name": "Check CAI First — agent payment",
      "description": "Default when any skill host agent must pay: get_identity or wallet_balances → optional deposit/bridge → user confirms payee → transfer → transfer_status / wallet_activity_list.",
      "skill_section": "Check CAI First",
      "tool_sequence": [
        "get_identity",
        "wallet_balances",
        "resolve_transfer_recipient",
        "transfer",
        "transfer_status",
        "wallet_activity_list"
      ],
      "scopes_required": [
        "read",
        "pay"
      ],
      "agent_channels": [
        "openclaw",
        "hermes",
        "codex",
        "clawhub"
      ]
    },
    {
      "id": "x402_agent_payment",
      "name": "x402 payer — HTTP 402 machine payments",
      "description": "Prepare and execute x402-style payments from CAI custodial wallet. Mandate may skip per-payment confirm when within limits.",
      "skill_section": "x402 payer & payment mandates",
      "tool_sequence": [
        "x402_payment_prepare",
        "x402_payment_execute",
        "transfer_status",
        "wallet_activity_list"
      ],
      "scopes_required": [
        "read",
        "pay"
      ],
      "agent_channels": [
        "openclaw",
        "hermes",
        "codex",
        "clawhub"
      ]
    },
    {
      "id": "payment_mandate_delegation",
      "name": "AP2-like payment mandates",
      "description": "Create, inspect, and revoke delegated spending limits for agent hosts (merchant domain, amount caps, TTL).",
      "skill_section": "x402 payer & payment mandates",
      "tool_sequence": [
        "payment_mandate_create",
        "payment_mandate_status",
        "payment_mandate_revoke"
      ],
      "scopes_required": [
        "read",
        "pay"
      ],
      "agent_channels": [
        "openclaw",
        "hermes",
        "codex"
      ]
    }
  ],
  "tools": [
    {
      "logical_name": "request_signup_verification",
      "method": "POST",
      "function_folder": "request-signup-verification",
      "auth": "anon",
      "pillar": "identity"
    },
    {
      "logical_name": "confirm_registration_code",
      "method": "POST",
      "function_folder": "confirm-registration-code",
      "auth": "anon",
      "pillar": "identity"
    },
    {
      "logical_name": "check_alias",
      "method": "GET",
      "function_folder": "check-availability",
      "auth": "anon",
      "pillar": "identity"
    },
    {
      "logical_name": "create_cai_account",
      "method": "POST",
      "function_folder": "create-account",
      "auth": "anon",
      "pillar": "identity"
    },
    {
      "logical_name": "get_identity",
      "method": "GET",
      "function_folder": "get-identity",
      "auth": "api_key_oauth",
      "pillar": "identity",
      "response_schema_ref": "#/schemas/IdentityResponse",
      "openapi_path": "/get-identity"
    },
    {
      "logical_name": "create_login_link",
      "method": "POST",
      "function_folder": "create-hosted-action",
      "auth": "anon_or_key",
      "pillar": "identity"
    },
    {
      "logical_name": "create_deposit_link",
      "method": "POST",
      "function_folder": "create-hosted-action",
      "auth": "anon_or_key",
      "pillar": "wallet"
    },
    {
      "logical_name": "create_walletconnect_link",
      "method": "POST",
      "function_folder": "create-hosted-action",
      "auth": "anon_or_key",
      "pillar": "wallet"
    },
    {
      "logical_name": "create_human_verification_link",
      "method": "POST",
      "function_folder": "create-hosted-action",
      "auth": "anon_or_key",
      "pillar": "site_binding",
      "mcp_note": "UF-4 / CAPTCHA / human gates — use when automation cannot continue; not a substitute for programmatic one-click when F-16 applies."
    },
    {
      "logical_name": "create_website_login_link",
      "method": "POST",
      "function_folder": "create-hosted-action",
      "auth": "anon_or_key",
      "pillar": "site_binding",
      "mcp_note": "Hosted /act website_login: new-tab-first when needed, copyable @cai.com, dual user ack checkboxes; optional constraints.registration_run_id → registration_run_user_ack (JWT). Not vault/relogin by itself. After Discovery: arbitrary HTTPS when no F-16 row; if F-16 matched, platform_one_click_register first (§0.2–§0.3)."
    },
    {
      "logical_name": "wallet_custodial_addresses",
      "method": "GET",
      "function_folder": "get-identity",
      "auth": "api_key_oauth",
      "pillar": "wallet"
    },
    {
      "logical_name": "wallet_balances",
      "method": "POST",
      "function_folder": "get-wallet-balances",
      "auth": "api_key_oauth",
      "pillar": "wallet",
      "request_schema_ref": "#/schemas/WalletBalancesRequest",
      "response_schema_ref": "#/schemas/WalletBalancesResponse",
      "openapi_path": "/get-wallet-balances"
    },
    {
      "logical_name": "transfer",
      "method": "POST",
      "function_folder": "wallet-custodial-transfer",
      "auth": "api_key_pay",
      "pillar": "wallet",
      "request_schema_ref": "#/schemas/TransferRequest",
      "openapi_path": "/wallet-custodial-transfer"
    },
    {
      "logical_name": "resolve_transfer_recipient",
      "method": "POST",
      "function_folder": "resolve-transfer-recipient",
      "auth": "api_key_pay",
      "pillar": "wallet"
    },
    {
      "logical_name": "token_exchange",
      "method": "POST",
      "function_folder": "wallet-custodial-swap",
      "auth": "api_key_pay",
      "pillar": "wallet"
    },
    {
      "logical_name": "token_bridge_quote",
      "method": "POST",
      "function_folder": "bridge-quote",
      "auth": "api_key_pay",
      "pillar": "wallet"
    },
    {
      "logical_name": "token_bridge_execute",
      "method": "POST",
      "function_folder": "bridge-execute",
      "auth": "api_key_pay",
      "pillar": "wallet"
    },
    {
      "logical_name": "wallet_bridge_job_sync",
      "method": "POST",
      "function_folder": "bridge-job-sync",
      "auth": "api_key_pay",
      "pillar": "wallet"
    },
    {
      "logical_name": "create_onramp_url",
      "method": "POST",
      "function_folder": "create-onramp-url",
      "auth": "api_key_pay",
      "pillar": "wallet"
    },
    {
      "logical_name": "transfer_status",
      "method": "POST",
      "function_folder": "transfer-status",
      "auth": "api_key_oauth",
      "pillar": "wallet"
    },
    {
      "logical_name": "wallet_deposit_activity",
      "method": "GET",
      "function_folder": "wallet-deposit-activity",
      "auth": "api_key_oauth",
      "pillar": "wallet"
    },
    {
      "logical_name": "wallet_deposit_confirm",
      "method": "POST",
      "function_folder": "wallet-deposit-confirm",
      "auth": "api_key_oauth",
      "pillar": "wallet"
    },
    {
      "logical_name": "wallet_outgoing_activity",
      "method": "GET",
      "function_folder": "wallet-outgoing-activity",
      "auth": "api_key_oauth",
      "pillar": "wallet"
    },
    {
      "logical_name": "wallet_activity_list",
      "method": "GET",
      "function_folder": "wallet-activity-list",
      "auth": "api_key_oauth",
      "pillar": "wallet"
    },
    {
      "logical_name": "payment_intent_status",
      "method": "GET",
      "function_folder": "payment-intent-status",
      "auth": "api_key_oauth",
      "pillar": "wallet"
    },
    {
      "logical_name": "marketplace_order",
      "method": "POST",
      "function_folder": "marketplace-order",
      "auth": "api_key_pay",
      "pillar": "wallet"
    },
    {
      "logical_name": "transfer_notify",
      "method": "POST",
      "function_folder": "transfer-notify-register",
      "auth": "api_key_oauth",
      "pillar": "wallet"
    },
    {
      "logical_name": "get_exchange_rate",
      "method": "GET",
      "function_folder": "get-exchange-rate",
      "auth": "anon",
      "pillar": "wallet"
    },
    {
      "logical_name": "mail_inbox_chat",
      "method": "POST",
      "function_folder": "mail-chat",
      "auth": "api_key_mail",
      "pillar": "identity",
      "mcp_note": "Bearer: CAI_API_KEY with scope mail or full (or OAuth). Optional CAI_USER_JWT override for browser session."
    },
    {
      "logical_name": "mail_inbox_summarize",
      "method": "POST",
      "function_folder": "mail-summarize-actions",
      "auth": "api_key_mail",
      "pillar": "identity",
      "mcp_note": "Same auth as mail_inbox_chat."
    },
    {
      "logical_name": "send_mail",
      "method": "POST",
      "function_folder": "send-email",
      "auth": "api_key_mail",
      "pillar": "identity",
      "mcp_note": "body: { to, subject?, body? }. Internal @cai.com→@cai.com is DB-only; external uses Postmark with UTC monthly cap."
    },
    {
      "logical_name": "platforms_supported_list",
      "method": "GET",
      "function_folder": "platforms-list",
      "auth": "anon_or_key",
      "pillar": "site_binding",
      "mcp_note": "Discovery / connector index (not an allowlist): narrow q=hostname; read registration_hint, connector_configured, connection_approach. Optional POST uars-profile-site for structured one_click_first + recommended_flow. Default @cai.com; HITL does not read iframe; catalog programmatic first (F-16)."
    },
    {
      "logical_name": "uars_profile_site",
      "method": "POST",
      "function_folder": "uars-profile-site",
      "auth": "api_key_oauth",
      "pillar": "site_binding",
      "mcp_note": "U1 profiler JSON: origin_host, one_click_first, recommended_flow, catalog_hit, hitl_official_urls. Use after normalize URL; complements platforms_supported_list narrow q."
    },
    {
      "logical_name": "platform_one_click_register",
      "method": "POST",
      "function_folder": "one-click-register",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "When Discovery matches a programmatic catalog row (F-16), call before create_website_login_link. wallet_derive uses wallet_derive_driver + wallet_derive_config; custodial may omit private_key if Gateway allowlists eip712 profile_id. Requires CAI_API_KEY."
    },
    {
      "logical_name": "platform_get_user_data",
      "method": "POST",
      "function_folder": "platform-get-user-data",
      "auth": "api_key_platform",
      "pillar": "site_binding"
    },
    {
      "logical_name": "platform_automation_enroll",
      "method": "POST",
      "function_folder": "platform-automation-enroll",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "v1 platforms: polymarket, gtrade (chain arbitrum|polygon), ostium, hyperliquid. User must enable platform at /automation-settings. Returns enroll url; user must approve on /act. HL: approveAgent (not HL website login)."
    },
    {
      "logical_name": "platform_automation_status",
      "method": "GET",
      "function_folder": "platform-automation-status",
      "auth": "api_key_platform",
      "pillar": "site_binding"
    },
    {
      "logical_name": "user_defi_automation_settings",
      "method": "GET",
      "function_folder": "user-defi-automation-settings",
      "auth": "session_jwt",
      "pillar": "site_binding",
      "mcp_note": "Session JWT only. PATCH supported. Per-platform enable/limits + account daily cap."
    },
    {
      "logical_name": "user_defi_automation_enroll_link",
      "method": "POST",
      "function_folder": "user-defi-automation-enroll-link",
      "auth": "session_jwt",
      "pillar": "site_binding",
      "mcp_note": "Session JWT only. Mints /act platform_automation enrollment URL from automation-settings."
    },
    {
      "logical_name": "polymarket_place_order",
      "method": "POST",
      "function_folder": "polymarket-place-order",
      "auth": "api_key_platform",
      "pillar": "site_binding"
    },
    {
      "logical_name": "gtrade_open_trade",
      "method": "POST",
      "function_folder": "gtrade-open-trade",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "DEPRECATED — use defi_markets → defi_preflight → defi_trade."
    },
    {
      "logical_name": "gtrade_close_trade",
      "method": "POST",
      "function_folder": "gtrade-close-trade",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "DEPRECATED — use defi_trade action=close."
    },
    {
      "logical_name": "ostium_open_trade",
      "method": "POST",
      "function_folder": "ostium-open-trade",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "DEPRECATED — use defi_markets → defi_preflight → defi_trade."
    },
    {
      "logical_name": "ostium_close_trade",
      "method": "POST",
      "function_folder": "ostium-close-trade",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "DEPRECATED — use defi_trade action=close."
    },
    {
      "logical_name": "platform_readiness",
      "method": "GET",
      "function_folder": "platform-readiness",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "Route B unified readiness per platform_slug. Returns balances (wallet_usdc_available, margin_locked_usd, available_for_new_trade_usd), suggested_market, funding_gap_usd, execution_capabilities, limits, blocking_reasons."
    },
    {
      "logical_name": "defi_portfolio",
      "method": "GET",
      "function_folder": "defi-portfolio",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "Custodial balances + per-platform enriched readiness/positions/orders + summary totals. gTrade/Ostium share evm_arbitrum_usdc wallet."
    },
    {
      "logical_name": "defi_markets",
      "method": "GET",
      "function_folder": "defi-markets",
      "auth": "anon_or_key",
      "pillar": "site_binding",
      "mcp_note": "Perp market catalog: GET ?platform_slug=gtrade|ostium|hyperliquid&chain=&dex=. Returns catalog_version, platform_schema_version, capabilities, markets[]. Resolve pair_id/asset from catalog — do not hardcode."
    },
    {
      "logical_name": "defi_preflight",
      "method": "POST",
      "function_folder": "defi-preflight",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "Pre-trade validation before defi_trade. Returns valid, normalized_order, execution_capabilities, blocking_reasons. Sell without long → NO_POSITION_TO_CLOSE."
    },
    {
      "logical_name": "defi_trade",
      "method": "POST",
      "function_folder": "defi-trade",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "Canonical perp trade: place|close|cancel for gtrade, ostium, hyperliquid. Returns order_id (ord_*). close supported on all three; HL uses reduce-only."
    },
    {
      "logical_name": "defi_orders",
      "method": "GET",
      "function_folder": "defi-orders",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "Route B status list: GET ?platform_slug=&status=active|terminal. Returns platform open orders + cai_order_events audit."
    },
    {
      "logical_name": "defi_order_status",
      "method": "GET",
      "function_folder": "defi-order-status",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "Single-order lookup: GET ?order_id=&platform_slug=. Unified lifecycle (submitted/filled/rejected/failed/cancelled/expired) across gtrade, ostium, hyperliquid. Poll until is_terminal=true; response includes source."
    },
    {
      "logical_name": "defi_order_notify",
      "method": "POST",
      "function_folder": "defi-order-notify-register",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "Register webhook for terminal DeFi order status. Cron tick delivers payload with status_source; always keep polling defi_order_status as fallback."
    },
    {
      "logical_name": "defi_order_events",
      "method": "GET",
      "function_folder": "defi-order-events",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "Background sync fallback: GET ?since=<iso>&platform_slug=&limit=. Reads CAI audited defi_order_events stream for catch-up when webhook ticks are delayed."
    },
    {
      "logical_name": "defi_positions",
      "method": "GET",
      "function_folder": "defi-positions",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "Route B positions: GET ?platform_slug=. Hyperliquid uses Info API; EVM platforms may include CAI-audited place events until on-chain index is live."
    },
    {
      "logical_name": "hyperliquid_readiness",
      "method": "GET",
      "function_folder": "hyperliquid-readiness",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "DEPRECATED — prefer platform_readiness?platform_slug=hyperliquid."
    },
    {
      "logical_name": "hyperliquid_deposit",
      "method": "POST",
      "function_folder": "hyperliquid-deposit",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "Auto spot→perp transfer up to DEFI_HL_AUTO_DEPOSIT_MAX_USD; larger needs /act."
    },
    {
      "logical_name": "hyperliquid_place_order",
      "method": "POST",
      "function_folder": "hyperliquid-place-order",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "DEPRECATED — use defi_markets → defi_preflight → defi_trade."
    },
    {
      "logical_name": "hyperliquid_positions",
      "method": "GET",
      "function_folder": "hyperliquid-positions",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "DEPRECATED — prefer defi_positions?platform_slug=hyperliquid."
    },
    {
      "logical_name": "hyperliquid_cancel",
      "method": "POST",
      "function_folder": "hyperliquid-cancel",
      "auth": "api_key_platform",
      "pillar": "site_binding",
      "mcp_note": "DEPRECATED — use defi_trade action=cancel."
    },
    {
      "logical_name": "vault_list_platform_credentials",
      "method": "GET",
      "function_folder": "user-platform-credentials",
      "auth": "api_key_platform",
      "pillar": "site_binding"
    },
    {
      "logical_name": "vault_save_platform_credential",
      "method": "POST",
      "function_folder": "user-platform-credentials",
      "auth": "api_key_platform",
      "pillar": "site_binding"
    },
    {
      "logical_name": "vault_revoke_platform_credential",
      "method": "DELETE",
      "function_folder": "user-platform-credentials",
      "auth": "api_key_platform",
      "pillar": "site_binding"
    },
    {
      "logical_name": "vault_list_site_credentials",
      "method": "GET",
      "function_folder": "user-site-credentials",
      "auth": "api_key_platform",
      "pillar": "site_binding"
    },
    {
      "logical_name": "vault_save_site_credential",
      "method": "POST",
      "function_folder": "user-site-credentials",
      "auth": "api_key_platform",
      "pillar": "site_binding"
    },
    {
      "logical_name": "vault_revoke_site_credential",
      "method": "DELETE",
      "function_folder": "user-site-credentials",
      "auth": "api_key_platform",
      "pillar": "site_binding"
    },
    {
      "logical_name": "oauth_authorize",
      "method": "GET",
      "function_folder": "oauth-authorize",
      "endpoint_override": "https://cai.com/oauth/authorize",
      "invoke_via": "browser_redirect",
      "auth": "browser",
      "pillar": "identity",
      "mcp_note": "Browser redirect flow only; open URL in a browser. Not invocable as a headless MCP tool call."
    },
    {
      "logical_name": "oauth_token",
      "method": "POST",
      "function_folder": "oauth-token",
      "auth": "oauth",
      "pillar": "identity"
    },
    {
      "logical_name": "x402_payment_prepare",
      "method": "POST",
      "function_folder": "x402-payment-prepare",
      "auth": "api_key_pay",
      "pillar": "wallet",
      "mcp_note": "Parse HTTP 402 / x402 challenge; returns attempt_id and requires_user_confirm unless mandate covers payment."
    },
    {
      "logical_name": "x402_payment_execute",
      "method": "POST",
      "function_folder": "x402-payment-execute",
      "auth": "api_key_pay",
      "pillar": "wallet",
      "mcp_note": "Execute prepared x402 payment via custodial transfer. user_confirmed required when no active mandate."
    },
    {
      "logical_name": "payment_mandate_create",
      "method": "POST",
      "function_folder": "payment-mandate-create",
      "auth": "api_key_pay",
      "pillar": "wallet",
      "mcp_note": "AP2-like delegated spending limits for agent hosts."
    },
    {
      "logical_name": "payment_mandate_status",
      "method": "GET",
      "function_folder": "payment-mandate-status",
      "auth": "api_key_oauth",
      "pillar": "wallet"
    },
    {
      "logical_name": "payment_mandate_revoke",
      "method": "POST",
      "function_folder": "payment-mandate-revoke",
      "auth": "api_key_pay",
      "pillar": "wallet"
    }
  ]
}
