Skip to content
Open
20 changes: 10 additions & 10 deletions packages/client/src/client/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -409,17 +409,17 @@ export class Client extends Protocol<ClientContext> {
* ```
*/
override async connect(transport: Transport, options?: RequestOptions): Promise<void> {
await super.connect(transport);
// When transport sessionId is already set this means we are trying to reconnect.
// Restore the protocol version negotiated during the original initialize handshake
// so HTTP transports include the required mcp-protocol-version header, but skip re-init.
if (transport.sessionId !== undefined) {
if (this._negotiatedProtocolVersion !== undefined && transport.setProtocolVersion) {
transport.setProtocolVersion(this._negotiatedProtocolVersion);
}
return;
}
try {
await super.connect(transport);
// When transport sessionId is already set this means we are trying to reconnect.
// Restore the protocol version negotiated during the original initialize handshake
// so HTTP transports include the required mcp-protocol-version header, but skip re-init.
if (transport.sessionId !== undefined) {
if (this._negotiatedProtocolVersion !== undefined && transport.setProtocolVersion) {
transport.setProtocolVersion(this._negotiatedProtocolVersion);
}
return;
}
const result = await this._requestWithSchema(
{
method: 'initialize',
Expand Down
27 changes: 27 additions & 0 deletions test/integration/test/client/client.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,33 @@ test('should reject unsupported protocol version', async () => {
expect(clientTransport.close).toHaveBeenCalled();
});

/***
* Test: Connection Initialization Failure Cleanup
*/
test('should close transport and clean up if connection initialization fails', async () => {
const clientTransport: Transport = {
start: vi.fn().mockRejectedValue(new Error('Transport start failed')),
close: vi.fn().mockResolvedValue(undefined),
send: vi.fn().mockResolvedValue(undefined)
};

const client = new Client(
{
name: 'test client',
version: '1.0'
},
{
capabilities: {}
}
);

await expect(client.connect(clientTransport)).rejects.toThrow('Transport start failed');

// The transport.close() method should be called to clean up resources
// because the client.connect() method caught the error and called this.close()
expect(clientTransport.close).toHaveBeenCalled();
});

/***
* Test: Connect New Client to Old Supported Server Version
*/
Expand Down
Loading