diff --git a/.changeset/fix-server-protocol-version.md b/.changeset/fix-server-protocol-version.md new file mode 100644 index 000000000..02100923e --- /dev/null +++ b/.changeset/fix-server-protocol-version.md @@ -0,0 +1,5 @@ +--- +'@modelcontextprotocol/server': patch +--- + +fix(server): propagate negotiated protocol version to transport in _oninitialize diff --git a/packages/server/src/server/server.ts b/packages/server/src/server/server.ts index f1a1851f4..46105fb10 100644 --- a/packages/server/src/server/server.ts +++ b/packages/server/src/server/server.ts @@ -434,6 +434,8 @@ export class Server extends Protocol { ? requestedVersion : (this._supportedProtocolVersions[0] ?? LATEST_PROTOCOL_VERSION); + this.transport?.setProtocolVersion?.(protocolVersion); + return { protocolVersion, capabilities: this.getCapabilities(), diff --git a/packages/server/test/server/server.test.ts b/packages/server/test/server/server.test.ts new file mode 100644 index 000000000..fdb8214c5 --- /dev/null +++ b/packages/server/test/server/server.test.ts @@ -0,0 +1,42 @@ +import type { JSONRPCMessage } from '@modelcontextprotocol/core'; +import { InMemoryTransport, LATEST_PROTOCOL_VERSION } from '@modelcontextprotocol/core'; +import { Server } from '../../src/server/server.js'; + +describe('Server', () => { + describe('_oninitialize', () => { + it('should propagate negotiated protocol version to transport', async () => { + const server = new Server({ name: 'test', version: '1.0.0' }, { capabilities: {} }); + + const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); + + const setProtocolVersion = vi.fn(); + (serverTransport as { setProtocolVersion?: (version: string) => void }).setProtocolVersion = setProtocolVersion; + + await server.connect(serverTransport); + + // Collect response from the server + const responsePromise = new Promise(resolve => { + clientTransport.onmessage = msg => resolve(msg); + }); + await clientTransport.start(); + + // Send initialize request directly + await clientTransport.send({ + jsonrpc: '2.0', + id: 1, + method: 'initialize', + params: { + protocolVersion: LATEST_PROTOCOL_VERSION, + capabilities: {}, + clientInfo: { name: 'test-client', version: '1.0.0' } + } + } as JSONRPCMessage); + + await responsePromise; + + expect(setProtocolVersion).toHaveBeenCalledWith(LATEST_PROTOCOL_VERSION); + + await server.close(); + }); + }); +});