{"openapi":"3.1.0","info":{"title":"Vidext Studio Public API","version":"1.0.0","description":"Vidext turns a single prompt into a structured learning path — outline, narrated slides, and AI-generated imagery — grounded in the organization's own documents. Built for agents: Studio is available over a remote MCP endpoint. This specification covers the public discovery, authentication, and transport surfaces that agent clients use to connect to Vidext Studio."},"servers":[{"url":"https://staging.vidext.com"}],"tags":[{"name":"Docs","description":"Public discovery and documentation endpoints."},{"name":"MCP","description":"Vidext Studio MCP transport endpoints."},{"name":"OAuth","description":"OAuth 2.1 endpoints used by MCP clients."}],"externalDocs":{"description":"Developer guide","url":"https://staging.vidext.com/developers"},"paths":{"/server.json":{"get":{"operationId":"getRegistryServerMetadata","summary":"Get MCP registry server metadata","description":"Returns a registry-ready server.json document with branding, repository, and remote transport metadata for Vidext Studio.","tags":["Docs"],"responses":{"200":{"description":"MCP registry server definition","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpRegistryServerDefinition"}}}}}}},"/.well-known/api-catalog":{"get":{"operationId":"getApiCatalog","summary":"Get API catalog","description":"Returns the RFC 9727 API catalog as an application/linkset+json document so discovery clients can enumerate Vidext's public API surfaces.","tags":["Docs"],"responses":{"200":{"description":"API catalog Linkset document","content":{"application/linkset+json":{"schema":{"$ref":"#/components/schemas/ApiCatalogLinkset"}}}}}}},"/.well-known/mcp":{"get":{"operationId":"getMcpDiscovery","summary":"Get MCP discovery metadata","description":"Returns discovery metadata for the Vidext Studio MCP server, including transport details, auth discovery, and tool inventory.","tags":["Docs"],"responses":{"200":{"description":"MCP discovery metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpDiscovery"}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"operationId":"getOAuthAuthorizationServerMetadata","summary":"Get OAuth authorization server metadata","description":"RFC 8414 authorization server metadata exposed for MCP clients.","tags":["OAuth"],"responses":{"200":{"description":"OAuth authorization server metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthAuthorizationServerMetadata"}}}}}}},"/.well-known/oauth-protected-resource":{"get":{"operationId":"getOAuthProtectedResourceMetadata","summary":"Get OAuth protected resource metadata","description":"RFC 9728 protected resource metadata for the Vidext MCP surface.","tags":["OAuth"],"responses":{"200":{"description":"OAuth protected resource metadata","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthProtectedResourceMetadata"}}}}}}},"/api/auth/mcp/authorize":{"get":{"operationId":"authorizeMcpClient","summary":"Start OAuth authorization flow","description":"Authorization endpoint for OAuth 2.1 code + PKCE used by MCP clients.","tags":["OAuth"],"responses":{"302":{"description":"Redirects to user login or consent flow"},"400":{"description":"Invalid authorization request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardErrorResponse"}}}},"429":{"description":"Too many requests","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the caller should retry. Present when rate limiting is enforced on the responding surface."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardErrorResponse"}}}}}}},"/api/auth/mcp/token":{"post":{"operationId":"exchangeMcpToken","summary":"Exchange OAuth code for tokens","description":"Token endpoint used by MCP clients to exchange an authorization code for access and refresh tokens.","tags":["OAuth"],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","required":["grant_type","code","redirect_uri","code_verifier"],"properties":{"grant_type":{"type":"string","example":"authorization_code"},"code":{"type":"string"},"redirect_uri":{"type":"string","format":"uri"},"code_verifier":{"type":"string"},"client_id":{"type":"string"}}}}}},"responses":{"200":{"description":"OAuth token response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthTokenResponse"}}}},"400":{"description":"Invalid token request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardErrorResponse"}}}},"429":{"description":"Too many requests","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the caller should retry. Present when rate limiting is enforced on the responding surface."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardErrorResponse"}}}}}}},"/api/auth/mcp/register":{"post":{"operationId":"registerMcpClient","summary":"Register OAuth client dynamically","description":"Dynamic client registration endpoint for MCP clients that do not ship with pre-provisioned OAuth client credentials.","tags":["OAuth"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["redirect_uris","grant_types","token_endpoint_auth_method"],"properties":{"redirect_uris":{"type":"array","items":{"type":"string","format":"uri"}},"grant_types":{"type":"array","items":{"type":"string"}},"response_types":{"type":"array","items":{"type":"string"}},"client_name":{"type":"string"},"token_endpoint_auth_method":{"type":"string"}}}}}},"responses":{"201":{"description":"Dynamic client registration response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DynamicClientRegistrationResponse"}}}},"400":{"description":"Invalid registration request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardErrorResponse"}}}},"429":{"description":"Too many requests","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the caller should retry. Present when rate limiting is enforced on the responding surface."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardErrorResponse"}}}}}}},"/api/auth/mcp/userinfo":{"get":{"operationId":"getMcpUserInfo","summary":"Get user info","description":"Returns OpenID Connect-style user info for the authenticated MCP user.","tags":["OAuth"],"responses":{"200":{"description":"User info response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserInfoResponse"}}}},"401":{"description":"Authentication required","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"OAuth bearer challenge with protected resource metadata discovery."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcErrorResponse"}}}},"429":{"description":"Too many requests","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the caller should retry. Present when rate limiting is enforced on the responding surface."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardErrorResponse"}}}}}}},"/api/auth/mcp/jwks":{"get":{"operationId":"getMcpJwks","summary":"Get JSON Web Key Set","description":"Returns the JWKS used by the Vidext OAuth issuer.","tags":["OAuth"],"responses":{"200":{"description":"JWKS response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JwksResponse"}}}}}}},"/api/mcp/studio":{"get":{"operationId":"studioMcpGetShared","summary":"GET Studio MCP transport","description":"Remote MCP transport for Vidext Studio. Supports JSON-RPC over streamable HTTP. Unauthenticated requests return a bearer challenge that points clients to OAuth 2.1 discovery metadata.","tags":["MCP"],"responses":{"200":{"description":"MCP transport response","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/JsonRpcSuccessResponse"},{"$ref":"#/components/schemas/JsonRpcErrorResponse"}]}}}},"401":{"description":"Authentication required","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"OAuth bearer challenge with protected resource metadata discovery."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcErrorResponse"}}}},"429":{"description":"Too many requests","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the caller should retry. Present when rate limiting is enforced on the responding surface."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardErrorResponse"}}}}}},"post":{"operationId":"studioMcpPostShared","summary":"POST Studio MCP transport","description":"Remote MCP transport for Vidext Studio. Supports JSON-RPC over streamable HTTP. Unauthenticated requests return a bearer challenge that points clients to OAuth 2.1 discovery metadata.","tags":["MCP"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"MCP transport response","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/JsonRpcSuccessResponse"},{"$ref":"#/components/schemas/JsonRpcErrorResponse"}]}}}},"401":{"description":"Authentication required","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"OAuth bearer challenge with protected resource metadata discovery."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcErrorResponse"}}}},"429":{"description":"Too many requests","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the caller should retry. Present when rate limiting is enforced on the responding surface."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardErrorResponse"}}}}}},"delete":{"operationId":"studioMcpDeleteShared","summary":"DELETE Studio MCP transport","description":"Remote MCP transport for Vidext Studio. Supports JSON-RPC over streamable HTTP. Unauthenticated requests return a bearer challenge that points clients to OAuth 2.1 discovery metadata.","tags":["MCP"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"MCP transport response","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/JsonRpcSuccessResponse"},{"$ref":"#/components/schemas/JsonRpcErrorResponse"}]}}}},"401":{"description":"Authentication required","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"OAuth bearer challenge with protected resource metadata discovery."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcErrorResponse"}}}},"429":{"description":"Too many requests","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the caller should retry. Present when rate limiting is enforced on the responding surface."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardErrorResponse"}}}}}}},"/api/mcp/studio/{projectId}":{"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string"},"description":"Project-scoped MCP transport path segment used to pin the conversation to a specific project."}],"get":{"operationId":"studioMcpGetProjectScoped","summary":"GET Studio MCP transport","description":"Remote MCP transport for Vidext Studio. Supports JSON-RPC over streamable HTTP. Unauthenticated requests return a bearer challenge that points clients to OAuth 2.1 discovery metadata.","tags":["MCP"],"responses":{"200":{"description":"MCP transport response","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/JsonRpcSuccessResponse"},{"$ref":"#/components/schemas/JsonRpcErrorResponse"}]}}}},"401":{"description":"Authentication required","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"OAuth bearer challenge with protected resource metadata discovery."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcErrorResponse"}}}},"429":{"description":"Too many requests","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the caller should retry. Present when rate limiting is enforced on the responding surface."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardErrorResponse"}}}}}},"post":{"operationId":"studioMcpPostProjectScoped","summary":"POST Studio MCP transport","description":"Remote MCP transport for Vidext Studio. Supports JSON-RPC over streamable HTTP. Unauthenticated requests return a bearer challenge that points clients to OAuth 2.1 discovery metadata.","tags":["MCP"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"MCP transport response","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/JsonRpcSuccessResponse"},{"$ref":"#/components/schemas/JsonRpcErrorResponse"}]}}}},"401":{"description":"Authentication required","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"OAuth bearer challenge with protected resource metadata discovery."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcErrorResponse"}}}},"429":{"description":"Too many requests","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the caller should retry. Present when rate limiting is enforced on the responding surface."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardErrorResponse"}}}}}},"delete":{"operationId":"studioMcpDeleteProjectScoped","summary":"DELETE Studio MCP transport","description":"Remote MCP transport for Vidext Studio. Supports JSON-RPC over streamable HTTP. Unauthenticated requests return a bearer challenge that points clients to OAuth 2.1 discovery metadata.","tags":["MCP"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"MCP transport response","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/JsonRpcSuccessResponse"},{"$ref":"#/components/schemas/JsonRpcErrorResponse"}]}}}},"401":{"description":"Authentication required","headers":{"WWW-Authenticate":{"schema":{"type":"string"},"description":"OAuth bearer challenge with protected resource metadata discovery."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcErrorResponse"}}}},"429":{"description":"Too many requests","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the caller should retry. Present when rate limiting is enforced on the responding surface."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StandardErrorResponse"}}}}}}}},"components":{"schemas":{"ApiCatalogLink":{"type":"object","required":["href"],"properties":{"href":{"type":"string","format":"uri"},"type":{"type":"string"}}},"ApiCatalogEntry":{"type":"object","required":["anchor"],"properties":{"anchor":{"type":"string","format":"uri"},"item":{"type":"array","items":{"$ref":"#/components/schemas/ApiCatalogLink"}},"service-desc":{"type":"array","items":{"$ref":"#/components/schemas/ApiCatalogLink"}},"service-doc":{"type":"array","items":{"$ref":"#/components/schemas/ApiCatalogLink"}},"service-meta":{"type":"array","items":{"$ref":"#/components/schemas/ApiCatalogLink"}}}},"ApiCatalogLinkset":{"type":"object","required":["linkset"],"properties":{"linkset":{"type":"array","items":{"$ref":"#/components/schemas/ApiCatalogEntry"}}},"example":{"linkset":[{"anchor":"https://staging.vidext.com/.well-known/api-catalog","item":[{"href":"https://staging.vidext.com/api/mcp/studio"}]},{"anchor":"https://staging.vidext.com/api/mcp/studio","service-desc":[{"href":"https://staging.vidext.com/openapi.json","type":"application/json"}],"service-doc":[{"href":"https://staging.vidext.com/developers","type":"text/markdown"}]}]}},"McpRegistryIcon":{"type":"object","required":["src"],"properties":{"src":{"type":"string","format":"uri"},"mimeType":{"type":"string"},"sizes":{"type":"array","items":{"type":"string"}}}},"McpRegistryServerDefinition":{"type":"object","required":["$schema","name","description","version"],"properties":{"$schema":{"type":"string","format":"uri"},"name":{"type":"string","example":"com.vidext/studio"},"title":{"type":"string","example":"Vidext Studio"},"description":{"type":"string","example":"Vidext turns a single prompt into a structured learning path — outline, narrated slides, and AI-generated imagery — grounded in the organization's own documents. Built for agents: Studio is available over a remote MCP endpoint."},"version":{"type":"string","example":"0.1.0"},"websiteUrl":{"type":"string","format":"uri","example":"https://staging.vidext.com/developers"},"icons":{"type":"array","items":{"$ref":"#/components/schemas/McpRegistryIcon"}},"repository":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"source":{"type":"string","example":"github"},"subfolder":{"type":"string"}}},"remotes":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","example":"streamable-http"},"url":{"type":"string","format":"uri"}}}},"_meta":{"type":"object","additionalProperties":true}},"example":{"$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","name":"com.vidext/studio","title":"Vidext Studio","description":"Vidext turns a single prompt into a structured learning path — outline, narrated slides, and AI-generated imagery — grounded in the organization's own documents. Built for agents: Studio is available over a remote MCP endpoint.","version":"0.1.0","websiteUrl":"https://staging.vidext.com/developers","icons":[{"src":"https://staging.vidext.com/apple-icon.png","mimeType":"image/png","sizes":["180x180"]}],"remotes":[{"type":"streamable-http","url":"https://staging.vidext.com/api/mcp/studio"}]}},"McpDiscovery":{"type":"object","properties":{"name":{"type":"string","example":"Vidext Studio"},"description":{"type":"string","example":"Vidext turns a single prompt into a structured learning path — outline, narrated slides, and AI-generated imagery — grounded in the organization's own documents. Built for agents: Studio is available over a remote MCP endpoint."},"mcp":{"type":"object","properties":{"transport":{"type":"string","example":"streamable-http"},"endpoint":{"type":"string","format":"uri","example":"https://staging.vidext.com/api/mcp/studio"},"protocolVersions":{"type":"array","items":{"type":"string"},"example":["2025-06-18"]}}},"auth":{"type":"object","properties":{"required":{"type":"boolean"},"type":{"type":"string","example":"oauth2"},"authorizationServer":{"type":"string","format":"uri"},"protectedResource":{"type":"string","format":"uri"}}},"tools":{"type":"array","items":{"type":"string"}}}},"OAuthAuthorizationServerMetadata":{"type":"object","properties":{"issuer":{"type":"string","format":"uri"},"authorization_endpoint":{"type":"string","format":"uri"},"token_endpoint":{"type":"string","format":"uri"},"userinfo_endpoint":{"type":"string","format":"uri"},"jwks_uri":{"type":"string","format":"uri"},"registration_endpoint":{"type":"string","format":"uri"},"scopes_supported":{"type":"array","items":{"type":"string"}},"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"}}}},"OAuthProtectedResourceMetadata":{"type":"object","properties":{"resource":{"type":"string","format":"uri"},"authorization_servers":{"type":"array","items":{"type":"string","format":"uri"}},"jwks_uri":{"type":"string","format":"uri"},"scopes_supported":{"type":"array","items":{"type":"string"}},"bearer_methods_supported":{"type":"array","items":{"type":"string"}}}},"OAuthTokenResponse":{"type":"object","properties":{"access_token":{"type":"string"},"refresh_token":{"type":"string"},"token_type":{"type":"string","example":"Bearer"},"expires_in":{"type":"integer"},"scope":{"type":"string"},"id_token":{"type":"string"}}},"StandardErrorResponse":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["BAD_REQUEST","UNAUTHORIZED","FORBIDDEN","NOT_FOUND","METHOD_NOT_ALLOWED","CONFLICT","TOO_MANY_REQUESTS","UNPROCESSABLE_ENTITY","FAILED_DEPENDENCY","INTERNAL_SERVER_ERROR","TIMEOUT"]},"message":{"type":"string"},"retryable":{"type":"boolean"},"hint":{"type":"string"},"details":{}}},"DynamicClientRegistrationResponse":{"type":"object","properties":{"client_id":{"type":"string"},"client_secret":{"type":"string"},"redirect_uris":{"type":"array","items":{"type":"string","format":"uri"}},"token_endpoint_auth_method":{"type":"string"}}},"UserInfoResponse":{"type":"object","properties":{"sub":{"type":"string"},"email":{"type":"string","format":"email"},"email_verified":{"type":"boolean"},"name":{"type":"string"}}},"Jwk":{"type":"object","properties":{"kty":{"type":"string"},"kid":{"type":"string"},"use":{"type":"string"},"alg":{"type":"string"},"n":{"type":"string"},"e":{"type":"string"}}},"JwksResponse":{"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#/components/schemas/Jwk"}}}},"JsonRpcRequest":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","example":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"method":{"type":"string"},"params":{"type":"object","additionalProperties":true}}},"JsonRpcSuccessResponse":{"type":"object","required":["jsonrpc","id","result"],"properties":{"jsonrpc":{"type":"string","example":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"result":{"type":"object","additionalProperties":true}}},"JsonRpcErrorResponse":{"type":"object","required":["jsonrpc","error","id"],"properties":{"jsonrpc":{"type":"string","example":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"integer"},"message":{"type":"string"},"data":{"type":"object","additionalProperties":true},"www-authenticate":{"type":"string"}}}}}}}}