diff --git a/.changeset/exact-optional-property-types.md b/.changeset/exact-optional-property-types.md new file mode 100644 index 000000000..3230301ba --- /dev/null +++ b/.changeset/exact-optional-property-types.md @@ -0,0 +1,15 @@ +--- +"@modelcontextprotocol/core": patch +"@modelcontextprotocol/server": patch +--- + +fix: support `exactOptionalPropertyTypes` TypeScript config + +Adds `| undefined` to optional callback properties in the `Transport` interface +and `WebStandardStreamableHTTPServerTransportOptions` to support projects using +`exactOptionalPropertyTypes: true` in their tsconfig. + +This allows explicitly passing `undefined` for optional callbacks like +`sessionIdGenerator`, `onclose`, `onerror`, and `onmessage`. + +Fixes #1397 diff --git a/packages/core/src/shared/transport.ts b/packages/core/src/shared/transport.ts index 87608f124..af43dfdb2 100644 --- a/packages/core/src/shared/transport.ts +++ b/packages/core/src/shared/transport.ts @@ -98,14 +98,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. @@ -114,7 +114,7 @@ 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. diff --git a/packages/server/src/server/streamableHttp.ts b/packages/server/src/server/streamableHttp.ts index ae8bad97e..82751726e 100644 --- a/packages/server/src/server/streamableHttp.ts +++ b/packages/server/src/server/streamableHttp.ts @@ -79,7 +79,7 @@ export interface WebStandardStreamableHTTPServerTransportOptions { * * If not provided, session management is disabled (stateless mode). */ - sessionIdGenerator?: () => string; + sessionIdGenerator?: (() => string) | undefined; /** * A callback for session initialization events @@ -88,7 +88,7 @@ export interface WebStandardStreamableHTTPServerTransportOptions { * and need to keep track of them. * @param sessionId The generated session ID */ - onsessioninitialized?: (sessionId: string) => void | Promise; + onsessioninitialized?: ((sessionId: string) => void | Promise) | undefined; /** * A callback for session close events @@ -100,7 +100,7 @@ export interface WebStandardStreamableHTTPServerTransportOptions { * session open/running. * @param sessionId The session ID that was closed */ - onsessionclosed?: (sessionId: string) => void | Promise; + onsessionclosed?: ((sessionId: string) => void | Promise) | undefined; /** * If true, the server will return JSON responses instead of starting an SSE stream.