OAuth callback migration
The connections redesign moves generic OAuth apps to a single static callback URL. Add it to your provider app registration so re-authorization keeps working.
The connections redesign consolidated every generic OAuth app onto a single static callback URL. If you registered a script-connections OAuth app before the redesign, add the new callback to your provider's app registration — otherwise the next authorization will fail.
What changed
Previously, each generic OAuth app authorized against a per-provider callback of the shape:
<your-base-url>/api/oauth/<provider>/callbackAfter the redesign, every generic authorization redirects to one static callback that never changes:
<your-base-url>/api/oauth/callbackThe value is derived from the server's public base URL
(PUBLIC_MCP_BASE_URL). You can copy the exact URL from the OAuth-app
create/edit dialog or the app detail page in the dashboard.
Who is affected
Affected — generic script-connections OAuth apps registered through the
pre-redesign flow (the ones you manage under Connections → OAuth Apps).
Their stored redirect URI still points at the legacy
/api/oauth/<provider>/callback path, but new authorizations are sent to the
static /api/oauth/callback. The dashboard flags these apps with an amber
warning triangle.
Not affected:
- Tracker apps (Linear, Jira) — they use their own dedicated callbacks, which are unchanged, and authorization still uses their stored redirect URIs.
- MCP dynamic-client-registration (DCR) apps — they use their MCP-specific callback and are never migrated.
The symptom
Existing tokens and token refresh keep working. The problem only surfaces on a new authorization or re-authorization: the provider rejects the request with
error=redirect_uri_mismatchbecause the static callback the swarm now sends is not in the provider app's list of registered redirect URIs.
The fix
Add the static callback to your provider app's registered redirect URIs:
- Copy the static callback from the OAuth-app dialog or detail page — it looks
like
<your-base-url>/api/oauth/callback. - Open your provider's app/console (e.g. GitHub OAuth App settings, Google Cloud console, etc.).
- Add
<your-base-url>/api/oauth/callbackto the Authorized redirect URIs (or equivalent) list. - Save, then re-authorize the app from Connections → OAuth Apps in the dashboard.
It is safe to keep the old /api/oauth/<provider>/callback entry registered
during the transition — the legacy callback route still completes any in-flight
authorizations. Once every app is re-authorized against the static callback, you
can remove the legacy entries.
Script connections
Register OpenAPI, GraphQL, and MCP APIs once — with optional OAuth or config-backed credentials — and call them from any swarm script via typed ctx.api / ctx.mcp clients.
Scripts as external APIs
Expose a saved swarm script as a public, JSON-in/JSON-out HTTP endpoint — POST /api/x/script/<id> — with optional bearer auth, typed input validation, and per-endpoint usage tracking.