diff --git a/.changeset/fix-transport-exact-optional-property-types.md b/.changeset/fix-transport-exact-optional-property-types.md new file mode 100644 index 0000000000..9b735ff1cd --- /dev/null +++ b/.changeset/fix-transport-exact-optional-property-types.md @@ -0,0 +1,10 @@ +--- +'@modelcontextprotocol/sdk': patch +--- + +Add explicit `| undefined` to the optional properties of the `Transport` interface (`onclose`, `onerror`, `onmessage`, `sessionId`, `setProtocolVersion`) and of `TransportSendOptions` (`relatedRequestId`, `resumptionToken`, `onresumptiontoken`). + +Under `exactOptionalPropertyTypes: true`, `onclose?: () => void` means the property may be absent but never explicitly `undefined`. The concrete transports declare these members as accessors typed `(() => void) | undefined`, so the SDK's own transports were not assignable to the +SDK's own `Transport` interface, and `server.connect(new StreamableHTTPServerTransport(...))` failed with TS2379. Consumers had to either cast at the call site or disable the flag for their whole project. + +This is a backport of the same fix already merged on `main` in #1766, and resolves #2083 for the v1 line. diff --git a/src/shared/transport.ts b/src/shared/transport.ts index 09fe611722..2be18ae85b 100644 --- a/src/shared/transport.ts +++ b/src/shared/transport.ts @@ -143,21 +143,21 @@ export type TransportSendOptions = { /** * If present, `relatedRequestId` is used to indicate to the transport which incoming request to associate this outgoing message with. */ - relatedRequestId?: RequestId; + relatedRequestId?: RequestId | undefined; /** * The resumption token used to continue long-running requests that were interrupted. * * This allows clients to reconnect and continue from where they left off, if supported by the transport. */ - resumptionToken?: string; + resumptionToken?: string | undefined; /** * A callback that is invoked when the resumption token changes, if supported by the transport. * * This allows clients to persist the latest token for potential reconnection. */ - onresumptiontoken?: (token: string) => void; + onresumptiontoken?: ((token: string) => void) | undefined; }; /** * Describes the minimal contract for an MCP transport that a client or server can communicate over. @@ -189,14 +189,14 @@ export interface Transport { * * This should be invoked when close() is called as well. */ - onclose?: () => void; + onclose?: (() => void) | undefined; /** * Callback for when an error occurs. * * Note that errors are not necessarily fatal; they are used for reporting any kind of exceptional condition out of band. */ - onerror?: (error: Error) => void; + onerror?: ((error: Error) => void) | undefined; /** * Callback for when a message (request or response) is received over the connection. @@ -205,15 +205,15 @@ export interface Transport { * * The requestInfo can be used to get the original request information (headers, etc.) */ - onmessage?: (message: T, extra?: MessageExtraInfo) => void; + onmessage?: ((message: T, extra?: MessageExtraInfo) => void) | undefined; /** * The session ID generated for this connection. */ - sessionId?: string; + sessionId?: string | undefined; /** * Sets the protocol version used for the connection (called when the initialize response is received). */ - setProtocolVersion?: (version: string) => void; + setProtocolVersion?: ((version: string) => void) | undefined; }