From a8097548472bab8cc24e5f8a408eb074071fc10c Mon Sep 17 00:00:00 2001 From: g97iulio1609 Date: Sat, 28 Feb 2026 08:21:07 +0100 Subject: [PATCH 1/2] fix: registerCapabilities registers logging/setLevel handler When logging capability is added via registerCapabilities() instead of the constructor options, the logging/setLevel request handler was not being registered. This caused clients to receive 'Method not found' errors when calling setLoggingLevel. Extract the logging handler setup into a private _registerLoggingHandler method and call it from both the constructor (when logging is in initial capabilities) and registerCapabilities (when logging is added later). Fixes #1464 --- packages/server/src/server/server.ts | 28 +++++++++++------- test/integration/test/server.test.ts | 43 ++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 10 deletions(-) diff --git a/packages/server/src/server/server.ts b/packages/server/src/server/server.ts index 264386806..a9d6881fc 100644 --- a/packages/server/src/server/server.ts +++ b/packages/server/src/server/server.ts @@ -115,19 +115,23 @@ export class Server extends Protocol { this.setNotificationHandler('notifications/initialized', () => this.oninitialized?.()); if (this._capabilities.logging) { - this.setRequestHandler('logging/setLevel', async (request, ctx) => { - const transportSessionId: string | undefined = - ctx.sessionId || (ctx.http?.req?.headers.get('mcp-session-id') as string) || undefined; - const { level } = request.params; - const parseResult = parseSchema(LoggingLevelSchema, level); - if (parseResult.success) { - this._loggingLevels.set(transportSessionId, parseResult.data); - } - return {}; - }); + this._registerLoggingHandler(); } } + private _registerLoggingHandler(): void { + this.setRequestHandler('logging/setLevel', async (request, ctx) => { + const transportSessionId: string | undefined = + ctx.sessionId || (ctx.http?.req?.headers.get('mcp-session-id') as string) || undefined; + const { level } = request.params; + const parseResult = parseSchema(LoggingLevelSchema, level); + if (parseResult.success) { + this._loggingLevels.set(transportSessionId, parseResult.data); + } + return {}; + }); + } + protected override buildContext(ctx: BaseContext, transportInfo?: MessageExtraInfo): ServerContext { // Only create http when there's actual HTTP transport info or auth info const hasHttpInfo = @@ -188,7 +192,11 @@ export class Server extends Protocol { if (this.transport) { throw new SdkError(SdkErrorCode.AlreadyConnected, 'Cannot register capabilities after connecting to transport'); } + const hadLogging = !!this._capabilities.logging; this._capabilities = mergeCapabilities(this._capabilities, capabilities); + if (!hadLogging && this._capabilities.logging) { + this._registerLoggingHandler(); + } } /** diff --git a/test/integration/test/server.test.ts b/test/integration/test/server.test.ts index ef7cd931e..6b0d6e833 100644 --- a/test/integration/test/server.test.ts +++ b/test/integration/test/server.test.ts @@ -3715,3 +3715,46 @@ describe('elicitInputStream', () => { }); }); }); + +describe('Server registerCapabilities with logging', () => { + test('registerCapabilities should register logging/setLevel handler', async () => { + const server = new Server( + { name: 'test-server', version: '1.0.0' } + ); + server.registerCapabilities({ logging: {} }); + + const client = new Client({ name: 'test-client', version: '1.0.0' }); + const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); + + await server.connect(serverTransport); + await client.connect(clientTransport); + + // logging/setLevel should succeed, not throw "Method not found" + await expect( + client.setLoggingLevel('error') + ).resolves.not.toThrow(); + + await client.close(); + await server.close(); + }); + + test('logging in constructor capabilities should register logging/setLevel handler', async () => { + const server = new Server( + { name: 'test-server', version: '1.0.0' }, + { capabilities: { logging: {} } } + ); + + const client = new Client({ name: 'test-client', version: '1.0.0' }); + const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); + + await server.connect(serverTransport); + await client.connect(clientTransport); + + await expect( + client.setLoggingLevel('error') + ).resolves.not.toThrow(); + + await client.close(); + await server.close(); + }); +}); From 5a16f7542fe93f1e9f286fbcd20ca4ad5021ac68 Mon Sep 17 00:00:00 2001 From: g97iulio1609 Date: Sat, 28 Feb 2026 17:03:26 +0100 Subject: [PATCH 2/2] fix: format test/integration/test/server.test.ts with prettier --- test/integration/test/server.test.ts | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/test/integration/test/server.test.ts b/test/integration/test/server.test.ts index 6b0d6e833..531ec9af8 100644 --- a/test/integration/test/server.test.ts +++ b/test/integration/test/server.test.ts @@ -3718,9 +3718,7 @@ describe('elicitInputStream', () => { describe('Server registerCapabilities with logging', () => { test('registerCapabilities should register logging/setLevel handler', async () => { - const server = new Server( - { name: 'test-server', version: '1.0.0' } - ); + const server = new Server({ name: 'test-server', version: '1.0.0' }); server.registerCapabilities({ logging: {} }); const client = new Client({ name: 'test-client', version: '1.0.0' }); @@ -3730,19 +3728,14 @@ describe('Server registerCapabilities with logging', () => { await client.connect(clientTransport); // logging/setLevel should succeed, not throw "Method not found" - await expect( - client.setLoggingLevel('error') - ).resolves.not.toThrow(); + await expect(client.setLoggingLevel('error')).resolves.not.toThrow(); await client.close(); await server.close(); }); test('logging in constructor capabilities should register logging/setLevel handler', async () => { - const server = new Server( - { name: 'test-server', version: '1.0.0' }, - { capabilities: { logging: {} } } - ); + const server = new Server({ name: 'test-server', version: '1.0.0' }, { capabilities: { logging: {} } }); const client = new Client({ name: 'test-client', version: '1.0.0' }); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); @@ -3750,9 +3743,7 @@ describe('Server registerCapabilities with logging', () => { await server.connect(serverTransport); await client.connect(clientTransport); - await expect( - client.setLoggingLevel('error') - ).resolves.not.toThrow(); + await expect(client.setLoggingLevel('error')).resolves.not.toThrow(); await client.close(); await server.close();