MCP SDK Tier Audit: modelcontextprotocol/typescript-sdk
Date: 2026-08-18
Branch: main (commit a81ef34ac)
Version: 2.0.0 — @modelcontextprotocol/client@2.0.0, @modelcontextprotocol/server@2.0.0, core, server-legacy, codemod, node, express, hono, fastify (all published 2026-07-27T23:55Z, npm latest); v1 maintenance line at 1.30.0
Requested tier: Tier 1
Requirements revisions scored: 2025-11-25 and 2026-07-28 — frozen requirement sets, each run at that revision's own wire version
Tool: @modelcontextprotocol/conformance tier-check 0.2.0-alpha.11 (+ #458; conformance main @ 74edef3), driven by the mcp-sdk-tier-audit skill
Previous assessment: #2271 (Tier 1, v1.27.0, 2026-02-18)
Tier Assessment: Tier 1
The TypeScript SDK meets all Tier 1 requirements: 100% scored conformance on both sides at both frozen revisions (server 30/30 @ 2025-11-25 and 37/37 @ 2026-07-28; client 18/18 and 32/32), 100% issue triage within SLA, no open P0s, stable releases on both the v2 (2.0.0) and v1.x (1.30.0) lines shipped the day before the 2026-07-28 spec, 48/48 documented features with examples, and published dependency, roadmap and versioning policies. The only failing scenarios are extension-tagged and unscored (SEP-2663 tasks on the server; SEP-1932 DPoP / SEP-1933 WIF on the client), all captured in the SDK's own expected-failures.yaml.
Requirements Summary
| # |
Requirement |
Tier 1 Standard |
Tier 2 Standard |
Current Value |
T1? |
T2? |
Gap |
| 1a |
Server Conformance |
100% pass rate |
>= 80% pass rate |
100% (67/67 scored: 30/30 @ 2025-11-25, 37/37 @ 2026-07-28; 47 unique scenarios) |
PASS |
PASS |
None. 10 unscored extension failures @ 2026-07-28 (all tasks-*, SEP-2663; 9 in test/conformance/expected-failures.yaml:50-58, 1 referee SKIP) |
| 1b |
Client Conformance |
100% pass rate |
>= 80% pass rate |
100% (50/50 scored: 18/18 @ 2025-11-25 [Core 4/4, Auth 14/14], 32/32 @ 2026-07-28 [Core 7/7, Auth 25/25]; 35 unique scenarios) |
PASS |
PASS |
None. 3 unscored extension failures per revision (auth/dpop, auth/dpop-nonce, auth/wif-jwt-bearer; all in test/conformance/expected-failures.yaml:38-40) |
| 2 |
Issue Triage |
>= 90% within 2 biz days |
>= 80% within 1 month |
100% (289/289 within SLA; 0 exceeding; median 0h, p95 0h) |
PASS |
PASS |
None |
| 2b |
Labels |
12 required labels |
12 required labels |
12/12 (uses_issue_types: false) |
PASS |
PASS |
None |
| 3 |
Critical Bug Resolution |
All P0s within 7 days |
All P0s within 2 weeks |
0 open (2 closed, both within 7d and 14d) |
PASS |
PASS |
None |
| 4 |
Stable Release |
Required + clear versioning |
At least one stable release |
1.30.0 (latest @modelcontextprotocol/sdk v1.x, 2026-07-27T23:55:32Z, per CLI); v2 monorepo @modelcontextprotocol/{core,client,server,server-legacy,codemod,express,fastify}@2.0.0 released 2026-07-27 and latest on npm. Both lines >= 1.0.0, no pre-release suffix |
PASS |
PASS |
None |
| 4b |
Spec Tracking |
Timeline agreed per release |
Within 6 months |
-1d gap (PASS): latest spec release 2026-07-28T16:47:49Z, latest SDK release 2026-07-27T23:55:32Z, within 30d |
PASS |
PASS |
None |
| 5 |
Documentation |
Comprehensive w/ examples |
Basic docs for core features |
48/48 features (36/36 core), all with examples |
PASS |
PASS |
None |
| 6 |
Dependency Policy |
Published update policy |
Published update policy |
Found (DEPENDENCY_POLICY.md, .github/dependabot.yml) |
PASS |
PASS |
None |
| 7 |
Roadmap |
Published roadmap |
Plan toward Tier 1 |
Found (ROADMAP.md) |
PASS |
PASS |
None |
| 8 |
Versioning Policy |
Documented breaking change policy |
N/A |
Found (VERSIONING.md) |
PASS |
N/A |
None |
Policy-signal files as detected by the CLI (checks.policy_signals, status partial because the optional alternates are absent): present — SECURITY.md, CONTRIBUTING.md, DEPENDENCY_POLICY.md, .github/dependabot.yml, ROADMAP.md, VERSIONING.md; absent — CHANGELOG.md (root; per-package changelogs exist), docs/dependency-policy.md, .github/renovate.json, renovate.json, docs/roadmap.md, docs/versioning.md, BREAKING_CHANGES.md. The partial status is informational; requirements 6-8 are judged on content in the Policy Evaluation section below.
Tier Determination
- Tier 1: PASS -- 8/8 requirements met (failing: none)
- Tier 2: PASS -- 7/7 requirements met (failing: none)
- Final Tier: 1
Conformance
The SDK's own conformance workflow runs the same legs on every push to main (pinned referee 0.2.0-alpha.11, test/conformance/package.json). The server invocation comes from the typescript-sdk entry in src/sdk-runner/known-sdks.ts; one process serves both revisions.
Only scored rows with a date-versioned specVersions tag are counted. A scenario tagged with several spec versions counts in each of those columns; "All" is the number of unique scored rows for that run.
Run @ 2025-11-25 (frozen 2025-11-25 requirement set)
| Suite |
2025-06-18 |
2025-11-25 |
2026-07-28 |
All (scored) |
| Server |
26/26 |
30/30 |
20/20 |
30/30 (100%) |
| Client: Core |
2/2 |
4/4 |
1/1 |
4/4 (100%) |
| Client: Auth |
3/3 |
14/14 |
14/14 |
14/14 (100%) |
Run @ 2026-07-28 (frozen 2026-07-28 requirement set)
| Suite |
2025-06-18 |
2025-11-25 |
2026-07-28 |
All (scored) |
| Server |
18/18 |
20/20 |
37/37 |
37/37 (100%) |
| Client: Core |
1/1 |
1/1 |
7/7 |
7/7 (100%) |
| Client: Auth |
3/3 |
14/14 |
25/25 |
25/25 (100%) |
Informational, not scored: server extension 0/10 @ 2026-07-28 (all tasks-*); client extension 3/6 per revision (auth/dpop, auth/dpop-nonce, auth/wif-jwt-bearer fail; auth/enterprise-managed-authorization, auth/client-credentials-jwt, auth/client-credentials-basic pass); every added-after-release and pending row passes.
Server Conformance Details
Pass rate: 100% (67/67 scored rows across both revisions; 47 unique scored scenarios; 83 rows including not-scored)
Revision 2025-11-25 (wire 2025-11-25, frozen 2025-11-25 requirement set)
Scored scenarios @ 2025-11-25 (30/30) and not-scored runs
Scored: 30/30 (100%), 70/70 checks. Not scored: 3 rows (3 pass, 0 fail).
| Scenario |
Status |
Checks |
Spec versions |
Scored? |
Notes |
| tools-list |
PASS |
3/3 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| tools-call-with-progress |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| tools-call-with-logging |
PASS |
2/2 |
2025-06-18, 2025-11-25 |
Yes |
Scored against the frozen 2025-11-25 set |
| tools-call-simple-text |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| tools-call-sampling |
PASS |
2/2 |
2025-06-18, 2025-11-25 |
Yes |
Scored against the frozen 2025-11-25 set |
| tools-call-mixed-content |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| tools-call-image |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| tools-call-error |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| tools-call-embedded-resource |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| tools-call-elicitation |
PASS |
2/2 |
2025-06-18, 2025-11-25 |
Yes |
Scored against the frozen 2025-11-25 set |
| tools-call-audio |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| server-sse-polling |
PASS |
3/3 |
2025-11-25 |
No (pending) |
Informational: pending requirement, not in the frozen 2025-11-25 set; passes |
| server-sse-multiple-streams |
PASS |
2/2 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| server-session-lifecycle |
PASS |
3/3 |
2025-03-26, 2025-06-18, 2025-11-25 |
No (added-after-release) |
Informational: added after the 2025-11-25 release, not in the frozen set; passes; deliberately not baselined (test/conformance/expected-failures.yaml:9-14) |
| server-initialize |
PASS |
3/3 |
2025-06-18, 2025-11-25 |
Yes |
Scored against the frozen 2025-11-25 set |
| resources-unsubscribe |
PASS |
2/2 |
2025-06-18, 2025-11-25 |
Yes |
Scored against the frozen 2025-11-25 set |
| resources-templates-read |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| resources-subscribe |
PASS |
2/2 |
2025-06-18, 2025-11-25 |
Yes |
Scored against the frozen 2025-11-25 set |
| resources-read-text |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| resources-read-binary |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| resources-list |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| prompts-list |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| prompts-get-with-image |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| prompts-get-with-args |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| prompts-get-simple |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| prompts-get-embedded-resource |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| ping |
PASS |
2/2 |
2025-06-18, 2025-11-25 |
Yes |
Scored against the frozen 2025-11-25 set |
| logging-set-level |
PASS |
2/2 |
2025-06-18, 2025-11-25 |
Yes |
Scored against the frozen 2025-11-25 set |
| json-schema-2020-12 |
PASS |
8/8 |
2025-11-25, 2026-07-28 |
No (pending) |
Informational: pending requirement, not in the frozen 2025-11-25 set; passes |
| elicitation-sep1330-enums |
PASS |
6/6 |
2025-11-25 |
Yes |
Scored against the frozen 2025-11-25 set |
| elicitation-sep1034-defaults |
PASS |
6/6 |
2025-11-25 |
Yes |
Scored against the frozen 2025-11-25 set |
| dns-rebinding-protection |
PASS |
2/2 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| completion-complete |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
Revision 2026-07-28 (wire 2026-07-28, frozen 2026-07-28 requirement set)
Scored scenarios @ 2026-07-28 (37/37) and not-scored runs
Scored: 37/37 (100%), 119/119 checks. Not scored: 13 rows (3 pass, 10 fail).
| Scenario |
Status |
Checks |
Spec versions |
Scored? |
Notes |
| tools-list |
PASS |
3/3 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| tools-call-with-progress |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| tools-call-simple-text |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| tools-call-mixed-content |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| tools-call-image |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| tools-call-error |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| tools-call-embedded-resource |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| tools-call-audio |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| tasks-wire-fields |
FAIL |
1/4 |
extension |
No (extension) |
Informational: extension (SEP-2663 tasks, not implemented by the server SDK); in baseline (test/conformance/expected-failures.yaml:52) |
| tasks-status-notifications |
FAIL |
0/0 |
extension |
No (extension) |
Informational: extension (SEP-2663 tasks, not implemented by the server SDK); 0/0 checks, referee SKIP; intentionally not baselined (test/conformance/expected-failures.yaml:45-49) |
| tasks-required-task-error |
FAIL |
1/2 |
extension |
No (extension) |
Informational: extension (SEP-2663 tasks, not implemented by the server SDK); in baseline (test/conformance/expected-failures.yaml:57) |
| tasks-request-state-removal |
FAIL |
1/2 |
extension |
No (extension) |
Informational: extension (SEP-2663 tasks, not implemented by the server SDK); in baseline (test/conformance/expected-failures.yaml:53) |
| tasks-request-headers |
FAIL |
2/5 |
extension |
No (extension) |
Informational: extension (SEP-2663 tasks, not implemented by the server SDK); in baseline (test/conformance/expected-failures.yaml:55) |
| tasks-mrtr-input |
FAIL |
1/4 |
extension |
No (extension) |
Informational: extension (SEP-2663 tasks, not implemented by the server SDK); in baseline (test/conformance/expected-failures.yaml:54) |
| tasks-mrtr-composition |
FAIL |
1/2 |
extension |
No (extension) |
Informational: extension (SEP-2663 tasks, not implemented by the server SDK); in baseline (test/conformance/expected-failures.yaml:58) |
| tasks-lifecycle |
FAIL |
1/9 |
extension |
No (extension) |
Informational: extension (SEP-2663 tasks, not implemented by the server SDK); in baseline (test/conformance/expected-failures.yaml:50) |
| tasks-dispatch-and-envelope |
FAIL |
3/9 |
extension |
No (extension) |
Informational: extension (SEP-2663 tasks, not implemented by the server SDK); in baseline (test/conformance/expected-failures.yaml:56) |
| tasks-capability-negotiation |
FAIL |
1/5 |
extension |
No (extension) |
Informational: extension (SEP-2663 tasks, not implemented by the server SDK); in baseline (test/conformance/expected-failures.yaml:51) |
| server-stateless |
PASS |
30/30 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| server-sse-multiple-streams |
PASS |
1/1 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| sep-2164-resource-not-found |
PASS |
4/4 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| resources-templates-read |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| resources-read-text |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| resources-read-binary |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| resources-list |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| prompts-list |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| prompts-get-with-image |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| prompts-get-with-args |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| prompts-get-simple |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| prompts-get-embedded-resource |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| json-schema-2020-12 |
PASS |
8/8 |
2025-11-25, 2026-07-28 |
No (pending) |
Informational: pending requirement, not in the frozen 2026-07-28 set; passes |
| input-required-result-validate-input |
PASS |
3/3 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| input-required-result-unsupported-methods |
PASS |
2/2 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| input-required-result-tampered-state |
PASS |
2/2 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| input-required-result-result-type |
PASS |
2/2 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| input-required-result-request-state |
PASS |
3/3 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| input-required-result-non-tool-request |
PASS |
3/3 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| input-required-result-multiple-input-requests |
PASS |
3/3 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| input-required-result-multi-round |
PASS |
4/4 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| input-required-result-missing-input-response |
PASS |
2/2 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| input-required-result-ignore-extra-params |
PASS |
2/2 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| input-required-result-capability-check |
PASS |
2/2 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| input-required-result-basic-sampling |
PASS |
3/3 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| input-required-result-basic-list-roots |
PASS |
3/3 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| input-required-result-basic-elicitation |
PASS |
3/3 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| http-header-validation |
PASS |
14/14 |
2026-07-28 |
No (pending) |
Informational: pending requirement, not in the frozen 2026-07-28 set; passes |
| http-custom-header-server-validation |
PASS |
10/10 |
2026-07-28 |
No (pending) |
Informational: pending requirement, not in the frozen 2026-07-28 set; passes |
| dns-rebinding-protection |
PASS |
2/2 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| completion-complete |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| caching |
PASS |
8/8 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
Client Conformance Details
Full suite pass rate: 100% (50/50 scored rows across both revisions; 35 unique scored scenarios; 64 rows including not-scored)
Suite breakdown: @ 2025-11-25 — Core 4/4 (100%), Auth 14/14 (100%); @ 2026-07-28 — Core 7/7 (100%), Auth 25/25 (100%). Category rule: auth/ prefix = Auth, everything else = Core.
Baseline: 3 known expected failures documented in test/conformance/expected-failures.yaml:38-40 (auth/dpop, auth/dpop-nonce, auth/wif-jwt-bearer — extension-tagged SEP-1932 DPoP / SEP-1933 WIF scenarios); the 2026-07-28 leg baseline test/conformance/expected-failures.2026-07-28.yaml:35 (client: []) is empty. All 6 not-scored client failures below (3 per revision) are exactly these baseline entries; there are no unexpected failures.
Core Scenarios
Core scenarios (11/11 scored runs)
Revision 2025-11-25
Scored: 4/4 (100%), 11/11 checks. Not scored: 1 (1 pass, 0 fail).
| Scenario |
Status |
Checks |
Spec versions |
Scored? |
Notes |
| tools_call |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| sse-retry |
PASS |
3/3 |
2025-11-25 |
Yes |
Scored against the frozen 2025-11-25 set |
| json-schema-2020-12-preservation |
PASS |
9/9 |
2025-11-25, 2026-07-28 |
No (added-after-release) |
Informational: added after the 2025-11-25 release, not in the frozen set; passes; deliberately not baselined (test/conformance/expected-failures.yaml:9-12, expected-failures.2026-07-28.yaml:19-24) |
| initialize |
PASS |
1/1 |
2025-06-18, 2025-11-25 |
Yes |
Scored against the frozen 2025-11-25 set |
| elicitation-sep1034-client-defaults |
PASS |
5/5 |
2025-11-25 |
Yes |
Scored against the frozen 2025-11-25 set |
Revision 2026-07-28
Scored: 7/7 (100%), 54/54 checks. Not scored: 1 (1 pass, 0 fail).
| Scenario |
Status |
Checks |
Spec versions |
Scored? |
Notes |
| tools_call |
PASS |
2/2 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| sep-2322-client-request-state |
PASS |
5/5 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| request-metadata |
PASS |
8/8 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| json-schema-ref-no-deref |
PASS |
1/1 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| json-schema-2020-12-preservation |
PASS |
9/9 |
2025-11-25, 2026-07-28 |
No (added-after-release) |
Informational: added after the 2026-07-28 release, not in the frozen set; passes; deliberately not baselined (test/conformance/expected-failures.yaml:9-12, expected-failures.2026-07-28.yaml:19-24) |
| http-standard-headers |
PASS |
9/9 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| http-invalid-tool-headers |
PASS |
11/11 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| http-custom-headers |
PASS |
18/18 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
Auth Scenarios
Auth scenarios (39/39 scored runs) and not-scored runs
Revision 2025-11-25
Scored: 14/14 (100%), 216/216 checks. Not scored: 6 (3 pass, 3 fail).
| Scenario |
Status |
Checks |
Spec versions |
Scored? |
Notes |
| auth/wif-jwt-bearer |
FAIL |
0/1 |
extension |
No (extension) |
Informational: extension (SEP-1933 WIF, not implemented by the OAuth client); in baseline (test/conformance/expected-failures.yaml:40) |
| auth/token-endpoint-auth-post |
PASS |
19/19 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| auth/token-endpoint-auth-none |
PASS |
19/19 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| auth/token-endpoint-auth-basic |
PASS |
19/19 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| auth/scope-step-up |
PASS |
21/21 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| auth/scope-retry-limit |
PASS |
10/10 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| auth/scope-omitted-when-undefined |
PASS |
15/15 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| auth/scope-from-www-authenticate |
PASS |
15/15 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| auth/scope-from-scopes-supported |
PASS |
15/15 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| auth/pre-registration |
PASS |
13/13 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| auth/metadata-var3 |
PASS |
14/14 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| auth/metadata-var2 |
PASS |
14/14 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| auth/metadata-var1 |
PASS |
14/14 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| auth/metadata-default |
PASS |
14/14 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
| auth/enterprise-managed-authorization |
PASS |
8/8 |
extension |
No (extension) |
Informational: extension scenario, not scored; passes (not in baseline, none needed) |
| auth/dpop-nonce |
FAIL |
0/5 |
extension |
No (extension) |
Informational: extension (SEP-1932 DPoP, not implemented by the OAuth client); in baseline (test/conformance/expected-failures.yaml:39) |
| auth/dpop |
FAIL |
0/3 |
extension |
No (extension) |
Informational: extension (SEP-1932 DPoP, not implemented by the OAuth client); in baseline (test/conformance/expected-failures.yaml:38) |
| auth/client-credentials-jwt |
PASS |
7/7 |
extension |
No (extension) |
Informational: extension scenario, not scored; passes (not in baseline, none needed) |
| auth/client-credentials-basic |
PASS |
7/7 |
extension |
No (extension) |
Informational: extension scenario, not scored; passes (not in baseline, none needed) |
| auth/basic-cimd |
PASS |
14/14 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2025-11-25 set |
Revision 2026-07-28
Scored: 25/25 (100%), 322/322 checks. Not scored: 6 (3 pass, 3 fail).
| Scenario |
Status |
Checks |
Spec versions |
Scored? |
Notes |
| auth/wif-jwt-bearer |
FAIL |
0/1 |
extension |
No (extension) |
Informational: extension (SEP-1933 WIF, not implemented by the OAuth client); in baseline (test/conformance/expected-failures.yaml:40) |
| auth/token-endpoint-auth-post |
PASS |
18/18 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/token-endpoint-auth-none |
PASS |
18/18 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/token-endpoint-auth-basic |
PASS |
18/18 |
2025-06-18, 2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/scope-step-up |
PASS |
23/23 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/scope-retry-limit |
PASS |
11/11 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/scope-omitted-when-undefined |
PASS |
14/14 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/scope-from-www-authenticate |
PASS |
14/14 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/scope-from-scopes-supported |
PASS |
14/14 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/resource-mismatch |
PASS |
3/3 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/pre-registration |
PASS |
10/10 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/offline-access-scope |
PASS |
11/11 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/offline-access-not-supported |
PASS |
14/14 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/metadata-var3 |
PASS |
13/13 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/metadata-var2 |
PASS |
13/13 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/metadata-var1 |
PASS |
13/13 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/metadata-issuer-mismatch |
PASS |
3/3 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/metadata-default |
PASS |
13/13 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/iss-wrong-issuer |
PASS |
8/8 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/iss-unexpected |
PASS |
8/8 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/iss-supported-missing |
PASS |
8/8 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/iss-supported |
PASS |
14/14 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/iss-not-advertised |
PASS |
14/14 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/iss-normalized |
PASS |
8/8 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/enterprise-managed-authorization |
PASS |
6/6 |
extension |
No (extension) |
Informational: extension scenario, not scored; passes (not in baseline, none needed) |
| auth/dpop-nonce |
FAIL |
0/5 |
extension |
No (extension) |
Informational: extension (SEP-1932 DPoP, not implemented by the OAuth client); in baseline (test/conformance/expected-failures.yaml:39) |
| auth/dpop |
FAIL |
0/3 |
extension |
No (extension) |
Informational: extension (SEP-1932 DPoP, not implemented by the OAuth client); in baseline (test/conformance/expected-failures.yaml:38) |
| auth/client-credentials-jwt |
PASS |
5/5 |
extension |
No (extension) |
Informational: extension scenario, not scored; passes (not in baseline, none needed) |
| auth/client-credentials-basic |
PASS |
5/5 |
extension |
No (extension) |
Informational: extension scenario, not scored; passes (not in baseline, none needed) |
| auth/basic-cimd |
PASS |
12/12 |
2025-11-25, 2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
| auth/authorization-server-migration |
PASS |
27/27 |
2026-07-28 |
Yes |
Scored against the frozen 2026-07-28 set |
Issue Triage Details
Analysis period: Last 289 issues (checks.triage.total_issues)
Labels: 12/12 present — bug, enhancement, question, needs confirmation, needs repro, ready for work, good first issue, help wanted, P0, P1, P2, P3; missing: none (checks.labels.missing = [], uses_issue_types: false)
| Metric |
Value |
T1 Req |
T2 Req |
Verdict |
| Compliance rate |
100% (289/289) |
>= 90% |
>= 80% |
PASS |
| Exceeding SLA |
0 |
-- |
-- |
-- |
| Median time to triage |
0h |
-- |
-- |
-- |
| p95 time to triage |
0h |
-- |
-- |
-- |
| Open P0s |
0 |
0 |
0 |
PASS |
| Closed P0s within 7d |
2/2 |
all |
-- |
PASS |
| Closed P0s within 14d |
2/2 |
-- |
all |
PASS |
No open P0s (checks.p0_resolution.open_p0_details = []).
Documentation Coverage
48/48 non-experimental features documented with examples (36/36 core), on the v2 guide site ts.sdk.modelcontextprotocol.io/v2/ (source: docs/; every code fence is synced from an executed example under examples/guides/) plus examples/. Experimental Tasks (SEP-2663) are not implemented in v2 and are excluded.
Feature coverage table (48/48)
| # |
Feature |
Documented? |
Where |
Has Examples? |
Verdict |
| 1 |
Tools - listing |
Yes |
docs/servers/tools.md:10-53; docs/clients/calling.md:8-29; docs/advanced/low-level-server.md:9-43 |
Yes (4 examples) |
PASS |
| 2 |
Tools - calling |
Yes |
docs/servers/tools.md:55-68; docs/clients/calling.md:8-29; docs/get-started/first-client.md:61-86 |
Yes (4 examples) |
PASS |
| 3 |
Tools - text results |
Yes |
docs/servers/tools.md:14-68 (content: [{ type: 'text' }]), 216-223 recap |
Yes (3 examples) |
PASS |
| 4 |
Tools - image results |
Yes |
docs/servers/tools.md:132-193 (image block, base64 + mimeType) |
Yes (1 example + quoted output) |
PASS |
| 5 |
Tools - audio results |
Yes |
docs/servers/tools.md:132-193 (audio block) |
Yes (1 example + quoted output) |
PASS |
| 6 |
Tools - embedded resources |
Yes |
docs/servers/tools.md:132-193 (resource block, "arrives without a resources/read round trip") |
Yes (1 example + quoted output) |
PASS |
| 7 |
Tools - error handling |
Yes |
docs/servers/errors.md:6-209 (isError vs ProtocolError, typed subclasses, code table); docs/servers/tools.md:70-93 |
Yes (7 examples) |
PASS |
| 8 |
Tools - change notifications |
Yes |
docs/servers/notifications.md:8-60 (sendToolListChanged, handle auto-notify), 62-70 (capability), 72-83 (handler.notify.toolsChanged) |
Yes (4 examples) |
PASS |
| 9 |
Resources - listing |
Yes |
docs/servers/resources.md:127-170; docs/clients/calling.md:78-101 |
Yes (3 examples) |
PASS |
| 10 |
Resources - reading text |
Yes |
docs/servers/resources.md:9-87; docs/clients/calling.md:78-101; docs/get-started/first-client.md:87-129 |
Yes (4 examples) |
PASS |
| 11 |
Resources - reading binary |
Yes |
docs/servers/resources.md:38-87 (blob base64 item, mimeType per item) |
Yes (1 example + quoted output) |
PASS |
| 12 |
Resources - templates |
Yes |
docs/servers/resources.md:89-170 (ResourceTemplate, list callback, resources/templates/list); docs/clients/calling.md:101 |
Yes (3 examples) |
PASS |
| 13 |
Resources - template reading |
Yes |
docs/servers/resources.md:108-125 (matched variables as second arg), 172-203 (path sanitisation) |
Yes (3 examples) |
PASS |
| 14 |
Resources - subscribing |
Yes |
docs/servers/resources.md:215-258 (capability, per-connection bookkeeping, sendResourceUpdated); docs/clients/subscriptions.md:113-129 |
Yes (2 examples) |
PASS |
| 15 |
Resources - unsubscribing |
Yes |
docs/servers/resources.md:237-240 (resources/unsubscribe handler); docs/clients/subscriptions.md:117-125 (unsubscribeResource) |
Yes (2 examples) |
PASS |
| 16 |
Resources - change notifications |
Yes |
docs/servers/resources.md:205-213; docs/servers/notifications.md:37, 60, 72-83 (notify.resourceUpdated/resourcesChanged) |
Yes (3 examples) |
PASS |
| 17 |
Prompts - listing |
Yes |
docs/servers/prompts.md:38-42; docs/clients/calling.md:103-128 |
Yes (2 examples) |
PASS |
| 18 |
Prompts - getting simple |
Yes |
docs/servers/prompts.md:48-64; docs/clients/calling.md:103-128 |
Yes (2 examples) |
PASS |
| 19 |
Prompts - getting with arguments |
Yes |
docs/servers/prompts.md:8-89 (argsSchema, validation, -32602 on missing arg) |
Yes (3 examples) |
PASS |
| 20 |
Prompts - embedded resources |
Yes |
docs/servers/prompts.md:160-211 (type: 'resource' message) |
Yes (1 example + quoted output) |
PASS |
| 21 |
Prompts - image content |
Yes |
docs/servers/prompts.md:119-158 (image block; audio same shape) |
Yes (1 example + quoted output) |
PASS |
| 22 |
Prompts - change notifications |
Yes |
docs/servers/notifications.md:37 (sendPromptListChanged), 43-60 (registration-handle auto-notify, registerPrompt named), 83 (notify.promptsChanged); docs/clients/subscriptions.md:32 (promptsListChanged filter) |
Yes (1 example: handle-mutation block at notifications.md:43-58 is the tools sibling; prompt method is inline) |
PASS |
| 23 |
Sampling - creating messages |
Yes |
docs/servers/sampling.md:16-72 (requestSampling, result shape, capability gate); docs/clients/server-requests.md:192-219 |
Yes (2 examples + quoted output) |
PASS |
| 24 |
Elicitation - form mode |
Yes |
docs/servers/elicitation.md:8-124; docs/clients/server-requests.md:167-190 |
Yes (5 examples) |
PASS |
| 25 |
Elicitation - URL mode |
Yes |
docs/servers/elicitation.md:165-195 (mode: 'url', url, elicitationId, secrets stay in browser); docs/clients/server-requests.md:169-180 |
Yes (2 examples + quoted output) |
PASS |
| 26 |
Elicitation - schema validation |
Yes |
docs/servers/elicitation.md:45 ("SDK validates accepted content against requestedSchema"), 120; docs/advanced/schema-libraries.md:126-156 (swap the elicitation validator) |
Yes (2 examples) |
PASS |
| 27 |
Elicitation - default values |
Yes |
docs/servers/elicitation.md:126-163 (default, applyDefaults client flag) |
Yes (1 example + quoted output) |
PASS |
| 28 |
Elicitation - enum values |
Yes |
docs/servers/elicitation.md:126-159 (enum: ['pdf','csv'] field, "submits the prefilled pdf or picks csv"); examples/elicitation/README.md:11-12 (enumNames) |
Yes (2 examples) |
PASS |
| 29 |
Elicitation - complete notification |
Yes |
docs/servers/elicitation.md:197-288 ("Signal that the URL flow finished": createElicitationCompletionNotifier, relatedRequestId, timeout/signal, client setNotificationHandler('notifications/elicitation/complete'), era note); recap :317 |
Yes (3 synced examples: createElicitationCompletionNotifier_connectCalendar, setNotificationHandler_elicitationComplete, callTool_connectCalendar_timeout + quoted output) |
PASS |
| 30 |
Roots - listing |
Yes |
docs/clients/roots.md:96-136 (capability, roots/list handler, advisory semantics) |
Yes (2 examples + quoted output) |
PASS |
| 31 |
Roots - change notifications |
Yes |
docs/clients/roots.md:138-158 (sendRootsListChanged, requires listChanged: true) |
Yes (1 example + quoted output) |
PASS |
| 32 |
Logging - sending log messages |
Yes |
docs/servers/logging-progress-cancellation.md:74-120 (capability, ctx.mcpReq.log, client handler) |
Yes (3 examples + quoted output) |
PASS |
| 33 |
Logging - setting level |
Yes |
docs/servers/logging-progress-cancellation.md:122-142 ("Let the client set the level": logging/setLevel installed by capability, client.setLoggingLevel('warning'), filtered output, 2026 per-request era note); recap :225 |
Yes (1 synced example setLoggingLevel_warning + quoted output) |
PASS |
| 34 |
Completions - resource argument |
Yes |
docs/servers/completion.md:357-380 (template complete map, ref/resource request shape) |
Yes (1 example) |
PASS |
| 35 |
Completions - prompt argument |
Yes |
docs/servers/completion.md:254-355, 382-402; docs/servers/prompts.md:213-237; docs/clients/calling.md:130-146 |
Yes (5 examples + quoted output) |
PASS |
| 36 |
Ping |
Yes |
docs/clients/calling.md:172-189 (client.ping, auto-answered both sides, timeout, era note) |
Yes (1 example + quoted output) |
PASS |
| 37 |
Streamable HTTP transport (client) |
Yes |
docs/clients/connect.md:8-26, 101-110 (StreamableHTTPClientTransport, terminateSession); docs/get-started/first-client.md:9-40 |
Yes (3 examples) |
PASS |
| 38 |
Streamable HTTP transport (server) |
Yes |
docs/serving/http.md:1-135 (createMcpHandler, factory, mount, Host/Origin, responseMode); docs/serving/{express,fastify,hono,web-standard}.md |
Yes (6+ examples) |
PASS |
| 39 |
SSE transport - legacy (client) |
Yes |
docs/clients/connect.md:46-66 (SSEClientTransport fallback); docs/serving/legacy-clients.md:94; examples/README.md:177-180 |
Yes (1 synced example connect_sseFallback) |
PASS |
| 40 |
SSE transport - legacy (server) |
Yes |
docs/serving/legacy-clients.md:90-127 ("Know where SSE went": SSEServerTransport from @modelcontextprotocol/server-legacy/sse on GET /sse + POST /messages); packages/server-legacy/README.md:1-39 |
Yes (1 synced example SSEServerTransport_express) |
PASS |
| 41 |
stdio transport (client) |
Yes |
docs/clients/connect.md:28-44 (StdioClientTransport, close order); docs/testing.md:116-126 |
Yes (2 examples) |
PASS |
| 42 |
stdio transport (server) |
Yes |
docs/serving/stdio.md:1-214 (serveStdio, stderr rule, Inspector, shutdown); docs/get-started/first-server.md:83-113; README.md:106-140 |
Yes (5 examples) |
PASS |
| 43 |
Progress notifications |
Yes |
docs/servers/logging-progress-cancellation.md:8-72 (progressToken, notify, onprogress); docs/clients/calling.md:148-170 (resetTimeoutOnProgress, maxTotalTimeout) |
Yes (4 examples + quoted output) |
PASS |
| 44 |
Cancellation |
Yes |
docs/servers/logging-progress-cancellation.md:144-218 (ctx.mcpReq.signal, AbortController on client, signal forwarding to fetch) |
Yes (3 examples + quoted output) |
PASS |
| 45 |
Pagination |
Yes |
docs/clients/calling.md:31-53 (aggregate walk of nextCursor, explicit { cursor }, listMaxPages, LIST_PAGINATION_EXCEEDED); docs/migration/upgrade-to-v2.md:1603-1611 |
Yes (1 synced example listTools_onePage + quoted output; the backing calling.examples.ts:130-132 also shows the server returning nextCursor, outside a synced region) |
PASS |
| 46 |
Capability negotiation |
Yes |
docs/clients/connect.md:68-99 (getServerCapabilities, "only ask for what the server advertised"); docs/clients/server-requests.md:6-30 (client capabilities, both-sides enforcement); docs/servers/notifications.md:62-70; docs/servers/sampling.md:56-72 (enforceStrictCapabilities); docs/advanced/low-level-server.md:9-43; docs/advanced/custom-methods.md:93-125 (capabilities.extensions) |
Yes (6 examples) |
PASS |
| 47 |
Protocol version negotiation |
Yes |
docs/protocol-versions.md:1-193 (versionNegotiation auto/legacy/pin, probe, supportedProtocolVersions, era matrix); docs/serving/legacy-clients.md:8-84; docs/troubleshooting.md:68-149; examples/custom-version/README.md |
Yes (7 examples + quoted output) |
PASS |
| 48 |
JSON Schema 2020-12 support |
Yes |
docs/migration/upgrade-to-v2.md:1454-1494 ("JSON Schema 2020-12 posture (SEP-1613, SEP-2106)": $schema-dispatched validator, Ajv2020 default, SEP-2106 non-object roots, mechanical-fix table), 695-711; docs/advanced/schema-libraries.md:65-156 (fromJsonSchema, validator swap); docs/serving/{express,fastify,hono,web-standard}.md quoted wire output with "$schema":"https://json-schema.org/draft/2020-12/schema" |
Yes (5 examples: fix-table snippets, registerTool_fromJsonSchema, jsonSchemaValidator_ajv, jsonSchemaValidator_cfWorker, wire transcripts; plus examples/schema-validators/) |
PASS |
Policy Evaluation
| Policy Area |
Tier 1 |
Tier 2 |
Evidence |
| Dependency Update Policy |
PASS |
PASS |
DEPENDENCY_POLICY.md — trigger-only updates (security, dependency bug, needed feature, Node support, spec revision), no scheduled npm bumps, caret ranges via pnpm catalogs, 7-day minimumReleaseAge; .github/dependabot.yml (weekly Actions updates) with repo-level GitHub security updates for npm |
| Roadmap |
PASS |
PASS |
ROADMAP.md — per-revision spec boards (2026-07-28, 2025-11-25), v2 hardening, next-revision commitment, issue-linked extension items, v1.x maintenance window |
| Versioning Policy |
PASS |
N/A |
VERSIONING.md — SemVer 2.0.0 per package, changesets fixed group, enumerated breaking / non-breaking changes, @deprecated for ≥1 minor before removal, migration guides + codemod, breaking change PR label |
Changes Since the Tier 1 Assessment (#2271)
| Area |
#2271 (2026-02-18, v1.27.0 on v1.x) |
This assessment |
| Release line |
@modelcontextprotocol/sdk 1.x |
v2 monorepo: @modelcontextprotocol/{core,client,server,server-legacy,node,express,hono,fastify,codemod} 2.0.0 (GA 2026-07-27); v1.x continues at 1.30.0 with bug/security fixes |
| Spec revisions |
2025-06-18 + 2025-11-25 (moving suite) |
2025-11-25 (stateful wire) + 2026-07-28 (stateless wire), frozen requirement sets, each at its own wire (0.2.0-alpha.11) |
| Conformance |
30/30 server, 20/20 client |
67/67 server, 50/50 client (both revisions) |
| 2026-07-28 features |
— |
SEP-2575 stateless lifecycle, input-required results (SEP-2322 request state), SEP-2243 header-mirrored params, SEP-2164, caching, subscriptions/listen, the 2026 auth bundle (issuer identification, offline access, AS migration, metadata issuer mismatch) |
| Spec tracking |
same-day (v1.23.0 for 2025-11-25) |
v2.0.0 published 2026-07-27T23:55Z, before the 2026-07-28 spec tag |
| Docs |
docs/*.md on v1.x, 48/48 |
VitePress site ts.sdk.modelcontextprotocol.io/v2/ with CI-executed examples, 48/48 (typescript-sdk#2679, #2686) |
| Governance docs |
root files on v1.x (#1547) |
same three files on main (typescript-sdk#2680) |
| Security |
3 published GHSAs, all fixed before #2271 |
no new published advisories since #2271 |
cc @pcarleton @localden — since I lead the SDK WG, could one of you be the approving reviewer, as with #2271/#2307?
Reproduce This Assessment
# Conformance repo at 0.2.0-alpha.11 + #458
git clone https://github.com/modelcontextprotocol/conformance.git
cd conformance
git checkout 74edef3
npm install
npm run build
# GitHub API access for repo-health checks
gh auth login
export GITHUB_TOKEN=$(gh auth token)
# tier-check builds the SDK (pnpm install && pnpm run build:all) and starts the
# everything server per the typescript-sdk entry in src/sdk-runner/known-sdks.ts.
node dist/index.js tier-check \
--sdk-path /path/to/typescript-sdk \
--requirements 2025-11-25,2026-07-28 \
--output markdown
MCP SDK Tier Audit: modelcontextprotocol/typescript-sdk
Date: 2026-08-18
Branch: main (commit a81ef34ac)
Version: 2.0.0 — @modelcontextprotocol/client@2.0.0, @modelcontextprotocol/server@2.0.0, core, server-legacy, codemod, node, express, hono, fastify (all published 2026-07-27T23:55Z, npm latest); v1 maintenance line at 1.30.0
Requested tier: Tier 1
Requirements revisions scored: 2025-11-25 and 2026-07-28 — frozen requirement sets, each run at that revision's own wire version
Tool: @modelcontextprotocol/conformance tier-check 0.2.0-alpha.11 (+ #458; conformance main @ 74edef3), driven by the mcp-sdk-tier-audit skill
Previous assessment: #2271 (Tier 1, v1.27.0, 2026-02-18)
Tier Assessment: Tier 1
The TypeScript SDK meets all Tier 1 requirements: 100% scored conformance on both sides at both frozen revisions (server 30/30 @ 2025-11-25 and 37/37 @ 2026-07-28; client 18/18 and 32/32), 100% issue triage within SLA, no open P0s, stable releases on both the v2 (2.0.0) and v1.x (1.30.0) lines shipped the day before the 2026-07-28 spec, 48/48 documented features with examples, and published dependency, roadmap and versioning policies. The only failing scenarios are extension-tagged and unscored (SEP-2663 tasks on the server; SEP-1932 DPoP / SEP-1933 WIF on the client), all captured in the SDK's own expected-failures.yaml.
Requirements Summary
Policy-signal files as detected by the CLI (checks.policy_signals, status partial because the optional alternates are absent): present — SECURITY.md, CONTRIBUTING.md, DEPENDENCY_POLICY.md, .github/dependabot.yml, ROADMAP.md, VERSIONING.md; absent — CHANGELOG.md (root; per-package changelogs exist), docs/dependency-policy.md, .github/renovate.json, renovate.json, docs/roadmap.md, docs/versioning.md, BREAKING_CHANGES.md. The partial status is informational; requirements 6-8 are judged on content in the Policy Evaluation section below.
Tier Determination
Conformance
The SDK's own conformance workflow runs the same legs on every push to main (pinned referee 0.2.0-alpha.11, test/conformance/package.json). The server invocation comes from the typescript-sdk entry in src/sdk-runner/known-sdks.ts; one process serves both revisions.
Only scored rows with a date-versioned specVersions tag are counted. A scenario tagged with several spec versions counts in each of those columns; "All" is the number of unique scored rows for that run.
Run @ 2025-11-25 (frozen 2025-11-25 requirement set)
Run @ 2026-07-28 (frozen 2026-07-28 requirement set)
Informational, not scored: server extension 0/10 @ 2026-07-28 (all tasks-*); client extension 3/6 per revision (auth/dpop, auth/dpop-nonce, auth/wif-jwt-bearer fail; auth/enterprise-managed-authorization, auth/client-credentials-jwt, auth/client-credentials-basic pass); every added-after-release and pending row passes.
Server Conformance Details
Pass rate: 100% (67/67 scored rows across both revisions; 47 unique scored scenarios; 83 rows including not-scored)
Revision 2025-11-25 (wire 2025-11-25, frozen 2025-11-25 requirement set)
Scored scenarios @ 2025-11-25 (30/30) and not-scored runsScored: 30/30 (100%), 70/70 checks. Not scored: 3 rows (3 pass, 0 fail).
Revision 2026-07-28 (wire 2026-07-28, frozen 2026-07-28 requirement set)
Scored scenarios @ 2026-07-28 (37/37) and not-scored runsScored: 37/37 (100%), 119/119 checks. Not scored: 13 rows (3 pass, 10 fail).
Client Conformance Details
Full suite pass rate: 100% (50/50 scored rows across both revisions; 35 unique scored scenarios; 64 rows including not-scored)
Core Scenarios
Core scenarios (11/11 scored runs)Revision 2025-11-25
Scored: 4/4 (100%), 11/11 checks. Not scored: 1 (1 pass, 0 fail).
Revision 2026-07-28
Scored: 7/7 (100%), 54/54 checks. Not scored: 1 (1 pass, 0 fail).
Auth Scenarios
Auth scenarios (39/39 scored runs) and not-scored runsRevision 2025-11-25
Scored: 14/14 (100%), 216/216 checks. Not scored: 6 (3 pass, 3 fail).
Revision 2026-07-28
Scored: 25/25 (100%), 322/322 checks. Not scored: 6 (3 pass, 3 fail).
Issue Triage Details
Analysis period: Last 289 issues (checks.triage.total_issues)
Labels: 12/12 present — bug, enhancement, question, needs confirmation, needs repro, ready for work, good first issue, help wanted, P0, P1, P2, P3; missing: none (checks.labels.missing = [], uses_issue_types: false)
No open P0s (checks.p0_resolution.open_p0_details = []).
Documentation Coverage
48/48 non-experimental features documented with examples (36/36 core), on the v2 guide site ts.sdk.modelcontextprotocol.io/v2/ (source: docs/; every code fence is synced from an executed example under examples/guides/) plus examples/. Experimental Tasks (SEP-2663) are not implemented in v2 and are excluded.
Feature coverage table (48/48)Policy Evaluation
Changes Since the Tier 1 Assessment (#2271)
cc @pcarleton @localden — since I lead the SDK WG, could one of you be the approving reviewer, as with #2271/#2307?
Reproduce This Assessment