All articles
Security/2026-10-23

The MCP Auth Fix That Ships Turned Off

6 MINUTES READ
Victor Okolie
Victor Okolie
Founder/CEO
mcp-auth-fix-ships-turned-off
Security
SUMMARY

Between 28 September and 15 October 2026 the official MCP SDKs published 13 security advisories. The fix for servers accepting tokens issued for another service is opt-in in both the Python and TypeScript SDKs: upgrading alone changes nothing. Here is what to upgrade to and the two changes that actually turn the check on.

Between 28 September and 15 October 2026, the official Model Context Protocol SDKs published 13 security advisories: six for the Python SDK and seven for the TypeScript SDK. Most are fixed by upgrading. One is not.

If your MCP server uses the SDK's bearer-token authentication, it may accept a token that was issued for a different service. The patched SDKs add a check for this, but the check is off by default in both SDKs. In the Python advisory's words, "Upgrading alone changes nothing."

Insight

If you upgraded your MCP SDK after the October advisories and use its bearer authentication, check two things: that you pass your server's audience to the SDK, and that your token verifier returns the token's audience. Without both, a token minted for another service on the same authorization server still gets in.

What the Bug Is

An OAuth access token says which service it's for in its audience claim (aud). When one authorization server issues tokens for several services (your MCP server, your REST API, an internal dashboard), each token should only work at the service it was issued for.

In affected versions, the SDKs' server-side bearer authentication had no way to check that. A valid token for your REST API was also accepted by your MCP server. Anyone who could get a token for one service could use it at another.

You are affected if all three are true:

  1. Your HTTP MCP server uses the SDK's bearer authentication: AuthSettings(...) with token_verifier= in Python, or requireBearerAuth() / verifyBearerToken() in TypeScript.
  2. Its authorization server also issues tokens for other services.
  3. Your token verifier doesn't check the token's audience itself.

The Fix, Step by Step

Python (mcp)

Advisory GHSA-w4fh-qvv9-3v23, published 5 October.

  1. Upgrade to mcp 1.30.0 or later (1.x), or 2.2.0 or later (2.x).
  2. In AuthSettings, set validate_token_resource=True and set resource_server_url to the audience your authorization server puts in tokens for your server.
  3. Return the token's audience from verify_token() as AccessToken.resource.

Make steps 2 and 3 together. With only step 2, every request gets a 401. If your verifier already checks the audience, set validate_token_resource=False to silence the deprecation warning. The setting becomes True by default in SDK 3.0.

TypeScript (@modelcontextprotocol/*)

Advisory GHSA-rvq5-wwqv-78pq, published 5 October.

  1. Upgrade to @modelcontextprotocol/sdk 1.32.0 or later (1.x). On 2.x: @modelcontextprotocol/server 2.3.0 or later, plus @modelcontextprotocol/express 2.0.2 if you use it, and @modelcontextprotocol/server-legacy 2.3.1.
  2. Pass your server's audience: requireBearerAuth({ verifier, expectedResource: new URL('https://mcp.example.com/mcp') }).
  3. Return the token's audience from verifyAccessToken() as AuthInfo.resource, also a URL.

Again, steps 2 and 3 go together.

Can't upgrade yet? Reject any token whose aud doesn't include your server inside your own verifier. Both advisories say that closes the issue on every version.

The Other Advisories

Most of the rest are fixed by upgrading alone. The TypeScript 1.x line needs 1.32.0 to cover all of them: 1.31.0 fixed only the first auth issue below.

AreaPythonTypeScript
OAuth client could send credentials to an authorization server the MCP server choseGHSA-qx49-fqc8-xw99 (high)GHSA-6qxp-vccf-f47h (high)
Server accepts tokens issued for another service (opt-in fix, above)GHSA-w4fh-qvv9-3v23GHSA-rvq5-wwqv-78pq
HTTP client transports followed cross-origin redirects, re-sending headers and bodiesGHSA-5h93-6whr-6q8jGHSA-6prh-2h8m-c8cw
Unbounded request bodies or batches; memory exhaustionGHSA-fmmv-w9g8-j3gc (high)GHSA-f897-62hf-6gxq, GHSA-46jr-4wx8-v453 (high)
Sessions and isolationGHSA-84m7-p3x7-pcfv: sessions never reclaimed by default (high)GHSA-22jm-h49p-29qw: tasks not tied to their session (high); GHSA-jm63-cq47-j5jp: shared instances delivered one client's messages to another (high)
Client fetched server-chosen $ref URLs while validating tool resultsGHSA-rwrf-2pqf-9j8j—

Patched versions: Python mcp 1.30.0 (1.x) or 2.2.0 (2.x). TypeScript @modelcontextprotocol/sdk 1.32.0 (1.x); on 2.x, server and client 2.3.0, express 2.0.2 and server-legacy 2.3.1.

Why We Can't Score This From Outside

Our scanner checks what an MCP server shows a client that has no credentials. In our study of 3,000 remote MCP endpoints, 29.3% required authentication, and 82.7% of those gave a challenge an agent can follow. That's the front door labelled correctly.

Whether the server then checks a token's audience happens on the server, after a token arrives. A scan without a token can't see it, so the Agent Readiness Score doesn't claim to measure it. It's a question for a code or configuration review.

The new ARS 3.3 check mcp-auth-scope-challenge covers a related, visible piece: whether a server's challenge names the scope a client should request (SEP-835).

What We Did

Our own MCP servers don't use bearer authentication: the hosted Glintbase server is open and anonymous. So the audience bug doesn't affect them. We still moved the scanner app and the @glintbase/mcp package to @modelcontextprotocol/sdk 1.32.1 in our 3.5.0 release, which covers the other TypeScript advisories that applied to us.

Sources

Advisory details as published on GitHub and read on 22–23 October 2026. Disclosure: Glintbase sells agent-readiness scoring.

Scanner Gateway

Run a Free AI Readiness Audit

Identify broken parameter signatures, missing Model Context Protocol schemas, and sitemap issues in your developer documentation.

More blog posts to read