{"openapi":"3.1.0","info":{"title":"Turbine public documents and MCP discovery API","version":"1.0.0","description":"Turbine connects a user’s calendar, inbox and backlog to their agents through MCP. Public document GETs and OAuth protected-resource metadata were verified without credentials on 2026-10-15. Only those public documents need no sign-in. MCP access is invite-gated and requires OAuth through the user’s Turbine account. Standard protocol envelopes below are not observed authenticated exchanges. Tool names, inputs and results are not verified or enumerated here. Use an MCP client and the setup guide for authenticated capability discovery. This is not a REST API for user data."},"servers":[{"url":"https://api.turbine.so","description":"Turbine production MCP host"}],"externalDocs":{"description":"Turbine agent setup guide","url":"https://app.turbine.so/agents/setup.md"},"paths":{"/llms.txt":{"servers":[{"url":"https://turbine.so","description":"Public marketing website and documentation, not the MCP host"}],"get":{"operationId":"getTurbineAgentGuide","summary":"Read the Turbine agent guide","description":"Read the Turbine agent guide. An unauthenticated GET returned HTTP 200 on 2026-10-15. This read-only document contains no private user data and does not grant MCP access. Accept: text/markdown does not change this document’s content type.","security":[],"parameters":[],"responses":{"200":{"description":"Public document. No authentication required for this GET.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DocumentText"}}}},"401":{"$ref":"#/components/responses/UnverifiedUnauthorized"},"403":{"$ref":"#/components/responses/UnverifiedForbidden"},"404":{"$ref":"#/components/responses/UnverifiedNotFound"}}}},"/.well-known/mcp/server-card.json":{"servers":[{"url":"https://turbine.so","description":"Public marketing website and documentation, not the MCP host"}],"get":{"operationId":"getTurbineMcpCard","summary":"Read the Turbine MCP server card","description":"Read the Turbine MCP server card. An unauthenticated GET returned HTTP 200 on 2026-10-15. This read-only document contains no private user data and does not grant MCP access. Accept: text/markdown does not change this document’s content type.","security":[],"parameters":[],"responses":{"200":{"description":"Public document. No authentication required for this GET.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerCard"}}}},"401":{"$ref":"#/components/responses/UnverifiedUnauthorized"},"403":{"$ref":"#/components/responses/UnverifiedForbidden"},"404":{"$ref":"#/components/responses/UnverifiedNotFound"}}}},"/mcp/server-card":{"servers":[{"url":"https://turbine.so","description":"Public marketing website and documentation, not the MCP host"}],"get":{"operationId":"getTurbineMcpCardAlias","summary":"Read the canonical Turbine MCP server card","description":"Read the canonical Turbine MCP server card. An unauthenticated GET returned HTTP 200 on 2026-10-15. This read-only document contains no private user data and does not grant MCP access. Accept: text/markdown does not change this document’s content type.","security":[],"parameters":[],"responses":{"200":{"description":"Public document. No authentication required for this GET.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerCard"}}}},"401":{"$ref":"#/components/responses/UnverifiedUnauthorized"},"403":{"$ref":"#/components/responses/UnverifiedForbidden"},"404":{"$ref":"#/components/responses/UnverifiedNotFound"}}}},"/.well-known/ai-catalog.json":{"servers":[{"url":"https://turbine.so","description":"Public marketing website and documentation, not the MCP host"}],"get":{"operationId":"getTurbineAiCatalog","summary":"Read the Turbine AI resource catalog","description":"Read the Turbine AI resource catalog. An unauthenticated GET returned HTTP 200 on 2026-10-15. This read-only document contains no private user data and does not grant MCP access. Accept: text/markdown does not change this document’s content type.","security":[],"parameters":[],"responses":{"200":{"description":"Public document. No authentication required for this GET.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiCatalog"}}}},"401":{"$ref":"#/components/responses/UnverifiedUnauthorized"},"403":{"$ref":"#/components/responses/UnverifiedForbidden"},"404":{"$ref":"#/components/responses/UnverifiedNotFound"}}}},"/sitemap.xml":{"servers":[{"url":"https://turbine.so","description":"Public marketing website and documentation, not the MCP host"}],"get":{"operationId":"getTurbineSitemap","summary":"Read the public Turbine sitemap","description":"Read the public Turbine sitemap. An unauthenticated GET returned HTTP 200 on 2026-10-15. This read-only document contains no private user data and does not grant MCP access. Accept: text/markdown does not change this document’s content type.","security":[],"parameters":[],"responses":{"200":{"description":"Public document. No authentication required for this GET.","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/DocumentText"}}}},"401":{"$ref":"#/components/responses/UnverifiedUnauthorized"},"403":{"$ref":"#/components/responses/UnverifiedForbidden"},"404":{"$ref":"#/components/responses/UnverifiedNotFound"}}}},"/robots.txt":{"servers":[{"url":"https://turbine.so","description":"Public marketing website and documentation, not the MCP host"}],"get":{"operationId":"getTurbineRobots","summary":"Read Turbine crawler directives","description":"Read Turbine crawler directives. An unauthenticated GET returned HTTP 200 on 2026-10-15. This read-only document contains no private user data and does not grant MCP access. Accept: text/markdown does not change this document’s content type.","security":[],"parameters":[],"responses":{"200":{"description":"Public document. No authentication required for this GET.","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/DocumentText"}}}},"401":{"$ref":"#/components/responses/UnverifiedUnauthorized"},"403":{"$ref":"#/components/responses/UnverifiedForbidden"},"404":{"$ref":"#/components/responses/UnverifiedNotFound"}}}},"/developers":{"servers":[{"url":"https://turbine.so","description":"Public marketing website and documentation, not the MCP host"}],"get":{"operationId":"getTurbineDeveloperDocs","summary":"Read Turbine developer docs for MCP and OAuth","description":"Read Turbine developer docs for MCP and OAuth. An unauthenticated GET returned HTTP 200 on 2026-10-15. This read-only document contains no private user data and does not grant MCP access. Send Accept: text/markdown for Markdown; absent Accept returns HTML. Markdown must be preferred over HTML by quality weight.","security":[],"parameters":[{"name":"Accept","in":"header","required":false,"description":"Preferred document representation. Defaults to HTML when absent. OpenAPI tooling may ignore this standard header; set the HTTP Accept header in the client.","schema":{"type":"string","enum":["text/html","text/markdown"]}}],"responses":{"200":{"description":"Public document. No authentication required for this GET.","content":{"text/html":{"schema":{"$ref":"#/components/schemas/DocumentText"}},"text/markdown":{"schema":{"$ref":"#/components/schemas/DocumentText"}}}},"401":{"$ref":"#/components/responses/UnverifiedUnauthorized"},"403":{"$ref":"#/components/responses/UnverifiedForbidden"},"404":{"$ref":"#/components/responses/UnverifiedNotFound"}}}},"/mcp":{"post":{"operationId":"sendMcpRequest","summary":"Send a JSON-RPC request to the remote MCP server","description":"The MCP endpoint uses Streamable HTTP POST, not one REST endpoint per tool. Send Content-Type: application/json and Accept: application/json, text/event-stream. Authorize with an OAuth access token in the Bearer header. The unauthenticated initialization probe returned the documented 401 challenge. Successful exchanges and authorization failures were not probed. The request schema describes the standard JSON-RPC request envelope, not verified tool parameters or supported protocol versions. Clients must negotiate capabilities through MCP before invoking tools.","externalDocs":{"description":"MCP Streamable HTTP transport rules","url":"https://modelcontextprotocol.io/specification/2025-06-18/basic/transports"},"security":[{"authkit":[]},{"bearerAuth":[]}],"parameters":[{"name":"MCP-Protocol-Version","in":"header","description":"For subsequent requests, send the protocol version negotiated during MCP initialization. This document does not assert which versions the server supports.","schema":{"type":"string"}},{"name":"Mcp-Session-Id","in":"header","description":"Send on subsequent requests only if the server issued a session ID during initialization. Session support has not been verified.","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"A JSON-RPC request. The example is the unauthenticated probe that returned 401, not evidence of successful initialization. MCP notifications and client responses also use this transport but are outside this request-focused description.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpRequest"},"example":{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"public-discovery-probe","version":"1.0.0"}}}}}},"responses":{"200":{"description":"Standard MCP Streamable HTTP response, not observed on this invite-gated endpoint. JSON-RPC envelopes describe the protocol only, not authenticated tool results or server capabilities.","headers":{"Mcp-Session-Id":{"description":"Optional session identifier assigned during initialization if the server uses sessions. Not observed.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/McpResponse"},{"$ref":"#/components/schemas/McpError"}]}},"text/event-stream":{"schema":{"type":"string","description":"Standard SSE stream carrying MCP JSON-RPC messages. Successful streaming has not been observed."}}}},"401":{"description":"Observed response to an unauthenticated POST. Follow the Bearer resource_metadata URL.","headers":{"WWW-Authenticate":{"description":"Observed Bearer challenge with the OAuth protected-resource metadata URL.","schema":{"type":"string"},"example":"Bearer error=\"invalid_token\", error_description=\"Authentication required\", resource_metadata=\"https://api.turbine.so/.well-known/oauth-protected-resource/mcp\""}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"},"example":{"error":"invalid_token","error_description":"Authentication required"}}}},"403":{"$ref":"#/components/responses/UnverifiedForbidden"},"default":{"description":"Other responses were not verified. MCP clients must handle the Streamable HTTP protocol, including JSON and event streams, rather than assume a REST result. No authenticated response contract is asserted here.","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UnverifiedBody"}}}}}}},"/.well-known/oauth-protected-resource/mcp":{"get":{"operationId":"getMcpProtectedResourceMetadata","summary":"Discover the OAuth authorization server for Turbine MCP","description":"Public OAuth protected-resource metadata. An unauthenticated GET returned 200 with the MCP resource URL, AuthKit authorization server and header bearer method. This is resource metadata, not a mirrored authorization-server document.","security":[],"responses":{"200":{"description":"Publicly observed OAuth protected-resource metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProtectedResourceMetadata"},"example":{"resource":"https://api.turbine.so/mcp","authorization_servers":["https://grounded-laugh-82.authkit.app"],"bearer_methods_supported":["header"]}}}},"401":{"description":"Reserved for an authentication rejection. Not observed on this public endpoint; no error format is asserted.","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UnverifiedBody"}}}},"403":{"$ref":"#/components/responses/UnverifiedForbidden"}}}}},"components":{"securitySchemes":{"authkit":{"type":"oauth2","description":"OAuth through the user's Turbine account at https://grounded-laugh-82.authkit.app. Endpoints and available scopes come from the issuer's live /.well-known/oauth-authorization-server and /.well-known/openid-configuration. Scopes below are issuer-advertised, not a claim that Turbine requires all of them. Public clients use authorization code with PKCE S256. Access remains invite-gated.","flows":{"authorizationCode":{"authorizationUrl":"https://grounded-laugh-82.authkit.app/oauth2/authorize","tokenUrl":"https://grounded-laugh-82.authkit.app/oauth2/token","scopes":{"email":"Email scope advertised by AuthKit.","offline_access":"Offline access scope advertised by AuthKit.","openid":"OpenID Connect scope advertised by AuthKit.","profile":"Profile scope advertised by AuthKit."}}}},"bearerAuth":{"type":"http","scheme":"bearer","description":"An access token obtained through the same AuthKit OAuth flow, not an API key or an alternative authentication service."}},"schemas":{"DocumentText":{"type":"string","description":"Complete public document in the response media type. HTML and Markdown representations share page content."},"ServerCard":{"type":"object","additionalProperties":true,"description":"Public experimental MCP server card. Additional extension fields may be present; authenticated tools are not listed.","required":["name","description","version"],"properties":{"name":{"type":"string","description":"Namespaced server name."},"description":{"type":"string","maxLength":100,"description":"Short server description."},"version":{"type":"string","description":"Card version."},"remotes":{"type":"array","description":"Remote MCP connections.","items":{"type":"object","additionalProperties":true,"required":["type","url"],"properties":{"type":{"type":"string","enum":["streamable-http","sse"],"description":"Transport type from the server-card schema."},"url":{"type":"string","format":"uri","description":"Remote endpoint URL."}}}}}},"AiCatalog":{"type":"object","additionalProperties":true,"description":"Public AI resource discovery catalog. Additional catalog extensions may be present.","required":["specVersion","entries"],"properties":{"specVersion":{"type":"string","description":"Catalog format version."},"entries":{"type":"array","description":"Links to public discovery and documentation resources.","items":{"type":"object","additionalProperties":true,"required":["identifier","displayName","type","url"],"properties":{"identifier":{"type":"string","description":"Resource URN."},"displayName":{"type":"string","description":"Human-readable resource name."},"type":{"type":"string","description":"Resource media type."},"url":{"type":"string","format":"uri","description":"Public resource URL."}}}}}},"McpRequest":{"type":"object","additionalProperties":true,"description":"Standard JSON-RPC 2.0 request envelope used by MCP. Method-specific parameters are discovered through the authenticated MCP protocol, not defined by this document.","required":["jsonrpc","id","method"],"properties":{"jsonrpc":{"type":"string","const":"2.0","description":"JSON-RPC protocol version."},"id":{"type":["string","integer"],"description":"Client request identifier for response correlation."},"method":{"type":"string","description":"MCP method name, such as initialize."},"params":{"type":"object","additionalProperties":true,"description":"Method-specific MCP parameters. No tool input schema is claimed here."}}},"McpResponse":{"type":"object","additionalProperties":true,"description":"Standard MCP JSON-RPC success envelope, not an observed Turbine response. Result properties depend on the negotiated method.","required":["jsonrpc","id","result"],"properties":{"jsonrpc":{"type":"string","enum":["2.0"],"description":"JSON-RPC version."},"id":{"type":["string","integer"],"description":"Identifier of the request being answered."},"result":{"type":"object","additionalProperties":true,"description":"Method-specific MCP result. No authenticated result fields have been verified."}}},"McpError":{"type":"object","additionalProperties":true,"description":"Standard MCP JSON-RPC error envelope, not an observed Turbine response.","required":["jsonrpc","id","error"],"properties":{"jsonrpc":{"type":"string","enum":["2.0"],"description":"JSON-RPC version."},"id":{"type":["string","integer"],"description":"Identifier of the request being answered."},"error":{"type":"object","additionalProperties":true,"required":["code","message"],"description":"Protocol or method error, distinct from the observed HTTP OAuth rejection.","properties":{"code":{"type":"integer","description":"JSON-RPC error code."},"message":{"type":"string","description":"Short error description."},"data":{"description":"Optional method-defined error data. Its shape is not verified."}}}}},"OAuthError":{"type":"object","additionalProperties":true,"description":"The JSON authentication error observed on the unauthenticated MCP POST.","required":["error"],"properties":{"error":{"type":"string","description":"OAuth error code.","examples":["invalid_token"]},"error_description":{"type":"string","description":"Human-readable authentication error.","examples":["Authentication required"]}}},"ProtectedResourceMetadata":{"type":"object","additionalProperties":true,"description":"OAuth protected-resource metadata as returned by the public MCP discovery endpoint.","required":["resource"],"properties":{"resource":{"type":"string","format":"uri","description":"Canonical protected MCP resource URL."},"authorization_servers":{"type":"array","description":"Authorization server issuer URLs. Fetch discovery metadata at the issuer origin.","items":{"type":"string","format":"uri"}},"bearer_methods_supported":{"type":"array","description":"Supported bearer-token delivery methods. The observed value is header.","items":{"type":"string"}}}},"UnverifiedBody":{"description":"Intentionally unconstrained because this response was not observed. Do not infer a JSON error shape, tool result or successful authorization from this schema."}},"responses":{"UnverifiedUnauthorized":{"description":"Authentication rejection reserved for client handling. Not observed on public document GETs; no body format is asserted.","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UnverifiedBody"}}}},"UnverifiedNotFound":{"description":"Document unavailable. Not observed at the listed public URL; no body format is asserted.","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UnverifiedBody"}}}},"UnverifiedForbidden":{"description":"Reserved for a forbidden response. Access to MCP is invite-gated, but no 403 response was observed and no body format is asserted.","content":{"*/*":{"schema":{"$ref":"#/components/schemas/UnverifiedBody"}}}}}}}