{"openapi": "3.0.3", "info": {"title": "MCP OAuth client-interop conformance: prove real clients can connect", "version": "1.0.0"}, "components": {"securitySchemes": {"bearer": {"type": "http", "scheme": "bearer"}}}, "paths": {"/": {"get": {"responses": {"200": {"description": "product descriptor", "content": {"application/json": {"schema": {"type": "object", "properties": {"name": {"type": "string"}, "prices": {"type": "object", "properties": {}}, "limits": {"type": "array", "items": {"type": "string"}}}}}}}, "402": {"description": "x402 payment required / payment rejected \u2014 body carries accepts[] with the payment requirements"}}}}, "/docs": {"get": {"responses": {"200": {"description": "full inline documentation (text)"}, "402": {"description": "x402 payment required / payment rejected \u2014 body carries accepts[] with the payment requirements"}}}}, "/health": {"get": {"responses": {"200": {"description": "ok", "content": {"application/json": {"schema": {"type": "object", "properties": {"ok": {"type": "boolean"}}}}}}, "402": {"description": "x402 payment required / payment rejected \u2014 body carries accepts[] with the payment requirements"}}}}, "/register": {"post": {"requestBody": {"content": {"application/json": {"schema": {"type": "object", "properties": {"account_name": {"type": "string", "example": "my-server-ops"}, "payer_wallet": {"type": "string", "example": "0x1111111111111111111111111111111111111111"}}}}}}, "responses": {"200": {"description": "account + token shown once", "content": {"application/json": {"schema": {"type": "object", "properties": {"account_id": {"type": "string"}, "token": {"type": "string"}}}}}}, "402": {"description": "x402 payment required / payment rejected \u2014 body carries accepts[] with the payment requirements"}}}}, "/check": {"post": {"description": "One full matrix run. x402 pay-per-call $0.01 (10000 atomic USDC, Base) unless the Bearer token's account has an active Solo subscription/trial, in which case the run is included. Unpaid returns HTTP 402 with the x402 challenge.", "requestBody": {"content": {"application/json": {"schema": {"type": "object", "properties": {"idp_shape": {"type": "string", "enum": ["dcr_friendly", "cognito_like", "strict_loopback"], "example": "cognito_like", "description": "one documented IdP shape (mutually exclusive with server_config/full_matrix)"}, "server_config": {"type": "object", "properties": {"name": {"type": "string", "example": "mine"}, "dcr_supported": {"type": "boolean", "example": false, "description": "whether the server/IdP offers RFC 7591 dynamic client registration"}, "loopback_mode": {"type": "string", "enum": ["any_port", "exact_port"], "example": "exact_port"}, "pinned_loopback_port": {"type": "integer", "example": 8080}, "preregistered_client_id": {"type": "string", "example": "prereg-client-1"}, "pkce_methods": {"type": "array", "items": {"type": "string"}, "example": ["S256"]}, "cimd_supported": {"type": "boolean", "example": false}}, "description": "Your server's OAuth shape. Every field optional; defaults match the dcr_friendly shape."}, "full_matrix": {"type": "boolean", "example": false, "description": "run all 5 clients x all 3 documented shapes (15 cells)"}, "clients": {"type": "array", "items": {"type": "string", "enum": ["claude_code", "claude_desktop", "cursor", "inspector", "vscode"]}, "example": ["cursor", "vscode"], "description": "optional subset of client profiles"}, "apply_shims": {"type": "boolean", "example": true, "description": "re-run each failing cell with its prescribed shim and report the flip"}}, "example": {"idp_shape": "cognito_like", "apply_shims": true}}, "example": {"idp_shape": "cognito_like", "apply_shims": true}}}}, "responses": {"200": {"description": "matrix result: per-cell perishable verdicts", "content": {"application/json": {"schema": {"type": "object", "properties": {"summary": {"type": "object", "properties": {"cells": {"type": "integer"}, "pass": {"type": "integer"}, "fail": {"type": "integer"}}}, "verdicts": {"type": "array", "items": {"type": "object", "properties": {"client": {"type": "string"}, "idp": {"type": "string"}, "status": {"type": "string", "enum": ["PASS", "FAIL"]}, "failing_step": {"type": "string", "nullable": true}, "error": {"type": "string", "nullable": true}, "shim": {"type": "string", "nullable": true}, "shim_text": {"type": "string", "nullable": true}, "verdict_hash": {"type": "string"}, "issued_at": {"type": "number"}, "expires_at": {"type": "number"}, "trace": {"type": "array", "items": {"type": "string"}}, "shim_result": {"type": "object", "properties": {"status": {"type": "string"}, "failing_step": {"type": "string", "nullable": true}}, "description": "present when apply_shims=true and the cell failed"}}}}}}}}}, "402": {"description": "x402 payment required / payment rejected \u2014 body carries accepts[] with the payment requirements"}}}}, "/trial/claim": {"post": {"security": [{"bearer": []}], "requestBody": {"content": {"application/json": {"schema": {"type": "object", "properties": {"server_name": {"type": "string", "example": "my-mcp-server"}}}}}}, "responses": {"200": {"description": "one-time trial granted (first Solo month, first server)", "content": {"application/json": {"schema": {"type": "object", "properties": {"trial": {"type": "boolean"}, "expires_at": {"type": "number"}}}}}}, "402": {"description": "x402 payment required / payment rejected \u2014 body carries accepts[] with the payment requirements"}}}}, "/subscribe": {"post": {"security": [{"bearer": []}], "description": "Solo $9/mo per server (9000000 atomic USDC) or Fleet $29/mo per account covering up to 10 servers (29000000 atomic USDC), selected by the tier field, via x402: unpaid returns HTTP 402 with the challenge at the tier price; a verified+settled payment activates/extends the account's 30-day term. An optional check shape (server_config / idp_shape) is stored for the hourly re-runs and the public badge.", "requestBody": {"content": {"application/json": {"schema": {"type": "object", "properties": {"server_name": {"type": "string", "example": "my-mcp-server"}, "tier": {"type": "string", "enum": ["solo", "fleet"], "example": "solo"}, "server_config": {"type": "object", "properties": {"name": {"type": "string", "example": "mine"}, "dcr_supported": {"type": "boolean", "example": false, "description": "whether the server/IdP offers RFC 7591 dynamic client registration"}, "loopback_mode": {"type": "string", "enum": ["any_port", "exact_port"], "example": "exact_port"}, "pinned_loopback_port": {"type": "integer", "example": 8080}, "preregistered_client_id": {"type": "string", "example": "prereg-client-1"}, "pkce_methods": {"type": "array", "items": {"type": "string"}, "example": ["S256"]}, "cimd_supported": {"type": "boolean", "example": false}}, "description": "Your server's OAuth shape. Every field optional; defaults match the dcr_friendly shape."}, "idp_shape": {"type": "string", "enum": ["dcr_friendly", "cognito_like", "strict_loopback"]}}}}}}, "responses": {"200": {"description": "subscription active", "content": {"application/json": {"schema": {"type": "object", "properties": {"active": {"type": "boolean"}, "tier": {"type": "string"}, "expires_at": {"type": "number"}}}}}}, "402": {"description": "x402 payment required / payment rejected \u2014 body carries accepts[] with the payment requirements"}}}}, "/fleet/servers": {"post": {"security": [{"bearer": []}], "description": "Register a server under an active Fleet subscription (cap 10 per account, enforced server-side).", "requestBody": {"content": {"application/json": {"schema": {"type": "object", "properties": {"server_name": {"type": "string", "example": "my-mcp-server"}}}}}}, "responses": {"200": {"description": "fleet server list", "content": {"application/json": {"schema": {"type": "object", "properties": {"fleet_servers": {"type": "array", "items": {"type": "string"}}}}}}}, "402": {"description": "x402 payment required / payment rejected \u2014 body carries accepts[] with the payment requirements"}}}}, "/badge": {"get": {"description": "Public SVG connectability badge for an account's latest hourly/on-demand run: /badge?account_id=<id>. Without account_id, the product badge.", "responses": {"200": {"description": "SVG badge"}, "402": {"description": "x402 payment required / payment rejected \u2014 body carries accepts[] with the payment requirements"}}}}, "/badge.json": {"get": {"description": "Public JSON badge data (summary counts, tier, checked_at) for ?account_id=<id>; without it, how the badge is addressed.", "responses": {"200": {"description": "badge data", "content": {"application/json": {"schema": {"type": "object", "properties": {"account_id": {"type": "string"}, "summary": {"type": "object", "properties": {}}}}}}}, "402": {"description": "x402 payment required / payment rejected \u2014 body carries accepts[] with the payment requirements"}}}}, "/terms": {"get": {"responses": {"200": {"description": "terms of service (text)"}, "402": {"description": "x402 payment required / payment rejected \u2014 body carries accepts[] with the payment requirements"}}}}, "/privacy": {"get": {"responses": {"200": {"description": "privacy notice (text)"}, "402": {"description": "x402 payment required / payment rejected \u2014 body carries accepts[] with the payment requirements"}}}}, "/upkeep.json": {"get": {"responses": {"200": {"description": "harness-upkeep cadence measurement record", "content": {"application/json": {"schema": {"type": "object", "properties": {"cadence": {"type": "string"}, "profiles": {"type": "array", "items": {"type": "object", "properties": {}}}}}}}}, "402": {"description": "x402 payment required / payment rejected \u2014 body carries accepts[] with the payment requirements"}}}}, "/history": {"get": {"security": [{"bearer": []}], "responses": {"200": {"description": "own account's matrix runs only", "content": {"application/json": {"schema": {"type": "object", "properties": {"history": {"type": "array", "items": {"type": "object", "properties": {"summary": {"type": "object", "properties": {}}, "verdicts": {"type": "array", "items": {"type": "object", "properties": {"client": {"type": "string"}, "idp": {"type": "string"}, "status": {"type": "string", "enum": ["PASS", "FAIL"]}, "failing_step": {"type": "string", "nullable": true}, "error": {"type": "string", "nullable": true}, "shim": {"type": "string", "nullable": true}, "shim_text": {"type": "string", "nullable": true}, "verdict_hash": {"type": "string"}, "issued_at": {"type": "number"}, "expires_at": {"type": "number"}, "trace": {"type": "array", "items": {"type": "string"}}, "shim_result": {"type": "object", "properties": {"status": {"type": "string"}, "failing_step": {"type": "string", "nullable": true}}, "description": "present when apply_shims=true and the cell failed"}}}}}}}}}}}}, "402": {"description": "x402 payment required / payment rejected \u2014 body carries accepts[] with the payment requirements"}}}}, "/subscription": {"get": {"security": [{"bearer": []}], "responses": {"200": {"description": "own subscription status", "content": {"application/json": {"schema": {"type": "object", "properties": {"subscription": {"type": "object", "properties": {"tier": {"type": "string"}, "trial": {"type": "boolean"}, "active": {"type": "boolean"}, "expires_at": {"type": "number"}}}}}}}}, "402": {"description": "x402 payment required / payment rejected \u2014 body carries accepts[] with the payment requirements"}}}}, "/tokens/revoke": {"post": {"security": [{"bearer": []}], "requestBody": {"content": {"application/json": {"schema": {"type": "object", "properties": {"token": {"type": "string", "description": "the token to revoke; must belong to your own account"}}}}}}, "responses": {"200": {"description": "revoked", "content": {"application/json": {"schema": {"type": "object", "properties": {"revoked": {"type": "boolean"}}}}}}, "402": {"description": "x402 payment required / payment rejected \u2014 body carries accepts[] with the payment requirements"}}}}, "/mcp": {"post": {"description": "MCP streamable-http endpoint (JSON-RPC 2.0): initialize, ping, tools/list, tools/call. Tools conformance_check / claim_trial / subscribe_solo / run_history / subscription_status wrap the exact REST operations (same validation, same metering, same Bearer token and X-PAYMENT headers); a payment-required conformance_check answers HTTP 402 with the x402 challenge at transport level. Also served at POST / (the product base URL).", "requestBody": {"content": {"application/json": {"schema": {"type": "object", "properties": {"jsonrpc": {"type": "string", "example": "2.0"}, "id": {"type": "integer", "example": 1}, "method": {"type": "string", "example": "tools/list"}}}}}}, "responses": {"200": {"description": "JSON-RPC result", "content": {"application/json": {"schema": {"type": "object", "properties": {"jsonrpc": {"type": "string"}, "result": {"type": "object", "properties": {}}}}}}}, "402": {"description": "x402 payment required / payment rejected \u2014 body carries accepts[] with the payment requirements"}}}}}}