Skip to content

Commit 4f6eced

Browse files
Fix: Return empty Array for list methods when no handlers registered
1 parent 2bb7f47 commit 4f6eced

2 files changed

Lines changed: 61 additions & 0 deletions

File tree

packages/core/src/shared/protocol.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,17 @@ export abstract class Protocol<SendRequestT extends Request, SendNotificationT e
603603
}
604604
}
605605

606+
private _getDefaultListResponse(method: string): SendResultT | null {
607+
const listMethodResponses: Record<string, string> = {
608+
'prompts/list': 'prompts',
609+
'resources/list': 'resources',
610+
'resources/templates/list': 'resourceTemplates',
611+
'tools/list': 'tools'
612+
};
613+
const responseKey = listMethodResponses[method];
614+
return responseKey ? ({ [responseKey]: [] } as SendResultT) : null;
615+
}
616+
606617
/**
607618
* Attaches to the given transport, starts it, and starts listening for messages.
608619
*
@@ -684,6 +695,32 @@ export abstract class Protocol<SendRequestT extends Request, SendNotificationT e
684695
const relatedTaskId = request.params?._meta?.[RELATED_TASK_META_KEY]?.taskId;
685696

686697
if (handler === undefined) {
698+
const defaultResponse = this._getDefaultListResponse(request.method);
699+
if (defaultResponse !== null) {
700+
const successResponse: JSONRPCResultResponse = {
701+
jsonrpc: '2.0',
702+
id: request.id,
703+
result: defaultResponse
704+
};
705+
706+
if (relatedTaskId && this._taskMessageQueue) {
707+
this._enqueueTaskMessage(
708+
relatedTaskId,
709+
{
710+
type: 'response',
711+
message: successResponse,
712+
timestamp: Date.now()
713+
},
714+
capturedTransport?.sessionId
715+
).catch(error => this._onerror(new Error(`Failed to enqueue default list response: ${error}`)));
716+
} else {
717+
capturedTransport
718+
?.send(successResponse)
719+
.catch(error => this._onerror(new Error(`Failed to send default list response: ${error}`)));
720+
}
721+
return;
722+
}
723+
687724
const errorResponse: JSONRPCErrorResponse = {
688725
jsonrpc: '2.0',
689726
id: request.id,

test/integration/test/server.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3279,3 +3279,27 @@ test('should respect client task capabilities', async () => {
32793279

32803280
clientTaskStore.cleanup();
32813281
});
3282+
3283+
test('should return empty arrays for list methods when server has capabilities but no handlers', async () => {
3284+
const server = new Server(
3285+
{ name: 'test server', version: '1.0' },
3286+
{ capabilities: { prompts: {}, resources: {}, tools: {} } }
3287+
);
3288+
3289+
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
3290+
3291+
const client = new Client(
3292+
{ name: 'test client', version: '1.0' },
3293+
{ capabilities: { sampling: {} } }
3294+
);
3295+
3296+
await Promise.all([client.connect(clientTransport), server.connect(serverTransport)]);
3297+
3298+
expect((await client.listPrompts()).prompts).toEqual([]);
3299+
expect((await client.listResources()).resources).toEqual([]);
3300+
expect((await client.listResourceTemplates()).resourceTemplates).toEqual([]);
3301+
expect((await client.listTools()).tools).toEqual([]);
3302+
3303+
await client.close();
3304+
await server.close();
3305+
});

0 commit comments

Comments
 (0)