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..531ec9af8 100644 --- a/test/integration/test/server.test.ts +++ b/test/integration/test/server.test.ts @@ -3715,3 +3715,37 @@ 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(); + }); +});