{"components":{"headers":{"Deprecation":{"description":"RFC 9745 structured-field Date. When an operation or representation is deprecated, the value is `@` followed by the Unix timestamp of deprecation, for example `@1688169599`. This is not a boolean. Skillsail does not currently send this header.","schema":{"pattern":"^@[0-9]+$","type":"string"}},"Skillsail-Api-Version":{"description":"Skillsail REST API version that served this response. v1 is current.","schema":{"enum":["1"],"type":"string"}},"Sunset":{"description":"RFC 8594 HTTP-date after which a deprecated operation or representation may be removed.","schema":{"type":"string"}},"WWWAuthenticate":{"description":"RFC 6750 Bearer challenge. Always includes resource_metadata for the Skillsail MCP resource. Includes error and error_description only when a bearer token was sent.","schema":{"type":"string"}}},"parameters":{"SkillsailApiVersion":{"description":"Skillsail REST API version. v1 is current. Omit the header to receive v1. Breaking changes are announced with Deprecation and Sunset headers at least 90 days before removal.","in":"header","name":"Skillsail-Api-Version","required":false,"schema":{"default":"1","enum":["1"],"type":"string"}}},"schemas":{"OAuthError":{"additionalProperties":false,"description":"OAuth 2.0 Bearer JSON object returned by the Skillsail MCP HTTP transport when a bearer token was sent and rejected. Not used for the empty missing-token 401 challenge.","properties":{"error":{"enum":["invalid_token","insufficient_scope"],"type":"string"},"error_description":{"type":"string"}},"required":["error"],"type":"object"},"ProblemDetails":{"additionalProperties":false,"description":"RFC 9457 problem details for Skillsail REST discovery errors. `code` is the machine-readable Skillsail error and `detail` is the human-readable message.","properties":{"code":{"type":"string"},"detail":{"type":"string"},"instance":{"format":"uri-reference","type":"string"},"status":{"type":"integer"},"title":{"type":"string"},"type":{"format":"uri","type":"string"}},"required":["code","detail","status","title","type"],"type":"object"},"TemporarilyUnavailableError":{"additionalProperties":false,"description":"JSON error object returned when OAuth protected-resource metadata or MCP authentication is temporarily unavailable.","properties":{"error":{"enum":["temporarily_unavailable"],"type":"string"},"error_description":{"type":"string"}},"required":["error"],"type":"object"}},"securitySchemes":{"skillsailOAuth":{"flows":{"authorizationCode":{"authorizationUrl":"https://rich-lyric-91.authkit.app/oauth2/authorize","scopes":{"email":"Access the authorized user's email address.","offline_access":"Refresh access when permitted by the user.","openid":"Authenticate the authorized user.","profile":"Access the authorized user's profile."},"tokenUrl":"https://rich-lyric-91.authkit.app/oauth2/token"}},"type":"oauth2"}}},"externalDocs":{"description":"Skillsail API versioning, typed errors, and deprecation.","url":"https://skillsail.com/docs/api"},"info":{"description":"Machine-readable description of Skillsail's public REST discovery endpoints and authenticated MCP transport (API v1). Send the optional Skillsail-Api-Version: 1 request header; omitted requests are served as v1. Deprecated operations include Deprecation: @<unix-seconds> (RFC 9745 Date) and a Sunset HTTP-date (RFC 8594). Breaking changes are announced at least 90 days before Sunset. Additive changes may ship in v1 without a new version. Course authoring uses the Skillsail MCP server at /mcp, which advertises its protocol version on the MCP server card. REST discovery errors use RFC 9457 application/problem+json with a machine-readable code and a human-readable detail. OAuth protected-resource metadata and MCP authentication outages return application/json with error and error_description. MCP requests that omit Authorization receive a 401 with an empty body and WWW-Authenticate.","title":"Skillsail API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/.well-known/oauth-protected-resource/mcp":{"get":{"description":"Returns OAuth Protected Resource metadata for the Skillsail MCP endpoint.","operationId":"getMcpProtectedResourceMetadata","parameters":[{"$ref":"#/components/parameters/SkillsailApiVersion"}],"responses":{"200":{"description":"OAuth Protected Resource metadata.","headers":{"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Skillsail-Api-Version":{"$ref":"#/components/headers/SkillsailApiVersion"},"Sunset":{"$ref":"#/components/headers/Sunset"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemporarilyUnavailableError"}}},"description":"OAuth metadata is temporarily unavailable. application/json with error=temporarily_unavailable, not problem+json."}},"summary":"Get MCP protected resource metadata"}},"/api/health":{"get":{"operationId":"getHealth","parameters":[{"$ref":"#/components/parameters/SkillsailApiVersion"}],"responses":{"200":{"description":"Skillsail service is reachable.","headers":{"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Skillsail-Api-Version":{"$ref":"#/components/headers/SkillsailApiVersion"},"Sunset":{"$ref":"#/components/headers/Sunset"}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"The request was not valid."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Authentication is required or the credential is invalid."},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"The credential is not allowed to call this resource."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"The resource does not exist."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"The client has been rate limited."},"500":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"An unexpected server error occurred."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"The service is temporarily unavailable."}},"summary":"Get service health"}},"/mcp":{"post":{"description":"Streamable HTTP MCP endpoint for authenticated course authoring tools.","operationId":"callMcp","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object"}}},"required":true},"responses":{"200":{"description":"MCP JSON-RPC response or event stream."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}},"description":"Two representations. Missing Authorization header: empty body (no Content-Type), Cache-Control no-store, and WWW-Authenticate with resource_metadata and no error= parameter. Malformed or invalid bearer token: application/json OAuthError with error=invalid_token and WWW-Authenticate including error=\"invalid_token\". Clients must parse JSON only when Content-Type is application/json.","headers":{"WWW-Authenticate":{"$ref":"#/components/headers/WWWAuthenticate"}}},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}},"description":"Bearer token is valid but not permitted. application/json OAuthError with error=insufficient_scope.","headers":{"WWW-Authenticate":{"$ref":"#/components/headers/WWWAuthenticate"}}},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TemporarilyUnavailableError"}}},"description":"MCP authentication is temporarily unavailable. application/json with error=temporarily_unavailable and Retry-After, not problem+json.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Skillsail sends 5 when token verification is unavailable.","schema":{"type":"string"}}}}},"security":[{"skillsailOAuth":[]}],"summary":"Call the Skillsail MCP server"}}},"servers":[{"description":"Skillsail API v1","url":"https://skillsail.com"}]}