The building blocks Okta gives you
Okta application vs. Okta AI agent
The patterns below lean on two different kinds of principal:- Okta application — an app registered in Okta as an OIDC/OAuth client and (for XAA) listed in the OIN. Base Workforce Identity functionality; in an XAA exchange it plays the requesting or resource role.
- Okta AI agent — an autonomous agent registered as a first-class non-human identity in Universal Directory through the paid Okta for AI Agents product. Beyond a plain application it gets an owner, a managed lifecycle (onboard, certify, kill switch), optional secret vaulting, and the entitlement to perform agent-to-agent token exchange — the onward, per-hop ID-JAG minting that a multi-agent chain needs.
Which pattern applies
Match your call path against this table; each pattern is detailed below. “3P” means a third party outside your Okta trust.Pattern 1 — Okta app → MCP server, via XAA
Canonical Cross App Access. The MCP Gateway mints an ID-JAG at Okta and redeems it at the MCP’s authorization server for a scoped access token.Okta prerequisites
Okta prerequisites
- Register the client application as an Okta OIDC app (the requesting app), so a signed-in user obtains an Okta ID token.
- Register the MCP server as an Okta app fronted by a custom authorization server (the resource app) — the server that redeems the ID-JAG.
- Establish the Cross App Access trust: in the Okta Admin Console, create a managed connection from the requesting app to the resource app. (XAA is Early Access — enablement goes through Okta support, and both apps must be OIN-listed.)
TrueFoundry setup
TrueFoundry setup
Configure the MCP server's Auth Data for Cross App Access
audience).
MCP server outbound Auth Data configured for Okta ID-JAG (Cross App Access)
Create a virtual account for the client application

Virtual account representing the client app, granted MCP Server User on the target MCP server
Pattern 2 — third-party MCP whose authorization server trusts Okta
The cross-vendor case, and the reason the IdP and authorization server are separate roles: the AS that redeems the ID-JAG does not have to be run by Okta. It just has to trust Okta as an ID-JAG issuer — a small explicit configuration on the resource side (Okta’s issuer identifier, its JWKS to verify signatures, and the accepted audience). The resource domain then validates ID-JAGs locally and mints its own tokens under its own policy — it never imports your user database and keeps full control of scopes and revocation. Setup is identical to pattern 1 — the same ID-JAG Auth Data and client virtual account — except Resource Token URL and Issuer URI point at the third party’s authorization server instead of an Okta custom AS.Pattern 3 — third-party MCP with no Okta trust: per-user OAuth
When the third party is not part of any XAA trust, the flow degrades to standard 3-legged OAuth, managed by the MCP Gateway per user — consent, token storage, refresh. On the MCP server set Auth Data → OAuth2, provider Custom, grant Authorization Code; each user authorizes their own account on first use (the gateway returns a401 with an authorization URL). No Okta XAA setup is involved.

MCP server outbound Auth Data for standard per-user OAuth (Authorization Code)
Pattern 4 — multi-agent chains: Okta AI agents and chained ID-JAG
The full agentic call path — app → agent → agent → MCP — built on Okta’s agent-to-agent token exchange. Each hop mints a fresh ID-JAG audienced to the next callee’s authorization server and nests the acting agent into theact chain. The first leg starts from the user’s ID token; onward legs are seeded by the previous hop’s access token — the paid AI Agents product extends the base ID-JAG rule (which forbids an access-token subject) to allow exactly this. It is a chain of exchanges, not one carried token.
Okta setup
Okta setup
Register each agent as an Okta AI agent
Give each agent a custom authorization server
audience for calls to that agent. Agents can share one custom AS (distinct scopes) or use one each.Register the MCP server as a resource
Authorize the connections along the chain
Share credentials with TrueFoundry
TrueFoundry setup
TrueFoundry setup

Agent outbound Auth Data configured for ID-JAG (Okta AI Agent)
Pattern 5 — same-tenant app-to-app: OBO, without an actor chain
Within one Okta tenant, the gateway performs an RFC 8693 OBO exchange on a custom authorization server. The resulting token keeps the user assub — but Okta’s OBO emits no act claim, so the resource learns who the user is but not which agents touched the request.
On the MCP server set Auth Data → OAuth2, OAuth Provider = Okta, Grant Type = Token Exchange, with the custom AS Token URL, optional Client ID / Secret, and Audience. No Cross App Access managed connection is needed for OBO.

MCP server outbound Auth Data configured for On-Behalf-Of (Token Exchange)
What the gateway adds on top of Okta
Base XAA describes a single requesting-app → resource-app relationship. The TrueFoundry gateways fill three gaps:- Multi-hop chaining. The gateway registers in the OIN with the “Both” role — resource app for the upstream hop, requesting app for the downstream hop — and mints a fresh, freshly-audienced ID-JAG per hop, stitching single grants into one governed path.
- Uniform governance across hops. Each resource AS enforces only its hop; the gateway runs the same authorize → exchange → guard → record loop at every hop.
- Abstraction. Apps and agents present the identity they already have; the gateway does XAA or OBO on their behalf. No app author writes a two-legged exchange — which matters at scale, when many agents talk to each other in a mesh.
Without the Okta for AI Agents product
Patterns 1–3 and 5 work on base Okta (plus API Access Management for custom authorization servers). What the paid product adds is the lifecycle layer (registry, discovery, vaulting, kill switch, certification) and the agent-to-agent exchange that pattern 4 needs. The most consequential gap on base Okta: OBO emits noact claim, so an app → app → MCP path has no cryptographic actor chain.
Getting a verifiable actor chain without the paid product
Getting a verifiable actor chain without the paid product
sub and the acting agent in act, nesting per hop. You get Okta’s centralized brokering and a verifiable actor chain.act chain minted by Okta.
FAQ
Must the terminal MCP server be registered as an Okta AI agent?
Must the terminal MCP server be registered as an Okta AI agent?
Must the starting assertion be an Okta-issued ID token?
Must the starting assertion be an Okta-issued ID token?
Must every hop be registered in Okta?
Must every hop be registered in Okta?