Is All OAuth The Same For MCP?
None
<p><span data-contrast="auto">There’s a funny saying making the rounds right now: “The S in MCP stands for security.” Of course, there is no S in MCP and that’s kind of the point. Security in the Model Context Protocol ecosystem is still a work in progress, and if you’re <a href="https://securityboulevard.com/2026/03/introducing-the-mcp-security-gateway-the-next-generation-of-agentic-security/" target="_blank" rel="noopener">building with MCP today</a>, you need to understand where the gaps are and what your options look like.</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><p><span data-contrast="auto">In this blog post, we will break down what we’re seeing in the field, the “gotchas” that come up, how to fix them, and how to think about OAuth implementations.</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><h3 aria-level="2"><b><span data-contrast="auto">Two Protocols, One Big Security Hole</span></b><span data-ccp-props='{"134245418":false,"134245529":false,"335559738":360,"335559739":80}'> </span></h3><p><span data-contrast="auto">First, let’s establish the two transport mechanisms for MCP servers:</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><ol><li><span data-contrast="auto">Standard input/output (stdio)</span><span data-ccp-props='{"335559738":240}'> </span></li><li><span data-contrast="auto">Streamable HTTP.</span><span data-ccp-props='{"335559739":240}'> </span></li></ol><p><span data-contrast="auto">When building an MCP Server, it’s essentially no different than installing a third-party package or module locally. If you look underneath the hood, the “tools” you’re calling are really just functions/methods within code that someone wrote, much like any other application stack. The key differentiator is how the tools are accessed.</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><p><span data-contrast="auto">When you run a stdio MCP server, it’s like doing a </span><span data-contrast="none">pip install</span><span data-contrast="auto"> or </span><span data-contrast="none">go get</span><span data-contrast="auto">; you’re pulling down code and running it on your machine. And because of that, aside from standard appsec practices, it’s genuinely difficult to lock down. How do you secure open code running locally on someone’s machine?</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><p><span data-contrast="auto">There are ways to work around this.</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><p><span data-contrast="auto">For example, with kagent, when you deploy an MCP server object in Kubernetes, you get a Kubernetes Service and that service effectively acts like a streamable HTTP endpoint that you can secure.</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><p><span data-contrast="auto">That’s, however, just a “workaround”. When incorporating MCP Servers within your environment, streamable HTTP MCP servers are the goal. They give you an endpoint, and that endpoint gives you a tunnel between Point A (your MCP client or Agent) and Point B (the MCP server) that you can actually secure with your gateway solution that’s built specifically for AI traffic. You can set up prompt guarding, guardrails, and most importantly, authentication/authorization.</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><h3 aria-level="2"><b><span data-contrast="auto">The Servers Aren’t Yours</span></b><span data-ccp-props='{"134245418":false,"134245529":false,"335559738":360,"335559739":80}'> </span></h3><p><span data-contrast="auto">With the information from the previous section, the next big question is, what can you actually verify about the security posture of a given MCP server?</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><p><span data-contrast="auto">Take the GitHub Copilot MCP server as an example. It follows great practices from an authentication perspective (supports OAuth and personal access tokens (PAT), but at the end of the day, that MCP server is sitting in the sky somewhere, and it’s a black box. You don’t have access to the underlying system and it’s not like you can pentest it to make sure it’s secure (unless you have written approval from GitHub, which for security reasons, you won’t get).</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><p><span data-contrast="auto">So when you’re hitting third-party streamable HTTP MCP servers or building your own, the question that keeps coming up across every team, whether it’s DevOps, platform engineering, security, infrastructure, or data science, is the same:</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><ol><li><span data-contrast="auto">How do we secure access to MCP servers?</span><span data-ccp-props='{"335559738":240}'> </span></li><li><span data-contrast="auto">How can we lock down tools that can be used by various people and teams?</span><span data-ccp-props="{}"> </span></li><li><span data-contrast="auto">How can we ensure the AuthN/Z methods we use today (e.g – OIDC-based OAuth) will work at the MCP layer?</span><span data-ccp-props='{"335559739":240}'> </span></li></ol><h3 aria-level="2"><b><span data-contrast="auto">Authentication and Authorization: The Core Challenge</span></b><span data-ccp-props='{"134245418":false,"134245529":false,"335559738":360,"335559739":80}'> </span></h3><p><span data-contrast="auto">This is probably the single biggest question I’m encountering right now. From an authentication and authorization perspective, the concerns break down into:</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><ul><li aria-setsize="-1" data-leveltext="●" data-font="" data-listid="3" data-list-defn-props='{"335552541":1,"335559685":720,"335559991":360,"469769242":[8226],"469777803":"left","469777804":"●","469777815":"multilevel"}' data-aria-posinset="1" data-aria-level="1"><b><span data-contrast="auto">Who is logging in:</span></b><span data-contrast="auto"> Is it you? Is it an agent? Is there some type of token passthrough happening?</span><span data-ccp-props='{"335559738":240}'> </span></li></ul><ul><li aria-setsize="-1" data-leveltext="●" data-font="" data-listid="3" data-list-defn-props='{"335552541":1,"335559685":720,"335559991":360,"469769242":[8226],"469777803":"left","469777804":"●","469777815":"multilevel"}' data-aria-posinset="2" data-aria-level="1"><b><span data-contrast="auto">Is there an on-behalf-of (OBO) flow:</span></b><span data-contrast="auto"> Is something acting on your behalf?</span><span data-ccp-props="{}"> </span></li></ul><ul><li aria-setsize="-1" data-leveltext="●" data-font="" data-listid="3" data-list-defn-props='{"335552541":1,"335559685":720,"335559991":360,"469769242":[8226],"469777803":"left","469777804":"●","469777815":"multilevel"}' data-aria-posinset="3" data-aria-level="1"><b><span data-contrast="auto">What permissions exist?</span></b><span data-contrast="auto"> Once authenticated, what are you or the agent acting for you actually authorized to do?</span><span data-ccp-props='{"335559739":240}'> </span></li></ul><p><span data-contrast="auto">This is where various OAuth implementations can come into play based on what your environment looks like today. OAuth isn’t something that generates access tokens for you; instead, the framework. It defines how a client (whatever you’re using to access the MCP endpoint) can obtain access. Tokens are how it’s done, but the overall purpose is delegated authorization.</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><h3 aria-level="2"><span data-contrast="auto">How OAuth Works</span><span data-ccp-props='{"134245418":true,"134245529":true,"335559738":240,"335559739":240}'> </span></h3><p><span data-contrast="auto">OAuth is a framework that defines how clients (MCP Inspector, VS Code, app, etc.) can obtain delegated access via tokens. These tokens are then used for authorization (proving the client has access to the specific endpoint).</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><p><span data-contrast="auto">Where token creation comes into play is based on how you’re using OAuth. There are several forms of OAuth including OIDC-based (very common), On-Behalf-Of (OBO), Elicitation (the November 2025 spec added URL mode elicitation, which can be used to kick off an OAuth flow to a third-party service), and token exchange (swap a token for a different one – different scope, audience, or subject). The protocol that you’ll primarily see used now is Client ID Metadata Documents (CIMD). The client hosts a public JSON document describing itself, and uses that URL as its “client_id”. The protocol previously used was Dynamic Client Registration, which programmatically registers clients with the authorization server at runtime.</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><p><span data-ccp-props='{"335559738":240,"335559739":240}'> <a href="https://securityboulevard.com/wp-content/uploads/2026/03/Screenshot-2026-03-18-13.28.32.png"><img fetchpriority="high" decoding="async" class="alignnone size-full wp-image-2089727" src="https://securityboulevard.com/wp-content/uploads/2026/03/Screenshot-2026-03-18-13.28.32.png" alt="" width="758" height="621" srcset="https://securityboulevard.com/wp-content/uploads/2026/03/Screenshot-2026-03-18-13.28.32.png 758w, https://securityboulevard.com/wp-content/uploads/2026/03/Screenshot-2026-03-18-13.28.32-300x246.png 300w" sizes="(max-width: 758px) 100vw, 758px"></a></span></p><p><span data-contrast="auto">You may see a combination of these used based on what MCP Server you’re using. For example, as mentioned previously, the GitHub Copilot MCP Server allows for both OAuth and PAT-based auth.</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><h3 aria-level="2"><b><span data-contrast="auto">The Client Compatibility Problem</span></b><span data-ccp-props='{"134245418":false,"134245529":false,"335559738":360,"335559739":80}'> </span></h3><p><span data-contrast="auto">As you’re testing our OAuth, you may use different clients and notice the flow works in one, but not in the other. The client you use may not implement the full authentication spec. This is, in many people’s opinion, one of the most difficult pieces of MCP security to figure out right now.</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><p><span data-contrast="auto">For example, VS Code was one of the first clients to ship CIMD support. You can open VS Code, hit </span><span data-contrast="none">Cmd+Shift+P</span><span data-contrast="auto">, type in MCP, and run through the full OIDC-based OAuth flow. The question then becomes, “Will that same flow work across every client?” MCP Jam, Hoot, MCP Inspector, etc.? The answer is: </span><i><span data-contrast="auto">it depends</span></i><span data-contrast="auto">. From what we’ve seen so far, different clients implement different portions of the spec or may not be fully up to date yet (e.g – using DCR instead of CIMD).</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><p><span data-contrast="auto">The important thing to keep in mind is if your OAuth flow works for one client and doesn’t work for another, it doesn’t mean the OAuth flow is broken. It could just be the client you’re using.</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><p><span data-contrast="auto">Sidenote: As of right now, CIMD, based on the SE-91 spec, is the path forward. If you look it up, Auth0 has an excellent diagram showing the registration flow and how it all works under the hood.</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><h3 aria-level="2"><b><span data-contrast="auto">The Redirect Flow Gotcha</span></b><span data-ccp-props='{"134245418":false,"134245529":false,"335559738":360,"335559739":80}'> </span></h3><p><span data-contrast="auto">The last thing we will leave you with to keep in mind that we see in the field is the redirection flow. OIDC-based OAuth redirect flows work like this: you type in your credentials, a browser opens, you hit “Authorize,” it redirects back to your application, and you’re signed in.</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><p><span data-contrast="auto">The question you need to ask is whether the client you’re using actually supports that flow because logging into a traditional application or endpoint is drastically different from a spec perspective than authenticating to an MCP server. They are totally different specs.</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><p><span data-contrast="auto">Yes, you can do OIDC-based authentication. Yes, you can do token passthrough. Yes, you can do on-behalf-of. But the question remains: does your client have the ability to follow the spec you’re trying to use?</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><p><span data-contrast="auto">For instance, OIDC support isn’t uniform across clients. Some clients may only speak plain OAuth 2.1 and can’t handle the OIDC layer (ID tokens, user info, the </span><span data-contrast="none">.well-known/openid-configuration</span><span data-contrast="auto"> endpoint). You don’t always know how a given client is handling these flows until you test it.</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><h3 aria-level="2"><b><span data-contrast="auto">The Key Takeaway</span></b><span data-ccp-props='{"134245418":false,"134245529":false,"335559738":360,"335559739":80}'> </span></h3><p><span data-contrast="auto">The most important thing we want to leave you with is this:</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><p><b><span data-contrast="auto">Just because your OAuth flow doesn’t work in a particular client does not mean the OAuth flow itself is broken.</span></b><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><p><span data-contrast="auto">It comes down to what parts of the spec are implemented within that client. Before you write off an authentication approach, test it across multiple clients. The flow might work perfectly, you might just be using a client that hasn’t caught up yet.</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><p><span data-contrast="auto">MCP security is evolving fast. Stay close to the spec, test your flows thoroughly, and don’t assume that one client’s limitations reflect the state of the ecosystem as a whole.</span><span data-ccp-props='{"335559738":240,"335559739":240}'> </span></p><div class="spu-placeholder" style="display:none"></div><div class="addtoany_share_save_container addtoany_content addtoany_content_bottom"><div class="a2a_kit a2a_kit_size_20 addtoany_list" data-a2a-url="https://securityboulevard.com/2026/03/is-all-oauth-the-same-for-mcp/" data-a2a-title="Is All OAuth The Same For MCP?"><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fsecurityboulevard.com%2F2026%2F03%2Fis-all-oauth-the-same-for-mcp%2F&linkname=Is%20All%20OAuth%20The%20Same%20For%20MCP%3F" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fsecurityboulevard.com%2F2026%2F03%2Fis-all-oauth-the-same-for-mcp%2F&linkname=Is%20All%20OAuth%20The%20Same%20For%20MCP%3F" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fsecurityboulevard.com%2F2026%2F03%2Fis-all-oauth-the-same-for-mcp%2F&linkname=Is%20All%20OAuth%20The%20Same%20For%20MCP%3F" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=https%3A%2F%2Fsecurityboulevard.com%2F2026%2F03%2Fis-all-oauth-the-same-for-mcp%2F&linkname=Is%20All%20OAuth%20The%20Same%20For%20MCP%3F" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fsecurityboulevard.com%2F2026%2F03%2Fis-all-oauth-the-same-for-mcp%2F&linkname=Is%20All%20OAuth%20The%20Same%20For%20MCP%3F" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share"></a></div></div>