← All AI Engineer talks

AI Engineer Europe 2026

One Login to Rule Them All: Cross-App Access for MCP

Read the talk

One Login to Rule Them All: Cross-App Access for MCP

Cross-App Access uses an enterprise identity provider to connect MCP clients to approved services, replacing repeated consent with policy-controlled token exchanges.

From a talk by Garrett Galow

Before you start: Familiarity with MCP clients and servers, enterprise SSO, and the difference between access tokens and refresh tokens will help you follow the exchanges.

The credentials IT cannot see

Repeated consent is irritating for users, but the larger problem belongs to IT. If employees connect arbitrary MCP clients to arbitrary services without going through the company IdP, administrators lose a central place to observe and govern those connections. An approved Cursor installation and a potentially unapproved DeepSeek client can both become routes into sensitive Figma or Notion data when users grant access themselves.

Galow makes the risk concrete through his account of being affected by the axios npm supply-chain compromise roughly a week before the talk. He did not know which dependency had introduced the compromised package. IT detected the affected machine, cut off its network access, and invalidated his Okta sessions across applications. But local MCP connections and API keys required a separate investigation: which services had he connected, which credentials existed outside the IdP, and how could each one be revoked?

Revoking an SSO session does not necessarily revoke every credential obtained outside it. Galow warns that access tokens and, especially, refresh tokens can preserve standing access after an incident or an employee’s departure. Depending on service policies, he says that access can last days, weeks, or months. He points to SCIM provisioning as a way to close the account lifecycle gap, while noting that many companies do not deploy it. The same fragmentation appears during onboarding: IT may configure the MCP servers in Cursor or Claude, yet each employee still has to authenticate and manage the connections.

3:473:59
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

3:47 · section reference included

Use the trust the applications already share

Cross-App Access, or XAA, makes the identity provider a trust intermediary between applications. Consider Cursor as the MCP client, Figma as the target service, and Okta as the company IdP. Cursor already trusts the company’s workos.okta.com instance to authenticate employees. Figma trusts that same instance. Both applications already know that the user belongs to them. XAA uses those existing relationships to obtain credentials for the client without another human consent interaction.

Diagram with Okta IDP above Cursor MCP Client and Figma MCP Server, SSO arrows toward Okta, and an XAA arrow from Cursor to Figma.
Cursor and Figma connect to Okta through SSO, with XAA linking Cursor to Figma.
6:376:43
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

6:37 · section reference included

One Okta login, then Figma is connected

The demonstration starts in ordinary Claude Code with a configured Figma MCP server that still needs authentication. Connecting it would lead to the familiar consent flow. Galow then switches to a separate, explicitly beta, XAA-compatible version of Claude Code. Its connection to his Okta environment is already configured. He logs into Okta, starts Claude Code, and opens the MCP server list: Figma is connected without a separate consent click.

The visible difference is small because the purpose is to remove an interaction. Instead of individually authorizing each configured service, the user completes the enterprise login and the client obtains the permitted connections behind the scenes. Galow extends the same pattern from Figma to a list of MCP servers. The automatic connection is the demonstrated result; the credential exchanges explain how it happens.

7:367:55
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

7:36 · section reference included

The exchanges behind the automatic connection

The flow has four actors, with Figma’s authorization server separated from its resource server:

ActorResponsibility
Claude CodeRequest credentials and call MCP tools
OktaAuthenticate the user and authorize cross-app requests
Figma authorization serverValidate the grant and issue an access token
Figma MCP resource serverServe requests authenticated with that access token

The resource server is the API the client wants to use. The authorization server is the system that decides whether to issue credentials for it; those are distinct responsibilities even when the same company operates both.

The first three steps establish access:

  1. Sign into the IdP. In the demonstrated flow, Okta returns an ID token and a refresh token, which Claude Code retains.
  2. Request an ID-JAG. An Identity Assertion JWT Authorization Grant is an IdP-issued assertion used to obtain access at another service. In Galow’s walkthrough, Claude Code uses its refresh token to request a grant for Figma. Okta checks both the user’s membership in the applications and the policy permitting Claude Code to request access to Figma.
  3. Exchange the grant at Figma. Claude Code sends the ID-JAG to Figma’s authorization server. Figma validates it through its existing trust relationship with Okta, then issues an access token.

The Identity Assertion Authorization Grant draft describes the protocol family behind this exchange; the beta demonstration uses the refresh-token path Galow narrates.

At the shell level, the grant-to-access-token exchange is a form-encoded request that exchanges the ID-JAG for an access token. With FIGMA_TOKEN_ENDPOINT set to the target authorization server’s token endpoint and ID_JAG holding the issued assertion, its core request fields look like this:

bash

curl --fail-with-body \
  --request POST "$FIGMA_TOKEN_ENDPOINT" \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer' \
  --data-urlencode "assertion=$ID_JAG"

The client also needs whatever client authentication its registration requires. The key boundary is that the ID-JAG goes to the authorization server, which validates it before issuing the resource credential.

The fourth step is ordinary MCP access: Claude Code sends requests using the OAuth access token Figma issued. XAA changes how the client obtains the credential, not the credential type the MCP resource server receives. Figma then returns the requested responses through the normal MCP interaction.

9:369:54
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

9:36 · section reference included

Silent renewal creates a revocation boundary

After the initial enterprise login, ID-JAG issuance and the exchange at Figma are invisible to the user. IT policy determines how often the user must authenticate interactively to the IdP; Galow gives daily and weekly login policies as examples. That interactive schedule is separate from the lifetime of a resource access token.

Galow uses a five-minute access token to illustrate renewal: after it expires, the client repeats ID-JAG issuance and exchange without asking the user to approve another connection. Five minutes is the example here, not an established lifetime for the demonstrated Figma token or a requirement of XAA.

As long as the SSO session remains active and policy permits access, the client can keep obtaining new grants and exchanging them for access tokens. If IT removes access or locks the Okta session, renewal fails. An already-issued access token can remain usable until it expires; central revocation prevents the next successful renewal. This brings continuing access back under the IdP’s control without making every short token lifetime another user interruption.

11:5412:04
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

11:54 · section reference included

Authorize the application relationship

For administrators, setup begins with the SSO applications the company already has: Cursor or Claude Code, plus Figma. In Okta’s managed connections interface, the administrator permits one application to request access to another. Galow’s example allows Cursor to request access to Figma. When Cursor asks for a Figma ID-JAG, Okta can check that source-to-target policy before issuing it. The user must still belong to both applications; the connection policy does not replace application membership.

Slide titled “What does IT need to do?” showing the Figma XAA administration page, its Manage Connections tab, and a Cursor XAA Demo entry.
The Figma XAA application’s Manage Connections view lists Cursor XAA Demo.
13:0613:13
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

13:06 · section reference included

What clients and servers must implement

An MCP client needs an XAA-compatible SSO connection, with XAA enabled on the customer’s IdP connection. It must request an ID-JAG from that IdP, exchange the grant at the target authorization server, and then use the returned access token for ordinary MCP requests. Galow describes IdP support as new and still developing. He says WorkOS implements the SSO, grant-request, and exchange stages for client builders, and identifies Cursor and Anthropic as using that support through their WorkOS SSO connections.

For a company exposing an MCP server, the new work sits primarily in its authorization server:

  1. Advertise support for the ID-JAG flow. Clients need to discover that the authorization server accepts the grant used by the ID-JAG flow.
  2. Accept the assertion. Receive the ID-JAG through the token exchange request.
  3. Validate it against the trusted IdP. Verify the signed JWT and its intended use using the relevant identity-provider trust information. Merely decoding a JWT is not validation.
  4. Issue the access token. Only after successful validation should the authorization server return the ordinary credential used at the MCP resource server.

Galow describes verification as the familiar signed-JWT validation problem. His overview ends at this implementation boundary, directing builders to the specification and a technical blog for the detailed contract; he also suggests using Claude to help unpack the IETF terminology.

14:1614:25
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

14:16 · section reference included

Authentication does not settle every permission question

The first audience question asks whether the flow also solves authorization—for example, choosing among Figma token scopes. In the demonstrated experience, the user connects as themselves and retains the permissions Figma gives that user. Galow describes IdP-imposed permission caveats as further work under discussion. That limitation should be read as a boundary of the experience he presents: the historical draft already includes optional scope requests and IdP policy evaluation, so it is too broad to conclude that scopes are absent from the protocol altogether. The demo does not establish fine-grained Figma permission controls.

The next question is how a client knows which application to request inside Okta. Galow uses mcp.figma.com as a simplified audience example: the client knows the service it wants, and Okta maps that target to its Figma application. In the draft’s more precise terminology, audience identifies the resource authorization server by its issuer URL; a separate optional resource parameter identifies the protected resource. Implementations should preserve that distinction rather than automatically substituting an MCP hostname for the authorization-server audience.

Asked whether audience selection could be used to manipulate scopes, Galow says he does not think so. The audience selects the intended recipient; it does not itself define a permission set. Okta must recognize the target application, and Figma must validate the assertion for its intended audience through the trusted Okta relationship. Selecting a target is not a substitute for permission checks.

17:0017:14
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

17:00 · section reference included

The remaining integration work

Asked about Microsoft Entra, Galow says it does not yet support XAA and that WorkOS is working with Microsoft on adoption. His availability report at the talk is Okta-only, with OIDC connections supported and SAML support planned. He describes a refresh token, ID token, or SAML assertion as possible proofs of the user’s application session; that initial proof is the part tied to the SSO connection type. Current Okta XAA documentation also describes SAML requesting applications, so the OIDC-only statement belongs to the recording’s deployment context.

An attendee then describes an Entra integration in which Claude Code, Codex, and Claude Desktop behave differently around resource parameters and scopes. They identify the flow as single sign-on and cite RFC 9728, OAuth 2.0 Protected Resource Metadata, while reporting that Entra rejects a resource/scope mismatch. RFC 9728 defines protected-resource discovery and identifier validation; it does not impose a general rule that resource and scope strings must be identical.

Galow does not diagnose that integration onstage. He confirms the governing constraint: requested OIDC scopes must fit what the server permits, and a mismatch must not cause the server to grant unauthorized scopes. The detailed client differences are left for an after-talk discussion, with no concrete fix established.

The attendee adds a registration problem: Entra lacks Dynamic Client Registration in their setup, leading them to use a proxy that recognizes incoming clients and adjusts headers before forwarding requests. Galow treats this as part of the ecosystem’s uneven protocol support. He describes DCR as widely supported among MCP clients and servers, but says an unsupported combination requires preregistering the client.

He closes with Client ID Metadata Documents, or CIMD, as a newer approach: clients publish their metadata upfront rather than requiring a new registration record each time. The November 2025 MCP authorization specification recommends this approach while retaining DCR and preregistration.

Registration approachHow the client is known
PreregistrationA client registration exists before connection
Dynamic Client RegistrationThe client registers programmatically
Client ID Metadata DocumentsThe server retrieves published client metadata

Galow presents CIMD as a better experience with less ecosystem support at the time, describing it as only a few months old. Its introduction does not remove DCR or make existing integrations interoperable automatically. XAA can eliminate repeated consent through shared enterprise trust, while discovery, scope handling, and client registration still require agreement between the systems on both ends.

19:1919:24
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

19:19 · section reference included

Resources

From the talk

Updates since the talk

Read the complete timestamped transcript
  1. 0:00

    [upbeat music] All right.

  2. 0:15

    Good morning, everybody. Thank you for coming to this talk. Hopefully, your morning was eventful. I caught a little bit of the keynote. I wasn't able to catch all of it, but it was pretty good.

  3. 0:24

    Um, my name's Garrett Galow. Today, I'm gonna be talking about One Login to Rule Them All, uh, or Cross-App Access for MCP, in case you haven't heard about that.

  4. 0:34

    A quick intro about myself. Uh, I run Product at WorkOS. I've been building enterprise developer platforms for the past almost fifteen years. Uh, originally at Microsoft Azure, then at Cloudflare for a long time, and now at WorkOS.

  5. 0:49

    If you haven't heard of WorkOS before, we make your app and also your agents enterprise-ready. Uh, we power auth for the likes of Anthropic, Cursor, OpenAI. So if you've ever logged into Cursor, for example, whether that was with username/password or, like, an enterprise IdP, you've used WorkOS.

  6. 1:08

    Um, today I'm gonna be talking about, uh, MCP and s- sign-in through things like Anthropic and Cursor. Um,

  7. 1:17

    but first, uh, if you've used MCP at all extensively, you know that it means consent screens on top of consent screens on top of consent screens. Who here uses MCP servers on the regular?

  8. 1:28

    Okay. Most of you. Um, if you haven't kind of experienced this before, uh, here is, uh, Cursor, which I have set up. Uh, and if you wanna use MCP servers with Cursor, you know, you add them in, you have the little config file, and then in each one of these, if you wanna use it, you have to

  9. 1:45

    connect. It'll pop up this window. You have this nice little consent screen that you're not gonna read. You're just gonna say okay, and you're gonna get redirected back. And you need to do this for every single tool, which is frankly pretty annoying.

  10. 2:00

    And sometimes you have to do this again. You don't really know why sometimes you have to do this again. Sometimes it seems to forget that you've already done this.

  11. 2:07

    Um, yeah, and so this is, like, a thing you have to do, uh, every time you wanna use, uh, these MCP servers. And, uh, that's not fun. But it's-- in, in a company with a lot of developers, it's not just, you know, one person's inconvenience.

  12. 2:23

    Uh, as a user, you might log into a half dozen or a dozen MCP servers, um, but when you combine that together across your team, you basically have dozens and dozens of people spending all this time managing all these consent screens, clicking these buttons, uh, without really caring why they have to do this.

  13. 2:40

    Now, this is a relic of a lot of the technology that MCP decides to use. It uses OAuth as the underlying, uh, authentication layer. And so, uh, the way OAuth was kind of invented around was this thing of, like, you don't tr-- you know, these two systems don't trust each other, so you have to, like, provide this

  14. 2:53

    consent to say, "Yes, Cursor can have access to my Figma account. Yes, Cursor can have access to my Notion account." Um, but the reality is that's not really how, uh, you know, things operate today.

  15. 3:05

    That's not how companies operate. Um, you know, we have a thing called single sign-on. Most people are using it. If you have a company, you're logging in through something like an Okta or Microsoft Entra, one of these systems.

  16. 3:17

    Um, and that's sort of, you know, that idea of, like, one login, sign into all those applications worked great. But MCP breaks this model, right? It sort of assumes that, uh, you know, none of these apps know anything about each other.

  17. 3:29

    There's no way to know that you're the same person, that, you know, you should have access to these systems. And so you have to go through these flows over and over and over and over again.

  18. 3:38

    Now, that is really annoying, um, and maybe that unto itself is a problem worth solving, but, you know, humans will tolerate a lot of annoyances if they get value out of it.

  19. 3:47

    The real problem comes in, um, for the IT team. Like, the people managing all these applications, uh, MCP's not-- doesn't work the way that they want it to work.

  20. 3:59

    You know, IT can't really tell, like, what MCP service you may or may not be using. You're connecting to these arbitrary things. You're not necessarily going through that IdP to connect to them, um, which is problematic.

  21. 4:11

    They basically can't determine, uh, you know, which AI agents you can actually use, right? Uh, in theory, you can take any arbitrary MCP client. You know, that might be a Cursor, but you could be using, um, sort of like a DeepSeek or some of these other tools that maybe your IT team doesn't want you to use, and,

  22. 4:29

    um, you're granting access to these sensitive systems, right? You know, you have lots of data in things like Figma or Notion that, you know, IT maybe doesn't want any a-- you know, any AI agent to get access to.

  23. 4:41

    The other thing is actual access and security. Um, I don't know how many people heard about the npm axios package getting popped about a week ago. Uh, unfortunately, I was, uh, hit by that.

  24. 4:53

    I'm still not exactly sure what npm package thing I used that had that dependency. But, uh, you know, our IT team, you know, became aware of that problem. They were able to detect that, you know, my machine had been compromised.

  25. 5:06

    They were able to cut off network access to my machine. They could invalidate my Okta sessions across all the applications, so they could help secure, uh, you know, my, my account and our company data.

  26. 5:17

    But, you know, in my local machine, I had MCP servers connected. I had, like, API keys that I was using for certain things. Like, that's the real-- We had to go through and do all this-- You know, I was looking through my laptop seeing, like, what had I connected to?

  27. 5:28

    What services might I have some sort of other credential not driven from the IdP that, you know, is at risk of being leaked? How do we go revoke that?

  28. 5:36

    How do we ensure that, you know, my system's safe?

  29. 5:40

    Uh, MCP today using OAuth, you know, if something happens like that or, you know, you leave a company, and IT might revoke your, you know, single sign-on through your IdP to those applications, you still have these access tokens, these refresh tokens even in most cases, that give you standing access to these services.

  30. 5:57

    That means you might have access for, uh, days or weeks or even months. Um, you know, many companies don't use things like SCIM, which allows you to revoke that access fully, but, you know, and so that means that

  31. 6:09

    Uh, you have this, like, lasting access problem that IT doesn't have any visibility over. And then, again, every time someone's onboarding to the team, they have to go through this whole thing where, uh, IT might be able to, like, automatically set up the MCP servers you're using in something like Cursor or Claude, um, but you still need

  32. 6:25

    to go through all this authentication, um, and manage all these connections yourself. So, um, obviously, this isn't great. So what are we doing about it, right? What's the solution to this?

  33. 6:37

    The solution is Cross-App Access, otherwise known as XAA.

  34. 6:43

    XAA is basically a way in which the identity provider can act as a stand-in, a trust provider between applications. So

  35. 6:51

    let's say the example of, I have Cursor, that's my MCP client. Uh, Figma is the MCP server I wanna connect to. And then Okta is the IdP that we use at our company for logging into things.

  36. 7:03

    So both Cursor and Figma already have this trust relationship with Okta, right? To log into Cursor, I go through Okta. To log into Figma, I go through Okta. So both of these applications know about, you know, workos.okta.com.

  37. 7:17

    They know about me as a person that has access to these applications. What Cross-App Access does, it helps bridge the gap between Cursor and Figma by providing a way for Cursor to talk to Figma.

  38. 7:27

    They can both depend on that trust reliance on Okta, and they can get credentials issued without manual or human intervention.

  39. 7:36

    So let me show you a little bit what that looks like. So I'm going to flip over to, uh, my terminal and make it bigger and more visible. So, uh, here on the left, on this tab, I have just, like, regular Claude Code set up and, you know, if I check my MCP servers, uh, you know, I've

  40. 7:55

    connected the Figma server here. Obviously, it needs authentication. I could go through that. You know, it's gonna present a consent screen. Um, that's kind of the standard flow.

  41. 8:05

    Uh, in this window over here, uh, we have a version of Claude Code that is XAA compatible. It basically implemented XAA here. So, um, the first thing I do just to kinda show, uh, since this is sort of like a, a beta implementation of this,

  42. 8:22

    um, I can basically say, like, I have configured inside of Claude Code, um, this connection to my Okta environment, and the first thing I'm going to do

  43. 8:32

    here is I'm going to log in. And so this is doing an Okta login. I'm gonna log into my Okta environment. You know, this is a thing you need to do one time in order to, uh, if you were, you know, setting up Claude for the first time, you'd be logging into Okta.

  44. 8:52

    Okay, that's all done now. Um, and then now if I start up Claude,

  45. 9:00

    and I look at my MCP servers, we'll notice here that Figma is automatically connected. Let me try and make that a little bit bigger.

  46. 9:08

    And so I didn't have to do-- I didn't have to click anything. I didn't have to see a consent screen. Uh, Figma's automatically connected, and now, you know, whether it's Figma or a list of MCP servers, I can do all of that.

  47. 9:20

    I know that kinda seems like magic. I didn't actually have to click anything. Did I actually do anything? Promise I did. Let me kinda talk a little bit about what's actually happening behind the scenes.

  48. 9:28

    The whole point of this is you don't have to do anything, right? So it doesn't-- It appears as like it's sort of automatic. But, uh, here's how it works.

  49. 9:36

    So in this, uh, situation, we basically have four systems, the client, which in that case was Claude Code I was using; the identity provider, which is Okta; the resource authorization server, uh, which is in this case managed by Figma, but we're separating it from the resource server, which is the Figma API.

  50. 9:54

    Um, if you're not familiar in MCP, you'll have the resource server, which is like your MCP server. It will call out to a separate place to do authorization and issue tokens.

  51. 10:03

    So in the case, the first thing I did, I did that Okta login, right? So the user goes through SSO to the IdP,

  52. 10:09

    and that issues back an ID token and refresh token. So in this case, Claude holds onto those tokens, and it's able to use that in the next step to, uh, to ask for what's called a, uh, ID-JAG token.

  53. 10:23

    So ID-JAG is, uh, happens to be the name of the spec that, that all this technology is built off of. Stands for Identity JWT Authorization Grant. It's a very big mouthful.

  54. 10:35

    Effectively, it just means a token issued by an IdP that can be used across services to, uh, manage access. So the client goes back to the IdP and says, "Hey, I have this refresh token for Garrett.

  55. 10:47

    Would you please give me this ID-JAG token that will work with Figma?"

  56. 10:52

    Uh, Okta basically knows about Claude, knows about Figma. It can check, "Hey, is Garrett a member of both of these applications? Uh, am I allowed to do this? Is-- Am I allowed to issue tokens for Claude on behalf of Figma?"

  57. 11:05

    The answer is yes. Okta will send back this ID-JAG token to Claude Code.

  58. 11:11

    Then Claude sends that to Figma, in this case, Figma's authorization server. Says, "Hey, I have this ID-JAG token for Garrett from the WorkOS Okta instance. Could you please validate this and provide me back a token?"

  59. 11:24

    Figma, because it has this relationship with Okta, goes through, verifies the ID-JAG. Once that's verified and correct, it is then able to issue this access token back to Claude Code.

  60. 11:35

    And at that point, uh, step four here is the regular MCP auth flow. So it just starts talking to the MCP server. It's using a regular OAuth access token.

  61. 11:44

    It's not a new type of credential. And then, you know, now I can talk to the MCP server. Figma will issue responses, and we're off to the races. Uh, a few things that are important here.

  62. 11:54

    Uh, steps two and three here are totally invisible to the user, right? Once I've logged into the IdP, which I don't have to do that very often, you know, that can be, you know, once a day.

  63. 12:04

    It's kind of up to the IT, you know, your company's policies. Maybe that's once a day, maybe that's once a week. Once you've done that login, you don't have to do that again.

  64. 12:12

    Steps two and three are done behind the scenes. Uh, and then step four is just the regular access token request that you're doing to the MCP server.

  65. 12:20

    The other thing around this is, uh, in the case of this access token that's being issued, uh, that could be very short-lived. So m- most applications issue access tokens around five minutes.

  66. 12:32

    Um, and so what happens is, that token will expire after five minutes, but you don't need the human to do anything. You can basically rerun this ID-JAG flow plus the exchange and get a new access token as needed.

  67. 12:45

    And so as long as your SSO session is active, you can keep getting these ID-JAG tokens and exchanging them for access tokens. And so you actually have a better security posture where if something happens, and, you know, my access is removed for some reason, or my session is locked with Okta, once that access token expires, I won't

  68. 13:01

    be able to get back in. I won't be able to reconnect to that MCP server.

  69. 13:06

    And so I wanna go a little bit through, um, you know, what does this look like on the setup side? Like, what does your IT admin need to do?

  70. 13:13

    If you're running an MCP client, what do you need to do? If you're running an MCP server, what do you need to do? On the IT side, it's actually pretty straightforward, right?

  71. 13:20

    Uh, you're already gonna have a, like, Claude Code or Cursor Okta application created. You're already gonna have the Fid-- Figma SSO application created, right? Those will be existing things that your company already has.

  72. 13:31

    Inside of a system like Okta, there's this new kind of managed connections portal, where you basically come in and say, "Hey, which app do I wanna grant the ability to request access to this other app?"

  73. 13:40

    So in this case, uh, we're saying Cursor can request access to Figma. Uh, and that policy means that when if Cursor comes knocking and says, "Hey, Okta, can I have an ID-JAG token for Figma?"

  74. 13:53

    Part of its request is which system does it want access to. Okta can verify that and say, "Yes. Actually, uh, Cursor is allowed to request this access out of Figma," and will issue that token.

  75. 14:04

    So that's all, all you really have to do on the IT side. Once you've done that, everything else is as normal. Like, you know, the user must belong to both applications.

  76. 14:11

    You're kind of doing the same kind of management policy as you normally do.

  77. 14:16

    On the MCP client, so this would be your Claude Code, your Cursor, or if you're building kind of your own MCP client, there's a handful of things you need to do.

  78. 14:25

    One, you need to have an SSO connection that's XAA compatible. So, you know, in general, if you're supporting SSO in your application or your client, that's kind of the standard fare.

  79. 14:34

    Um, XAA support is relatively new, so Cur-- uh, Okta does support it, but with some caveats. Um, they're working through those. We're working with other industry partners like Microsoft to have them support this as well.

  80. 14:46

    But you need that, and that customer's, uh, IdP connection would need to be XAA compatib-- enabled. Uh, your client requests this ID-JAG token from the ID, uh, identity provider.

  81. 14:57

    You get that token back. You need to make that exchange request to the MCP server, so you need to, uh, support, uh, that token flow. And then once that's done, number four is your standard just talk to an MCP server.

  82. 15:08

    So nothing new there. Uh, we've built support as someone who, you know, we provide authentication services for c-- for our customers. We've built support for one, two, and three here, so we can handle, if you're building an MCP client, we can handle all of that flow.

  83. 15:21

    Um, we're actually the way in which, you know, Cursor and Anthropic are doing this because they use us for their SSO connections.

  84. 15:29

    On the MCP server side, which is probably more relevant to most folks, is, like, you might be, you know, your company might have an MCP server you want your customers to use.

  85. 15:37

    There's also some stuff you need to do to support it on your side.

  86. 15:41

    The first is there's this new, um, JWT bearer type that you need to support. Um, so this is basically, like, announcing that you now support, uh, this ID-JAG flow and that you'll accept these kinds of tokens.

  87. 15:52

    Then obviously, like, MCP clients are going to send you those tokens. You need to accept them, uh, and then you need to verify them. So there's a step where you go to the, uh, identity provider, the Okta URL, and say, like, "Hey, is this a valid token?"

  88. 16:04

    It's basically this kind of assigned JWT, kinda like how you'd validate a JWT in any other context. You're doing the same thing here. And then last, uh, which should be kinda the normal thing, is issue the access token, right?

  89. 16:15

    So you validated everything, now you wanna give them an access token.

  90. 16:22

    If you'd like to learn more about how this works, I'd, you know, kind of treated this as, like, a high-level overview. Obviously, like, there's a whole spec defining ID-JAG and the specifics around how it should work.

  91. 16:32

    Uh, that's an exercise I leave to you, the reader, if you wanna go explore the spec. Um, I will say, like, Claude is very good at explaining the spec, so that might be an easier way to get introduced to it without having to go read, you know, uh, IETF nomenclature.

  92. 16:45

    Um, but here we have a blog post kind of outlining all the details around ID-JAG, how does it work, um, a lot more of the technical aspects of it if you're ever interested.

  93. 16:53

    Um, so yeah, you can check that out to learn more. And with that, uh, happy to answer any questions people have.

  94. 16:59

    Yeah.

  95. 17:00

    Uh, so this might, uh, this might solve the authentication problem, but does it also solve the authorization problem? Let's say for Figma, you've got, like, different token scopes. Does that also solve the authorization bit as well?

  96. 17:14

    Yeah. Uh, so just so y-- I'm gonna repeat questions so that people on the recording can hear it. The question is, this solves authentication, not authorization. Does this do anything to, to help with that?

  97. 17:22

    Um, by default, no. Uh, so this is pu-- kind of just around the authentication bit. Um, this is still, you know, you're logging into Figma, uh, as yourself. You know, so you're getting the permissions that you have, uh, with Figma.

  98. 17:36

    Um, one of the things we're kind of talking about is, like, okay, how do you extend this to be able to, um, define, like, scoped access? So maybe, uh, you know, Okta's saying, "Yes, I'm-- I will grant this cross- cross-app access, but there's caveats alongside, like, the permissions I'm gonna grant."

  99. 17:51

    That's not something that's, like, part of the spec today. Um, but obviously, like, something that's important that we need to consider.

  100. 17:56

    Thank you.

  101. 17:59

    Uh, I'm gonna ask the same question, but a second part to it.

  102. 18:01

    Yeah.

  103. 18:01

    Um, how does the, uh, MCP client know which app to go for inside Okta?

  104. 18:11

    The question, how does the MCP client know- The app it's requesting access for in Okta? Uh, the answer is basically like an audience URL. So you would use, um, in this case it's like, you know, mcp.figma.com, you know, is the, the, uh, Figma's MCP server.

  105. 18:28

    That audience will be known inside of Okta. And so, uh, your cursor will request to your Okta and say, "Hey, here's the audience I'm looking for." Um, that's configured inside of Okta to say like, the Figma app covers this audience, and then that's how it's checking the access request.

  106. 18:45

    So-

  107. 18:46

    But would you be able to use that to hack scopes?

  108. 18:49

    Um, no, I don't think you could use it to hack scopes 'cause it's, it's just audience, which is kind of like a standard OAuth parlance. So, um, yeah, that's the thing that like, uh, cursor knows the audience that it's trying to get based on the MCP server.

  109. 19:04

    Okta is configured to know for this app that's the audience that it controls, and then obviously, you know, Figma knows its own audience and is, and is checking, uh, you know, the validity of the JWT with, with Okta.

  110. 19:17

    Cool. Yeah.

  111. 19:19

    Do you support, uh, Azure?

  112. 19:23

    Um-

  113. 19:24

    Entra?

  114. 19:24

    Yeah, yeah, yeah. It's Entra-supported. Uh, Microsoft doesn't-- hasn't yet added XAA support inside of Entra. Um,

  115. 19:33

    that's something we're working with them on. If you have connections, push, uh, 'cause we wanna get this adopted more broadly. Um, yeah, kind of more generally, uh, today with Okta, this is supported for OIDC-based connections.

  116. 19:47

    Um, they're, they're gonna support this for SAML-based connections as well. Um, kind of the spec defines that you-- whatever you send to the IdP, it's either a refresh token, ID token, or a SAML assertion, so kind of just something that proves that you have an, you know, the user has a session in your app.

  117. 20:02

    Um, that's the only part that's cares about the type of SSL connection you have. But yeah, right now it's just Okta. Hopefully that will be more soon.

  118. 20:10

    Okay. So, so there is no Entra at the moment?

  119. 20:12

    No. They don't support it yet.

  120. 20:14

    Okay. So can I follow up with-

  121. 20:16

    Sure

  122. 20:17

    ... so with Microsoft, I ran into various client protocol fragmentation.

  123. 20:25

    Okay.

  124. 20:25

    Um, there was a resource parameter problem where Claude Code sends the resource, um, Entra validates, but it has to match the scope. Um, the way Codex does it is completely different.

  125. 20:39

    The way Claude Desktop does it is not the same either.

  126. 20:43

    Sorry, this is to... What part of the flow is this? Or what-- When Cursor or Claude is talking to, uh, Microsoft here, is that for like single sign-on or is that for talk-

  127. 20:56

    For single sign-on.

  128. 20:57

    Okay.

  129. 20:59

    So there's an RFC 9728. When, when, when it does the initial discovery-

  130. 21:06

    Yeah

  131. 21:06

    ... um, the resource, the resource and the scope have to match, otherwise Entra rejects it.

  132. 21:14

    Yes.

  133. 21:16

    And different protocols have-- need, need a set of different-

  134. 21:20

    Yeah. I'd have to maybe-- And we can-- I can talk to you after on this one. It's a little in the weeds. Yeah, I mean, uh,

  135. 21:26

    if it's like a OIDC-based connection, then yeah, the scopes that the client is requesting need to match-

  136. 21:33

    Yeah

  137. 21:33

    ... what the server will allow.

  138. 21:35

    Yeah.

  139. 21:35

    And if there's a mismatch there, there's kinda different ways you can handle it.

  140. 21:38

    Yeah.

  141. 21:38

    But, like, you shouldn't grant obviously scopes that weren't, you know, allowed. Um, so that might be. We can talk about it. I can see, uh, if that's the issue.

  142. 21:46

    Where, where Entra doesn't support DCR.

  143. 21:50

    Mm. Yeah.

  144. 21:51

    So you have to set up a proxy that now needs to be aware of which client is coming in to, um, tweak a few headers before sending it across to Entra.

  145. 22:00

    I wonder if, like- [coughs] ...

  146. 22:02

    Yeah. Uh, the question was Entra doesn't support DCR, so that creates issues. Yeah. That's, um,

  147. 22:08

    uh, kinda I think a general problem in the wild is, you know, which clients and which servers support all the, you know, as the MCP spec develops. Um, so I would say like most clients and servers support DCR at this point, but obviously not everyone does, and there's not a lot you can really do if, uh, you

  148. 22:25

    know, one doesn't support it. You have to like, you know, go reg-- you know, in the case if it's not DCR, you have to go pre-register that client. Um, you know, CIMD is like the new standard that kind of supersedes, uh, DCR.

  149. 22:36

    It's, um, a command or... I actually forgot what the CI stands for. It's meta-- It's like a metadata document that defines clients up front, so you don't have to create the clients every time.

  150. 22:47

    Um, but that one has even less broad support in the ecosystem 'cause it's, you know, it's like three months old. Um, but it is like a better experience. So yeah, there's still a little bit of, um, catch-up in the ecosystem to, you know, uh, supporting like the latest spec.

  151. 23:01

    I'll, I'll catch up.

  152. 23:01

    Cool. Yeah. Great. Well, thanks everyone for your time. Have a great rest of the conference. [clapping] [outro jingle]