diff --git a/packages/core/src/shared/protocol.ts b/packages/core/src/shared/protocol.ts index 90c6116e0..c0f664cb3 100644 --- a/packages/core/src/shared/protocol.ts +++ b/packages/core/src/shared/protocol.ts @@ -603,6 +603,17 @@ export abstract class Protocol = { + 'prompts/list': 'prompts', + 'resources/list': 'resources', + 'resources/templates/list': 'resourceTemplates', + 'tools/list': 'tools' + }; + const responseKey = listMethodResponses[method]; + return responseKey ? ({ [responseKey]: [] } as SendResultT) : null; + } + /** * Attaches to the given transport, starts it, and starts listening for messages. * @@ -684,6 +695,32 @@ export abstract class Protocol this._onerror(new Error(`Failed to enqueue default list response: ${error}`))); + } else { + capturedTransport + ?.send(successResponse) + .catch(error => this._onerror(new Error(`Failed to send default list response: ${error}`))); + } + return; + } + const errorResponse: JSONRPCErrorResponse = { jsonrpc: '2.0', id: request.id, diff --git a/test/integration/test/server.test.ts b/test/integration/test/server.test.ts index 1cefeb62b..1fd235499 100644 --- a/test/integration/test/server.test.ts +++ b/test/integration/test/server.test.ts @@ -3281,3 +3281,21 @@ test('should respect client task capabilities', async () => { clientTaskStore.cleanup(); }); + +test('should return empty arrays for list methods when server has capabilities but no handlers', async () => { + const server = new Server({ name: 'test server', version: '1.0' }, { capabilities: { prompts: {}, resources: {}, tools: {} } }); + + const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); + + const client = new Client({ name: 'test client', version: '1.0' }, { capabilities: { sampling: {} } }); + + await Promise.all([client.connect(clientTransport), server.connect(serverTransport)]); + + expect((await client.listPrompts()).prompts).toEqual([]); + expect((await client.listResources()).resources).toEqual([]); + expect((await client.listResourceTemplates()).resourceTemplates).toEqual([]); + expect((await client.listTools()).tools).toEqual([]); + + await client.close(); + await server.close(); +});