The security fix you have to switch on
The official MCP Python SDK fixed three flaws in one release. Two of them close when you upgrade. The third, the one that decides whether your server accepts somebody else's token, ships switched off, and every dependency scanner will report you patched.
The official Python SDK for Model Context Protocol published three advisories on the same day, one fix release on each of its two branches, and a sentence that should change how you read every changelog: upgrading alone changes nothing. It sits under the one flaw of the three that guards the front door of an MCP server.
Three decisions nobody made
Read the three side by side and the bugs are not the interesting part. The interesting part is who decided. A client validating tool results asked a JSON Schema library to resolve references, and the library's default answer was to open whatever URL the server named, including local files. The HTTP transports switched on redirect following for convenience, and a credential header went wherever the redirect pointed. The server's token check was handed to whoever wrote the verifier, and nothing asked that person whether the token was even meant for this server.
None of that is exotic. It is what happens when a protocol's security decisions are made inside an SDK, one library default at a time. You can build on MCP without ever reading the specification. You read the quickstart, and the SDK's defaults become the protocol you actually run.
The server's metadata is an input
The schema flaw deserves its own line, because it inverts the usual picture. We tend to think of a tool's description and schema as configuration, something the client consults. Here the client treated it as instructions to follow: go and fetch this. A malicious server did not need a prompt injection or a confused model. It only needed to declare a tool. Everything a server sends is input, including the parts that look like documentation.
A version number is not a security state
Two of the fixes close when the package moves. The audience fix does not, and for a reason that is defensible: turning it on breaks any verifier that does not report the token's audience, so the maintainers made it opt-in and scheduled the default for the next major release. This is what a server that upgraded and changed nothing gets instead of the check:
`AuthSettings.validate_token_resource` is not set, so bearer tokens are not checked against `resource_server_url`; it will default to True in 3.0 when `resource_server_url` is set.
That is honest, and it is a warning written for a developer reading a console. Your dependency scanner reads version numbers. It will mark the package fixed, the ticket will close, and a server that accepts tokens minted for your other services will keep accepting them. Not because anyone skipped the patch, but because the patch is a setting and nobody owns the setting.
Trust is the attack surface
An SDK feels like plumbing, and plumbing feels safe to inherit. It is the opposite: it is where the trust decisions of a protocol are actually taken, quietly, by defaults. Three of them were wrong this week. Two were corrected for you. One was corrected and left for you to switch on.
What to actually do
- Upgrade the mcp package on every client and server. That closes the redirect and schema flaws with no code change.
- Then open every place you build AuthSettings. Either turn on validate_token_resource and make your verifier return the audience, or confirm your verifier already rejects a token whose aud is not your server. Doing neither leaves the flaw open on the new version.
- Treat a DeprecationWarning from an auth library as a finding. Make warnings visible in CI, and fail the build on the ones that come from security settings.
- Stop following redirects you did not plan for. If a client reached its server through a redirect to another host, point it at the real endpoint and rotate whatever credentials it carried while it was following.
- Read tool schemas as untrusted data. Any code that resolves, renders or acts on what an MCP server declares about itself should behave as if the server were hostile, because sometimes it is.
- Three CVE records assigned by GitHub and published 27 October 2026 against the official MCP Python SDK, PyPI package mcp: CVE-2026-116684 (GHSA-w4fh-qvv9-3v23), CVE-2026-116685 (GHSA-5h93-6whr-6q8j) and CVE-2026-116686 (GHSA-rwrf-2pqf-9j8j). All three are fixed in mcp 1.30.0 and 2.2.0.
- Affected ranges per the advisories: mcp 1.10.0 through 1.29.1 and 2.0.0 through 2.1.1 for CVE-2026-116684 and CVE-2026-116686; mcp 1.8.0 through 1.29.1 and 2.0.0 through 2.1.1 for CVE-2026-116685.
- CVE-2026-116684, server side: bearer authentication configured through AuthSettings with a token_verifier accepts a valid token issued for another service when the authorization server serves several resources and the TokenVerifier does not check the aud claim itself.
- CVE-2026-116685, client side: the Streamable HTTP and SSE client transports, ClientSessionGroup and the OAuth client providers followed redirects to any origin, forwarding custom credential headers and, on 307 or 308, the request body. The advisory states that a lone Authorization bearer header was not exposed, because the HTTP library already drops it on cross-origin redirects, and that a server which is itself malicious gains nothing this way.
- CVE-2026-116686, client side: tool results were validated against the server-declared outputSchema with jsonschema's default resolver, so an unresolved $ref made the client fetch an http, https or file URL. The fetch ran synchronously on the event loop with no timeout, which could stall every session in the process. The advisory states there was no setting that turned this validation off.
- Weakness: CWE-863, incorrect authorization, on CVE-2026-116684. CWE-200, exposure of sensitive information, on CVE-2026-116685. CWE-918, server-side request forgery, on CVE-2026-116686.
- GitHub's score on CVE-2026-116684: CVSS 3.1 base 6.8, high attack complexity, low privileges required, high confidentiality and integrity impact.
- GitHub's score on CVE-2026-116685: CVSS 3.1 base 5.9, high attack complexity, confidentiality impact only.
- GitHub's score on CVE-2026-116686: CVSS 3.1 base 6.5, user interaction required, availability impact only.
- Per the advisories, the fixes for CVE-2026-116685 and CVE-2026-116686 need no code changes. The fix for CVE-2026-116684 does: its advisory states that upgrading alone changes nothing, that the new validate_token_resource setting is off unless set, and that the verifier must also return the token's audience as AccessToken.resource.
- In AuthSettings at the v1.30.0 and v2.2.0 tags, validate_token_resource defaults to None. With resource_server_url set and the field left unset, the SDK emits a DeprecationWarning and behaves as False. The code states that 3.0 makes True the default.
- NVD status on 28 October 2026 for all three: Received, with no NVD score of its own. The CVE records carry no CISA ADP entry.
- Whether any of the three has been exploited. The advisories say nothing about it, and we hold no telemetry: our public sensor is offline.
- How many MCP servers sit behind an authorization server that also issues tokens for other services, which is the condition for CVE-2026-116684. Nobody has published deployment counts.
- How many custom TokenVerifier implementations already check the audience. Those deployments were never exposed, and nothing public tells them apart from the ones that were.
- Whether the other official MCP SDKs share any of these defaults. We have checked only the Python SDK.
- We reproduced none of the three. Everything here rests on the records, the advisories and the AuthSettings source.
- NVD has not analysed the records yet, so every score here is GitHub's alone.
- 01GHSA-w4fh-qvv9-3v23: server bearer-token authentication accepts tokens issued for a different resource server ↗
- 02GHSA-5h93-6whr-6q8j: HTTP client transports followed cross-origin redirects carrying custom headers and bodies ↗
- 03GHSA-rwrf-2pqf-9j8j: client fetched server-chosen $ref URLs while validating tool results ↗
- 04CVE-2026-116684 ↗
- 05CVE-2026-116685 ↗
- 06CVE-2026-116686 ↗
- 07CVE-2026-116684 record ↗
- 08AuthSettings at v1.30.0 ↗
- 09GHSA-w4fh-qvv9-3v23, mirrored ↗
