Skip to content

Commit 88f9723

Browse files
committed
Fix: Return Empty Arrays for List Methods When No Handlers Registered (#929)
1 parent 856d9ec commit 88f9723

File tree

2 files changed

+379
-15
lines changed

2 files changed

+379
-15
lines changed

src/client/index.test.ts

Lines changed: 328 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import {
1717
ElicitRequestSchema,
1818
ListRootsRequestSchema,
1919
ErrorCode,
20+
ListPromptsRequestSchema,
21+
ListResourceTemplatesRequestSchema,
2022
} from "../types.js";
2123
import { Transport } from "../shared/transport.js";
2224
import { Server } from "../server/index.js";
@@ -1301,3 +1303,329 @@ describe('outputSchema validation', () => {
13011303

13021304

13031305
});
1306+
1307+
test("should return empty array when server has prompts capability but no prompts registered", async () => {
1308+
const server = new Server(
1309+
{
1310+
name: "test server",
1311+
version: "1.0",
1312+
},
1313+
{
1314+
capabilities: {
1315+
prompts: {},
1316+
},
1317+
},
1318+
);
1319+
1320+
server.setRequestHandler(InitializeRequestSchema, (_request) => ({
1321+
protocolVersion: LATEST_PROTOCOL_VERSION,
1322+
capabilities: {
1323+
prompts: {},
1324+
},
1325+
serverInfo: {
1326+
name: "test",
1327+
version: "1.0",
1328+
},
1329+
}));
1330+
1331+
const [clientTransport, serverTransport] =
1332+
InMemoryTransport.createLinkedPair();
1333+
1334+
const client = new Client(
1335+
{
1336+
name: "test client",
1337+
version: "1.0",
1338+
},
1339+
{
1340+
capabilities: {
1341+
sampling: {},
1342+
},
1343+
},
1344+
);
1345+
1346+
await Promise.all([
1347+
client.connect(clientTransport),
1348+
server.connect(serverTransport),
1349+
]);
1350+
1351+
const result = await client.listPrompts();
1352+
expect(result.prompts).toEqual([]);
1353+
});
1354+
1355+
test("should return empty array when server has resources capability but no resources registered", async () => {
1356+
const server = new Server(
1357+
{
1358+
name: "test server",
1359+
version: "1.0",
1360+
},
1361+
{
1362+
capabilities: {
1363+
resources: {},
1364+
},
1365+
},
1366+
);
1367+
1368+
server.setRequestHandler(InitializeRequestSchema, (_request) => ({
1369+
protocolVersion: LATEST_PROTOCOL_VERSION,
1370+
capabilities: {
1371+
resources: {},
1372+
},
1373+
serverInfo: {
1374+
name: "test",
1375+
version: "1.0",
1376+
},
1377+
}));
1378+
1379+
const [clientTransport, serverTransport] =
1380+
InMemoryTransport.createLinkedPair();
1381+
1382+
const client = new Client(
1383+
{
1384+
name: "test client",
1385+
version: "1.0",
1386+
},
1387+
{
1388+
capabilities: {
1389+
sampling: {},
1390+
},
1391+
},
1392+
);
1393+
1394+
await Promise.all([
1395+
client.connect(clientTransport),
1396+
server.connect(serverTransport),
1397+
]);
1398+
1399+
const result = await client.listResources();
1400+
expect(result.resources).toEqual([]);
1401+
});
1402+
1403+
test("should return empty array when server has resources capability but no resource templates registered", async () => {
1404+
const server = new Server(
1405+
{
1406+
name: "test server",
1407+
version: "1.0",
1408+
},
1409+
{
1410+
capabilities: {
1411+
resources: {},
1412+
},
1413+
},
1414+
);
1415+
1416+
server.setRequestHandler(InitializeRequestSchema, (_request) => ({
1417+
protocolVersion: LATEST_PROTOCOL_VERSION,
1418+
capabilities: {
1419+
resources: {},
1420+
},
1421+
serverInfo: {
1422+
name: "test",
1423+
version: "1.0",
1424+
},
1425+
}));
1426+
1427+
const [clientTransport, serverTransport] =
1428+
InMemoryTransport.createLinkedPair();
1429+
1430+
const client = new Client(
1431+
{
1432+
name: "test client",
1433+
version: "1.0",
1434+
},
1435+
{
1436+
capabilities: {
1437+
sampling: {},
1438+
},
1439+
},
1440+
);
1441+
1442+
await Promise.all([
1443+
client.connect(clientTransport),
1444+
server.connect(serverTransport),
1445+
]);
1446+
1447+
const result = await client.listResourceTemplates();
1448+
expect(result.resourceTemplates).toEqual([]);
1449+
});
1450+
1451+
test("should return empty array when server has tools capability but no tools registered", async () => {
1452+
const server = new Server(
1453+
{
1454+
name: "test server",
1455+
version: "1.0",
1456+
},
1457+
{
1458+
capabilities: {
1459+
tools: {},
1460+
},
1461+
},
1462+
);
1463+
1464+
server.setRequestHandler(InitializeRequestSchema, (_request) => ({
1465+
protocolVersion: LATEST_PROTOCOL_VERSION,
1466+
capabilities: {
1467+
tools: {},
1468+
},
1469+
serverInfo: {
1470+
name: "test",
1471+
version: "1.0",
1472+
},
1473+
}));
1474+
1475+
const [clientTransport, serverTransport] =
1476+
InMemoryTransport.createLinkedPair();
1477+
1478+
const client = new Client(
1479+
{
1480+
name: "test client",
1481+
version: "1.0",
1482+
},
1483+
{
1484+
capabilities: {
1485+
sampling: {},
1486+
},
1487+
},
1488+
);
1489+
1490+
await Promise.all([
1491+
client.connect(clientTransport),
1492+
server.connect(serverTransport),
1493+
]);
1494+
1495+
const result = await client.listTools();
1496+
expect(result.tools).toEqual([]);
1497+
});
1498+
1499+
test("should handle empty collections consistently across all capabilities", async () => {
1500+
const server = new Server(
1501+
{
1502+
name: "test server",
1503+
version: "1.0",
1504+
},
1505+
{
1506+
capabilities: {
1507+
prompts: {},
1508+
resources: {},
1509+
tools: {},
1510+
},
1511+
},
1512+
);
1513+
1514+
server.setRequestHandler(InitializeRequestSchema, (_request) => ({
1515+
protocolVersion: LATEST_PROTOCOL_VERSION,
1516+
capabilities: {
1517+
prompts: {},
1518+
resources: {},
1519+
tools: {},
1520+
},
1521+
serverInfo: {
1522+
name: "test",
1523+
version: "1.0",
1524+
},
1525+
}));
1526+
1527+
server.setRequestHandler(ListPromptsRequestSchema, () => ({
1528+
prompts: [],
1529+
}));
1530+
1531+
server.setRequestHandler(ListResourcesRequestSchema, () => ({
1532+
resources: [],
1533+
}));
1534+
1535+
server.setRequestHandler(ListResourceTemplatesRequestSchema, () => ({
1536+
resourceTemplates: [],
1537+
}));
1538+
1539+
server.setRequestHandler(ListToolsRequestSchema, () => ({
1540+
tools: [],
1541+
}));
1542+
1543+
const [clientTransport, serverTransport] =
1544+
InMemoryTransport.createLinkedPair();
1545+
1546+
const client = new Client(
1547+
{
1548+
name: "test client",
1549+
version: "1.0",
1550+
},
1551+
{
1552+
capabilities: {
1553+
sampling: {},
1554+
},
1555+
},
1556+
);
1557+
1558+
await Promise.all([
1559+
client.connect(clientTransport),
1560+
server.connect(serverTransport),
1561+
]);
1562+
1563+
const promptsResult = await client.listPrompts();
1564+
const resourcesResult = await client.listResources();
1565+
const resourceTemplatesResult = await client.listResourceTemplates();
1566+
const toolsResult = await client.listTools();
1567+
1568+
expect(promptsResult.prompts).toEqual([]);
1569+
expect(resourcesResult.resources).toEqual([]);
1570+
expect(resourceTemplatesResult.resourceTemplates).toEqual([]);
1571+
expect(toolsResult.tools).toEqual([]);
1572+
});
1573+
1574+
test("should return empty arrays for all list methods when server has capabilities but no handlers", async () => {
1575+
const server = new Server(
1576+
{
1577+
name: "test server",
1578+
version: "1.0",
1579+
},
1580+
{
1581+
capabilities: {
1582+
prompts: {},
1583+
resources: {},
1584+
tools: {},
1585+
},
1586+
},
1587+
);
1588+
1589+
server.setRequestHandler(InitializeRequestSchema, (_request) => ({
1590+
protocolVersion: LATEST_PROTOCOL_VERSION,
1591+
capabilities: {
1592+
prompts: {},
1593+
resources: {},
1594+
tools: {},
1595+
},
1596+
serverInfo: {
1597+
name: "test",
1598+
version: "1.0",
1599+
},
1600+
}));
1601+
1602+
const [clientTransport, serverTransport] =
1603+
InMemoryTransport.createLinkedPair();
1604+
1605+
const client = new Client(
1606+
{
1607+
name: "test client",
1608+
version: "1.0",
1609+
},
1610+
{
1611+
capabilities: {
1612+
sampling: {},
1613+
},
1614+
},
1615+
);
1616+
1617+
await Promise.all([
1618+
client.connect(clientTransport),
1619+
server.connect(serverTransport),
1620+
]);
1621+
1622+
const promptsResult = await client.listPrompts();
1623+
const resourcesResult = await client.listResources();
1624+
const resourceTemplatesResult = await client.listResourceTemplates();
1625+
const toolsResult = await client.listTools();
1626+
1627+
expect(promptsResult.prompts).toEqual([]);
1628+
expect(resourcesResult.resources).toEqual([]);
1629+
expect(resourceTemplatesResult.resourceTemplates).toEqual([]);
1630+
expect(toolsResult.tools).toEqual([]);
1631+
});

0 commit comments

Comments
 (0)