CVE-2026-111771
Model Context Protocol TypeScript SDK: Server bearer authentication accepted tokens issued for another service
The Model Context Protocol TypeScript SDK provides TypeScript client and server implementations of the Model Context Protocol. From 1.6.0 until 1.32.0 in @modelcontextprotocol/sdk, from 2.0.0 until 2.3.0 in @modelcontextprotocol/server, from 2.0.0 until 2.0.2 in @modelcontextprotocol/express, and from 2.0.0 until 2.3.1 in @modelcontextprotocol/server-legacy, server-side bearer authentication could accept a valid access token issued for a different service because the SDK did not enforce the token audience. The affected surface is server-side HTTP bearer authentication. The trigger is a valid token whose audience names another service. The authorization server must issue tokens for multiple services, and the application's verifyAccessToken() must not independently validate aud. Applications already validating aud inside verifyAccessToken() are not affected. An attacker with a token for another service could authenticate to the MCP server and obtain the confidentiality and integrity capabilities granted to an authenticated caller. Upgrading alone leaves the new audience validation disabled. Operators must enable audience validation and provide the token audience together. Enabling only the expected audience check causes every request to receive HTTP 401. This issue is fixed in @modelcontextprotocol/sdk 1.32.0, @modelcontextprotocol/server 2.3.0, @modelcontextprotocol/express 2.0.2, and @modelcontextprotocol/server-legacy 2.3.1.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- High
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- High
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
6.8
Model Context Protocol TypeScript SDK: Server bearer authentication accepted tokens issued for another service
The Model Context Protocol TypeScript SDK provides TypeScript client and server implementations of the Model Context Protocol. From 1.6.0 until 1.32.0 in @modelcontextprotocol/sdk, from 2.0.0 until 2.3.0 in @modelcontextprotocol/server, from 2.0.0 until 2.0.2 in @modelcontextprotocol/express, and from 2.0.0 until 2.3.1 in @modelcontextprotocol/server-legacy, server-side bearer authentication could accept a valid access token issued for a different service because the SDK did not enforce the token audience. The affected surface is server-side HTTP bearer authentication. The trigger is a valid token whose audience names another service. The authorization server must issue tokens for multiple services, and the application's verifyAccessToken() must not independently validate aud. Applications already validating aud inside verifyAccessToken() are not affected. An attacker with a token for another service could authenticate to the MCP server and obtain the confidentiality and integrity capabilities granted to an authenticated caller. Upgrading alone leaves the new audience validation disabled. Operators must enable audience validation and provide the token audience together. Enabling only the expected audience check causes every request to receive HTTP 401. This issue is fixed in @modelcontextprotocol/sdk 1.32.0, @modelcontextprotocol/server 2.3.0, @modelcontextprotocol/express 2.0.2, and @modelcontextprotocol/server-legacy 2.3.1.
- Record
CVE-2026-111771- CVSS 3.1
- 6.8 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N - Weakness
- CWE-863
- Updated
- 2026-11-05
EUVDEUVD-2026-117801
6.8
The Model Context Protocol TypeScript SDK provides TypeScript client and server implementations of the Model Context Protocol. From 1.6.0 until 1.32.0 in @modelcontextprotocol/sdk, from 2.0.0 until 2.3.0 in @modelcontextprotocol/server, from 2.0.0 until 2.0.2 in @modelcontextprotocol/express, and from 2.0.0 until 2.3.1 in @modelcontextprotocol/server-legacy, server-side bearer authentication could accept a valid access token issued for a different service because the SDK did not enforce the token audience. The affected surface is server-side HTTP bearer authentication. The trigger is a valid token whose audience names another service. The authorization server must issue tokens for multiple services, and the application's verifyAccessToken() must not independently validate aud. Applications already validating aud inside verifyAccessToken() are not affected. An attacker with a token for another service could authenticate to the MCP server and obtain the confidentiality and integrity capabilities granted to an authenticated caller. Upgrading alone leaves the new audience validation disabled. Operators must enable audience validation and provide the token audience together. Enabling only the expected audience check causes every request to receive HTTP 401. This issue is fixed in @modelcontextprotocol/sdk 1.32.0, @modelcontextprotocol/server 2.3.0, @modelcontextprotocol/express 2.0.2, and @modelcontextprotocol/server-legacy 2.3.1.
- Record
EUVD-2026-117801- CVSS 3.1
- 6.8 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N - Updated
- 2026-11-05
GitHub AdvisoriesGHSA-rvq5-wwqv-78pq
6.8
MCP TypeScript SDK: Server bearer authentication accepted tokens issued for another service
Summary
In affected versions, the SDK's server-side bearer authentication had no way to check that a token was issued for your server (its audience). Where one authorization server issues tokens for several services, a valid token for another service was also accepted by your MCP server.
Am I affected?
Yes, if your HTTP server uses requireBearerAuth() or verifyBearerToken(), its authorization server also issues tokens for other services, and your verifyAccessToken() does not check the token's audience (aud) itself.
Affected versions:
@modelcontextprotocol/sdk1.6.0 through 1.31.0@modelcontextprotocol/server2.0.0 through 2.2.0@modelcontextprotocol/express2.0.0 through 2.0.1@modelcontextprotocol/server-legacy2.0.0 through 2.3.0
Fix
Upgrade to:
- 1.x:
@modelcontextprotocol/sdk1.32.0 or later - 2.x:
@modelcontextprotocol/server2.3.0 or later, together with@modelcontextprotocol/express2.0.2 or later if you use it @modelcontextprotocol/server-legacy2.3.1 or later
Upgrading alone changes nothing. The patched versions add an expectedResource setting that is off by default. To turn the check on, make both of these changes together:
- Pass the audience your authorization server puts in tokens for your server:
requireBearerAuth({ verifier, expectedResource: new URL('https://mcp.example.com/mcp') }). - Return the token's audience from
verifyAccessToken()asAuthInfo.resource, also aURL.
A token for another service then gets 401. With only the first change, every request gets 401.
If you cannot upgrade yet, reject any token whose aud does not include your server inside verifyAccessToken(). That closes the issue on every version.
- Record
GHSA-rvq5-wwqv-78pq- CVSS 3.1
- 6.8 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N - Weakness
- CWE-863
- Updated
- 2026-11-02
NVD
6.8
The Model Context Protocol TypeScript SDK provides TypeScript client and server implementations of the Model Context Protocol. From 1.6.0 until 1.32.0 in @modelcontextprotocol/sdk, from 2.0.0 until 2.3.0 in @modelcontextprotocol/server, from 2.0.0 until 2.0.2 in @modelcontextprotocol/express, and from 2.0.0 until 2.3.1 in @modelcontextprotocol/server-legacy, server-side bearer authentication could accept a valid access token issued for a different service because the SDK did not enforce the token audience. The affected surface is server-side HTTP bearer authentication. The trigger is a valid token whose audience names another service. The authorization server must issue tokens for multiple services, and the application's verifyAccessToken() must not independently validate aud. Applications already validating aud inside verifyAccessToken() are not affected. An attacker with a token for another service could authenticate to the MCP server and obtain the confidentiality and integrity capabilities granted to an authenticated caller. Upgrading alone leaves the new audience validation disabled. Operators must enable audience validation and provide the token audience together. Enabling only the expected audience check causes every request to receive HTTP 401. This issue is fixed in @modelcontextprotocol/sdk 1.32.0, @modelcontextprotocol/server 2.3.0, @modelcontextprotocol/express 2.0.2, and @modelcontextprotocol/server-legacy 2.3.1.
- Record
CVE-2026-111771- CVSS 3.1
- 6.8 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N - Weakness
- CWE-863
- Updated
- 2026-11-05
OSV
6.8
Model Context Protocol TypeScript SDK: Server bearer authentication accepted tokens issued for another service
The Model Context Protocol TypeScript SDK provides TypeScript client and server implementations of the Model Context Protocol. From 1.6.0 until 1.32.0 in @modelcontextprotocol/sdk, from 2.0.0 until 2.3.0 in @modelcontextprotocol/server, from 2.0.0 until 2.0.2 in @modelcontextprotocol/express, and from 2.0.0 until 2.3.1 in @modelcontextprotocol/server-legacy, server-side bearer authentication could accept a valid access token issued for a different service because the SDK did not enforce the token audience. The affected surface is server-side HTTP bearer authentication. The trigger is a valid token whose audience names another service. The authorization server must issue tokens for multiple services, and the application's verifyAccessToken() must not independently validate aud. Applications already validating aud inside verifyAccessToken() are not affected. An attacker with a token for another service could authenticate to the MCP server and obtain the confidentiality and integrity capabilities granted to an authenticated caller. Upgrading alone leaves the new audience validation disabled. Operators must enable audience validation and provide the token audience together. Enabling only the expected audience check causes every request to receive HTTP 401. This issue is fixed in @modelcontextprotocol/sdk 1.32.0, @modelcontextprotocol/server 2.3.0, @modelcontextprotocol/express 2.0.2, and @modelcontextprotocol/server-legacy 2.3.1.
- Record
CVE-2026-111771- CVSS 3.1
- 6.8 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N - Weakness
- CWE-863
- Updated
- 2026-11-07
OSVGHSA-rvq5-wwqv-78pq
6.8
MCP TypeScript SDK: Server bearer authentication accepted tokens issued for another service
Summary
In affected versions, the SDK's server-side bearer authentication had no way to check that a token was issued for your server (its audience). Where one authorization server issues tokens for several services, a valid token for another service was also accepted by your MCP server.
Am I affected?
Yes, if your HTTP server uses requireBearerAuth() or verifyBearerToken(), its authorization server also issues tokens for other services, and your verifyAccessToken() does not check the token's audience (aud) itself.
Affected versions:
@modelcontextprotocol/sdk1.6.0 through 1.31.0@modelcontextprotocol/server2.0.0 through 2.2.0@modelcontextprotocol/express2.0.0 through 2.0.1@modelcontextprotocol/server-legacy2.0.0 through 2.3.0
Fix
Upgrade to:
- 1.x:
@modelcontextprotocol/sdk1.32.0 or later - 2.x:
@modelcontextprotocol/server2.3.0 or later, together with@modelcontextprotocol/express2.0.2 or later if you use it @modelcontextprotocol/server-legacy2.3.1 or later
Upgrading alone changes nothing. The patched versions add an expectedResource setting that is off by default. To turn the check on, make both of these changes together:
- Pass the audience your authorization server puts in tokens for your server:
requireBearerAuth({ verifier, expectedResource: new URL('https://mcp.example.com/mcp') }). - Return the token's audience from
verifyAccessToken()asAuthInfo.resource, also aURL.
A token for another service then gets 401. With only the first change, every request gets 401.
If you cannot upgrade yet, reject any token whose aud does not include your server inside verifyAccessToken(). That closes the issue on every version.
- Record
GHSA-rvq5-wwqv-78pq- CVSS 3.1
- 6.8 Medium
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N - Weakness
- CWE-863
- Updated
- 2026-11-02
Show 8 moreShow less
OSVCLSA-2026-1793100011 No score
TuxCare security update for @modelcontextprotocol/sdk (3 CVEs)
TuxCare rebuilt @modelcontextprotocol/sdk to address 3 CVEs. Fixed in 1.30.0-tuxcare.2.
- Record
CLSA-2026-1793100011- Updated
- 2026-11-02
OSVCLSA-2026-1793110244 No score
TuxCare security update for @modelcontextprotocol/sdk (1 CVE)
TuxCare rebuilt @modelcontextprotocol/sdk to address 1 CVE. Fixed in 1.29.0-tuxcare.4.
- Record
CLSA-2026-1793110244- Updated
- 2026-11-02
OSVCLSA-2026-1793112043 No score
TuxCare security update for @modelcontextprotocol/sdk (4 CVEs)
TuxCare rebuilt @modelcontextprotocol/sdk to address 4 CVEs. Fixed in 1.25.2-tuxcare.4.
- Record
CLSA-2026-1793112043- Updated
- 2026-11-02
OSVCLSA-2026-1793112371 No score
TuxCare security update for @modelcontextprotocol/sdk (6 CVEs)
TuxCare rebuilt @modelcontextprotocol/sdk to address 6 CVEs. Fixed in 1.13.3-tuxcare.2.
- Record
CLSA-2026-1793112371- Updated
- 2026-11-02
OSVCLSA-2026-1793113170 No score
TuxCare security update for @modelcontextprotocol/sdk (4 CVEs)
TuxCare rebuilt @modelcontextprotocol/sdk to address 4 CVEs. Fixed in 1.24.0-tuxcare.4.
- Record
CLSA-2026-1793113170- Updated
- 2026-11-02
OSVCLSA-2026-1793887845 No score
TuxCare security update for @modelcontextprotocol/sdk (1 CVE)
TuxCare rebuilt @modelcontextprotocol/sdk to address 1 CVE. Fixed in 1.26.0-tuxcare.4.
- Record
CLSA-2026-1793887845- Updated
- 2026-11-06
OSVCLSA-2026-1793887992 No score
TuxCare security update for @modelcontextprotocol/sdk (2 CVEs)
TuxCare rebuilt @modelcontextprotocol/sdk to address 2 CVEs. Fixed in 1.30.1-tuxcare.3.
- Record
CLSA-2026-1793887992- Updated
- 2026-11-06
OSVCLSA-2026-1793887996 No score
TuxCare security update for @modelcontextprotocol/sdk (3 CVEs)
TuxCare rebuilt @modelcontextprotocol/sdk to address 3 CVEs. Fixed in 1.17.3-tuxcare.4.
- Record
CLSA-2026-1793887996- Updated
- 2026-11-06
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
@modelcontextprotocol/sdknpm |
1.6.0 up to 1.32.0 | 1.32.0 |
@modelcontextprotocol/servernpm |
2.0.0 up to 2.3.0 | 2.3.0 |
@modelcontextprotocol/expressnpm |
2.0.0 up to 2.0.2 | 2.0.2 |
@modelcontextprotocol/server-legacynpm |
2.0.0 up to 2.3.1 | 2.3.1 |
@modelcontextprotocol/sdkTuxCare:npm From an advisory covering 3 CVEs |
1.30.0-tuxcare.0 up to 1.30.0-tuxcare.2, plus listed versions 1.30.01.30.0-tuxcare.1 |
1.30.0-tuxcare.2 |
@modelcontextprotocol/sdkTuxCare:npm |
1.29.0-tuxcare.0 up to 1.29.0-tuxcare.4, plus listed versions 1.29.01.29.0-tuxcare.11.29.0-tuxcare.21.29.0-tuxcare.3 |
1.29.0-tuxcare.4 |
@modelcontextprotocol/sdkTuxCare:npm From an advisory covering 4 CVEs |
1.25.2-tuxcare.0 up to 1.25.2-tuxcare.4, plus listed versions 1.25.21.25.2-tuxcare.11.25.2-tuxcare.21.25.2-tuxcare.3 |
1.25.2-tuxcare.4 |
@modelcontextprotocol/sdkTuxCare:npm From an advisory covering 6 CVEs |
1.13.3-tuxcare.0 up to 1.13.3-tuxcare.2, plus listed versions 1.13.31.13.3-tuxcare.1 |
1.13.3-tuxcare.2 |
@modelcontextprotocol/sdkTuxCare:npm From an advisory covering 4 CVEs |
1.24.0-tuxcare.0 up to 1.24.0-tuxcare.4, plus listed versions 1.24.01.24.0-tuxcare.11.24.0-tuxcare.21.24.0-tuxcare.3 |
1.24.0-tuxcare.4 |
@modelcontextprotocol/sdkTuxCare:npm |
1.26.0-tuxcare.0 up to 1.26.0-tuxcare.4, plus listed versions 1.26.01.26.0-tuxcare.11.26.0-tuxcare.21.26.0-tuxcare.3 |
1.26.0-tuxcare.4 |
@modelcontextprotocol/sdkTuxCare:npm From an advisory covering 2 CVEs |
1.30.1-tuxcare.0 up to 1.30.1-tuxcare.3, plus listed versions 1.30.11.30.1-tuxcare.11.30.1-tuxcare.2 |
1.30.1-tuxcare.3 |
@modelcontextprotocol/sdkTuxCare:npm From an advisory covering 3 CVEs |
1.17.3-tuxcare.0 up to 1.17.3-tuxcare.4, plus listed versions 1.17.31.17.3-tuxcare.11.17.3-tuxcare.21.17.3-tuxcare.3 |
1.17.3-tuxcare.4 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, aliases | OSV | |
| references | OSV | |
| affected | NVD | |
| aliases, products | EUVD | |
| description, facts, products, references, severity, title | CVE List | |
| first indexed | GitHub Advisories, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-111771 is a medium vulnerability (CVSS 6.8) in @clerk Express, published October 20, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.54%, the 45th percentile. Fixed in @modelcontextprotocol/sdk 1.32.0.
References
github.com/modelcontextprotocol/typescript-sdk/security/advisories/GHSA-rvq5-wwqv-78pq
github.com/modelcontextprotocol/typescript-sdk/pull/2929
github.com/modelcontextprotocol/typescript-sdk/pull/2930
github.com/modelcontextprotocol/typescript-sdk/pull/2952
github.com/modelcontextprotocol/typescript-sdk/commit/40f8f4e229d963cd7fd2890bda2aeebe7005299a
github.com/modelcontextprotocol/typescript-sdk/commit/5a0724d14cf34a27a3b070224d2996cdd611df9f
Show 9 moreShow less
github.com/modelcontextprotocol/typescript-sdk/commit/5a1867390b91b8836f49af76c45427279f513325
github.com/modelcontextprotocol/typescript-sdk/releases/tag/1.32.0
github.com/modelcontextprotocol/typescript-sdk/releases/tag/@modelcontextprotocol/[email protected]
github.com/modelcontextprotocol/typescript-sdk/releases/tag/@modelcontextprotocol/[email protected]
github.com/modelcontextprotocol/typescript-sdk/releases/tag/@modelcontextprotocol/[email protected]
github.com/advisories/GHSA-rvq5-wwqv-78pq
github.com/CVEProject/cvelistV5/tree/main/cves/2026/111xxx/CVE-2026-111771.json
nvd.nist.gov/vuln/detail/CVE-2026-111771
github.com/modelcontextprotocol/typescript-sdk