▲ Independent reporting on the agent economy  ·  editor@gaasnews.com
Sections
HomeWhat is GaaS?PlatformsOrchestrationProtocolsEnterprisePricingFundingLaborSafetyPolicyOpinionGlossaryAboutContact
Home›Protocols›MCP token audience flaw
Protocols

The MCP spec says servers must check who a token was issued for. The official SDKs could not, and the fix is off by default.

Upgrading alone changes nothing, both advisories say. Teams running MCP servers behind a shared login system have a configuration change to make, and a version bump will not make it for them.

AJ
Andrew Jamerson
Founding Editor
Oct 31, 2026 · 4 min read
Connected spheres with lines on dark backgroundPhoto: Connected spheres with lines on dark background. // GaaS News
TL;DR
  • The official MCP Python and TypeScript SDKs accepted bearer tokens issued for other services, under CVE-2026-116684 and CVE-2026-111771, each rated 6.8.
  • The MCP specification says servers "MUST validate" a token's audience. The SDKs' built-in bearer authentication gave developers no way to do it.
  • The fix is opt-in. "Upgrading alone changes nothing," both advisories say.

The Model Context Protocol specification is blunt about tokens: "MCP servers MUST validate that access tokens were issued specifically for them as the intended audience." Two advisories published this month show that the project's own software development kits gave developers no way to do that. According to the Python advisory and its TypeScript counterpart, the SDKs' server-side bearer authentication "had no way to check that a token was issued for your server," so a valid token for another service "was also accepted by your MCP server."

The flaws are tracked as CVE-2026-116684 for Python and CVE-2026-111771 for TypeScript. Maintainers published both on October 5, and they reached the GitHub Advisory Database later in the month. The code shipped earlier: mcp 1.30.0 and 2.2.0 reached PyPI on September 7, and @modelcontextprotocol/sdk 1.32.0 reached npm on October 2.

Who the MCP token flaw affects

The MCP token flaw affects a specific setup, and both advisories spell it out. You are exposed if your HTTP server uses the SDK's bearer authentication, your authorization server also issues tokens for other services, and your token verifier does not check the audience claim itself. That is the arrangement you would expect at a company that puts an internal MCP server behind the same identity provider as everything else. A token minted for some other internal service would open the MCP server too.

Affected Python versions are mcp 1.10.0 through 1.29.1 and 2.0.0 through 2.1.1. On TypeScript the list covers @modelcontextprotocol/sdk 1.6.0 through 1.31.0, @modelcontextprotocol/server 2.0.0 through 2.2.0, @modelcontextprotocol/express 2.0.0 through 2.0.1, and @modelcontextprotocol/server-legacy 2.0.0 through 2.3.0.

Why the MCP fix is off by default

The MCP fix is off by default, and both advisories use the same sentence to say so: "Upgrading alone changes nothing." The Python release adds a validate_token_resource setting "that is off unless you set it." The TypeScript release adds an expectedResource setting "that is off by default." Turning the Python check on means setting the flag, pointing resource_server_url at the audience your authorization server puts in its tokens, and returning that audience from verify_token(). Do only the first part and, the advisory warns, "every request gets 401."

That warning is the likely reason for the opt-in, though neither advisory says so: forcing the check on everyone would lock out servers whose verifiers do not yet return an audience. Python users get a deprecation warning in the meantime, and the setting "will default to True in 3.0." For anyone who cannot upgrade, the advisory offers a workaround that closes the issue on every version: reject any token whose aud claim does not include your server inside verify_token().

The MCP bearer token model carries the weight

The MCP bearer token model is why a moderate-rated bug deserves attention. A bearer token works for whoever holds it, so the audience claim is one of the few things limiting where a leaked or misdirected token can go. We reported in September on SEP-2752, a proposal to add signed requests that would tie each call to its sender. It still sits open without a sponsor, and the last maintainer word on the thread remains that "the working group has made a deliberate choice to standardize on OAuth." That choice puts the weight on implementations getting the OAuth details right, and this was one of those details.

What is not established

What is not established is how many servers fit all three conditions, and neither advisory reports exploitation. An attacker would already need a valid token from the same authorization server. Servers whose verifiers check the audience were never exposed. We did not test any deployment ourselves. NVD had no record for the TypeScript CVE when we looked this week.

What MCP server operators should do

MCP server operators should treat this as a configuration task with a short checklist:

  1. Find every server using the SDK's bearer authentication and check whether its authorization server also issues tokens for other services.
  2. Upgrade, then turn the check on: validate_token_resource in Python, expectedResource in TypeScript.
  3. Test with a token issued for another service and confirm you get a 401.
  4. If you run a gateway in front of MCP servers, enforce the audience there too.

Anyone still catching up on the protocol should read what changed in the 2026-07-28 spec, and our agent protocol explainer covers how MCP and A2A fit together.

AJ

Andrew Jamerson

Founding Editor, GaaS News

Andrew Jamerson is the founding editor of GaaS News, covering the economics of the agent era. He started the publication to cover Agentic AI as a Service as a dedicated beat and edits every article on the site.

Be on the list when the beat breaks

One email when a platform ships, a round closes, or the ground shifts under the software stack.