From 1289b16092a63863b8f3509e5eefc29bb7d1b368 Mon Sep 17 00:00:00 2001 From: Felix Weinberger Date: Mon, 8 Jun 2026 13:32:33 +0000 Subject: [PATCH 1/2] chore: sync spec-types to modelcontextprotocol@0168c57f Refreshes the vendored schema copies via npm run sync-schema. The draft schema now declares LATEST_PROTOCOL_VERSION = "2026-07-28" (previously the DRAFT-2026-v1 placeholder) and picks up the latest draft doc-comment and type updates. The dated schemas are unchanged. --- src/spec-types/SOURCE | 2 +- src/spec-types/draft.ts | 149 ++++++++++++++++++++++++++++++++++------ 2 files changed, 128 insertions(+), 23 deletions(-) diff --git a/src/spec-types/SOURCE b/src/spec-types/SOURCE index 201d6005..49ed355e 100644 --- a/src/spec-types/SOURCE +++ b/src/spec-types/SOURCE @@ -1 +1 @@ -modelcontextprotocol@33c3724972e6a87a8ad153e3f8a0d4714b0b9536 +modelcontextprotocol@0168c57fc74aba6e6dcf8f0b7191db3caaa5ad65 diff --git a/src/spec-types/draft.ts b/src/spec-types/draft.ts index 3d7cd427..f99c5295 100644 --- a/src/spec-types/draft.ts +++ b/src/spec-types/draft.ts @@ -34,7 +34,7 @@ export type JSONRPCMessage = | JSONRPCResponse; /** @internal */ -export const LATEST_PROTOCOL_VERSION = "DRAFT-2026-v1"; +export const LATEST_PROTOCOL_VERSION = "2026-07-28"; /** @internal */ export const JSONRPC_VERSION = "2.0"; @@ -102,6 +102,10 @@ export interface RequestMetaObject extends MetaObject { * If absent, the server MUST NOT send any {@link LoggingMessageNotification | notifications/message} * notifications for this request. The client opts in to log messages by * explicitly setting a level. Replaces the former `logging/setLevel` RPC. + * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. */ "io.modelcontextprotocol/logLevel"?: LoggingLevel; } @@ -162,7 +166,7 @@ export interface Notification { * input_required - the request requires additional input and the result contains an {@link InputRequiredResult} object with instructions for the client to provide additional input before retrying the original request. * @category Common Types */ -export type ResultType = "complete" | "input_required"; +export type ResultType = "complete" | "input_required" | string; /** * Common result fields. @@ -292,15 +296,14 @@ export interface InvalidRequestError extends Error { /** * A JSON-RPC error indicating that the requested method does not exist or is not available. * - * In MCP, this error is returned when a request is made for a method that requires a capability that has not been declared. This can occur in either direction: + * In MCP, a server returns this error when a client invokes a method the server does not implement — either a genuinely unknown method, or one gated behind a server capability the server did not advertise (e.g., calling `prompts/list` when the `prompts` capability was not advertised). * - * - A server returning this error when the client requests a capability it doesn't support (e.g., requesting completions when the `completions` capability was not advertised) - * - A client returning this error when the server requests a capability it doesn't support (e.g., requesting roots when the client did not declare the `roots` capability) + * A request that requires a client capability the client did not declare is signalled instead by {@link MissingRequiredClientCapabilityError} (`-32003`). * * @see {@link https://www.jsonrpc.org/specification#error_object | JSON-RPC 2.0 Error Object} * - * @example Roots not supported - * {@includeCode ./examples/MethodNotFoundError/roots-not-supported.json} + * @example Prompts not supported + * {@includeCode ./examples/MethodNotFoundError/prompts-not-supported.json} * * @category Errors */ @@ -578,7 +581,7 @@ export interface DiscoverRequest extends JSONRPCRequest { * * @category `server/discover` */ -export interface DiscoverResult extends Result { +export interface DiscoverResult extends CacheableResult { /** * MCP Protocol Versions this server supports. The client should choose a * version from this list for use in subsequent requests. @@ -628,6 +631,10 @@ export interface ClientCapabilities { /** * Present if the client supports listing roots. * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @example Roots — minimum baseline support * {@includeCode ./examples/ClientCapabilities/roots-minimum-baseline-support.json} */ @@ -636,14 +643,18 @@ export interface ClientCapabilities { /** * Present if the client supports sampling from an LLM. * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @example Sampling — minimum baseline support * {@includeCode ./examples/ClientCapabilities/sampling-minimum-baseline-support.json} * * @example Sampling — tool use support * {@includeCode ./examples/ClientCapabilities/sampling-tool-use-support.json} * - * @example Sampling — context inclusion support (soft-deprecated) - * {@includeCode ./examples/ClientCapabilities/sampling-context-inclusion-support-soft-deprecated.json} + * @example Sampling — context inclusion support (deprecated) + * {@includeCode ./examples/ClientCapabilities/sampling-context-inclusion-support-deprecated.json} */ sampling?: { /** @@ -675,7 +686,10 @@ export interface ClientCapabilities { * (e.g., "io.modelcontextprotocol/oauth-client-credentials"), and values are * per-extension settings objects. An empty object indicates support with no settings. * - * @example Extensions — UI extension with MIME type support + * Keys MUST follow the {@link MetaObject | `_meta` key naming rules}, with a + * mandatory prefix. + * + * @example Extensions — MCP Apps (UI) extension with MIME type support * {@includeCode ./examples/ClientCapabilities/extensions-ui-mime-types.json} */ extensions?: { [key: string]: JSONObject }; @@ -694,6 +708,10 @@ export interface ServerCapabilities { /** * Present if the server supports sending log messages to the client. * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @example Logging — minimum baseline support * {@includeCode ./examples/ServerCapabilities/logging-minimum-baseline-support.json} */ @@ -762,11 +780,14 @@ export interface ServerCapabilities { }; /** * Optional MCP extensions that the server supports. Keys are extension identifiers - * (e.g., "io.modelcontextprotocol/apps"), and values are per-extension settings + * (e.g., "io.modelcontextprotocol/tasks"), and values are per-extension settings * objects. An empty object indicates support with no settings. * - * @example Extensions — UI extension support - * {@includeCode ./examples/ServerCapabilities/extensions-ui.json} + * Keys MUST follow the {@link MetaObject | `_meta` key naming rules}, with a + * mandatory prefix. + * + * @example Extensions — Tasks extension support + * {@includeCode ./examples/ServerCapabilities/extensions-tasks.json} */ extensions?: { [key: string]: JSONObject }; } @@ -1848,6 +1869,10 @@ export interface Tool extends BaseMetadata, Icons { /** * Parameters for a `notifications/message` notification. * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @example Log database connection failed * {@includeCode ./examples/LoggingMessageNotificationParams/log-database-connection-failed.json} * @@ -1871,6 +1896,10 @@ export interface LoggingMessageNotificationParams extends NotificationParams { /** * JSONRPCNotification of a log message passed from server to client. The client opts in by setting `"io.modelcontextprotocol/logLevel"` in a request's `_meta`. * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @example Log database connection failed * {@includeCode ./examples/LoggingMessageNotification/log-database-connection-failed.json} * @@ -1887,6 +1916,10 @@ export interface LoggingMessageNotification extends JSONRPCNotification { * These map to syslog message severities, as specified in RFC-5424: * https://datatracker.ietf.org/doc/html/rfc5424#section-6.2.1 * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @category Common Types */ export type LoggingLevel = @@ -1912,6 +1945,10 @@ export type LoggingLevel = * @example Follow-up request with tool results * {@includeCode ./examples/CreateMessageRequestParams/follow-up-with-tool-results.json} * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @category `sampling/createMessage` */ export interface CreateMessageRequestParams { @@ -1928,8 +1965,12 @@ export interface CreateMessageRequestParams { * A request to include context from one or more MCP servers (including the caller), to be attached to the prompt. * The client MAY ignore this request. * - * Default is `"none"`. Values `"thisServer"` and `"allServers"` are soft-deprecated. Servers SHOULD only use these values if the client - * declares {@link ClientCapabilities.sampling.context}. These values may be removed in future spec releases. + * Default is `"none"`. The values `"thisServer"` and `"allServers"` are deprecated (SEP-2596): servers SHOULD + * omit this field or use `"none"`, and SHOULD only use the deprecated values if the client declares + * {@link ClientCapabilities.sampling.context}. + * + * @deprecated The `"thisServer"` and `"allServers"` values are deprecated as of protocol version 2025-11-25 + * (SEP-2596) and will be removed no later than the Sampling feature itself (SEP-2577). Omit this field or use `"none"`. */ includeContext?: "none" | "thisServer" | "allServers"; /** @@ -1963,6 +2004,10 @@ export interface CreateMessageRequestParams { /** * Controls tool selection behavior for sampling requests. * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @category `sampling/createMessage` */ export interface ToolChoice { @@ -1981,6 +2026,10 @@ export interface ToolChoice { * @example Sampling request * {@includeCode ./examples/CreateMessageRequest/sampling-request.json} * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @category `sampling/createMessage` */ export interface CreateMessageRequest { @@ -2002,6 +2051,10 @@ export interface CreateMessageRequest { * @example Final response after tool use * {@includeCode ./examples/CreateMessageResult/final-response.json} * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @category `sampling/createMessage` */ export interface CreateMessageResult extends SamplingMessage { @@ -2033,6 +2086,10 @@ export interface CreateMessageResult extends SamplingMessage { * @example Multiple content blocks * {@includeCode ./examples/SamplingMessage/multiple-content-blocks.json} * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @category `sampling/createMessage` */ export interface SamplingMessage { @@ -2042,6 +2099,10 @@ export interface SamplingMessage { } /** + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @category `sampling/createMessage` */ export type SamplingMessageContentBlock = @@ -2190,6 +2251,10 @@ export interface AudioContent { * @example `get_weather` tool use * {@includeCode ./examples/ToolUseContent/get-weather-tool-use.json} * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @category `sampling/createMessage` */ export interface ToolUseContent { @@ -2225,6 +2290,10 @@ export interface ToolUseContent { * @example `get_weather` tool result * {@includeCode ./examples/ToolResultContent/get-weather-tool-result.json} * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @category `sampling/createMessage` */ export interface ToolResultContent { @@ -2284,6 +2353,10 @@ export interface ToolResultContent { * @example With hints and priorities * {@includeCode ./examples/ModelPreferences/with-hints-and-priorities.json} * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @category `sampling/createMessage` */ export interface ModelPreferences { @@ -2338,6 +2411,10 @@ export interface ModelPreferences { * Keys not declared here are currently left unspecified by the spec and are up * to the client to interpret. * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @category `sampling/createMessage` */ export interface ModelHint { @@ -2486,6 +2563,10 @@ export interface PromptReference extends BaseMetadata { * @example List roots request * {@includeCode ./examples/ListRootsRequest/list-roots-request.json} * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @category `roots/list` */ export interface ListRootsRequest { @@ -2504,6 +2585,10 @@ export interface ListRootsRequest { * @example Multiple root directories * {@includeCode ./examples/ListRootsResult/multiple-root-directories.json} * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @category `roots/list` */ export interface ListRootsResult { @@ -2516,6 +2601,10 @@ export interface ListRootsResult { * @example Project directory root * {@includeCode ./examples/Root/project-directory.json} * + * @deprecated Deprecated as of protocol version 2026-07-28 (SEP-2577). + * Remains in the specification for at least twelve months; see the + * deprecated features registry. + * * @category `roots/list` */ export interface Root { @@ -2666,8 +2755,17 @@ export interface NumberSchema { type: "number" | "integer"; title?: string; description?: string; + /** + * @TJS-type number + */ minimum?: number; + /** + * @TJS-type number + */ maximum?: number; + /** + * @TJS-type number + */ default?: number; } @@ -2916,6 +3014,18 @@ export interface ElicitResult { content?: { [key: string]: string | number | boolean | string[] }; } +/** + * Parameters for a {@link ElicitationCompleteNotification | notifications/elicitation/complete} notification. + * + * @category `notifications/elicitation/complete` + */ +export interface ElicitationCompleteNotificationParams extends NotificationParams { + /** + * The ID of the elicitation that completed. + */ + elicitationId: string; +} + /** * An optional notification from the server to the client, informing it of a completion of a out-of-band elicitation request. * @@ -2926,12 +3036,7 @@ export interface ElicitResult { */ export interface ElicitationCompleteNotification extends JSONRPCNotification { method: "notifications/elicitation/complete"; - params: { - /** - * The ID of the elicitation that completed. - */ - elicitationId: string; - }; + params: ElicitationCompleteNotificationParams; } /* Client messages */ From b42db5f6d9b3337e54076c104d7d89f5b541217b Mon Sep 17 00:00:00 2001 From: Felix Weinberger Date: Mon, 8 Jun 2026 13:34:26 +0000 Subject: [PATCH 2/2] fix: update the draft wire version to 2026-07-28 The spec repo's draft schema now declares LATEST_PROTOCOL_VERSION = "2026-07-28", but the harness still asserted the old DRAFT-2026-v1 placeholder, so an SDK that sends the version the draft spec actually declares cannot pass the draft suite. - bump DRAFT_PROTOCOL_VERSION in src/types.ts to 2026-07-28 - update the hard-coded literals in tests, example servers, and README - add src/types.test.ts pinning DRAFT_PROTOCOL_VERSION to the vendored draft schema's LATEST_PROTOCOL_VERSION so the two cannot drift, and asserting the draft identifier stays distinct from the dated versions --- README.md | 4 ++-- .../servers/typescript/everything-server.ts | 6 +++--- .../typescript/sep-2164-empty-contents.ts | 2 +- .../typescript/sep-2322-mrtr-broken-server.ts | 2 +- .../typescript/sep-2549-no-caching-hints.ts | 2 +- src/connection/connection.test.ts | 8 ++++---- .../client/http-standard-headers.test.ts | 2 +- src/scenarios/client/request-metadata.test.ts | 6 +++--- src/scenarios/server/caching.ts | 2 +- src/scenarios/server/stateless.test.ts | 4 ++-- src/types.test.ts | 19 +++++++++++++++++++ src/types.ts | 2 +- 12 files changed, 39 insertions(+), 20 deletions(-) create mode 100644 src/types.test.ts diff --git a/README.md b/README.md index 41f5e588..a10ce3d2 100644 --- a/README.md +++ b/README.md @@ -64,13 +64,13 @@ npx @modelcontextprotocol/conformance client --command "" --scen - `--command` - The command to run your MCP client (can include flags) - `--scenario` - The test scenario to run (e.g., "initialize") - `--suite` - Run a suite of tests in parallel: `all`, `core`, `extensions`, `backcompat`, `auth`, `metadata`, `draft` (scenarios targeting the in-progress draft spec), or `sep-835` -- `--spec-version ` - Filter scenarios by spec version (e.g., `2025-11-25`, `DRAFT-2026-v1`; `draft` is accepted as an alias for the current draft identifier). The draft version selects the latest dated release plus any draft-only scenarios. When omitted, the version is inferred from the scenario's spec applicability (draft-only scenarios run at the draft version, everything else at the latest dated release); an explicitly requested version outside a scenario's applicability window skips the scenario (exit 0) unless `--force` is passed +- `--spec-version ` - Filter scenarios by spec version (e.g., `2025-11-25`, `2026-07-28`; `draft` is accepted as an alias for the current draft identifier). The draft version selects the latest dated release plus any draft-only scenarios. When omitted, the version is inferred from the scenario's spec applicability (draft-only scenarios run at the draft version, everything else at the latest dated release); an explicitly requested version outside a scenario's applicability window skips the scenario (exit 0) unless `--force` is passed - `--force` - Run a scenario even if it is not applicable at the requested `--spec-version` - `--expected-failures ` - Path to YAML baseline file of known failures (see [Expected Failures](#expected-failures)) - `--timeout` - Timeout in milliseconds (default: 30000) - `--verbose` - Show verbose output -The framework appends `` as an argument to your command and sets the `MCP_CONFORMANCE_SCENARIO` environment variable to the scenario name. For scenarios that require additional context (e.g., client credentials), the `MCP_CONFORMANCE_CONTEXT` environment variable contains a JSON object with scenario-specific data. When `--spec-version` is passed, its resolved value is forwarded to the client process as `MCP_CONFORMANCE_PROTOCOL_VERSION`; example clients can use this value directly as their `protocolVersion`. SDKs that hard-code their protocol version can ignore it. Clients under test must derive the lifecycle from the protocol version they are asked to run: dated versions through `2025-11-25` use the stateful lifecycle (initialize handshake), while the 2026 draft (`DRAFT-2026-v1`) uses the stateless lifecycle (per-request `_meta`). +The framework appends `` as an argument to your command and sets the `MCP_CONFORMANCE_SCENARIO` environment variable to the scenario name. For scenarios that require additional context (e.g., client credentials), the `MCP_CONFORMANCE_CONTEXT` environment variable contains a JSON object with scenario-specific data. When `--spec-version` is passed, its resolved value is forwarded to the client process as `MCP_CONFORMANCE_PROTOCOL_VERSION`; example clients can use this value directly as their `protocolVersion`. SDKs that hard-code their protocol version can ignore it. Clients under test must derive the lifecycle from the protocol version they are asked to run: dated versions through `2025-11-25` use the stateful lifecycle (initialize handshake), while the 2026 draft (`2026-07-28`) uses the stateless lifecycle (per-request `_meta`). ### Server Testing diff --git a/examples/servers/typescript/everything-server.ts b/examples/servers/typescript/everything-server.ts index ce439451..fb0d6bb5 100644 --- a/examples/servers/typescript/everything-server.ts +++ b/examples/servers/typescript/everything-server.ts @@ -1276,7 +1276,7 @@ app.post('/mcp', async (req, res) => { } // Protocol Version Negotiation Matrix (-32004, HTTP 400) - if (metaVersion !== 'DRAFT-2026-v1') { + if (metaVersion !== '2026-07-28') { return res.status(400).json({ jsonrpc: '2.0', id, @@ -1284,7 +1284,7 @@ app.post('/mcp', async (req, res) => { code: -32004, message: 'UnsupportedProtocolVersionError', data: { - supported: ['DRAFT-2026-v1'], + supported: ['2026-07-28'], requested: String(metaVersion) } } @@ -1344,7 +1344,7 @@ app.post('/mcp', async (req, res) => { jsonrpc: '2.0', id, result: { - supportedVersions: ['DRAFT-2026-v1'], + supportedVersions: ['2026-07-28'], capabilities: { tools: { listChanged: true }, // Explicitly announce dynamic capabilities matching Section 7 expectations prompts: { listChanged: true }, diff --git a/examples/servers/typescript/sep-2164-empty-contents.ts b/examples/servers/typescript/sep-2164-empty-contents.ts index 570b4567..464b68e9 100644 --- a/examples/servers/typescript/sep-2164-empty-contents.ts +++ b/examples/servers/typescript/sep-2164-empty-contents.ts @@ -25,7 +25,7 @@ app.post('/mcp', (req, res) => { jsonrpc: '2.0', id, result: { - supportedVersions: ['DRAFT-2026-v1'], + supportedVersions: ['2026-07-28'], capabilities: { resources: {} }, serverInfo: { name: 'sep-2164-empty-contents', version: '1.0.0' } } diff --git a/examples/servers/typescript/sep-2322-mrtr-broken-server.ts b/examples/servers/typescript/sep-2322-mrtr-broken-server.ts index 232e7948..49fcdb6d 100644 --- a/examples/servers/typescript/sep-2322-mrtr-broken-server.ts +++ b/examples/servers/typescript/sep-2322-mrtr-broken-server.ts @@ -23,7 +23,7 @@ type Handler = (params: Record) => unknown; const handlers: Record = {}; handlers['server/discover'] = () => ({ - supportedVersions: ['DRAFT-2026-v1'], + supportedVersions: ['2026-07-28'], capabilities: { tools: {}, prompts: {}, diff --git a/examples/servers/typescript/sep-2549-no-caching-hints.ts b/examples/servers/typescript/sep-2549-no-caching-hints.ts index 318c9fd3..efee1c28 100644 --- a/examples/servers/typescript/sep-2549-no-caching-hints.ts +++ b/examples/servers/typescript/sep-2549-no-caching-hints.ts @@ -26,7 +26,7 @@ app.post('/mcp', (req, res) => { jsonrpc: '2.0', id, result: { - supportedVersions: ['DRAFT-2026-v1'], + supportedVersions: ['2026-07-28'], capabilities: { tools: {}, resources: {}, prompts: {} }, serverInfo: { name: 'sep-2549-no-caching-hints', version: '1.0.0' } } diff --git a/src/connection/connection.test.ts b/src/connection/connection.test.ts index be093417..822d3bb5 100644 --- a/src/connection/connection.test.ts +++ b/src/connection/connection.test.ts @@ -20,8 +20,8 @@ describe('connectFor', () => { // version through), so identity with connectStateless no longer holds; // assert it did not select the stateful implementation. The wire-level // behaviour of the wrapper is covered in stateless.test.ts. - expect(connectFor('DRAFT-2026-v1')).not.toBe(connectStateful); - expect(connectFor('DRAFT-2026-v1')).not.toBe(connectStateless); + expect(connectFor('2026-07-28')).not.toBe(connectStateful); + expect(connectFor('2026-07-28')).not.toBe(connectStateless); }); }); @@ -64,10 +64,10 @@ describe('connectStateless', () => { await conn.request('tools/list'); const [, init] = mockFetch.mock.calls[0]; - expect(init.headers['MCP-Protocol-Version']).toBe('DRAFT-2026-v1'); + expect(init.headers['MCP-Protocol-Version']).toBe('2026-07-28'); const sent = JSON.parse(init.body); expect(sent.params._meta['io.modelcontextprotocol/protocolVersion']).toBe( - 'DRAFT-2026-v1' + '2026-07-28' ); expect( sent.params._meta['io.modelcontextprotocol/clientInfo'] diff --git a/src/scenarios/client/http-standard-headers.test.ts b/src/scenarios/client/http-standard-headers.test.ts index 3478e060..94674562 100644 --- a/src/scenarios/client/http-standard-headers.test.ts +++ b/src/scenarios/client/http-standard-headers.test.ts @@ -24,7 +24,7 @@ describe('HttpStandardHeadersScenario (SEP-2243) — negative', () => { id: 1, method: 'initialize', params: { - protocolVersion: 'DRAFT-2026-v1', + protocolVersion: '2026-07-28', clientInfo: { name: 'neg-test', version: '0' }, capabilities: {} } diff --git a/src/scenarios/client/request-metadata.test.ts b/src/scenarios/client/request-metadata.test.ts index d1ef6759..e2046fed 100644 --- a/src/scenarios/client/request-metadata.test.ts +++ b/src/scenarios/client/request-metadata.test.ts @@ -26,7 +26,7 @@ async function badClient(serverUrl: string) { } const goodMeta = { - 'io.modelcontextprotocol/protocolVersion': 'DRAFT-2026-v1', + 'io.modelcontextprotocol/protocolVersion': '2026-07-28', 'io.modelcontextprotocol/clientInfo': { name: 'test', version: '1.0' }, 'io.modelcontextprotocol/clientCapabilities': {} }; @@ -70,7 +70,7 @@ async function nonRetryingClient(serverUrl: string) { method: 'POST', headers: { 'Content-Type': 'application/json', - 'MCP-Protocol-Version': 'DRAFT-2026-v1' + 'MCP-Protocol-Version': '2026-07-28' }, body: JSON.stringify({ jsonrpc: '2.0', @@ -118,7 +118,7 @@ async function malformedCapabilitiesClient(serverUrl: string) { method: 'POST', headers: { 'Content-Type': 'application/json', - 'MCP-Protocol-Version': 'DRAFT-2026-v1' + 'MCP-Protocol-Version': '2026-07-28' }, body: JSON.stringify({ jsonrpc: '2.0', diff --git a/src/scenarios/server/caching.ts b/src/scenarios/server/caching.ts index 1c96a856..c7f4a5b5 100644 --- a/src/scenarios/server/caching.ts +++ b/src/scenarios/server/caching.ts @@ -99,7 +99,7 @@ Servers MUST include \`ttlMs\` (integer >= 0) and \`cacheScope\` ("public" or "p // SEP-2549 only exists in the draft spec, so each cacheable endpoint is // queried over the version-appropriate connection. Under --spec-version // draft that resolves to the stateless impl (SEP-2575): protocolVersion - // DRAFT-2026-v1 plus the cross-cutting _meta and standard headers + // 2026-07-28 plus the cross-cutting _meta and standard headers // (issue #315). let conn: Connection; try { diff --git a/src/scenarios/server/stateless.test.ts b/src/scenarios/server/stateless.test.ts index 0870af9a..133d9328 100644 --- a/src/scenarios/server/stateless.test.ts +++ b/src/scenarios/server/stateless.test.ts @@ -101,7 +101,7 @@ describe('Stateless Server Scenario Negative Tests', () => { jsonrpc: '2.0', id: reqBody.id, result: { - supportedVersions: ['DRAFT-2026-v1'], + supportedVersions: ['2026-07-28'], capabilities: {}, serverInfo: { name: 'bad-meta-server', version: '1.0.0' } } @@ -341,7 +341,7 @@ describe('Stateless Server Scenario Negative Tests', () => { jsonrpc: '2.0', id: reqBody.id, result: { - supportedVersions: ['DRAFT-2026-v1'], + supportedVersions: ['2026-07-28'], capabilities: { tools: { listChanged: true }, prompts: { listChanged: true } diff --git a/src/types.test.ts b/src/types.test.ts new file mode 100644 index 00000000..6612196e --- /dev/null +++ b/src/types.test.ts @@ -0,0 +1,19 @@ +import { describe, it, expect } from 'vitest'; +import { LATEST_PROTOCOL_VERSION } from './spec-types/draft'; +import { DATED_SPEC_VERSIONS, DRAFT_PROTOCOL_VERSION } from './types'; + +describe('DRAFT_PROTOCOL_VERSION', () => { + it('mirrors LATEST_PROTOCOL_VERSION from the vendored draft schema', () => { + // DRAFT_PROTOCOL_VERSION is the wire protocolVersion the harness asserts + // for draft-spec scenarios. It must match what the spec's draft schema + // declares, or SDKs implementing the draft cannot pass the draft suite. + expect(DRAFT_PROTOCOL_VERSION).toBe(LATEST_PROTOCOL_VERSION); + }); + + it('is distinct from every dated spec version', () => { + // Scenario applicability (introducedIn/removedIn) and --spec-version + // resolution rely on the draft identifier not colliding with a released + // version. + expect(DATED_SPEC_VERSIONS).not.toContain(DRAFT_PROTOCOL_VERSION); + }); +}); diff --git a/src/types.ts b/src/types.ts index 2e9dd22a..4da546fe 100644 --- a/src/types.ts +++ b/src/types.ts @@ -41,7 +41,7 @@ export const LATEST_SPEC_VERSION: DatedSpecVersion = '2025-11-25'; * `LATEST_PROTOCOL_VERSION` in the spec repo's `schema/draft/schema.ts`; * bump when that constant changes. */ -export const DRAFT_PROTOCOL_VERSION = 'DRAFT-2026-v1'; +export const DRAFT_PROTOCOL_VERSION = '2026-07-28'; // Wire protocolVersion strings the mock server will negotiate on initialize. export const NEGOTIABLE_PROTOCOL_VERSIONS: readonly string[] = [