Skip to content

Commit 5dca74b

Browse files
authored
feat: add core and extensions suites for SDK tiering (#117)
* 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. * 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)
1 parent d0b2b49 commit 5dca74b

3 files changed

Lines changed: 37 additions & 15 deletions

File tree

src/index.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ import {
1616
listActiveClientScenarios,
1717
listPendingClientScenarios,
1818
listAuthScenarios,
19-
listMetadataScenarios
19+
listMetadataScenarios,
20+
listCoreScenarios,
21+
listExtensionScenarios
2022
} from './scenarios';
2123
import { ConformanceCheck } from './types';
2224
import { ClientOptionsSchema, ServerOptionsSchema } from './schemas';
@@ -65,6 +67,8 @@ program
6567

6668
const suites: Record<string, () => string[]> = {
6769
all: listScenarios,
70+
core: listCoreScenarios,
71+
extensions: listExtensionScenarios,
6872
auth: listAuthScenarios,
6973
metadata: listMetadataScenarios,
7074
'sep-835': () =>
@@ -177,7 +181,9 @@ program
177181
console.error('Either --scenario or --suite is required');
178182
console.error('\nAvailable client scenarios:');
179183
listScenarios().forEach((s) => console.error(` - ${s}`));
180-
console.error('\nAvailable suites: all, auth, metadata, sep-835');
184+
console.error(
185+
'\nAvailable suites: all, core, extensions, auth, metadata, sep-835'
186+
);
181187
process.exit(1);
182188
}
183189

@@ -296,13 +302,14 @@ program
296302

297303
if (suite === 'all') {
298304
scenarios = listClientScenarios();
299-
} else if (suite === 'active') {
305+
} else if (suite === 'active' || suite === 'core') {
306+
// 'core' is an alias for 'active' - tier 1 requirements
300307
scenarios = listActiveClientScenarios();
301308
} else if (suite === 'pending') {
302309
scenarios = listPendingClientScenarios();
303310
} else {
304311
console.error(`Unknown suite: ${suite}`);
305-
console.error('Available suites: active, all, pending');
312+
console.error('Available suites: active, all, core, pending');
306313
process.exit(1);
307314
}
308315

src/scenarios/client/auth/index.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
ClientCredentialsBasicScenario
2323
} from './client-credentials';
2424

25+
// Auth scenarios (required for tier 1)
2526
export const authScenariosList: Scenario[] = [
2627
...metadataScenarios,
2728
new AuthBasicCIMDScenario(),
@@ -34,7 +35,11 @@ export const authScenariosList: Scenario[] = [
3435
new ScopeRetryLimitScenario(),
3536
new ClientSecretBasicAuthScenario(),
3637
new ClientSecretPostAuthScenario(),
37-
new PublicClientAuthScenario(),
38+
new PublicClientAuthScenario()
39+
];
40+
41+
// Extension scenarios (optional for tier 1 - protocol extensions)
42+
export const extensionScenariosList: Scenario[] = [
3843
new ClientCredentialsJwtScenario(),
3944
new ClientCredentialsBasicScenario()
4045
];

src/scenarios/index.ts

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,24 +53,16 @@ import {
5353

5454
import { DNSRebindingProtectionScenario } from './server/dns-rebinding';
5555

56-
import { authScenariosList } from './client/auth/index';
56+
import { authScenariosList, extensionScenariosList } from './client/auth/index';
5757
import { listMetadataScenarios } from './client/auth/discovery-metadata';
5858

5959
// Pending client scenarios (not yet fully tested/implemented)
6060
const pendingClientScenariosList: ClientScenario[] = [
61-
// Elicitation scenarios (SEP-1330)
62-
new ElicitationEnumsScenario(),
63-
6461
// JSON Schema 2020-12 (SEP-1613)
6562
// This test is pending until the SDK includes PR #1135 which preserves
6663
// $schema, $defs, and additionalProperties fields in tool schemas.
6764
new JsonSchema2020_12Scenario(),
6865

69-
// On hold until elicitation schema types are fixed
70-
// https://github.com/modelcontextprotocol/modelcontextprotocol/pull/1863
71-
new ToolsCallElicitationScenario(),
72-
new ElicitationDefaultsScenario(),
73-
7466
// On hold until server-side SSE improvements are made
7567
// https://github.com/modelcontextprotocol/typescript-sdk/pull/1129
7668
new ServerSSEPollingScenario()
@@ -145,8 +137,18 @@ export const clientScenarios = new Map<string, ClientScenario>(
145137
allClientScenariosList.map((scenario) => [scenario.name, scenario])
146138
);
147139

148-
// Scenario scenarios
140+
// All client test scenarios (core + extensions)
149141
const scenariosList: Scenario[] = [
142+
new InitializeScenario(),
143+
new ToolsCallScenario(),
144+
new ElicitationClientDefaultsScenario(),
145+
new SSERetryScenario(),
146+
...authScenariosList,
147+
...extensionScenariosList
148+
];
149+
150+
// Core scenarios (tier 1 requirements)
151+
const coreScenariosList: Scenario[] = [
150152
new InitializeScenario(),
151153
new ToolsCallScenario(),
152154
new ElicitationClientDefaultsScenario(),
@@ -191,4 +193,12 @@ export function listAuthScenarios(): string[] {
191193
return authScenariosList.map((scenario) => scenario.name);
192194
}
193195

196+
export function listCoreScenarios(): string[] {
197+
return coreScenariosList.map((scenario) => scenario.name);
198+
}
199+
200+
export function listExtensionScenarios(): string[] {
201+
return extensionScenariosList.map((scenario) => scenario.name);
202+
}
203+
194204
export { listMetadataScenarios };

0 commit comments

Comments
 (0)