From 3da35dba63952db6eee0f3e28aec5e6716095456 Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Thu, 22 Jan 2026 20:34:30 +0000 Subject: [PATCH 1/2] feat: add core and extensions suites for SDK tiering Add new suites to support SDK tiering requirements: Client suites: - core (19 scenarios): Tier 1 requirements (base + auth) - extensions (2 scenarios): Optional protocol extensions (client credentials) - all (21 scenarios): Everything (core + extensions) - auth (15 scenarios): Auth scenarios only (excludes extensions) Server suites: - core: Alias for 'active' (tier 1 requirements) This allows SDK developers to run --suite core for tier 1 certification while keeping extension tests available but not blocking. --- src/index.ts | 15 +++++++++++---- src/scenarios/client/auth/index.ts | 7 ++++++- src/scenarios/index.ts | 22 ++++++++++++++++++++-- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/index.ts b/src/index.ts index 7a6aa15..46ed8a5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -16,7 +16,9 @@ import { listActiveClientScenarios, listPendingClientScenarios, listAuthScenarios, - listMetadataScenarios + listMetadataScenarios, + listCoreScenarios, + listExtensionScenarios } from './scenarios'; import { ConformanceCheck } from './types'; import { ClientOptionsSchema, ServerOptionsSchema } from './schemas'; @@ -65,6 +67,8 @@ program const suites: Record string[]> = { all: listScenarios, + core: listCoreScenarios, + extensions: listExtensionScenarios, auth: listAuthScenarios, metadata: listMetadataScenarios, 'sep-835': () => @@ -177,7 +181,9 @@ program console.error('Either --scenario or --suite is required'); console.error('\nAvailable client scenarios:'); listScenarios().forEach((s) => console.error(` - ${s}`)); - console.error('\nAvailable suites: all, auth, metadata, sep-835'); + console.error( + '\nAvailable suites: all, core, extensions, auth, metadata, sep-835' + ); process.exit(1); } @@ -296,13 +302,14 @@ program if (suite === 'all') { scenarios = listClientScenarios(); - } else if (suite === 'active') { + } else if (suite === 'active' || suite === 'core') { + // 'core' is an alias for 'active' - tier 1 requirements scenarios = listActiveClientScenarios(); } else if (suite === 'pending') { scenarios = listPendingClientScenarios(); } else { console.error(`Unknown suite: ${suite}`); - console.error('Available suites: active, all, pending'); + console.error('Available suites: active, all, core, pending'); process.exit(1); } diff --git a/src/scenarios/client/auth/index.ts b/src/scenarios/client/auth/index.ts index 6a3ad1c..805781a 100644 --- a/src/scenarios/client/auth/index.ts +++ b/src/scenarios/client/auth/index.ts @@ -22,6 +22,7 @@ import { ClientCredentialsBasicScenario } from './client-credentials'; +// Auth scenarios (required for tier 1) export const authScenariosList: Scenario[] = [ ...metadataScenarios, new AuthBasicCIMDScenario(), @@ -34,7 +35,11 @@ export const authScenariosList: Scenario[] = [ new ScopeRetryLimitScenario(), new ClientSecretBasicAuthScenario(), new ClientSecretPostAuthScenario(), - new PublicClientAuthScenario(), + new PublicClientAuthScenario() +]; + +// Extension scenarios (optional for tier 1 - protocol extensions) +export const extensionScenariosList: Scenario[] = [ new ClientCredentialsJwtScenario(), new ClientCredentialsBasicScenario() ]; diff --git a/src/scenarios/index.ts b/src/scenarios/index.ts index 6dc8070..e803373 100644 --- a/src/scenarios/index.ts +++ b/src/scenarios/index.ts @@ -53,7 +53,7 @@ import { import { DNSRebindingProtectionScenario } from './server/dns-rebinding'; -import { authScenariosList } from './client/auth/index'; +import { authScenariosList, extensionScenariosList } from './client/auth/index'; import { listMetadataScenarios } from './client/auth/discovery-metadata'; // Pending client scenarios (not yet fully tested/implemented) @@ -145,8 +145,18 @@ export const clientScenarios = new Map( allClientScenariosList.map((scenario) => [scenario.name, scenario]) ); -// Scenario scenarios +// All client test scenarios (core + extensions) const scenariosList: Scenario[] = [ + new InitializeScenario(), + new ToolsCallScenario(), + new ElicitationClientDefaultsScenario(), + new SSERetryScenario(), + ...authScenariosList, + ...extensionScenariosList +]; + +// Core scenarios (tier 1 requirements) +const coreScenariosList: Scenario[] = [ new InitializeScenario(), new ToolsCallScenario(), new ElicitationClientDefaultsScenario(), @@ -191,4 +201,12 @@ export function listAuthScenarios(): string[] { return authScenariosList.map((scenario) => scenario.name); } +export function listCoreScenarios(): string[] { + return coreScenariosList.map((scenario) => scenario.name); +} + +export function listExtensionScenarios(): string[] { + return extensionScenariosList.map((scenario) => scenario.name); +} + export { listMetadataScenarios }; From 3f3da07714bba1a528fc2d51148e1c95f16cd62f Mon Sep 17 00:00:00 2001 From: Paul Carleton Date: Thu, 22 Jan 2026 21:33:20 +0000 Subject: [PATCH 2/2] feat: promote elicitation tests from pending to active Move 3 elicitation scenarios to active suite: - elicitation-sep1330-enums - tools-call-elicitation - elicitation-sep1034-defaults These tests are now passing in the Python SDK and ready for SDK tiering requirements. Remaining pending tests (2): - json-schema-2020-12 (blocked on SDK PR #1135) - server-sse-polling (blocked on SDK PR #1129) --- src/scenarios/index.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/scenarios/index.ts b/src/scenarios/index.ts index e803373..0c3e4aa 100644 --- a/src/scenarios/index.ts +++ b/src/scenarios/index.ts @@ -58,19 +58,11 @@ import { listMetadataScenarios } from './client/auth/discovery-metadata'; // Pending client scenarios (not yet fully tested/implemented) const pendingClientScenariosList: ClientScenario[] = [ - // Elicitation scenarios (SEP-1330) - new ElicitationEnumsScenario(), - // JSON Schema 2020-12 (SEP-1613) // This test is pending until the SDK includes PR #1135 which preserves // $schema, $defs, and additionalProperties fields in tool schemas. new JsonSchema2020_12Scenario(), - // On hold until elicitation schema types are fixed - // https://github.com/modelcontextprotocol/modelcontextprotocol/pull/1863 - new ToolsCallElicitationScenario(), - new ElicitationDefaultsScenario(), - // On hold until server-side SSE improvements are made // https://github.com/modelcontextprotocol/typescript-sdk/pull/1129 new ServerSSEPollingScenario()