{"openapi":"3.1.0","info":{"title":"Stunt Double public API","version":"1.3.1","summary":"Public, unauthenticated endpoints on stuntdouble.io, plus the MCP server entry point.","description":"Stunt Double sends AI users (actors) through real products and returns evidence-backed results: checklist runs, user interviews and feedback. Programmatic control of a workspace is through the Model Context Protocol server (`mcpJsonRpc`), which uses OAuth 2.1. The other operations here are public, read-only discovery endpoints. Errors from `/api/*` on this host use the `Error` schema.\n\n**Versioning.** `info.version` follows semantic versioning. A breaking change to an operation here ships under a new path or a new header value alongside the old one, never in place. The MCP server is versioned by the protocol: send the `MCP-Protocol-Version` header with the version negotiated at `initialize`.\n\n**Deprecation.** A deprecated operation is marked `deprecated: true` in this spec, its responses carry a `Deprecation` header (RFC 9745) and a `Sunset` header (RFC 8594) with the removal date, and the change is announced in the changelog (https://www.stuntdouble.io/changelog) at least 90 days before removal.\n\n**Rate limits.** Uncached endpoints on this host return `RateLimit` and `RateLimit-Policy` headers (IETF draft-ietf-httpapi-ratelimit-headers) on every response, and `Retry-After` with a 429 when the quota is spent.","contact":{"name":"Stunt Double support","email":"support@stuntdouble.io","url":"https://www.stuntdouble.io/support"},"termsOfService":"https://www.stuntdouble.io/terms"},"externalDocs":{"description":"Stunt Double API overview","url":"https://www.stuntdouble.io/support/docs/api"},"servers":[{"url":"https://www.stuntdouble.io","description":"Marketing site and discovery"}],"tags":[{"name":"discovery","description":"Machine-readable descriptions of Stunt Double for agents."},{"name":"mcp","description":"The Model Context Protocol servers: the product server that controls a workspace (OAuth), and the public docs server (no sign-in)."},{"name":"a2a","description":"The public docs agent, over the A2A protocol."},{"name":"auth","description":"OAuth 2.1 discovery."},{"name":"status","description":"Service health."},{"name":"desktop","description":"The macOS desktop app."}],"paths":{"/":{"get":{"operationId":"getHomepage","tags":["discovery"],"summary":"Homepage, as HTML or Markdown","description":"Content-negotiated on `Accept`. Send `Accept: text/markdown` for a Markdown rendition of the homepage; anything else gets HTML. Responses carry `Vary: Accept`.","parameters":[{"name":"Accept","in":"header","required":false,"description":"Use `text/markdown` to request Markdown.","schema":{"type":"string","examples":["text/markdown","text/html"]}}],"responses":{"200":{"description":"The homepage.","headers":{"Vary":{"schema":{"type":"string"},"description":"Includes `Accept`."}},"content":{"text/markdown":{"schema":{"type":"string"}},"text/html":{"schema":{"type":"string"}}}}}}},"/index.md":{"get":{"operationId":"getHomepageMarkdown","tags":["discovery"],"summary":"Homepage as Markdown","description":"The Markdown rendition of the homepage at a stable URL, whatever `Accept` says.","responses":{"200":{"description":"Homepage Markdown.","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/llms.txt":{"get":{"operationId":"getLlmsTxt","tags":["discovery"],"summary":"llms.txt site summary","description":"A Markdown summary of Stunt Double for language models (https://llmstxt.org), including when an agent should use it and how to connect.","responses":{"200":{"description":"The llms.txt file.","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/.well-known/mcp.json":{"get":{"operationId":"getMcpManifest","tags":["discovery","mcp"],"summary":"MCP server manifest","description":"Describes the MCP server: its Streamable HTTP endpoint, OAuth endpoints, capabilities and tools. Also served at `/.well-known/mcp`.","responses":{"200":{"description":"The manifest.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpManifest"}}}}}}},"/mcp":{"get":{"operationId":"getMcpDiscovery","tags":["discovery","mcp"],"summary":"Where the MCP server lives","description":"MCP clients sometimes probe this host. A GET describes the canonical endpoint; a POST is redirected there with 308, which preserves the method and body.","responses":{"200":{"description":"Discovery information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpDiscovery"}}}}}}},"/api/health":{"get":{"operationId":"getHealth","tags":["status"],"summary":"Health check","description":"Reports that the marketing site is serving. Service status for the product is at https://status.stuntdouble.io.","responses":{"200":{"description":"Healthy.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/desktop/latest":{"get":{"operationId":"getLatestDesktopRelease","tags":["desktop"],"summary":"Latest macOS desktop release","description":"Version and download location of the newest Stunt Double desktop app release.","responses":{"200":{"description":"The latest release.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesktopRelease"}}}},"404":{"description":"No release is published.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageError"}}}},"500":{"description":"The release lookup failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageError"}}}}}}},"/api/desktop/download":{"get":{"operationId":"downloadDesktopApp","tags":["desktop"],"summary":"Download the macOS desktop app","description":"Redirects to the latest `.dmg`, or to the GitHub releases page when none is available.","responses":{"302":{"description":"Redirect to the download.","headers":{"Location":{"schema":{"type":"string","format":"uri"}}}},"307":{"description":"Redirect to the GitHub releases page.","headers":{"Location":{"schema":{"type":"string","format":"uri"}}}}}}},"/api/{path}":{"get":{"operationId":"unknownApiPath","tags":["discovery"],"summary":"Any other /api path","description":"Documents the error returned for an `/api/*` path that does not exist, on every HTTP method.","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string"},"description":"Any unmatched path."}],"responses":{"404":{"description":"No endpoint exists at this path.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/.well-known/mcp":{"post":{"operationId":"docsMcpHandshake","tags":["mcp"],"summary":"Handshake with the public docs MCP server","description":"A POST to the well-known URL reaches the public docs MCP server, the same server as `/api/docs-mcp`. A GET on this URL returns the manifest (`getMcpManifest`).","security":[],"parameters":[{"$ref":"#/components/parameters/McpProtocolVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"The JSON-RPC response.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"202":{"description":"A notification (such as `notifications/initialized`) was accepted.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}}},"400":{"description":"The body is not a single JSON-RPC message, or `MCP-Protocol-Version` names an unsupported version.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/docs-mcp":{"post":{"operationId":"docsMcpJsonRpc","tags":["mcp"],"summary":"Call the public docs MCP server","description":"A read-only MCP server (Streamable HTTP, stateless, JSON responses) that needs no sign-in. It advertises the `resources` capability: `resources/list` names llms.txt, the homepage as Markdown, this OpenAPI spec and the MCP manifest, and `resources/read` returns each one. It has no tools; to act on a workspace, use `mcpJsonRpc`.","security":[],"parameters":[{"$ref":"#/components/parameters/McpProtocolVersion"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"The JSON-RPC response.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"202":{"description":"A notification (such as `notifications/initialized`) was accepted.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}}},"400":{"description":"The body is not a single JSON-RPC message, or `MCP-Protocol-Version` names an unsupported version.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/.well-known/oauth-authorization-server":{"get":{"operationId":"getOAuthAuthorizationServerMetadata","tags":["auth","discovery"],"summary":"OAuth authorization server metadata","description":"The issuer's RFC 8414 metadata, served on this host as well as the issuer's own. This host is not an OAuth issuer: the document is `https://app.stuntdouble.io`'s, and its `issuer` names that origin. It lists the authorization, token and registration endpoints, PKCE support and `scopes_supported`.","responses":{"200":{"description":"The authorization server metadata.","content":{"application/json":{"schema":{"type":"object","required":["issuer","authorization_endpoint","token_endpoint","response_types_supported"],"properties":{"issuer":{"type":"string","format":"uri"},"authorization_endpoint":{"type":"string","format":"uri"},"token_endpoint":{"type":"string","format":"uri"},"registration_endpoint":{"type":"string","format":"uri"},"response_types_supported":{"type":"array","items":{"type":"string"}},"grant_types_supported":{"type":"array","items":{"type":"string"}},"code_challenge_methods_supported":{"type":"array","items":{"type":"string"}},"scopes_supported":{"type":"array","items":{"type":"string"}},"token_endpoint_auth_methods_supported":{"type":"array","items":{"type":"string"}}}}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"operationId":"getOAuthProtectedResourceMetadata","tags":["auth","discovery"],"summary":"OAuth protected resource metadata","description":"The RFC 9728 metadata for the protected resource, the MCP server on `https://app.stuntdouble.io`, served on this host as well. It names the resource, its authorization server, `scopes_supported` and `bearer_methods_supported`.","responses":{"200":{"description":"The protected resource metadata.","content":{"application/json":{"schema":{"type":"object","required":["resource","authorization_servers"],"properties":{"resource":{"type":"string","format":"uri"},"authorization_servers":{"type":"array","items":{"type":"string","format":"uri"}},"scopes_supported":{"type":"array","items":{"type":"string"}},"bearer_methods_supported":{"type":"array","items":{"type":"string"}}}}}}}}}},"/.well-known/mcp/server-card.json":{"get":{"operationId":"getMcpServerCard","tags":["discovery"],"summary":"MCP server card for the public docs server","description":"The MCP server card (server-card.schema.json) for the server this host serves: the public docs MCP server, with its Streamable HTTP remote and supported protocol versions. The product server, which needs OAuth, has its own card on its own host; both are listed by `getAiCatalog`.","responses":{"200":{"description":"The server card.","content":{"application/json":{"schema":{"type":"object","required":["name","version","remotes"],"properties":{"$schema":{"type":"string","format":"uri"},"name":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"version":{"type":"string"},"websiteUrl":{"type":"string","format":"uri"},"remotes":{"type":"array","items":{"type":"object","required":["type","url"],"properties":{"type":{"type":"string","enum":["streamable-http"]},"url":{"type":"string","format":"uri"},"supportedProtocolVersions":{"type":"array","items":{"type":"string"}}}}}}}}}}}}},"/.well-known/ai-catalog.json":{"get":{"operationId":"getAiCatalog","tags":["discovery"],"summary":"AI Catalog of MCP servers","description":"The domain-level entry point for MCP discovery: one entry for each Stunt Double MCP server (the product server and the public docs server), each pointing at the server card on the host that serves it.","responses":{"200":{"description":"The catalog.","content":{"application/json":{"schema":{"type":"object","required":["specVersion","entries"],"properties":{"specVersion":{"type":"string"},"entries":{"type":"array","items":{"type":"object","required":["identifier","type","url"],"properties":{"identifier":{"type":"string"},"type":{"type":"string"},"url":{"type":"string","format":"uri"}}}}}}}}}}}},"/auth.md":{"get":{"operationId":"getAuthMd","tags":["auth","discovery"],"summary":"How an agent authenticates","description":"One Markdown document covering who can get a credential, dynamic client registration, the PKCE authorization code flow, scopes and how to send the bearer token.","responses":{"200":{"description":"The document.","content":{"text/markdown":{"schema":{"type":"string"}}}}}}},"/.well-known/api-catalog":{"get":{"operationId":"getApiCatalog","tags":["discovery"],"summary":"API catalog","description":"An RFC 9727 linkset naming each API (the product MCP server, the public docs MCP server and the docs agent) with its description, documentation and health check. The homepage links it with `rel=\"api-catalog\"`.","responses":{"200":{"description":"The catalog.","content":{"application/linkset+json":{"schema":{"type":"object","required":["linkset"],"properties":{"linkset":{"type":"array","items":{"type":"object"}}}}}}}}}},"/.well-known/agent-skills/index.json":{"get":{"operationId":"getAgentSkillsIndex","tags":["discovery"],"summary":"Agent Skills index","description":"The Agent Skills discovery index (v0.2.0): each published skill with its `SKILL.md` URL and the SHA-256 digest of those bytes.","responses":{"200":{"description":"The index.","content":{"application/json":{"schema":{"type":"object","required":["$schema","skills"],"properties":{"$schema":{"type":"string","format":"uri"},"skills":{"type":"array","items":{"type":"object"}}}}}}}}}},"/.well-known/agent-card.json":{"get":{"operationId":"getAgentCard","tags":["discovery","a2a"],"summary":"A2A Agent Card","description":"Describes the public docs agent (`a2aJsonRpc`): its interfaces, capabilities and skills.","responses":{"200":{"description":"The Agent Card.","content":{"application/json":{"schema":{"type":"object","required":["name","description","version","supportedInterfaces","skills"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"version":{"type":"string"},"provider":{"type":"object","properties":{"organization":{"type":"string"},"url":{"type":"string","format":"uri"}}},"supportedInterfaces":{"type":"array","items":{"type":"object","required":["url","protocolBinding"],"properties":{"url":{"type":"string","format":"uri"},"protocolBinding":{"type":"string"},"protocolVersion":{"type":"string"}}}},"url":{"type":"string","format":"uri"},"preferredTransport":{"type":"string"},"protocolVersion":{"type":"string"},"documentationUrl":{"type":"string","format":"uri"},"iconUrl":{"type":"string","format":"uri"},"capabilities":{"type":"object","properties":{"streaming":{"type":"boolean"},"pushNotifications":{"type":"boolean"},"extendedAgentCard":{"type":"boolean"}}},"defaultInputModes":{"type":"array","items":{"type":"string"}},"defaultOutputModes":{"type":"array","items":{"type":"string"}},"skills":{"type":"array","items":{"type":"object","required":["id","name","description"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"examples":{"type":"array","items":{"type":"string"}}}}}}}}}}}}},"/api/a2a":{"post":{"operationId":"a2aJsonRpc","tags":["a2a"],"summary":"Ask the public docs agent","description":"A stateless A2A server (JSON-RPC binding) that needs no sign-in. `SendMessage` (A2A 1.0) and `message/send` (0.3) take a text message and reply with a Markdown message about Stunt Double: what it is, how to connect an agent, getting started, and where the docs are. It never creates tasks and cannot act on a workspace; to do that, use `mcpJsonRpc`.","security":[],"parameters":[{"name":"A2A-Version","in":"header","required":false,"schema":{"type":"string","enum":["1.0","0.3"]},"description":"The A2A protocol version. Absent means 0.3."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"The JSON-RPC response: a Message, or an A2A error such as `-32001` (task not found) or `-32009` (version not supported).","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"400":{"description":"The body is not a JSON-RPC 2.0 request.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/mcp":{"servers":[{"url":"https://app.stuntdouble.io","description":"Stunt Double product app"}],"post":{"operationId":"mcpJsonRpc","tags":["mcp"],"summary":"Call the MCP server","description":"The Model Context Protocol server (Streamable HTTP transport). Send a JSON-RPC 2.0 request such as `initialize`, `tools/list` or `tools/call`. Requires an OAuth 2.1 bearer token carrying at least one of `mcp:read`, `mcp:write` or `mcp:run`; `tools/list` returns only the tools those scopes cover. Unauthenticated requests get 401 with a `WWW-Authenticate` header pointing at the protected resource metadata, which MCP clients use to start the OAuth flow.","security":[{"oauth2":["mcp:read"]},{"oauth2":["mcp:write"]},{"oauth2":["mcp:run"]}],"parameters":[{"$ref":"#/components/parameters/McpProtocolVersion"},{"name":"Mcp-Session-Id","in":"header","required":false,"description":"Session id returned by `initialize`.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"A JSON-RPC response, as JSON or as a server-sent event stream.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}},"text/event-stream":{"schema":{"type":"string"}}}},"401":{"description":"Missing or invalid bearer token.","headers":{"WWW-Authenticate":{"schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}}}}}},"components":{"securitySchemes":{"oauth2":{"type":"oauth2","description":"OAuth 2.1 with PKCE and dynamic client registration. MCP clients discover these endpoints automatically from https://app.stuntdouble.io/.well-known/oauth-authorization-server. Request only the scopes the client needs; a client that requests none is granted all of them.","flows":{"authorizationCode":{"authorizationUrl":"https://app.stuntdouble.io/oauth/authorize","tokenUrl":"https://app.stuntdouble.io/oauth/token","scopes":{"mcp:read":"Read workspaces and their contents: members, projects, actors, checklists, interviews, workflows, feedback, run results and Stunt Double Index reports.","mcp:write":"Create and edit projects, actors, actor knowledge, guidelines, checklists, interviews, workflows and feedback statuses.","mcp:run":"Start checklist runs, workflow runs, interviews and Stunt Double Index re-runs for domains you own. Checklist, workflow and interview runs consume the workspace run allowance."}}}}},"parameters":{"McpProtocolVersion":{"name":"MCP-Protocol-Version","in":"header","required":false,"description":"The MCP protocol version negotiated at `initialize`, sent on every later request. Omitted, the server assumes `2025-03-26`. An unsupported value is a 400.","schema":{"type":"string","enum":["2025-11-25","2025-06-18","2025-03-26","2024-11-05"]}}},"headers":{"RateLimit":{"description":"Remaining quota and seconds until it resets, e.g. `\"public-api\";r=119;t=60`.","schema":{"type":"string"}},"RateLimitPolicy":{"description":"The quota policy, e.g. `\"public-api\";q=120;w=60`: 120 requests per 60 seconds per client.","schema":{"type":"string"}},"RetryAfter":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}},"Deprecation":{"description":"RFC 9745: present on a deprecated operation, as the date it was deprecated. None is deprecated today.","schema":{"type":"string"}},"Sunset":{"description":"RFC 8594: present on a deprecated operation, as the date it will be removed.","schema":{"type":"string"}}},"responses":{"RateLimited":{"description":"Too many requests from this client. Wait for `Retry-After` seconds.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","status","message","hint","documentation_url"],"properties":{"code":{"type":"string","description":"Stable, machine-readable error code.","enum":["not_found","rate_limited"]},"status":{"type":"integer","description":"The HTTP status code."},"message":{"type":"string","description":"What went wrong."},"hint":{"type":"string","description":"How to resolve it."},"documentation_url":{"type":"string","format":"uri"}}}}},"OAuthError":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"RFC 6750 error code.","examples":["invalid_token"]},"error_description":{"type":"string"}}},"MessageError":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"What went wrong."}}},"Health":{"type":"object","required":["service","status","timestamp"],"properties":{"service":{"type":"string","const":"marketing-website"},"status":{"type":"string","const":"ok"},"timestamp":{"type":"string","format":"date-time"}}},"DesktopRelease":{"type":"object","required":["version","downloadUrl","releasedAt","available"],"properties":{"version":{"type":"string","examples":["1.4.0"]},"downloadUrl":{"type":"string","description":"Path of the download redirect."},"releasedAt":{"type":"string","format":"date-time"},"available":{"type":"boolean","description":"Whether a `.dmg` is attached to the release."}}},"McpDiscovery":{"type":"object","required":["name","endpoint","transport"],"properties":{"name":{"type":"string"},"display_name":{"type":"string"},"description":{"type":"string"},"endpoint":{"type":"string","format":"uri"},"transport":{"type":"string","const":"streamable-http"},"documentation_url":{"type":"string","format":"uri"},"manifest_url":{"type":"string","format":"uri"}}},"McpManifest":{"type":"object","required":["name","transports"],"properties":{"schema_version":{"type":"string"},"name":{"type":"string"},"display_name":{"type":"string"},"description":{"type":"string"},"documentation_url":{"type":"string","format":"uri"},"transports":{"type":"array","items":{"type":"object","required":["type","url"],"properties":{"type":{"type":"string"},"url":{"type":"string","format":"uri"}}}},"capabilities":{"type":"object","additionalProperties":{"type":"boolean"}},"tools":{"type":"array","items":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"category":{"type":"string"}}}}}},"JsonRpcRequest":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["string","integer"]},"method":{"type":"string","examples":["initialize","tools/list","tools/call"]},"params":{"type":"object"}}},"JsonRpcResponse":{"type":"object","required":["jsonrpc"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["string","integer","null"]},"result":{},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"},"data":{}}}}}}}}