{"openapi":"3.1.0","info":{"title":"Opal (BYOK) API","version":"0.1.0","description":"Opal (BYOK) lets an AI assistant read your own Opal data through the Opal API with a key you supply (Opal API token (admin-created, read scope)). Read-only: 11 tools (list_apps, list_groups, list_resources, list_owners, list_bundles, list_tags, list_access_rules, list_campaigns, list_configuration_templates, list_message_channels, list_on_call_schedules). The BYOK key travels with each request,...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-opal.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-opal/docs"},"termsOfService":"https://connectorbay.com/byok-opal/terms"},"servers":[{"url":"https://byok-opal.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-opal/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/list_apps":{"post":{"operationId":"list_apps","summary":"List the apps (connected systems) in your Opal organization with type, visibility and admin owner. Use for \"Which system","description":"List the apps (connected systems) in your Opal organization with type, visibility and admin owner. Use for \"Which systems are connected to Opal\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"app_types":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Comma-separated app types to include, for example GIT_HUB,AWS,OKTA_DIRECTORY.","title":"App Types"},"owner_id":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"default":null,"description":"Only apps administered by this owner id (UUID).","title":"Owner Id"}},"title":"list_appsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_groups":{"post":{"operationId":"list_groups","summary":"List groups managed in Opal with type, owner, approval settings and requestability. Use for \"Which groups can people req","description":"List groups managed in Opal with type, owner, approval settings and requestability. Use for \"Which groups can people request access to\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"cursor":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Pagination cursor: the next value of the previous answer (leave empty for the first page).","title":"Cursor"},"page_size":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":200,"description":"Results per page (default 200).","title":"Page Size"},"group_type":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only groups of this type, for example OKTA_GROUP or GIT_HUB_TEAM.","title":"Group Type"},"group_name":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only groups with this name.","title":"Group Name"},"requestable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Only groups that allow access requests.","title":"Requestable"}},"title":"list_groupsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_resources":{"post":{"operationId":"list_resources","summary":"List resources managed in Opal (cloud accounts, roles, repos, databases) with type, owner, approval settings, parent and","description":"List resources managed in Opal (cloud accounts, roles, repos, databases) with type, owner, approval settings, parent and risk sensitivity. Use for \"Which production resources need MFA to request\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"cursor":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Pagination cursor: the next value of the previous answer (leave empty for the first page).","title":"Cursor"},"page_size":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":200,"description":"Results per page (default 200).","title":"Page Size"},"resource_type":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only resources of this type, for example AWS_IAM_ROLE or GIT_HUB_REPO.","title":"Resource Type"},"resource_name":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only resources with this name.","title":"Resource Name"},"parent_resource_id":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"default":null,"description":"Only children of this resource id.","title":"Parent Resource Id"}},"title":"list_resourcesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_owners":{"post":{"operationId":"list_owners","summary":"List owners (teams that administer apps, groups and resources) with escalation period; members are not listed. Use for \"","description":"List owners (teams that administer apps, groups and resources) with escalation period; members are not listed. Use for \"Which owners exist in Opal\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"cursor":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Pagination cursor: the next value of the previous answer (leave empty for the first page).","title":"Cursor"},"page_size":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":200,"description":"Results per page (default 200).","title":"Page Size"},"name":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only owners with this name.","title":"Name"}},"title":"list_ownersArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_bundles":{"post":{"operationId":"list_bundles","summary":"List access bundles (sets of resources and groups requested together) with item counts. Use for \"Which access bundles do","description":"List access bundles (sets of resources and groups requested together) with item counts. Use for \"Which access bundles do we offer\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"cursor":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Pagination cursor: the next value of the previous answer (leave empty for the first page).","title":"Cursor"},"page_size":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":200,"description":"Results per page (default 200, max 1000).","title":"Page Size"},"contains":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only bundles whose name contains this text.","title":"Contains"}},"title":"list_bundlesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_tags":{"post":{"operationId":"list_tags","summary":"List the tags created in Opal with key and value. Use for \"Which tags are used in Opal\".","description":"List the tags created in Opal with key and value. Use for \"Which tags are used in Opal\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"cursor":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Pagination cursor: the next value of the previous answer (leave empty for the first page).","title":"Cursor"},"page_size":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":200,"description":"Results per page (default 200).","title":"Page Size"}},"title":"list_tagsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_access_rules":{"post":{"operationId":"list_access_rules","summary":"List access rules (automatic grants) with name, status and admin owner; rule clauses are left out. Use for \"Which access","description":"List access rules (automatic grants) with name, status and admin owner; rule clauses are left out. Use for \"Which access rules are active\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"cursor":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Pagination cursor: the next value of the previous answer (leave empty for the first page).","title":"Cursor"},"page_size":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":200,"description":"Results per page (default 200).","title":"Page Size"}},"title":"list_access_rulesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_campaigns":{"post":{"operationId":"list_campaigns","summary":"List access review campaigns with status and lifecycle timestamps (who started or stopped them is left out). Use for \"Wh","description":"List access review campaigns with status and lifecycle timestamps (who started or stopped them is left out). Use for \"Which access reviews are ongoing\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"cursor":{"anyOf":[{"maxLength":300,"type":"string"},{"type":"null"}],"default":null,"description":"Pagination cursor: the next value of the previous answer (leave empty for the first page).","title":"Cursor"},"page_size":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":200,"description":"Results per page (default 200).","title":"Page Size"},"name":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only campaigns whose name contains this text.","title":"Name"},"status":{"anyOf":[{"enum":["DRAFT","ONGOING","COMPLETED","STOPPED","ENDED"],"type":"string"},{"type":"null"}],"default":null,"description":"Only campaigns with this status.","title":"Status"},"created_after":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only campaigns created after this ISO 8601 timestamp.","title":"Created After"}},"title":"list_campaignsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_configuration_templates":{"post":{"operationId":"list_configuration_templates","summary":"List configuration templates (reusable approval and MFA settings) with owner and MFA requirements. Use for \"Which config","description":"List configuration templates (reusable approval and MFA settings) with owner and MFA requirements. Use for \"Which configuration templates exist\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_configuration_templatesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_message_channels":{"post":{"operationId":"list_message_channels","summary":"List message channels (Slack channels and similar) Opal can notify, with provider and privacy. Use for \"Which message ch","description":"List message channels (Slack channels and similar) Opal can notify, with provider and privacy. Use for \"Which message channels does Opal use\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_message_channelsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_on_call_schedules":{"post":{"operationId":"list_on_call_schedules","summary":"List on-call schedules linked to Opal with provider and name. Use for \"Which on-call schedules does Opal know\".","description":"List on-call schedules linked to Opal with provider and name. Use for \"Which on-call schedules does Opal know\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_on_call_schedulesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}