{"openapi":"3.1.0","info":{"title":"pabloMCP API","version":"1.0.0","summary":"Secure MCP capability layer — pair any agent to an encrypted workspace vault and tools.","description":"REST surface of pabloMCP (https://pablomcp.com). Every tool is one POST operation under /tools/{tool_name}; the same registry is exposed over MCP Streamable HTTP at https://pablomcp.com/mcp. Discovery (GET /tools, MCP initialize/tools/list) needs no auth. To act, pair first: POST /tools/auth_pairing_start with the human's email, have them confirm the emailed link + TOTP, then POST /tools/auth_pairing_complete to receive a named revocable bearer key. Errors are always structured JSON: { error: { error, code, details? } } with actionable messages, never HTML. Rate limit: 240 requests per minute per caller (bearer key, else IP), announced on every response via RateLimit-* and X-RateLimit-* headers; 429 responses carry Retry-After. Versioning: this surface is additive-stable — existing operations, fields, and error codes are not changed or removed in place. Any breaking change would ship under a new path prefix (/v2/), with the old surface kept for at least 90 days and affected operations marked deprecated:true in this spec before removal.","contact":{"name":"pabloMCP","email":"hello@pablomcp.com","url":"https://pablomcp.com/contact"},"x-llms-txt":"https://pablomcp.com/llms.txt","x-rate-limit":{"limit":240,"window":"1 minute","scope":"per bearer key (unauthenticated: per IP)","headers":["RateLimit-Limit","RateLimit-Remaining","RateLimit-Reset","X-RateLimit-Limit","X-RateLimit-Remaining","X-RateLimit-Reset"],"on_exceed":"HTTP 429 with Retry-After header and { error, code: 'RATE_LIMITED', details }"},"x-versioning-policy":{"current":"1.0.0","strategy":"Additive-stable: new tools and optional fields may appear at any time; existing operations, request fields, and error codes are never changed or removed in place.","breaking_changes":"Would ship under a /v2/ path prefix. The v1 surface stays available for at least 90 days after any such change.","deprecation":"Deprecated operations are marked deprecated:true in this spec at least 90 days before removal."}},"servers":[{"url":"https://pablomcp.com","description":"Production"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"meta","description":"Discovery and health endpoints (no auth)."},{"name":"READ","description":"Safe reads — no side effects."},{"name":"DRAFT","description":"Prepare data without mutating."},{"name":"COMMIT","description":"Writes — preview unless confirm:true."},{"name":"DANGEROUS","description":"Irreversible — confirm:true required."}],"paths":{"/healthz":{"get":{"operationId":"health_check_http","summary":"Service health probe","description":"Liveness probe. Returns { ok: true } with a timestamp. No authentication required.","tags":["meta"],"security":[],"responses":{"200":{"description":"Service is up.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"ts":{"type":"string"}},"required":["ok"]}}}}}}},"/tools":{"get":{"operationId":"list_tools","summary":"List every tool with its risk class","description":"Returns the full tool catalogue (name, tool_class, description). No authentication required — use this to discover capabilities before pairing.","tags":["meta"],"security":[],"responses":{"200":{"description":"Tool catalogue.","content":{"application/json":{"schema":{"type":"object","properties":{"tools":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"tool_class":{"$ref":"#/components/schemas/ToolClass"},"description":{"type":"string"}},"required":["name","tool_class","description"]}}},"required":["tools"]}}}}}}},"/mcp":{"post":{"operationId":"mcp_streamable_http","summary":"MCP Streamable HTTP endpoint (JSON-RPC 2.0)","description":"Official Model Context Protocol endpoint. Send JSON-RPC 2.0 requests (initialize, tools/list, tools/call). initialize and tools/list work without authentication; tools/call requires a bearer key for most tools. Responses stream as text/event-stream.","tags":["meta"],"security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"jsonrpc":{"const":"2.0"},"id":{"anyOf":[{"type":"string"},{"type":"number"}]},"method":{"type":"string"},"params":{"type":"object","additionalProperties":true}},"required":["jsonrpc","method"]}}}},"responses":{"200":{"description":"JSON-RPC response (as SSE message events).","content":{"text/event-stream":{"schema":{"type":"string"}}}}}}},"/tools/admob_docs":{"post":{"operationId":"admob_docs","summary":"AdMob API reference: base URL, auth model, common paths, and docs index.","description":"AdMob API reference: base URL, auth model, common paths, and docs index. Read this before admob_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/admob_request":{"post":{"operationId":"admob_request","summary":"Generic AdMob API passthrough — call ANY endpoint at admob.googleapis.com/v1.","description":"Generic AdMob API passthrough — call ANY endpoint at admob.googleapis.com/v1. POST :generate are read-style and treated as READ; other POST/PATCH/PUT=COMMIT, GET=READ, DELETE=DANGEROUS.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["method","path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/agent_key_create":{"post":{"operationId":"agent_key_create","summary":"Create a named agent API key for this workspace.","description":"Create a named agent API key for this workspace. The raw token is returned once; store it in the target agent/client. This is the public pabloMCP replacement for one global MCP_API_KEY while preserving the simple paste-a-key UX. Preview unless confirm:true. COMMIT.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"access_mode":{"type":"string","enum":["relaxed","balanced","locked_down"]},"expires_at":{"type":"string"},"confirm":{"type":"boolean"}},"required":["name"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/agent_key_list":{"post":{"operationId":"agent_key_list","summary":"List agent API keys for the current workspace.","description":"List agent API keys for the current workspace. Raw tokens are never returned; only metadata, status, and hash previews. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"include_revoked":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/agent_key_revoke":{"post":{"operationId":"agent_key_revoke","summary":"Revoke a named agent API key by id.","description":"Revoke a named agent API key by id. Existing TOTP sessions for that key stop mattering because bearer auth will fail first. Preview unless confirm:true. COMMIT.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"confirm":{"type":"boolean"}},"required":["id"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/anthropic_docs":{"post":{"operationId":"anthropic_docs","summary":"Return Anthropic API reference: base URL, auth model, version header, and docs index.","description":"Return Anthropic API reference: base URL, auth model, version header, and docs index. Read this before anthropic_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/anthropic_request":{"post":{"operationId":"anthropic_request","summary":"Generic Anthropic API passthrough — call ANY endpoint at api.anthropic.com/v1.","description":"Generic Anthropic API passthrough — call ANY endpoint at api.anthropic.com/v1. POST /messages and /complete are inference and treated as READ. Other POST/PATCH/PUT=COMMIT, GET=READ, DELETE=DANGEROUS.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["method","path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/approval_decide":{"post":{"operationId":"approval_decide","summary":"Approve or reject a pending approval request.","description":"Approve or reject a pending approval request. Approval does not execute by itself; call approval_execute after approval. Preview unless confirm:true. COMMIT.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"decision":{"type":"string","enum":["approved","rejected"]},"note":{"type":"string"},"confirm":{"type":"boolean"}},"required":["id","decision"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/approval_execute":{"post":{"operationId":"approval_execute","summary":"Execute an approved approval request by replaying the stored tool call once.","description":"Execute an approved approval request by replaying the stored tool call once. This bypasses the policy approval gate but still runs the tool's own schema, preview, confirm, and safety logic. COMMIT.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"confirm":{"type":"boolean"}},"required":["id"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/approval_get":{"post":{"operationId":"approval_get","summary":"Read a single approval request, including the stored tool arguments.","description":"Read a single approval request, including the stored tool arguments. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/approval_list":{"post":{"operationId":"approval_list","summary":"List approval requests for the current workspace.","description":"List approval requests for the current workspace. Use this to show pending risky actions before deciding. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["pending","approved","rejected","expired","executed"]},"limit":{"type":"number"}}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/approval_respond":{"post":{"operationId":"approval_respond","summary":"One-call approval response for agents.","description":"One-call approval response for agents. If the human approves, this records approval and immediately executes the stored tool call. If rejected, it records rejection and does not execute. Use this as the simple in-band approval path. COMMIT.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"decision":{"type":"string","enum":["approved","rejected"]},"note":{"type":"string"},"confirm":{"type":"boolean"}},"required":["id","decision"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/audit_read":{"post":{"operationId":"audit_read","summary":"Read recent COMMIT/DRAFT/DANGEROUS tool calls from the MCP audit log.","description":"Read recent COMMIT/DRAFT/DANGEROUS tool calls from the MCP audit log. Use to answer questions like 'what did you do for me yesterday' or to verify an earlier change actually went through. Optionally filter by tool name or tool_class.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"number"},"tool":{"type":"string"},"tool_class":{"type":"string","enum":["READ","DRAFT","COMMIT","DANGEROUS"]}}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/auth_handshake":{"post":{"operationId":"auth_handshake","summary":"Open or refresh a 60-minute session by providing the current 6-digit code from your TOTP authenticator app.","description":"Open or refresh a 60-minute session by providing the current 6-digit code from your TOTP authenticator app. Required before any other HTTP tool call once TOTP is configured. Idle for 60 min ⇒ session expires and you must handshake again. The session is tied to the bearer token used on this request. COMMIT.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true. No bearer key required.","tags":["COMMIT"],"x-tool-class":"COMMIT","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"}},"required":["code"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/auth_logout":{"post":{"operationId":"auth_logout","summary":"Close the current session immediately.","description":"Close the current session immediately. The next non-auth call from this bearer will require a fresh handshake. Useful before stepping away from a shared machine. COMMIT.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true. No bearer key required.","tags":["COMMIT"],"x-tool-class":"COMMIT","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"confirm":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/auth_pairing_complete":{"post":{"operationId":"auth_pairing_complete","summary":"Complete agent-first pairing once the human has finished the web flow.","description":"Complete agent-first pairing once the human has finished the web flow. Only requires the pairing_id — the web step already verified the human and their authenticator. On success, creates a named revocable agent key and opens its first 60-minute session. The raw token is returned once. COMMIT.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true. No bearer key required.","tags":["COMMIT"],"x-tool-class":"COMMIT","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"pairing_id":{"type":"string"},"agent_name":{"type":"string"},"access_mode":{"type":"string","enum":["relaxed","balanced","locked_down"]}},"required":["pairing_id"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/auth_pairing_start":{"post":{"operationId":"auth_pairing_start","summary":"Start agent-first pabloMCP pairing.","description":"Start agent-first pabloMCP pairing. The user gives their email; pabloMCP emails a one-time pairing link. The user taps it on their phone, completes auth + (first time) authenticator setup on the web, then tells you they're done. Then call auth_pairing_complete with just the pairing_id. COMMIT.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true. No bearer key required.","tags":["COMMIT"],"x-tool-class":"COMMIT","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"},"agent_name":{"type":"string"}},"required":["email"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/auth_pairing_status":{"post":{"operationId":"auth_pairing_status","summary":"Inspect a pending agent-first pairing request.","description":"Inspect a pending agent-first pairing request. Use to poll whether the human has finished the web flow (ready=true). READ.\n\nRisk class: READ — no side effects; runs immediately. No bearer key required.","tags":["READ"],"x-tool-class":"READ","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"pairing_id":{"type":"string"}},"required":["pairing_id"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/auth_session_status":{"post":{"operationId":"auth_session_status","summary":"Inspect the current session bound to this bearer token — whether it's active, when it expires, minutes remaining.","description":"Inspect the current session bound to this bearer token — whether it's active, when it expires, minutes remaining. Also reports whether TOTP is configured at all. READ.\n\nRisk class: READ — no side effects; runs immediately. No bearer key required.","tags":["READ"],"x-tool-class":"READ","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/auth_setup_totp":{"post":{"operationId":"auth_setup_totp","summary":"Bootstrap TOTP second-factor on this server.","description":"Bootstrap TOTP second-factor on this server. Generates a new TOTP secret, stores it encrypted in the vault, and returns the otpauth:// URL to scan with Google Authenticator / 1Password / Authy. Once set, every HTTP tools/call requires a fresh 6-digit code via auth_handshake. SETUP IS LOCAL-ONLY: must be called over stdio (local Claude Code), or over HTTP with an already-valid session (rotation). HTTP rotation additionally requires `code` — a current 6-digit code from the existing authenticator — so a stolen bearer with a live session cannot silently relock the workspace. Refuses to overwrite an existing secret unless `replace:true` is passed. COMMIT.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true. No bearer key required.","tags":["COMMIT"],"x-tool-class":"COMMIT","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"replace":{"type":"boolean"},"code":{"type":"string"},"confirm":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/betdex_cancel_order":{"post":{"operationId":"betdex_cancel_order","summary":"Cancel one BetDEX order by ID.","description":"Cancel one BetDEX order by ID. Without confirm returns a preview; confirm:true performs the cancellation. COMMIT.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"order_id":{"type":"string"},"confirm":{"type":"boolean"}},"required":["order_id"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/betdex_docs":{"post":{"operationId":"betdex_docs","summary":"BetDEX Exchange API quick reference, authentication model, supported tools, and safety notes.","description":"BetDEX Exchange API quick reference, authentication model, supported tools, and safety notes. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/betdex_events":{"post":{"operationId":"betdex_events","summary":"List BetDEX events with filters for sport/subcategory, live/today/later, active state, date range, and pagination.","description":"List BetDEX events with filters for sport/subcategory, live/today/later, active state, date range, and pagination. Defaults to active tennis. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"subcategory_id":{"type":"string"},"starting":{"type":"string","enum":["Live","Today","Later","Range"]},"active":{"type":"boolean"},"from":{"type":"string"},"to":{"type":"string"},"page":{"type":"number"},"size":{"type":"number"}}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/betdex_markets":{"post":{"operationId":"betdex_markets","summary":"List BetDEX markets by event, type, status, in-play state, date range, and pagination.","description":"List BetDEX markets by event, type, status, in-play state, date range, and pagination. Includes outcome metadata. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"event_ids":{"type":"array","items":{"type":"string"}},"market_type_ids":{"type":"array","items":{"type":"string"}},"statuses":{"type":"array","items":{"type":"string","enum":["Initializing","Open","Locking","Locked","Settling","Settled","Voiding","Voided","Closed"]}},"in_play_statuses":{"type":"array","items":{"type":"string","enum":["NotApplicable","PrePlay","InPlay"]}},"published":{"type":"boolean"},"from":{"type":"string"},"to":{"type":"string"},"page":{"type":"number"},"size":{"type":"number"}}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/betdex_order":{"post":{"operationId":"betdex_order","summary":"Submit a real-money BetDEX back/lay order.","description":"Submit a real-money BetDEX back/lay order. Without confirm returns a preview and makes no API call. Requires confirm:true to execute. COMMIT.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"market_id":{"type":"string"},"outcome_id":{"type":"string"},"side":{"type":"string","enum":["For","Against"]},"price":{"type":"number"},"stake":{"type":"number"},"keep_when_in_play":{"type":"boolean"},"retain_unmatched":{"type":"boolean"},"reference":{"type":"string"},"confirm":{"type":"boolean"}},"required":["market_id","outcome_id","side","price","stake"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/betdex_order_preview":{"post":{"operationId":"betdex_order_preview","summary":"Preview a BetDEX back/lay order with fresh market and liquidity context.","description":"Preview a BetDEX back/lay order with fresh market and liquidity context. Never places an order. DRAFT.\n\nRisk class: DRAFT — prepares data, never mutates.","tags":["DRAFT"],"x-tool-class":"DRAFT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"market_id":{"type":"string"},"outcome_id":{"type":"string"},"side":{"type":"string","enum":["For","Against"]},"price":{"type":"number"},"stake":{"type":"number"},"keep_when_in_play":{"type":"boolean"},"retain_unmatched":{"type":"boolean"},"reference":{"type":"string"}},"required":["market_id","outcome_id","side","price","stake"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/betdex_prices":{"post":{"operationId":"betdex_prices","summary":"Fetch current BetDEX back/lay price levels, amounts, total liquidity, and traded volume for up to 100 market IDs.","description":"Fetch current BetDEX back/lay price levels, amounts, total liquidity, and traded volume for up to 100 market IDs. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"market_ids":{"type":"array","items":{"type":"string"}}},"required":["market_ids"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/betdex_status":{"post":{"operationId":"betdex_status","summary":"Check BetDEX public exchange status and whether configured credentials can create a session.","description":"Check BetDEX public exchange status and whether configured credentials can create a session. Does not return tokens. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/betdex_wallet":{"post":{"operationId":"betdex_wallet","summary":"Fetch the configured BetDEX wallet balances, exposure, and metrics-safe wallet metadata.","description":"Fetch the configured BetDEX wallet balances, exposure, and metrics-safe wallet metadata. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/cloudbet_bet":{"post":{"operationId":"cloudbet_bet","summary":"Place a straight (single) bet on a Cloudbet market for real money.","description":"Place a straight (single) bet on a Cloudbet market for real money. Requires event_id, market_url, price, stake, currency, and confirm:true. Smartly retries PRICE_ABOVE_MARKET stale-price rejects with returned reofferPrice.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"event_id":{"type":"string"},"market_url":{"type":"string"},"price":{"type":"number"},"stake":{"type":"number"},"currency":{"type":"string"},"confirm":{"type":"boolean"}},"required":["event_id","market_url","price","stake"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/cloudbet_bet_preview":{"post":{"operationId":"cloudbet_bet_preview","summary":"Preview a Cloudbet bet without placing it — computes estimated payout/profit and fetches the current live odds for sa...","description":"Preview a Cloudbet bet without placing it — computes estimated payout/profit and fetches the current live odds for sanity-check. Use before cloudbet_bet to confirm the market is still trading at your price.\n\nRisk class: DRAFT — prepares data, never mutates.","tags":["DRAFT"],"x-tool-class":"DRAFT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"event_id":{"type":"string"},"market_url":{"type":"string"},"price":{"type":"number"},"stake":{"type":"number"},"currency":{"type":"string"}},"required":["event_id","market_url","price","stake"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/cloudbet_docs":{"post":{"operationId":"cloudbet_docs","summary":"Cloudbet Sports API reference: base URL, auth model, path prefix, and docs index.","description":"Cloudbet Sports API reference: base URL, auth model, path prefix, and docs index. Read this before cloudbet_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/cloudbet_multi_bet":{"post":{"operationId":"cloudbet_multi_bet","summary":"Place a Cloudbet multi/parlay for real money.","description":"Place a Cloudbet multi/parlay for real money. Requires selections, stake, currency, and confirm:true. Smartly retries Cloudbet PRICE_ABOVE_MARKET stale-price rejects with returned reofferPrice(s).\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"selections":{"type":"array","items":{"type":"object","properties":{"event_id":{"type":"string"},"market_url":{"type":"string"},"price":{"type":"number"}},"required":["event_id","market_url","price"]}},"stake":{"type":"number"},"currency":{"type":"string"},"confirm":{"type":"boolean"}},"required":["selections","stake"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/cloudbet_multi_preview":{"post":{"operationId":"cloudbet_multi_preview","summary":"Preview a Cloudbet multi/parlay without placing it — computes combined odds, estimated payout/profit.","description":"Preview a Cloudbet multi/parlay without placing it — computes combined odds, estimated payout/profit. Use before cloudbet_multi_bet.\n\nRisk class: DRAFT — prepares data, never mutates.","tags":["DRAFT"],"x-tool-class":"DRAFT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"selections":{"type":"array","items":{"type":"object","properties":{"event_id":{"type":"string"},"market_url":{"type":"string"},"price":{"type":"number"}},"required":["event_id","market_url","price"]}},"stake":{"type":"number"},"currency":{"type":"string"}},"required":["selections","stake"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/cloudbet_request":{"post":{"operationId":"cloudbet_request","summary":"Generic Cloudbet Sports API passthrough — call ANY endpoint at sports-api.cloudbet.com.","description":"Generic Cloudbet Sports API passthrough — call ANY endpoint at sports-api.cloudbet.com. GET=READ, POST/PATCH/PUT=COMMIT, DELETE=DANGEROUS. COMMIT/DANGEROUS require confirm:true. For real-money bet placement prefer cloudbet_bet / cloudbet_multi_bet which handle stale-price reoffers.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["method","path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/cloudflare_docs":{"post":{"operationId":"cloudflare_docs","summary":"Cloudflare API reference: base URL, auth model, account-scoped path conventions, key doc URLs.","description":"Cloudflare API reference: base URL, auth model, account-scoped path conventions, key doc URLs. Read this before cloudflare_request. The default account id is in `CLOUDFLARE_ACCOUNT_ID` (resolve via secrets_get if you need it). READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/cloudflare_request":{"post":{"operationId":"cloudflare_request","summary":"Generic Cloudflare API passthrough — call ANY endpoint at api.cloudflare.com/client/v4.","description":"Generic Cloudflare API passthrough — call ANY endpoint at api.cloudflare.com/client/v4. Path goes in `path` (e.g. '/zones' or '/accounts/{account_id}/...'). GET=READ, POST/PATCH/PUT=COMMIT, DELETE=DANGEROUS. COMMIT/DANGEROUS require confirm:true.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["method","path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/connector_credential_set":{"post":{"operationId":"connector_credential_set","summary":"Store or update a declared connector credential in the encrypted vault.","description":"Store or update a declared connector credential in the encrypted vault. Use during agent-accessible onboarding after connector_status shows a required or optional key is missing. Preview unless confirm:true. COMMIT.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"connector_id":{"type":"string"},"name":{"type":"string"},"value":{"type":"string"},"confirm":{"type":"boolean"}},"required":["connector_id","name","value"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/connector_list":{"post":{"operationId":"connector_list","summary":"List pabloMCP connectors, connection status, required credentials, and available tools.","description":"List pabloMCP connectors, connection status, required credentials, and available tools. Use during agent-accessible onboarding to see what is ready or missing. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"include_tools":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/connector_status":{"post":{"operationId":"connector_status","summary":"Inspect one connector by id, including required credentials and the tools it exposes.","description":"Inspect one connector by id, including required credentials and the tools it exposes. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"}},"required":["id"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/domain_check":{"post":{"operationId":"domain_check","summary":"Check whether one or more domain names are available to register through Dreamscape.","description":"Check whether one or more domain names are available to register through Dreamscape. Use before domain_register to confirm availability and pricing eligibility. Requires an array of fully-qualified domain names.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"domains":{"type":"array","items":{"type":"string"}}},"required":["domains"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/domain_list":{"post":{"operationId":"domain_list","summary":"List domains held in the Dreamscape reseller account, with expiry dates and status.","description":"List domains held in the Dreamscape reseller account, with expiry dates and status. Use to inventory owned domains or look up a domain's expiry/status before transfer/renewal operations.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"page":{"type":"number"},"page_size":{"type":"number"}}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/domain_register":{"post":{"operationId":"domain_register","summary":"Register (purchase) an available domain through Dreamscape via the DomainCreate SOAP op — actually charges the resell...","description":"Register (purchase) an available domain through Dreamscape via the DomainCreate SOAP op — actually charges the reseller account. Requires registrant/admin/billing/tech ContactIdentifiers from dreamscape_contact_create, and confirm:true to actually buy. Use domain_check first to verify availability.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"registration_period":{"type":"number"},"registrant_contact_identifier":{"type":"string"},"admin_contact_identifier":{"type":"string"},"billing_contact_identifier":{"type":"string"},"tech_contact_identifier":{"type":"string"},"nameservers":{"type":"array","items":{"type":"string"}},"confirm":{"type":"boolean"}},"required":["domain","registrant_contact_identifier","admin_contact_identifier","billing_contact_identifier","tech_contact_identifier"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/domain_transfer_check":{"post":{"operationId":"domain_transfer_check","summary":"Check whether a domain (held at another registrar) is eligible to transfer into Dreamscape using its EPP/auth key.","description":"Check whether a domain (held at another registrar) is eligible to transfer into Dreamscape using its EPP/auth key. Use before domain_transfer_start to validate the auth key and see renewal/pricing. Requires domain and auth_key.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"auth_key":{"type":"string"}},"required":["domain","auth_key"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/domain_transfer_start":{"post":{"operationId":"domain_transfer_start","summary":"Initiate the inbound transfer of an existing domain into Dreamscape using its EPP/auth key.","description":"Initiate the inbound transfer of an existing domain into Dreamscape using its EPP/auth key. Run domain_transfer_check first to confirm eligibility, and dreamscape_contact_create to get the ContactIdentifier. Pass confirm:true to actually start (otherwise preview).\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"auth_key":{"type":"string"},"contact_identifier":{"type":"string"},"renewal_period":{"type":"number"},"confirm":{"type":"boolean"}},"required":["domain","auth_key","contact_identifier"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/domain_update_nameservers":{"post":{"operationId":"domain_update_nameservers","summary":"Replace the authoritative nameservers for a domain registered with Dreamscape (e.g.","description":"Replace the authoritative nameservers for a domain registered with Dreamscape (e.g. delegating DNS to Cloudflare or Vercel). Requires the domain and at least 2 nameserver hostnames; preview unless confirm:true.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"nameservers":{"type":"array","items":{"type":"string"}},"confirm":{"type":"boolean"}},"required":["domain","nameservers"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/dreamscape_contact_create":{"post":{"operationId":"dreamscape_contact_create","summary":"Create a Dreamscape contact record (registrant/admin/billing/tech) and return the resulting ContactIdentifier (C-...).","description":"Create a Dreamscape contact record (registrant/admin/billing/tech) and return the resulting ContactIdentifier (C-...). Use as the first step before domain_register or domain_transfer_start, which both require contact identifiers. Requires full postal contact details; preview unless confirm:true.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"first_name":{"type":"string"},"last_name":{"type":"string"},"address":{"type":"string"},"city":{"type":"string"},"country":{"type":"string"},"state":{"type":"string"},"postcode":{"type":"string"},"country_code":{"type":"string"},"phone":{"type":"string"},"mobile":{"type":"string"},"email":{"type":"string"},"account_type":{"type":"string","enum":["Personal","Business"]},"confirm":{"type":"boolean"}},"required":["first_name","last_name","address","city","country","state","postcode","country_code","phone","email"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/dreamscape_docs":{"post":{"operationId":"dreamscape_docs","summary":"Return Dreamscape SOAP API reference info: docs URL, production/test WSDL & endpoints, key operation notes, and trans...","description":"Return Dreamscape SOAP API reference info: docs URL, production/test WSDL & endpoints, key operation notes, and transfer-flow gotchas. Use when you need to recall operation names (DomainCreate vs DomainRegister) or the auth-in-header convention before calling another dreamscape_/domain_ tool.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/elevenlabs_docs":{"post":{"operationId":"elevenlabs_docs","summary":"Return ElevenLabs API reference: base URL, auth model, and docs index.","description":"Return ElevenLabs API reference: base URL, auth model, and docs index. Read this before elevenlabs_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/elevenlabs_request":{"post":{"operationId":"elevenlabs_request","summary":"Generic ElevenLabs API passthrough — call ANY endpoint at api.elevenlabs.io/v1.","description":"Generic ElevenLabs API passthrough — call ANY endpoint at api.elevenlabs.io/v1. Inference POSTs (text-to-speech, speech-to-text, voice-changer, sound-generation, etc.) are treated as READ. Other POST/PATCH/PUT=COMMIT, GET=READ, DELETE=DANGEROUS.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["method","path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/ga_docs":{"post":{"operationId":"ga_docs","summary":"GA4 Admin + Data API reference: base URLs, auth model, common paths, and docs index.","description":"GA4 Admin + Data API reference: base URLs, auth model, common paths, and docs index. Read this before ga_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/ga_request":{"post":{"operationId":"ga_request","summary":"Generic GA4 API passthrough.","description":"Generic GA4 API passthrough. Choose `api` ('admin' for accounts/properties/streams or 'data' for reports). GET and POST :runReport/:runRealtimeReport=READ; other POST/PATCH/PUT=COMMIT, DELETE=DANGEROUS. COMMIT/DANGEROUS require confirm:true. Use ga_docs first.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"api":{"type":"string","enum":["admin","data"]},"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["method","path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/gdocs_read":{"post":{"operationId":"gdocs_read","summary":"Read the full plain-text body of a Google Doc by document ID.","description":"Read the full plain-text body of a Google Doc by document ID. Use for Google Docs specifically; for arbitrary Drive files (Sheets, text files, binaries) use gdrive_read.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"document_id":{"type":"string"}},"required":["document_id"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/gdrive_create":{"post":{"operationId":"gdrive_create","summary":"Create a new file in Google Drive — defaults to a Google Doc and inserts initial text if `content` is provided.","description":"Create a new file in Google Drive — defaults to a Google Doc and inserts initial text if `content` is provided. Use for spinning up a new Doc/Sheet/Slide; preview unless confirm:true. Requires name; optional folder_id parents the file.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"mime_type":{"type":"string"},"content":{"type":"string"},"folder_id":{"type":"string"},"confirm":{"type":"boolean"}},"required":["name"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/gdrive_list":{"post":{"operationId":"gdrive_list","summary":"List files in Google Drive — impersonates the GOOGLE_IMPERSONATE_USER stored in this workspace's vault.","description":"List files in Google Drive — impersonates the GOOGLE_IMPERSONATE_USER stored in this workspace's vault. Optionally filtered by a Drive query or folder. Use to find file IDs before gdrive_read or gdocs_read. Distinct from `notion_request` (Notion) and Gmail tools.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"page_size":{"type":"number"},"folder_id":{"type":"string"}}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/gdrive_read":{"post":{"operationId":"gdrive_read","summary":"Read or export a Google Drive file by ID.","description":"Read or export a Google Drive file by ID. Returns plain-text content for Google Docs/Sheets and text/JSON files; metadata only for binary types. For full structured Doc content use gdocs_read. Requires file_id (find via gdrive_list).\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"file_id":{"type":"string"},"export_mime":{"type":"string"}},"required":["file_id"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/github_docs":{"post":{"operationId":"github_docs","summary":"GitHub REST API reference: base URL, auth model, API version, common paths, and the official docs index.","description":"GitHub REST API reference: base URL, auth model, API version, common paths, and the official docs index. Read this before github_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/github_request":{"post":{"operationId":"github_request","summary":"Generic GitHub REST API passthrough — call ANY endpoint at api.github.com.","description":"Generic GitHub REST API passthrough — call ANY endpoint at api.github.com. GET=READ, POST/PATCH/PUT=COMMIT, DELETE=DANGEROUS. COMMIT/DANGEROUS require confirm:true. Use github_docs first.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["method","path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/godaddy_docs":{"post":{"operationId":"godaddy_docs","summary":"GoDaddy API reference: base URL, auth model, and the official docs index.","description":"GoDaddy API reference: base URL, auth model, and the official docs index. Read this before godaddy_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/godaddy_request":{"post":{"operationId":"godaddy_request","summary":"Generic GoDaddy API passthrough — call ANY endpoint at api.godaddy.com/v1.","description":"Generic GoDaddy API passthrough — call ANY endpoint at api.godaddy.com/v1. GET=READ, POST/PATCH/PUT=COMMIT, DELETE=DANGEROUS. COMMIT/DANGEROUS require confirm:true.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["method","path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/google_ads_docs":{"post":{"operationId":"google_ads_docs","summary":"Google Ads API reference: base URL, auth model, customer scoping, and docs index.","description":"Google Ads API reference: base URL, auth model, customer scoping, and docs index. Read this before google_ads_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/google_ads_request":{"post":{"operationId":"google_ads_request","summary":"Generic Google Ads API passthrough — call ANY endpoint at googleads.googleapis.com.","description":"Generic Google Ads API passthrough — call ANY endpoint at googleads.googleapis.com. Auto-prefixes /customers/{id} unless absolute:true. POST to :search or :searchStream is treated as READ; other POST/PATCH/PUT=COMMIT, DELETE=DANGEROUS, GET=READ. COMMIT/DANGEROUS require confirm:true. Use google_ads_docs first.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"absolute":{"type":"boolean"},"confirm":{"type":"boolean"}},"required":["method","path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/google_alias_add":{"post":{"operationId":"google_alias_add","summary":"Add a Google Workspace email alias to a user (default pablo@popasite.com).","description":"Add a Google Workspace email alias to a user (default pablo@popasite.com). Use when a new domain has been added and you want a name@newdomain.com address routed to Pablo's primary mailbox. Preview unless confirm:true.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"string"},"alias":{"type":"string"},"confirm":{"type":"boolean"}},"required":["alias"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/google_alias_list":{"post":{"operationId":"google_alias_list","summary":"List Google Workspace email aliases attached to a user (default pablo@popasite.com) via the Admin Directory API.","description":"List Google Workspace email aliases attached to a user (default pablo@popasite.com) via the Admin Directory API. Use to audit which alias addresses already exist before google_alias_add.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"string"}}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/google_domain_add":{"post":{"operationId":"google_domain_add","summary":"Register a new secondary domain on the Google Workspace customer (so it can be used for aliases or send-as identities).","description":"Register a new secondary domain on the Google Workspace customer (so it can be used for aliases or send-as identities). Run this before google_alias_add for an address on a brand-new domain. Preview unless confirm:true.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"customer":{"type":"string"},"confirm":{"type":"boolean"}},"required":["domain"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/google_send_as_add":{"post":{"operationId":"google_send_as_add","summary":"Add a Gmail 'Send As' identity so the user can send messages from another address (e.g.","description":"Add a Gmail 'Send As' identity so the user can send messages from another address (e.g. an alias). Use after google_alias_add when you also want to compose mail from that alias. Preview unless confirm:true.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"string"},"send_as_email":{"type":"string"},"display_name":{"type":"string"},"treat_as_alias":{"type":"boolean"},"confirm":{"type":"boolean"}},"required":["send_as_email"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/gsc_docs":{"post":{"operationId":"gsc_docs","summary":"Google Search Console + Indexing API reference: base URLs, auth model, common paths, and docs index.","description":"Google Search Console + Indexing API reference: base URLs, auth model, common paths, and docs index. Read this before gsc_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/gsc_request":{"post":{"operationId":"gsc_request","summary":"Generic Search Console / Indexing API passthrough.","description":"Generic Search Console / Indexing API passthrough. Choose `api` ('search_console', 'inspect', or 'indexing'). GET and searchAnalytics/urlInspection POSTs=READ; other POST/PUT=COMMIT, DELETE=DANGEROUS. COMMIT/DANGEROUS require confirm:true. Use gsc_docs first.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"api":{"type":"string","enum":["search_console","inspect","indexing"]},"method":{"type":"string","enum":["GET","POST","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["method","path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/gtm_docs":{"post":{"operationId":"gtm_docs","summary":"Google Tag Manager API reference: base URL, auth model, common paths, and docs index.","description":"Google Tag Manager API reference: base URL, auth model, common paths, and docs index. Read this before gtm_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/gtm_request":{"post":{"operationId":"gtm_request","summary":"Generic GTM API passthrough — call ANY endpoint at tagmanager.googleapis.com/tagmanager/v2.","description":"Generic GTM API passthrough — call ANY endpoint at tagmanager.googleapis.com/tagmanager/v2. GET=READ, POST/PATCH/PUT=COMMIT, DELETE=DANGEROUS. COMMIT/DANGEROUS require confirm:true.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["method","path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/health_check":{"post":{"operationId":"health_check","summary":"Probe every configured external service (Dreamscape, Vercel, GitHub, Google, Stripe, Resend, Cloudflare, Neon, Notion...","description":"Probe every configured external service (Dreamscape, Vercel, GitHub, Google, Stripe, Resend, Cloudflare, Neon, Notion) and report which credentials are present and which APIs answer. Use first when something seems broken or after env var changes.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/neon_docs":{"post":{"operationId":"neon_docs","summary":"Neon API reference: base URL, auth model, common paths, and docs index.","description":"Neon API reference: base URL, auth model, common paths, and docs index. Read this before neon_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/neon_request":{"post":{"operationId":"neon_request","summary":"Generic Neon API passthrough — call ANY endpoint at console.neon.tech/api/v2.","description":"Generic Neon API passthrough — call ANY endpoint at console.neon.tech/api/v2. GET=READ, POST/PATCH/PUT=COMMIT, DELETE=DANGEROUS. COMMIT/DANGEROUS require confirm:true. Does NOT execute SQL — use neon_sql for that.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["method","path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/neon_sql":{"post":{"operationId":"neon_sql","summary":"Execute SQL against a Neon database over the SQL-over-HTTP proxy.","description":"Execute SQL against a Neon database over the SQL-over-HTTP proxy. SELECT/EXPLAIN/SHOW run immediately as READ; INSERT/UPDATE/DELETE/DDL require confirm:true. Requires project_id (find via neon_request GET /projects).\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"project_id":{"type":"string"},"query":{"type":"string"},"params":{"type":"array","items":{}},"role":{"type":"string"},"database":{"type":"string"},"confirm":{"type":"boolean"}},"required":["project_id","query"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/notion_docs":{"post":{"operationId":"notion_docs","summary":"Notion API reference: base URL, auth model, version header, common paths, and docs index.","description":"Notion API reference: base URL, auth model, version header, common paths, and docs index. Read this before notion_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/notion_request":{"post":{"operationId":"notion_request","summary":"Generic Notion API passthrough — call ANY endpoint at api.notion.com/v1.","description":"Generic Notion API passthrough — call ANY endpoint at api.notion.com/v1. /search and /databases/{id}/query POSTs are treated as READ; other POST/PATCH=COMMIT (confirm-gated); GET=READ; DELETE=DANGEROUS. Use notion_docs first.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["method","path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/openai_docs":{"post":{"operationId":"openai_docs","summary":"Return OpenAI API reference: base URL, auth model, and docs index.","description":"Return OpenAI API reference: base URL, auth model, and docs index. Read this before openai_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/openai_request":{"post":{"operationId":"openai_request","summary":"Generic OpenAI API passthrough — call ANY endpoint at api.openai.com/v1.","description":"Generic OpenAI API passthrough — call ANY endpoint at api.openai.com/v1. Most OpenAI POSTs are inference (chat, responses, embeddings, images) and are treated as READ. Other POST/PATCH/PUT=COMMIT, GET=READ, DELETE=DANGEROUS.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["method","path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/policy_get":{"post":{"operationId":"policy_get","summary":"Read the current workspace safety mode.","description":"Read the current workspace safety mode. Modes: relaxed, balanced, locked_down. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/policy_set_mode":{"post":{"operationId":"policy_set_mode","summary":"Set the workspace safety mode.","description":"Set the workspace safety mode. This controls when pabloMCP pauses an agent action and creates an approval instead of executing. Preview unless confirm:true. COMMIT.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"mode":{"type":"string","enum":["relaxed","balanced","locked_down"]},"confirm":{"type":"boolean"}},"required":["mode"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/polymarket_balance":{"post":{"operationId":"polymarket_balance","summary":"Retrieve Polymarket on-chain USDC.e balance (Polygon) plus CLOB collateral balance for the configured proxy wallet.","description":"Retrieve Polymarket on-chain USDC.e balance (Polygon) plus CLOB collateral balance for the configured proxy wallet. Use to verify funds before polymarket_order.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/polymarket_docs":{"post":{"operationId":"polymarket_docs","summary":"Return Polymarket API reference: base URLs (Gamma + CLOB), auth model, signing notes, and docs index.","description":"Return Polymarket API reference: base URLs (Gamma + CLOB), auth model, signing notes, and docs index. No generic passthrough — order placement requires EIP-712 signing handled in-process by @polymarket/clob-client. Use the curated tools for writes. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/polymarket_markets":{"post":{"operationId":"polymarket_markets","summary":"Search Polymarket events and their markets via the public Gamma API.","description":"Search Polymarket events and their markets via the public Gamma API. Use to discover token_ids (needed by polymarket_orderbook / polymarket_order). Filter with `query` (title), `tag` (e.g. tennis/politics/crypto), and `active`.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"tag":{"type":"string"},"limit":{"type":"number"},"active":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/polymarket_order":{"post":{"operationId":"polymarket_order","summary":"Place a real Polymarket CLOB limit order on Polygon.","description":"Place a real Polymarket CLOB limit order on Polygon. If TT_EXECUTOR_URL is configured, MCP relays to the TT executor (tt.pa13lo.com) so order submission happens from the working TT bridge instead of Vercel. Otherwise falls back to in-process @polymarket/clob-client signing. Spends real USDC. Defaults to GTC; FOK fills-or-kills immediately. Requires token_id, side, price (0.01-0.99), size (USDC), and confirm:true (otherwise preview). Run polymarket_order_preview first.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"token_id":{"type":"string"},"side":{"type":"string","enum":["BUY","SELL"]},"price":{"type":"number"},"size":{"type":"number"},"order_type":{"type":"string","enum":["GTC","FOK"]},"confirm":{"type":"boolean"}},"required":["token_id","side","price","size"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/polymarket_order_preview":{"post":{"operationId":"polymarket_order_preview","summary":"Preview a Polymarket CLOB limit order without placing it — returns estimated shares and the current best bid/ask for ...","description":"Preview a Polymarket CLOB limit order without placing it — returns estimated shares and the current best bid/ask for sanity-check. Use before polymarket_order. Requires token_id, side, price (0.01-0.99), size (USDC).\n\nRisk class: DRAFT — prepares data, never mutates.","tags":["DRAFT"],"x-tool-class":"DRAFT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"token_id":{"type":"string"},"side":{"type":"string","enum":["BUY","SELL"]},"price":{"type":"number"},"size":{"type":"number"}},"required":["token_id","side","price","size"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/polymarket_orderbook":{"post":{"operationId":"polymarket_orderbook","summary":"Fetch the live CLOB order book (top bids/asks, spread, midpoint) for a Polymarket outcome token.","description":"Fetch the live CLOB order book (top bids/asks, spread, midpoint) for a Polymarket outcome token. Use to check current pricing before polymarket_order_preview / polymarket_order. Requires token_id (find via polymarket_markets).\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"token_id":{"type":"string"}},"required":["token_id"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/polymarket_positions":{"post":{"operationId":"polymarket_positions","summary":"List currently open Polymarket CLOB orders for the configured wallet via L2-authenticated CLOB API.","description":"List currently open Polymarket CLOB orders for the configured wallet via L2-authenticated CLOB API. Use to inspect resting orders before placing new ones; for past fills use polymarket_trades.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/polymarket_trade_allowed":{"post":{"operationId":"polymarket_trade_allowed","summary":"Check whether the configured Polymarket execution path is reachable before placing orders.","description":"Check whether the configured Polymarket execution path is reachable before placing orders. If TT_EXECUTOR_URL is configured, checks the TT executor bridge health; otherwise checks local MCP CLOB client setup. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/polymarket_trades":{"post":{"operationId":"polymarket_trades","summary":"List recent Polymarket trade fills for the wallet via the authenticated CLOB API.","description":"List recent Polymarket trade fills for the wallet via the authenticated CLOB API. Use for fill history / P&L; for resting orders use polymarket_positions.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"number"}}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/resend_docs":{"post":{"operationId":"resend_docs","summary":"Return Resend API reference: base URL, auth model, and docs index.","description":"Return Resend API reference: base URL, auth model, and docs index. Read this before resend_request to discover what's possible. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/resend_request":{"post":{"operationId":"resend_request","summary":"Generic Resend API passthrough — call ANY endpoint at api.resend.com.","description":"Generic Resend API passthrough — call ANY endpoint at api.resend.com. GET=READ, POST/PATCH/PUT=COMMIT, DELETE=DANGEROUS. COMMIT/DANGEROUS require confirm:true.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["method","path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/resend_send":{"post":{"operationId":"resend_send","summary":"Send a transactional email via Resend (api.resend.com).","description":"Send a transactional email via Resend (api.resend.com). Use for outbound notifications/receipts; the `from` address must be on a verified Resend domain. Requires to, subject, and at least one of text/html. Preview unless confirm:true.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"to":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"subject":{"type":"string"},"text":{"type":"string"},"html":{"type":"string"},"from":{"type":"string"},"cc":{"type":"array","items":{"type":"string"}},"bcc":{"type":"array","items":{"type":"string"}},"reply_to":{"type":"string"},"confirm":{"type":"boolean"}},"required":["to","subject"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/scaffold_project":{"post":{"operationId":"scaffold_project","summary":"Bootstrap a new project end-to-end in one call: creates a private GitHub repo, optionally adds a Vercel-managed DNS A...","description":"Bootstrap a new project end-to-end in one call: creates a private GitHub repo, optionally adds a Vercel-managed DNS A record for the domain, and optionally adds a Google email alias to pablo@popasite.com. Use when starting a brand-new site/app. Preview unless confirm:true.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"domain":{"type":"string"},"email_alias":{"type":"string"},"org":{"type":"string"},"confirm":{"type":"boolean"}},"required":["name"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/secrets_get":{"post":{"operationId":"secrets_get","summary":"Return the value of an operator-level env var (e.g.","description":"Return the value of an operator-level env var (e.g. ELEVENLABS_API_KEY) from pablo-mcp's process env. Operator-only over HTTP; paired workspaces should use vault_get. Every fetch is audit-logged.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/secrets_list":{"post":{"operationId":"secrets_list","summary":"List the names of env vars set on pablo-mcp's process (values NOT returned).","description":"List the names of env vars set on pablo-mcp's process (values NOT returned). Operator-only over HTTP — paired workspaces should use vault_list for their own secrets. Stdio bypasses. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/stripe_docs":{"post":{"operationId":"stripe_docs","summary":"Stripe REST API reference: base URL, auth model, request body format, common paths, and docs index.","description":"Stripe REST API reference: base URL, auth model, request body format, common paths, and docs index. Read this before stripe_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/stripe_refund":{"post":{"operationId":"stripe_refund","summary":"Refund a Stripe charge or PaymentIntent (full by default, partial if `amount` is given).","description":"Refund a Stripe charge or PaymentIntent (full by default, partial if `amount` is given). Accepts both ch_… and pi_… IDs. Preview unless confirm:true — actual refund moves real money.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"charge":{"type":"string"},"amount":{"type":"number"},"reason":{"type":"string","enum":["duplicate","fraudulent","requested_by_customer"]},"confirm":{"type":"boolean"}},"required":["charge"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/stripe_request":{"post":{"operationId":"stripe_request","summary":"Generic Stripe REST passthrough — call ANY endpoint at api.stripe.com/v1.","description":"Generic Stripe REST passthrough — call ANY endpoint at api.stripe.com/v1. GET=READ, POST/PUT=COMMIT (confirm-gated), DELETE=DANGEROUS (confirm-gated). Use stripe_docs first. For refunds prefer stripe_refund (handles ch_/pi_ IDs + confirm gating).\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PUT","DELETE"]},"path":{"type":"string"},"form":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/supabase_docs":{"post":{"operationId":"supabase_docs","summary":"Supabase Management API reference: base URL, auth model, common paths, and docs index.","description":"Supabase Management API reference: base URL, auth model, common paths, and docs index. Read this before supabase_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/supabase_request":{"post":{"operationId":"supabase_request","summary":"Generic Supabase Management API passthrough — call ANY endpoint at api.supabase.com/v1.","description":"Generic Supabase Management API passthrough — call ANY endpoint at api.supabase.com/v1. GET=READ, POST/PATCH/PUT=COMMIT, DELETE=DANGEROUS. COMMIT/DANGEROUS require confirm:true. For SQL prefer supabase_sql which auto-detects read vs write.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["method","path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/supabase_sql":{"post":{"operationId":"supabase_sql","summary":"Execute a SQL query against a Supabase project's Postgres via the Management API.","description":"Execute a SQL query against a Supabase project's Postgres via the Management API. SELECT/EXPLAIN/SHOW run immediately as READ; INSERT/UPDATE/DELETE/DDL require confirm:true. Requires project_ref (find via supabase_request GET /projects).\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"project_ref":{"type":"string"},"query":{"type":"string"},"confirm":{"type":"boolean"}},"required":["project_ref","query"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/telegram_docs":{"post":{"operationId":"telegram_docs","summary":"Return Telegram Bot API reference: base URL, auth model, key methods, and the official method index.","description":"Return Telegram Bot API reference: base URL, auth model, key methods, and the official method index. Read this before telegram_request to discover what's possible. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/telegram_get_me":{"post":{"operationId":"telegram_get_me","summary":"Verify the configured Telegram bot token is valid — returns the bot's id, username, and capabilities.","description":"Verify the configured Telegram bot token is valid — returns the bot's id, username, and capabilities. Use as a health probe. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/telegram_request":{"post":{"operationId":"telegram_request","summary":"Generic Telegram Bot API passthrough — call ANY Bot API method.","description":"Generic Telegram Bot API passthrough — call ANY Bot API method. Method name (e.g. 'sendPhoto', 'editMessageText') goes in `method`; payload in `body`. All Bot API methods are POST to the bot URL — class is COMMIT (confirm-gated) for everything except a hardcoded list of read-only methods.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string"},"body":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["method"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/telegram_send_message":{"post":{"operationId":"telegram_send_message","summary":"Send a Telegram message via the configured bot.","description":"Send a Telegram message via the configured bot. Defaults to TELEGRAM_PABLO_CHAT_ID for the recipient — use this for proactive notifications/alerts to Pablo. Pass `chat_id` to target a different chat. Supports `parse_mode='MarkdownV2'|'HTML'`. Preview unless confirm:true. COMMIT.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string"},"chat_id":{"type":"string"},"parse_mode":{"type":"string","enum":["MarkdownV2","HTML"]},"disable_notification":{"type":"boolean"},"confirm":{"type":"boolean"}},"required":["text"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/twilio_docs":{"post":{"operationId":"twilio_docs","summary":"Twilio REST API reference: base URL, auth pattern, key endpoint paths and their doc URLs.","description":"Twilio REST API reference: base URL, auth pattern, key endpoint paths and their doc URLs. Read this before twilio_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/twilio_request":{"post":{"operationId":"twilio_request","summary":"Generic Twilio REST passthrough — call ANY Twilio API endpoint under /2010-04-01/Accounts/{Sid}/.","description":"Generic Twilio REST passthrough — call ANY Twilio API endpoint under /2010-04-01/Accounts/{Sid}/. Path is relative; AccountSid is auto-injected. GET = READ; POST/PATCH/PUT = COMMIT (confirm-gated); DELETE = DANGEROUS (confirm-gated). Use twilio_docs first to find the right path.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"form":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/vapi_docs":{"post":{"operationId":"vapi_docs","summary":"Vapi REST API reference: base URL, auth pattern, key endpoint paths and doc URLs.","description":"Vapi REST API reference: base URL, auth pattern, key endpoint paths and doc URLs. Read this before vapi_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/vapi_request":{"post":{"operationId":"vapi_request","summary":"Generic Vapi REST passthrough — call ANY Vapi API endpoint.","description":"Generic Vapi REST passthrough — call ANY Vapi API endpoint. GET = READ; POST/PATCH/PUT = COMMIT (confirm-gated); DELETE = DANGEROUS (confirm-gated). Use vapi_docs first to find the right path.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/vault_delete":{"post":{"operationId":"vault_delete","summary":"Delete a project-scoped secret from the vault by (project, name).","description":"Delete a project-scoped secret from the vault by (project, name). Irreversible — there is no undo, and consumers reading via vault_get or getKey() will start failing immediately. Always preview first; only pass confirm:true after the user explicitly approves. DANGEROUS.\n\nRisk class: DANGEROUS — irreversible; requires confirm:true and may need human approval. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["DANGEROUS"],"x-tool-class":"DANGEROUS","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string"},"name":{"type":"string"},"confirm":{"type":"boolean"}},"required":["project","name"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/vault_get":{"post":{"operationId":"vault_get","summary":"Fetch a single project-scoped secret from the vault by (project, name) and return its decrypted value.","description":"Fetch a single project-scoped secret from the vault by (project, name) and return its decrypted value. Use this when you need an API key for any project — pass project='ecostore' (or whatever namespace), name='NETSUITE_API_KEY' style. Every fetch is audit-logged. Discover available secrets with vault_list. Add new ones with vault_set. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string"},"name":{"type":"string"}},"required":["project","name"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/vault_list":{"post":{"operationId":"vault_list","summary":"List secrets stored in the vault.","description":"List secrets stored in the vault. Pass `project` to scope to one namespace (e.g. 'ecostore'), or omit to see every project. Returns {project, name, updated_at} tuples — values are NEVER returned (use vault_get for that). Call this first when you don't know what key names exist for a project. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string"}}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/vault_set":{"post":{"operationId":"vault_set","summary":"Store or update a project-scoped API key/credential in the encrypted vault.","description":"Store or update a project-scoped API key/credential in the encrypted vault. `project` is a free-form namespace (e.g. 'ecostore', 'duel', 'pablo-mcp'); `name` is the secret key (uppercase env-style, e.g. 'NETSUITE_API_KEY'). Values are AES-256-GCM encrypted at rest in Neon. Use this whenever a user asks to add/update a key for any project — no Vercel dashboard needed. Retrieve with vault_get, list with vault_list, remove with vault_delete. Preview unless confirm:true. COMMIT.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"project":{"type":"string"},"name":{"type":"string"},"value":{"type":"string"},"confirm":{"type":"boolean"}},"required":["project","name","value"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/vercel_docs":{"post":{"operationId":"vercel_docs","summary":"Vercel API reference: base URL, auth model, team scoping rules, common paths, and the official docs index.","description":"Vercel API reference: base URL, auth model, team scoping rules, common paths, and the official docs index. Read this before vercel_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/vercel_request":{"post":{"operationId":"vercel_request","summary":"Generic Vercel API passthrough — call ANY endpoint at api.vercel.com.","description":"Generic Vercel API passthrough — call ANY endpoint at api.vercel.com. teamId is auto-injected from VERCEL_TEAM_ID. GET=READ, POST/PATCH/PUT=COMMIT, DELETE=DANGEROUS. COMMIT/DANGEROUS require confirm:true. Use vercel_docs first.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["method","path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/workspace_status":{"post":{"operationId":"workspace_status","summary":"Inspect the current pabloMCP workspace and caller context.","description":"Inspect the current pabloMCP workspace and caller context. This is the agent-accessible starting point for onboarding and diagnostics. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/xai_docs":{"post":{"operationId":"xai_docs","summary":"Return xAI (Grok) API reference: base URL, auth model, and docs index.","description":"Return xAI (Grok) API reference: base URL, auth model, and docs index. The REST surface is OpenAI-compatible. Read this before xai_request. READ.\n\nRisk class: READ — no side effects; runs immediately.","tags":["READ"],"x-tool-class":"READ","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/tools/xai_request":{"post":{"operationId":"xai_request","summary":"Generic xAI API passthrough — call ANY endpoint at api.x.ai/v1.","description":"Generic xAI API passthrough — call ANY endpoint at api.x.ai/v1. POST inference (chat/completions, completions, embeddings, images) is treated as READ. Other POST/PATCH/PUT=COMMIT, GET=READ, DELETE=DANGEROUS.\n\nRisk class: COMMIT — writes; returns a preview unless confirm:true is passed. Call once without confirm to receive a preview, show it to the human, then call again with confirm:true.","tags":["COMMIT"],"x-tool-class":"COMMIT","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PATCH","PUT","DELETE"]},"path":{"type":"string"},"body":{"type":"object","additionalProperties":true},"query":{"type":"object","additionalProperties":true},"confirm":{"type":"boolean"}},"required":["method","path"]}}}},"responses":{"200":{"description":"Tool executed (or returned a preview / approval request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"400":{"description":"Structured error: unknown tool, invalid arguments, unauthorized (pair first), TOTP session expired, or handler failure. Inspect error.code and error.error for the resolution hint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResult"}}}},"401":{"description":"Bearer token present but not recognised. Revoked or mistyped key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded (per-caller, one-minute window). Honor Retry-After; every response carries RateLimit-Limit / RateLimit-Remaining / RateLimit-Reset headers so you can pace ahead of time.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Auth backend unavailable — retry later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Named per-agent key (pmcp_*) obtained via the pairing flow (auth_pairing_start → human email + TOTP confirm → auth_pairing_complete). Self-serve and free; revocable from the dashboard."}},"schemas":{"ToolClass":{"type":"string","enum":["READ","DRAFT","COMMIT","DANGEROUS"],"description":"Risk class of a tool."},"ToolResult":{"type":"object","description":"Envelope returned by every tool call. Exactly one of data (executed), preview (confirm needed), approval_required (human approval pending), or error is meaningful.","properties":{"tool_class":{"$ref":"#/components/schemas/ToolClass"},"executed":{"type":"boolean"},"data":{"description":"Tool output when executed."},"preview":{"description":"What would happen — re-call with confirm:true to execute."},"approval_required":{"type":"object","description":"Present when the workspace safety mode requires human approval. Show summary to the human and call approval_respond.","properties":{"approval_id":{"type":"string"},"summary":{"type":"string"},"tool":{"type":"string"},"status":{"const":"pending"},"expires_at":{"type":"string"}}},"error":{"$ref":"#/components/schemas/ApiError"}},"required":["tool_class","executed"]},"ApiError":{"type":"object","description":"Structured error. code is machine-readable; error is the human/agent-readable resolution hint.","properties":{"error":{"type":"string"},"code":{"type":"string"},"details":{}},"required":["error","code"]}}}}