Skip to content

Commit 689148d

Browse files
rechedev9KKonstantinovfelixweinberger
authored
fix(server): propagate negotiated protocol version to transport (#1660)
Co-authored-by: Konstantin Konstantinov <KKonstantinov@users.noreply.github.com> Co-authored-by: Felix Weinberger <3823880+felixweinberger@users.noreply.github.com>
1 parent 0fabc27 commit 689148d

File tree

3 files changed

+49
-0
lines changed

3 files changed

+49
-0
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@modelcontextprotocol/server': patch
3+
---
4+
5+
fix(server): propagate negotiated protocol version to transport in _oninitialize

packages/server/src/server/server.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,8 @@ export class Server extends Protocol<ServerContext> {
433433
? requestedVersion
434434
: (this._supportedProtocolVersions[0] ?? LATEST_PROTOCOL_VERSION);
435435

436+
this.transport?.setProtocolVersion?.(protocolVersion);
437+
436438
return {
437439
protocolVersion,
438440
capabilities: this.getCapabilities(),
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import type { JSONRPCMessage } from '@modelcontextprotocol/core';
2+
import { InMemoryTransport, LATEST_PROTOCOL_VERSION } from '@modelcontextprotocol/core';
3+
import { Server } from '../../src/server/server.js';
4+
5+
describe('Server', () => {
6+
describe('_oninitialize', () => {
7+
it('should propagate negotiated protocol version to transport', async () => {
8+
const server = new Server({ name: 'test', version: '1.0.0' }, { capabilities: {} });
9+
10+
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
11+
12+
const setProtocolVersion = vi.fn();
13+
(serverTransport as { setProtocolVersion?: (version: string) => void }).setProtocolVersion = setProtocolVersion;
14+
15+
await server.connect(serverTransport);
16+
17+
// Collect response from the server
18+
const responsePromise = new Promise<JSONRPCMessage>(resolve => {
19+
clientTransport.onmessage = msg => resolve(msg);
20+
});
21+
await clientTransport.start();
22+
23+
// Send initialize request directly
24+
await clientTransport.send({
25+
jsonrpc: '2.0',
26+
id: 1,
27+
method: 'initialize',
28+
params: {
29+
protocolVersion: LATEST_PROTOCOL_VERSION,
30+
capabilities: {},
31+
clientInfo: { name: 'test-client', version: '1.0.0' }
32+
}
33+
} as JSONRPCMessage);
34+
35+
await responsePromise;
36+
37+
expect(setProtocolVersion).toHaveBeenCalledWith(LATEST_PROTOCOL_VERSION);
38+
39+
await server.close();
40+
});
41+
});
42+
});

0 commit comments

Comments
 (0)