{
  "name": "Spendkit",
  "spec_status": "Spendkit-specific machine reference; not an industry standard",
  "description": "Non-custodial payment authorization and onchain enforcement for AI Agents",
  "public_landing_url": "https://spendkit-alpha.vercel.app/",
  "dashboard_url": "https://spendkit-alpha.vercel.app/app",
  "dashboard_agent_configuration_url": "https://spendkit-alpha.vercel.app/app/agents",
  "configuration_sources": {
    "base_url": "Public hosted service URL https://spendkit-alpha.vercel.app; not generated in the dashboard",
    "client_id_and_secret": "Dashboard > AI Agents > choose Agent > Connect Agent; copy into protected Runtime configuration",
    "payment_wallet_signer": "Developer's own verified wallet or secure signer; private key is never created or shown by Spendkit Dashboard",
    "recipient_and_amount": "Application payment request",
    "idempotency_key": "Application's stable identifier for one logical payment"
  },
  "docs_url": "https://spendkit-alpha.vercel.app/docs/",
  "http_mcp_quickstart_url": "https://spendkit-alpha.vercel.app/docs/api-quickstart/",
  "code_examples_url": "https://spendkit-alpha.vercel.app/docs/examples/",
  "code_example_files": {
    "javascript": "https://spendkit-alpha.vercel.app/examples/mcp/javascript.mjs",
    "python": "https://spendkit-alpha.vercel.app/examples/mcp/python.py",
    "go": "https://spendkit-alpha.vercel.app/examples/mcp/go.go",
    "cpp": "https://spendkit-alpha.vercel.app/examples/mcp/cpp.cpp"
  },
  "mcp_tool_reference_url": "https://spendkit-alpha.vercel.app/docs/mcp-tools/",
  "ai_coding_agent_guide_url": "https://spendkit-alpha.vercel.app/docs/ai-coding-agents/",
  "llms_url": "https://spendkit-alpha.vercel.app/llms-full.txt",
  "mcp_url": "https://spendkit-alpha.vercel.app/mcp",
  "oauth_token_url": "https://spendkit-alpha.vercel.app/oauth/token",
  "oauth_client_credentials_request": {
    "method": "POST",
    "content_type": "application/x-www-form-urlencoded",
    "fields": ["grant_type=client_credentials", "client_id", "client_secret", "scope (optional subset of granted scopes)"],
    "response_fields": ["access_token", "token_type", "expires_in", "scope"]
  },
  "oauth_metadata_url": "https://spendkit-alpha.vercel.app/.well-known/oauth-authorization-server",
  "protected_resource_metadata_url": "https://spendkit-alpha.vercel.app/.well-known/oauth-protected-resource",
  "auth_modes": [
    "oauth2_client_credentials"
  ],
  "payment_model": "non-custodial-ai-agent-spending-policy-firewall",
  "server_broadcasts_payment": false,
  "tools": [
    "spendkit_get_connection",
    "spendkit_get_policy",
    "spendkit_preview_payment",
    "spendkit_authorize_payment",
    "spendkit_record_payment",
    "spendkit_get_payment_status",
    "spendkit_list_payments"
  ],
  "mcp_call_format": {
    "transport": "POST /mcp, JSON-RPC 2.0 over HTTP",
    "preferred_protocol": "2026-07-28",
    "modern_required_headers": ["Authorization: Bearer <access_token>", "Content-Type: application/json", "MCP-Protocol-Version: 2026-07-28", "Mcp-Method: <method>", "Mcp-Name: <tool name> for tools/call"],
    "modern_meta_required": ["io.modelcontextprotocol/protocolVersion", "io.modelcontextprotocol/clientInfo", "io.modelcontextprotocol/clientCapabilities"],
    "discovery_sequence": ["server/discover", "tools/list"],
    "method": "tools/call",
    "tool_name_path": "params.name",
    "arguments_path": "params.arguments",
    "data_path": "result.structuredContent",
    "denial_rule": "Inspect result.isError and structuredContent.allowed or accepted; HTTP 200 can contain a denial",
    "input_schema_discovery": "tools/list"
  },
  "tool_contracts": [
    {
      "name": "spendkit_get_connection",
      "scope": "authenticated_connection",
      "arguments": {},
      "result_fields": ["connection", "agent", "network", "authentication", "paymentModel"]
    },
    {
      "name": "spendkit_get_policy",
      "scope": "policy:read",
      "arguments": {},
      "result_fields": ["ready", "reason?", "policyId?", "token?", "decimals?", "perTransactionLimit?", "dailyLimit?", "spentToday?", "remainingDaily?", "enabled?", "emergencyPaused?", "revoked?", "_raw?"]
    },
    {
      "name": "spendkit_preview_payment",
      "scope": "payment:preview",
      "arguments": {"amount": "required positive decimal string", "recipient": "required nonzero EVM address", "token": "optional token symbol"},
      "result_fields": ["allowed", "reason", "amount?", "amountAtomic?", "recipient?", "token?", "network?", "owner?", "policy?", "wallet?"]
    },
    {
      "name": "spendkit_authorize_payment",
      "scope": "payment:authorize",
      "arguments": {"amount": "required positive decimal string", "recipient": "required nonzero EVM address", "token": "optional token symbol", "idempotencyKey": "required string, 1-128 characters"},
      "result_fields": ["allowed", "reason?", "duplicate?", "intentId?", "status?", "authorization?", "signature?", "transaction?"],
      "transaction_fields": ["chainId", "from", "to", "data", "value"]
    },
    {
      "name": "spendkit_record_payment",
      "scope": "payment:record",
      "arguments": {"intentId": "required nonempty string", "txHash": "required 0x-prefixed 32-byte transaction hash"},
      "result_fields": ["accepted", "error?", "intentId?", "status?", "txHash?"],
      "integration_note": "Keep this call after wallet submission for prompt status and Payment Activity updates. If it fails, retry with the same intentId and txHash; never resend the wallet transaction just to retry recording. Onchain Router limits remain enforced."
    },
    {
      "name": "spendkit_get_payment_status",
      "scope": "payment:read",
      "arguments": {"intentId": "required nonempty string"},
      "result_fields": ["intentId?", "status", "txHash?", "failureCode?", "failureMessage?", "recipient?", "amountAtomic?", "token?", "policyId?", "createdAt?", "updatedAt?"]
    },
    {
      "name": "spendkit_list_payments",
      "scope": "payment:read",
      "arguments": {"limit": "optional integer, 1-100; default 50"},
      "result_fields": ["rows"]
    }
  ],
  "public_policy_selector": false,
  "token_argument_semantics": "symbol such as USDG, not a contract address; omit to use Agent default",
  "networks": [
    {
      "key": "arbitrum-sepolia",
      "chain_id": 421614,
      "token": "USDG"
    }
  ],
  "current_demo_status": {
    "network": "arbitrum-sepolia",
    "registered_router": "0xe388644B4115fbE029FA4acC3b20a47600c4bA16",
    "router_architecture": "signed-authorization-v3",
    "runtime_checks_router_schema": true,
    "latest_published_confirmed_payment_uses_current_router": false,
    "evidence_note": "Published confirmed payment is historical evidence from the earlier Router. A new confirmed payment is needed for the current Payment Wallet sender path."
  },
  "runtime_access": {
    "read_only_scopes": [
      "policy:read",
      "payment:preview",
      "payment:read"
    ],
    "full_scopes": [
      "policy:read",
      "payment:preview",
      "payment:authorize",
      "payment:read",
      "payment:record"
    ],
    "capability_rule": "lastUsedAt alone does not prove payment authorization; payment:authorize scope is required",
    "upgrade": "read-only active credentials can be rotated to a new full credential after Wallet + Policy protection is ready"
  },
  "local_stdio_bridge": {
    "command": "npm run mcp:bridge",
    "purpose": "Acquire/refresh OAuth client_credentials access tokens and forward stdio JSON-RPC to remote Spendkit MCP",
    "submits_evm_transactions": false
  },
  "security": {
    "wallet_challenges": "durable one-time tenant-bound challenges",
    "shared_rate_limits": true,
    "scheduled_reconciliation": "/api/internal/reconcile",
    "signer_modes": [
      "local-private-key",
      "remote-signer"
    ]
  },
  "legal": {
    "privacy_url": "https://spendkit-alpha.vercel.app/privacy/",
    "terms_url": "https://spendkit-alpha.vercel.app/terms/",
    "security_url": "https://spendkit-alpha.vercel.app/security/"
  },
  "mcp_protocol": {
    "preferred": "2026-07-28",
    "legacy_fallback": "2025-11-25",
    "modern_lifecycle": "stateless server/discover",
    "modern_result_cache_hints": true
  },
  "runtime_reliability": {
    "doctor_command": "npm run agent:doctor",
    "heartbeat_tool": "spendkit_get_connection",
    "default_heartbeat_ms": 120000,
    "http_timeout_ms": 10000,
    "http_retries": 2,
    "retry_after_supported": true,
    "trace_header": "X-Spendkit-Trace-Id",
    "structured_recovery": true,
    "blockchain_tx_auto_retry": false,
    "recent_activity_semantics": "lastUsedAt means recently observed authenticated MCP usage; it is not proof the Runtime or its bound Payment Wallet client is currently online"
  },
  "judge_brief_url": "https://spendkit-alpha.vercel.app/open-house/",
  "buildathon_context": {
    "program": "Arbitrum Open House Singapore Buildathon",
    "network": "arbitrum-sepolia",
    "chain_id": 421614,
    "asset": "Paxos Test USDG",
    "evidence_url": "https://spendkit-alpha.vercel.app/open-house/#evidence",
    "latest_verified_payment_tx": "0xa0b16825347b8749a27df7f2048cacd8a25a88f71479d7c17fbfe4fd89cabd43",
    "latest_verified_payment_block": 312101737,
    "latest_verified_payment_amount": "0.01 USDG",
    "latest_verified_payment_status": "CONFIRMED",
    "mcp_sdk_production_probes": "36/36 PASS",
    "full_mcp_conformance_claimed": false
  },
  "demo_url": "https://spendkit-alpha.vercel.app/demo/",
  "demo_quality_standard": {
    "repository_file": "DEMO_QUALITY_STANDARD.md",
    "target": "CHAMPION_READY",
    "score_threshold": 95,
    "hard_gates_required": true,
    "target_duration": "2:45-3:05",
    "runtime_payment_flow": {
      "sequence": [
        "policy_preview",
        "authorization",
        "per_payment_user_confirmation",
        "payment_wallet_router_submission",
        "record_and_reconcile"
      ],
      "amount_limits_source": "live_policy_and_router",
      "payment_wallet_key_required": true
    }
  },
  "server_pays_gas": false,
  "transaction_sender": "bound_agent_payment_wallet",
  "wallet_roles": {
    "spendkit_admin_authorization_signer": {
      "address": "0x3EA76F9b8489AD51D5e00dcb8bE5706049fC89F1",
      "responsibilities": [
        "router_admin",
        "policy_management",
        "pause_control",
        "authorization_signing"
      ],
      "demo_shared_admin_signer": true
    },
    "agent_payment_wallet": {
      "address": "0x8F2ab541a145671542c2ff9c7be8a46813ff83dc",
      "responsibilities": [
        "holds_usdg",
        "submits_router_transaction",
        "pays_gas",
        "payment_token_source"
      ]
    },
    "demo_recipient": {
      "address": "0x33017f263aDb598a5E4Cc0c66F986b9893746F5C",
      "responsibility": "receives_usdg"
    }
  }
}
