feat: allow overriding protocol versions in Client, Server, and Transport (#1448)
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
92f5ce59ba
commit
160902eb2e
2 changed files with 119 additions and 9 deletions
|
|
@ -51,8 +51,7 @@ import {
|
|||
McpError,
|
||||
mergeCapabilities,
|
||||
Protocol,
|
||||
safeParse,
|
||||
SUPPORTED_PROTOCOL_VERSIONS
|
||||
safeParse
|
||||
} from '@modelcontextprotocol/core';
|
||||
|
||||
import { ExperimentalServerTasks } from '../experimental/tasks/server.js';
|
||||
|
|
@ -435,7 +434,9 @@ export class Server<
|
|||
this._clientCapabilities = request.params.capabilities;
|
||||
this._clientVersion = request.params.clientInfo;
|
||||
|
||||
const protocolVersion = SUPPORTED_PROTOCOL_VERSIONS.includes(requestedVersion) ? requestedVersion : LATEST_PROTOCOL_VERSION;
|
||||
const protocolVersion = this._supportedProtocolVersions.includes(requestedVersion)
|
||||
? requestedVersion
|
||||
: (this._supportedProtocolVersions[0] ?? LATEST_PROTOCOL_VERSION);
|
||||
|
||||
return {
|
||||
protocolVersion,
|
||||
|
|
|
|||
|
|
@ -142,6 +142,18 @@ export interface WebStandardStreamableHTTPServerTransportOptions {
|
|||
* client reconnection timing for polling behavior.
|
||||
*/
|
||||
retryInterval?: number;
|
||||
|
||||
/**
|
||||
* List of protocol versions that this transport will accept.
|
||||
* Used to validate the mcp-protocol-version header in incoming requests.
|
||||
*
|
||||
* Note: When using Server.connect(), the server automatically passes its
|
||||
* supportedProtocolVersions to the transport, so you typically don't need
|
||||
* to set this option directly.
|
||||
*
|
||||
* @default SUPPORTED_PROTOCOL_VERSIONS
|
||||
*/
|
||||
supportedProtocolVersions?: string[];
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -220,6 +232,7 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
|
|||
private _allowedOrigins?: string[];
|
||||
private _enableDnsRebindingProtection: boolean;
|
||||
private _retryInterval?: number;
|
||||
private _supportedProtocolVersions: string[];
|
||||
|
||||
sessionId?: string;
|
||||
onclose?: () => void;
|
||||
|
|
@ -236,6 +249,7 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
|
|||
this._allowedOrigins = options.allowedOrigins;
|
||||
this._enableDnsRebindingProtection = options.enableDnsRebindingProtection ?? false;
|
||||
this._retryInterval = options.retryInterval;
|
||||
this._supportedProtocolVersions = options.supportedProtocolVersions ?? SUPPORTED_PROTOCOL_VERSIONS;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -249,6 +263,14 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
|
|||
this._started = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the supported protocol versions for header validation.
|
||||
* Called by the server during connect() to pass its supported versions.
|
||||
*/
|
||||
setSupportedProtocolVersions(versions: string[]): void {
|
||||
this._supportedProtocolVersions = versions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper to create a JSON error response
|
||||
*/
|
||||
|
|
@ -848,11 +870,11 @@ export class WebStandardStreamableHTTPServerTransport implements Transport {
|
|||
private validateProtocolVersion(req: Request): Response | undefined {
|
||||
const protocolVersion = req.headers.get('mcp-protocol-version');
|
||||
|
||||
if (protocolVersion !== null && !SUPPORTED_PROTOCOL_VERSIONS.includes(protocolVersion)) {
|
||||
if (protocolVersion !== null && !this._supportedProtocolVersions.includes(protocolVersion)) {
|
||||
return this.createJsonErrorResponse(
|
||||
400,
|
||||
-32_000,
|
||||
`Bad Request: Unsupported protocol version: ${protocolVersion} (supported versions: ${SUPPORTED_PROTOCOL_VERSIONS.join(', ')})`
|
||||
`Bad Request: Unsupported protocol version: ${protocolVersion} (supported versions: ${this._supportedProtocolVersions.join(', ')})`
|
||||
);
|
||||
}
|
||||
return undefined;
|
||||
|
|
|
|||
Loading…
Reference in a new issue