@frontmcp/testing 1.8.4 → 1.8.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -372,6 +372,12 @@ export declare class McpTestClient {
372
372
  setTimeout(ms: number): void;
373
373
  private initialize;
374
374
  private listTools;
375
+ /**
376
+ * Follow `nextCursor` until the server stops returning one, concatenating the
377
+ * pages. A server that hands back a cursor it already returned, or never stops
378
+ * paging, fails the call rather than looping.
379
+ */
380
+ private listAllPages;
375
381
  private callTool;
376
382
  private progressTokenFor;
377
383
  private readonly recordNotification;
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-test-client.d.ts","sourceRoot":"","sources":["../../src/client/mcp-test-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-test-client.d.ts","sourceRoot":"","sources":["../../src/client/mcp-test-client.ts"],"names":[],"mappings":"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"}
@@ -1413,6 +1413,7 @@ var DEFAULT_CLIENT_INFO = {
1413
1413
  name: "@frontmcp/testing",
1414
1414
  version: "0.4.0"
1415
1415
  };
1416
+ var MAX_LIST_PAGES = 1e3;
1416
1417
  function extractEntryPaths(data) {
1417
1418
  let payload = data;
1418
1419
  if (typeof payload === "string") {
@@ -1646,13 +1647,12 @@ var McpTestClient = class {
1646
1647
  /**
1647
1648
  * List all available tools
1648
1649
  */
1649
- list: async () => {
1650
- const response = await this.listTools();
1651
- if (!response.success || !response.data) {
1652
- throw new Error(`Failed to list tools: ${response.error?.message}`);
1653
- }
1654
- return response.data.tools;
1655
- },
1650
+ list: async () => this.listAllPages(
1651
+ "tools/list",
1652
+ "tools",
1653
+ (cursor) => this.listTools(cursor),
1654
+ (page) => page.tools
1655
+ ),
1656
1656
  /**
1657
1657
  * Call a tool by name with arguments
1658
1658
  */
@@ -1668,23 +1668,21 @@ var McpTestClient = class {
1668
1668
  /**
1669
1669
  * List all static resources
1670
1670
  */
1671
- list: async () => {
1672
- const response = await this.listResources();
1673
- if (!response.success || !response.data) {
1674
- throw new Error(`Failed to list resources: ${response.error?.message}`);
1675
- }
1676
- return response.data.resources;
1677
- },
1671
+ list: async () => this.listAllPages(
1672
+ "resources/list",
1673
+ "resources",
1674
+ (cursor) => this.listResources(cursor),
1675
+ (page) => page.resources
1676
+ ),
1678
1677
  /**
1679
1678
  * List all resource templates
1680
1679
  */
1681
- listTemplates: async () => {
1682
- const response = await this.listResourceTemplates();
1683
- if (!response.success || !response.data) {
1684
- throw new Error(`Failed to list resource templates: ${response.error?.message}`);
1685
- }
1686
- return response.data.resourceTemplates;
1687
- },
1680
+ listTemplates: async () => this.listAllPages(
1681
+ "resources/templates/list",
1682
+ "resource templates",
1683
+ (cursor) => this.listResourceTemplates(cursor),
1684
+ (page) => page.resourceTemplates
1685
+ ),
1688
1686
  /**
1689
1687
  * Read a resource by URI
1690
1688
  */
@@ -1712,13 +1710,12 @@ var McpTestClient = class {
1712
1710
  /**
1713
1711
  * List all available prompts
1714
1712
  */
1715
- list: async () => {
1716
- const response = await this.listPrompts();
1717
- if (!response.success || !response.data) {
1718
- throw new Error(`Failed to list prompts: ${response.error?.message}`);
1719
- }
1720
- return response.data.prompts;
1721
- },
1713
+ list: async () => this.listAllPages(
1714
+ "prompts/list",
1715
+ "prompts",
1716
+ (cursor) => this.listPrompts(cursor),
1717
+ (page) => page.prompts
1718
+ ),
1722
1719
  /**
1723
1720
  * Get a prompt with arguments
1724
1721
  */
@@ -2102,8 +2099,33 @@ var McpTestClient = class {
2102
2099
  clientInfo: this.config.clientInfo
2103
2100
  });
2104
2101
  }
2105
- async listTools() {
2106
- return this.request("tools/list", {});
2102
+ async listTools(cursor) {
2103
+ return this.request("tools/list", cursor ? { cursor } : {});
2104
+ }
2105
+ /**
2106
+ * Follow `nextCursor` until the server stops returning one, concatenating the
2107
+ * pages. A server that hands back a cursor it already returned, or never stops
2108
+ * paging, fails the call rather than looping.
2109
+ */
2110
+ async listAllPages(method, label, fetchPage, itemsOf) {
2111
+ const items = [];
2112
+ const seenCursors = /* @__PURE__ */ new Set();
2113
+ let cursor;
2114
+ for (let page = 0; page < MAX_LIST_PAGES; page++) {
2115
+ const response = await fetchPage(cursor);
2116
+ if (!response.success || !response.data) {
2117
+ throw new Error(`Failed to list ${label}: ${response.error?.message}`);
2118
+ }
2119
+ items.push(...itemsOf(response.data) ?? []);
2120
+ const next = response.data.nextCursor;
2121
+ if (!next) return items;
2122
+ if (seenCursors.has(next)) {
2123
+ throw new Error(`Failed to list ${label}: ${method} returned the cursor "${next}" twice`);
2124
+ }
2125
+ seenCursors.add(next);
2126
+ cursor = next;
2127
+ }
2128
+ throw new Error(`Failed to list ${label}: ${method} did not finish within ${MAX_LIST_PAGES} pages`);
2107
2129
  }
2108
2130
  async callTool(name, args, progressToken) {
2109
2131
  return this.request("tools/call", {
@@ -2128,17 +2150,17 @@ var McpTestClient = class {
2128
2150
  timestamp
2129
2151
  });
2130
2152
  };
2131
- async listResources() {
2132
- return this.request("resources/list", {});
2153
+ async listResources(cursor) {
2154
+ return this.request("resources/list", cursor ? { cursor } : {});
2133
2155
  }
2134
- async listResourceTemplates() {
2135
- return this.request("resources/templates/list", {});
2156
+ async listResourceTemplates(cursor) {
2157
+ return this.request("resources/templates/list", cursor ? { cursor } : {});
2136
2158
  }
2137
2159
  async readResource(uri) {
2138
2160
  return this.request("resources/read", { uri });
2139
2161
  }
2140
- async listPrompts() {
2141
- return this.request("prompts/list", {});
2162
+ async listPrompts(cursor) {
2163
+ return this.request("prompts/list", cursor ? { cursor } : {});
2142
2164
  }
2143
2165
  async getPrompt(name, args) {
2144
2166
  return this.request("prompts/get", {
package/esm/index.mjs CHANGED
@@ -1302,6 +1302,7 @@ var DEFAULT_CLIENT_INFO = {
1302
1302
  name: "@frontmcp/testing",
1303
1303
  version: "0.4.0"
1304
1304
  };
1305
+ var MAX_LIST_PAGES = 1e3;
1305
1306
  function extractEntryPaths(data) {
1306
1307
  let payload = data;
1307
1308
  if (typeof payload === "string") {
@@ -1535,13 +1536,12 @@ var McpTestClient = class {
1535
1536
  /**
1536
1537
  * List all available tools
1537
1538
  */
1538
- list: async () => {
1539
- const response = await this.listTools();
1540
- if (!response.success || !response.data) {
1541
- throw new Error(`Failed to list tools: ${response.error?.message}`);
1542
- }
1543
- return response.data.tools;
1544
- },
1539
+ list: async () => this.listAllPages(
1540
+ "tools/list",
1541
+ "tools",
1542
+ (cursor) => this.listTools(cursor),
1543
+ (page) => page.tools
1544
+ ),
1545
1545
  /**
1546
1546
  * Call a tool by name with arguments
1547
1547
  */
@@ -1557,23 +1557,21 @@ var McpTestClient = class {
1557
1557
  /**
1558
1558
  * List all static resources
1559
1559
  */
1560
- list: async () => {
1561
- const response = await this.listResources();
1562
- if (!response.success || !response.data) {
1563
- throw new Error(`Failed to list resources: ${response.error?.message}`);
1564
- }
1565
- return response.data.resources;
1566
- },
1560
+ list: async () => this.listAllPages(
1561
+ "resources/list",
1562
+ "resources",
1563
+ (cursor) => this.listResources(cursor),
1564
+ (page) => page.resources
1565
+ ),
1567
1566
  /**
1568
1567
  * List all resource templates
1569
1568
  */
1570
- listTemplates: async () => {
1571
- const response = await this.listResourceTemplates();
1572
- if (!response.success || !response.data) {
1573
- throw new Error(`Failed to list resource templates: ${response.error?.message}`);
1574
- }
1575
- return response.data.resourceTemplates;
1576
- },
1569
+ listTemplates: async () => this.listAllPages(
1570
+ "resources/templates/list",
1571
+ "resource templates",
1572
+ (cursor) => this.listResourceTemplates(cursor),
1573
+ (page) => page.resourceTemplates
1574
+ ),
1577
1575
  /**
1578
1576
  * Read a resource by URI
1579
1577
  */
@@ -1601,13 +1599,12 @@ var McpTestClient = class {
1601
1599
  /**
1602
1600
  * List all available prompts
1603
1601
  */
1604
- list: async () => {
1605
- const response = await this.listPrompts();
1606
- if (!response.success || !response.data) {
1607
- throw new Error(`Failed to list prompts: ${response.error?.message}`);
1608
- }
1609
- return response.data.prompts;
1610
- },
1602
+ list: async () => this.listAllPages(
1603
+ "prompts/list",
1604
+ "prompts",
1605
+ (cursor) => this.listPrompts(cursor),
1606
+ (page) => page.prompts
1607
+ ),
1611
1608
  /**
1612
1609
  * Get a prompt with arguments
1613
1610
  */
@@ -1991,8 +1988,33 @@ var McpTestClient = class {
1991
1988
  clientInfo: this.config.clientInfo
1992
1989
  });
1993
1990
  }
1994
- async listTools() {
1995
- return this.request("tools/list", {});
1991
+ async listTools(cursor) {
1992
+ return this.request("tools/list", cursor ? { cursor } : {});
1993
+ }
1994
+ /**
1995
+ * Follow `nextCursor` until the server stops returning one, concatenating the
1996
+ * pages. A server that hands back a cursor it already returned, or never stops
1997
+ * paging, fails the call rather than looping.
1998
+ */
1999
+ async listAllPages(method, label, fetchPage, itemsOf) {
2000
+ const items = [];
2001
+ const seenCursors = /* @__PURE__ */ new Set();
2002
+ let cursor;
2003
+ for (let page = 0; page < MAX_LIST_PAGES; page++) {
2004
+ const response = await fetchPage(cursor);
2005
+ if (!response.success || !response.data) {
2006
+ throw new Error(`Failed to list ${label}: ${response.error?.message}`);
2007
+ }
2008
+ items.push(...itemsOf(response.data) ?? []);
2009
+ const next = response.data.nextCursor;
2010
+ if (!next) return items;
2011
+ if (seenCursors.has(next)) {
2012
+ throw new Error(`Failed to list ${label}: ${method} returned the cursor "${next}" twice`);
2013
+ }
2014
+ seenCursors.add(next);
2015
+ cursor = next;
2016
+ }
2017
+ throw new Error(`Failed to list ${label}: ${method} did not finish within ${MAX_LIST_PAGES} pages`);
1996
2018
  }
1997
2019
  async callTool(name, args, progressToken) {
1998
2020
  return this.request("tools/call", {
@@ -2017,17 +2039,17 @@ var McpTestClient = class {
2017
2039
  timestamp
2018
2040
  });
2019
2041
  };
2020
- async listResources() {
2021
- return this.request("resources/list", {});
2042
+ async listResources(cursor) {
2043
+ return this.request("resources/list", cursor ? { cursor } : {});
2022
2044
  }
2023
- async listResourceTemplates() {
2024
- return this.request("resources/templates/list", {});
2045
+ async listResourceTemplates(cursor) {
2046
+ return this.request("resources/templates/list", cursor ? { cursor } : {});
2025
2047
  }
2026
2048
  async readResource(uri) {
2027
2049
  return this.request("resources/read", { uri });
2028
2050
  }
2029
- async listPrompts() {
2030
- return this.request("prompts/list", {});
2051
+ async listPrompts(cursor) {
2052
+ return this.request("prompts/list", cursor ? { cursor } : {});
2031
2053
  }
2032
2054
  async getPrompt(name, args) {
2033
2055
  return this.request("prompts/get", {
package/esm/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frontmcp/testing",
3
- "version": "1.8.4",
3
+ "version": "1.8.6",
4
4
  "description": "E2E testing framework for FrontMCP servers - MCP client, auth mocks, Playwright integration",
5
5
  "author": "AgentFront <info@agentfront.dev>",
6
6
  "homepage": "https://docs.agentfront.dev",
@@ -87,9 +87,9 @@
87
87
  "./esm": null
88
88
  },
89
89
  "peerDependencies": {
90
- "@frontmcp/lazy-zod": "1.8.4",
91
- "@frontmcp/sdk": "1.8.4",
92
- "@frontmcp/ui": "1.8.4",
90
+ "@frontmcp/lazy-zod": "1.8.6",
91
+ "@frontmcp/sdk": "1.8.6",
92
+ "@frontmcp/ui": "1.8.6",
93
93
  "@jest/globals": "^29.0.0 || ^30.0.0",
94
94
  "@playwright/test": "^1.40.0",
95
95
  "jest": "^29.0.0 || ^30.0.0"
@@ -112,8 +112,8 @@
112
112
  "node": ">=24.0.0"
113
113
  },
114
114
  "dependencies": {
115
- "@frontmcp/protocol": "1.8.4",
116
- "@frontmcp/utils": "1.8.4",
115
+ "@frontmcp/protocol": "1.8.6",
116
+ "@frontmcp/utils": "1.8.6",
117
117
  "jose": "^6.0.11",
118
118
  "tslib": "^2.3.0"
119
119
  },
@@ -1986,6 +1986,7 @@ var DEFAULT_CLIENT_INFO = {
1986
1986
  name: "@frontmcp/testing",
1987
1987
  version: "0.4.0"
1988
1988
  };
1989
+ var MAX_LIST_PAGES = 1e3;
1989
1990
  function extractEntryPaths(data) {
1990
1991
  let payload = data;
1991
1992
  if (typeof payload === "string") {
@@ -2219,13 +2220,12 @@ var McpTestClient = class {
2219
2220
  /**
2220
2221
  * List all available tools
2221
2222
  */
2222
- list: async () => {
2223
- const response = await this.listTools();
2224
- if (!response.success || !response.data) {
2225
- throw new Error(`Failed to list tools: ${response.error?.message}`);
2226
- }
2227
- return response.data.tools;
2228
- },
2223
+ list: async () => this.listAllPages(
2224
+ "tools/list",
2225
+ "tools",
2226
+ (cursor) => this.listTools(cursor),
2227
+ (page) => page.tools
2228
+ ),
2229
2229
  /**
2230
2230
  * Call a tool by name with arguments
2231
2231
  */
@@ -2241,23 +2241,21 @@ var McpTestClient = class {
2241
2241
  /**
2242
2242
  * List all static resources
2243
2243
  */
2244
- list: async () => {
2245
- const response = await this.listResources();
2246
- if (!response.success || !response.data) {
2247
- throw new Error(`Failed to list resources: ${response.error?.message}`);
2248
- }
2249
- return response.data.resources;
2250
- },
2244
+ list: async () => this.listAllPages(
2245
+ "resources/list",
2246
+ "resources",
2247
+ (cursor) => this.listResources(cursor),
2248
+ (page) => page.resources
2249
+ ),
2251
2250
  /**
2252
2251
  * List all resource templates
2253
2252
  */
2254
- listTemplates: async () => {
2255
- const response = await this.listResourceTemplates();
2256
- if (!response.success || !response.data) {
2257
- throw new Error(`Failed to list resource templates: ${response.error?.message}`);
2258
- }
2259
- return response.data.resourceTemplates;
2260
- },
2253
+ listTemplates: async () => this.listAllPages(
2254
+ "resources/templates/list",
2255
+ "resource templates",
2256
+ (cursor) => this.listResourceTemplates(cursor),
2257
+ (page) => page.resourceTemplates
2258
+ ),
2261
2259
  /**
2262
2260
  * Read a resource by URI
2263
2261
  */
@@ -2285,13 +2283,12 @@ var McpTestClient = class {
2285
2283
  /**
2286
2284
  * List all available prompts
2287
2285
  */
2288
- list: async () => {
2289
- const response = await this.listPrompts();
2290
- if (!response.success || !response.data) {
2291
- throw new Error(`Failed to list prompts: ${response.error?.message}`);
2292
- }
2293
- return response.data.prompts;
2294
- },
2286
+ list: async () => this.listAllPages(
2287
+ "prompts/list",
2288
+ "prompts",
2289
+ (cursor) => this.listPrompts(cursor),
2290
+ (page) => page.prompts
2291
+ ),
2295
2292
  /**
2296
2293
  * Get a prompt with arguments
2297
2294
  */
@@ -2675,8 +2672,33 @@ var McpTestClient = class {
2675
2672
  clientInfo: this.config.clientInfo
2676
2673
  });
2677
2674
  }
2678
- async listTools() {
2679
- return this.request("tools/list", {});
2675
+ async listTools(cursor) {
2676
+ return this.request("tools/list", cursor ? { cursor } : {});
2677
+ }
2678
+ /**
2679
+ * Follow `nextCursor` until the server stops returning one, concatenating the
2680
+ * pages. A server that hands back a cursor it already returned, or never stops
2681
+ * paging, fails the call rather than looping.
2682
+ */
2683
+ async listAllPages(method, label, fetchPage, itemsOf) {
2684
+ const items = [];
2685
+ const seenCursors = /* @__PURE__ */ new Set();
2686
+ let cursor;
2687
+ for (let page = 0; page < MAX_LIST_PAGES; page++) {
2688
+ const response = await fetchPage(cursor);
2689
+ if (!response.success || !response.data) {
2690
+ throw new Error(`Failed to list ${label}: ${response.error?.message}`);
2691
+ }
2692
+ items.push(...itemsOf(response.data) ?? []);
2693
+ const next = response.data.nextCursor;
2694
+ if (!next) return items;
2695
+ if (seenCursors.has(next)) {
2696
+ throw new Error(`Failed to list ${label}: ${method} returned the cursor "${next}" twice`);
2697
+ }
2698
+ seenCursors.add(next);
2699
+ cursor = next;
2700
+ }
2701
+ throw new Error(`Failed to list ${label}: ${method} did not finish within ${MAX_LIST_PAGES} pages`);
2680
2702
  }
2681
2703
  async callTool(name, args, progressToken) {
2682
2704
  return this.request("tools/call", {
@@ -2701,17 +2723,17 @@ var McpTestClient = class {
2701
2723
  timestamp
2702
2724
  });
2703
2725
  };
2704
- async listResources() {
2705
- return this.request("resources/list", {});
2726
+ async listResources(cursor) {
2727
+ return this.request("resources/list", cursor ? { cursor } : {});
2706
2728
  }
2707
- async listResourceTemplates() {
2708
- return this.request("resources/templates/list", {});
2729
+ async listResourceTemplates(cursor) {
2730
+ return this.request("resources/templates/list", cursor ? { cursor } : {});
2709
2731
  }
2710
2732
  async readResource(uri) {
2711
2733
  return this.request("resources/read", { uri });
2712
2734
  }
2713
- async listPrompts() {
2714
- return this.request("prompts/list", {});
2735
+ async listPrompts(cursor) {
2736
+ return this.request("prompts/list", cursor ? { cursor } : {});
2715
2737
  }
2716
2738
  async getPrompt(name, args) {
2717
2739
  return this.request("prompts/get", {
package/fixtures/index.js CHANGED
@@ -1429,6 +1429,7 @@ var DEFAULT_CLIENT_INFO = {
1429
1429
  name: "@frontmcp/testing",
1430
1430
  version: "0.4.0"
1431
1431
  };
1432
+ var MAX_LIST_PAGES = 1e3;
1432
1433
  function extractEntryPaths(data) {
1433
1434
  let payload = data;
1434
1435
  if (typeof payload === "string") {
@@ -1662,13 +1663,12 @@ var McpTestClient = class {
1662
1663
  /**
1663
1664
  * List all available tools
1664
1665
  */
1665
- list: async () => {
1666
- const response = await this.listTools();
1667
- if (!response.success || !response.data) {
1668
- throw new Error(`Failed to list tools: ${response.error?.message}`);
1669
- }
1670
- return response.data.tools;
1671
- },
1666
+ list: async () => this.listAllPages(
1667
+ "tools/list",
1668
+ "tools",
1669
+ (cursor) => this.listTools(cursor),
1670
+ (page) => page.tools
1671
+ ),
1672
1672
  /**
1673
1673
  * Call a tool by name with arguments
1674
1674
  */
@@ -1684,23 +1684,21 @@ var McpTestClient = class {
1684
1684
  /**
1685
1685
  * List all static resources
1686
1686
  */
1687
- list: async () => {
1688
- const response = await this.listResources();
1689
- if (!response.success || !response.data) {
1690
- throw new Error(`Failed to list resources: ${response.error?.message}`);
1691
- }
1692
- return response.data.resources;
1693
- },
1687
+ list: async () => this.listAllPages(
1688
+ "resources/list",
1689
+ "resources",
1690
+ (cursor) => this.listResources(cursor),
1691
+ (page) => page.resources
1692
+ ),
1694
1693
  /**
1695
1694
  * List all resource templates
1696
1695
  */
1697
- listTemplates: async () => {
1698
- const response = await this.listResourceTemplates();
1699
- if (!response.success || !response.data) {
1700
- throw new Error(`Failed to list resource templates: ${response.error?.message}`);
1701
- }
1702
- return response.data.resourceTemplates;
1703
- },
1696
+ listTemplates: async () => this.listAllPages(
1697
+ "resources/templates/list",
1698
+ "resource templates",
1699
+ (cursor) => this.listResourceTemplates(cursor),
1700
+ (page) => page.resourceTemplates
1701
+ ),
1704
1702
  /**
1705
1703
  * Read a resource by URI
1706
1704
  */
@@ -1728,13 +1726,12 @@ var McpTestClient = class {
1728
1726
  /**
1729
1727
  * List all available prompts
1730
1728
  */
1731
- list: async () => {
1732
- const response = await this.listPrompts();
1733
- if (!response.success || !response.data) {
1734
- throw new Error(`Failed to list prompts: ${response.error?.message}`);
1735
- }
1736
- return response.data.prompts;
1737
- },
1729
+ list: async () => this.listAllPages(
1730
+ "prompts/list",
1731
+ "prompts",
1732
+ (cursor) => this.listPrompts(cursor),
1733
+ (page) => page.prompts
1734
+ ),
1738
1735
  /**
1739
1736
  * Get a prompt with arguments
1740
1737
  */
@@ -2118,8 +2115,33 @@ var McpTestClient = class {
2118
2115
  clientInfo: this.config.clientInfo
2119
2116
  });
2120
2117
  }
2121
- async listTools() {
2122
- return this.request("tools/list", {});
2118
+ async listTools(cursor) {
2119
+ return this.request("tools/list", cursor ? { cursor } : {});
2120
+ }
2121
+ /**
2122
+ * Follow `nextCursor` until the server stops returning one, concatenating the
2123
+ * pages. A server that hands back a cursor it already returned, or never stops
2124
+ * paging, fails the call rather than looping.
2125
+ */
2126
+ async listAllPages(method, label, fetchPage, itemsOf) {
2127
+ const items = [];
2128
+ const seenCursors = /* @__PURE__ */ new Set();
2129
+ let cursor;
2130
+ for (let page = 0; page < MAX_LIST_PAGES; page++) {
2131
+ const response = await fetchPage(cursor);
2132
+ if (!response.success || !response.data) {
2133
+ throw new Error(`Failed to list ${label}: ${response.error?.message}`);
2134
+ }
2135
+ items.push(...itemsOf(response.data) ?? []);
2136
+ const next = response.data.nextCursor;
2137
+ if (!next) return items;
2138
+ if (seenCursors.has(next)) {
2139
+ throw new Error(`Failed to list ${label}: ${method} returned the cursor "${next}" twice`);
2140
+ }
2141
+ seenCursors.add(next);
2142
+ cursor = next;
2143
+ }
2144
+ throw new Error(`Failed to list ${label}: ${method} did not finish within ${MAX_LIST_PAGES} pages`);
2123
2145
  }
2124
2146
  async callTool(name, args, progressToken) {
2125
2147
  return this.request("tools/call", {
@@ -2144,17 +2166,17 @@ var McpTestClient = class {
2144
2166
  timestamp
2145
2167
  });
2146
2168
  };
2147
- async listResources() {
2148
- return this.request("resources/list", {});
2169
+ async listResources(cursor) {
2170
+ return this.request("resources/list", cursor ? { cursor } : {});
2149
2171
  }
2150
- async listResourceTemplates() {
2151
- return this.request("resources/templates/list", {});
2172
+ async listResourceTemplates(cursor) {
2173
+ return this.request("resources/templates/list", cursor ? { cursor } : {});
2152
2174
  }
2153
2175
  async readResource(uri) {
2154
2176
  return this.request("resources/read", { uri });
2155
2177
  }
2156
- async listPrompts() {
2157
- return this.request("prompts/list", {});
2178
+ async listPrompts(cursor) {
2179
+ return this.request("prompts/list", cursor ? { cursor } : {});
2158
2180
  }
2159
2181
  async getPrompt(name, args) {
2160
2182
  return this.request("prompts/get", {
package/index.js CHANGED
@@ -1421,6 +1421,7 @@ var DEFAULT_CLIENT_INFO = {
1421
1421
  name: "@frontmcp/testing",
1422
1422
  version: "0.4.0"
1423
1423
  };
1424
+ var MAX_LIST_PAGES = 1e3;
1424
1425
  function extractEntryPaths(data) {
1425
1426
  let payload = data;
1426
1427
  if (typeof payload === "string") {
@@ -1654,13 +1655,12 @@ var McpTestClient = class {
1654
1655
  /**
1655
1656
  * List all available tools
1656
1657
  */
1657
- list: async () => {
1658
- const response = await this.listTools();
1659
- if (!response.success || !response.data) {
1660
- throw new Error(`Failed to list tools: ${response.error?.message}`);
1661
- }
1662
- return response.data.tools;
1663
- },
1658
+ list: async () => this.listAllPages(
1659
+ "tools/list",
1660
+ "tools",
1661
+ (cursor) => this.listTools(cursor),
1662
+ (page) => page.tools
1663
+ ),
1664
1664
  /**
1665
1665
  * Call a tool by name with arguments
1666
1666
  */
@@ -1676,23 +1676,21 @@ var McpTestClient = class {
1676
1676
  /**
1677
1677
  * List all static resources
1678
1678
  */
1679
- list: async () => {
1680
- const response = await this.listResources();
1681
- if (!response.success || !response.data) {
1682
- throw new Error(`Failed to list resources: ${response.error?.message}`);
1683
- }
1684
- return response.data.resources;
1685
- },
1679
+ list: async () => this.listAllPages(
1680
+ "resources/list",
1681
+ "resources",
1682
+ (cursor) => this.listResources(cursor),
1683
+ (page) => page.resources
1684
+ ),
1686
1685
  /**
1687
1686
  * List all resource templates
1688
1687
  */
1689
- listTemplates: async () => {
1690
- const response = await this.listResourceTemplates();
1691
- if (!response.success || !response.data) {
1692
- throw new Error(`Failed to list resource templates: ${response.error?.message}`);
1693
- }
1694
- return response.data.resourceTemplates;
1695
- },
1688
+ listTemplates: async () => this.listAllPages(
1689
+ "resources/templates/list",
1690
+ "resource templates",
1691
+ (cursor) => this.listResourceTemplates(cursor),
1692
+ (page) => page.resourceTemplates
1693
+ ),
1696
1694
  /**
1697
1695
  * Read a resource by URI
1698
1696
  */
@@ -1720,13 +1718,12 @@ var McpTestClient = class {
1720
1718
  /**
1721
1719
  * List all available prompts
1722
1720
  */
1723
- list: async () => {
1724
- const response = await this.listPrompts();
1725
- if (!response.success || !response.data) {
1726
- throw new Error(`Failed to list prompts: ${response.error?.message}`);
1727
- }
1728
- return response.data.prompts;
1729
- },
1721
+ list: async () => this.listAllPages(
1722
+ "prompts/list",
1723
+ "prompts",
1724
+ (cursor) => this.listPrompts(cursor),
1725
+ (page) => page.prompts
1726
+ ),
1730
1727
  /**
1731
1728
  * Get a prompt with arguments
1732
1729
  */
@@ -2110,8 +2107,33 @@ var McpTestClient = class {
2110
2107
  clientInfo: this.config.clientInfo
2111
2108
  });
2112
2109
  }
2113
- async listTools() {
2114
- return this.request("tools/list", {});
2110
+ async listTools(cursor) {
2111
+ return this.request("tools/list", cursor ? { cursor } : {});
2112
+ }
2113
+ /**
2114
+ * Follow `nextCursor` until the server stops returning one, concatenating the
2115
+ * pages. A server that hands back a cursor it already returned, or never stops
2116
+ * paging, fails the call rather than looping.
2117
+ */
2118
+ async listAllPages(method, label, fetchPage, itemsOf) {
2119
+ const items = [];
2120
+ const seenCursors = /* @__PURE__ */ new Set();
2121
+ let cursor;
2122
+ for (let page = 0; page < MAX_LIST_PAGES; page++) {
2123
+ const response = await fetchPage(cursor);
2124
+ if (!response.success || !response.data) {
2125
+ throw new Error(`Failed to list ${label}: ${response.error?.message}`);
2126
+ }
2127
+ items.push(...itemsOf(response.data) ?? []);
2128
+ const next = response.data.nextCursor;
2129
+ if (!next) return items;
2130
+ if (seenCursors.has(next)) {
2131
+ throw new Error(`Failed to list ${label}: ${method} returned the cursor "${next}" twice`);
2132
+ }
2133
+ seenCursors.add(next);
2134
+ cursor = next;
2135
+ }
2136
+ throw new Error(`Failed to list ${label}: ${method} did not finish within ${MAX_LIST_PAGES} pages`);
2115
2137
  }
2116
2138
  async callTool(name, args, progressToken) {
2117
2139
  return this.request("tools/call", {
@@ -2136,17 +2158,17 @@ var McpTestClient = class {
2136
2158
  timestamp
2137
2159
  });
2138
2160
  };
2139
- async listResources() {
2140
- return this.request("resources/list", {});
2161
+ async listResources(cursor) {
2162
+ return this.request("resources/list", cursor ? { cursor } : {});
2141
2163
  }
2142
- async listResourceTemplates() {
2143
- return this.request("resources/templates/list", {});
2164
+ async listResourceTemplates(cursor) {
2165
+ return this.request("resources/templates/list", cursor ? { cursor } : {});
2144
2166
  }
2145
2167
  async readResource(uri) {
2146
2168
  return this.request("resources/read", { uri });
2147
2169
  }
2148
- async listPrompts() {
2149
- return this.request("prompts/list", {});
2170
+ async listPrompts(cursor) {
2171
+ return this.request("prompts/list", cursor ? { cursor } : {});
2150
2172
  }
2151
2173
  async getPrompt(name, args) {
2152
2174
  return this.request("prompts/get", {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frontmcp/testing",
3
- "version": "1.8.4",
3
+ "version": "1.8.6",
4
4
  "description": "E2E testing framework for FrontMCP servers - MCP client, auth mocks, Playwright integration",
5
5
  "author": "AgentFront <info@agentfront.dev>",
6
6
  "homepage": "https://docs.agentfront.dev",
@@ -87,9 +87,9 @@
87
87
  "./esm": null
88
88
  },
89
89
  "peerDependencies": {
90
- "@frontmcp/lazy-zod": "1.8.4",
91
- "@frontmcp/sdk": "1.8.4",
92
- "@frontmcp/ui": "1.8.4",
90
+ "@frontmcp/lazy-zod": "1.8.6",
91
+ "@frontmcp/sdk": "1.8.6",
92
+ "@frontmcp/ui": "1.8.6",
93
93
  "@jest/globals": "^29.0.0 || ^30.0.0",
94
94
  "@playwright/test": "^1.40.0",
95
95
  "jest": "^29.0.0 || ^30.0.0"
@@ -112,8 +112,8 @@
112
112
  "node": ">=24.0.0"
113
113
  },
114
114
  "dependencies": {
115
- "@frontmcp/protocol": "1.8.4",
116
- "@frontmcp/utils": "1.8.4",
115
+ "@frontmcp/protocol": "1.8.6",
116
+ "@frontmcp/utils": "1.8.6",
117
117
  "jose": "^6.0.11",
118
118
  "tslib": "^2.3.0"
119
119
  },
package/perf/index.js CHANGED
@@ -2048,6 +2048,7 @@ var DEFAULT_CLIENT_INFO = {
2048
2048
  name: "@frontmcp/testing",
2049
2049
  version: "0.4.0"
2050
2050
  };
2051
+ var MAX_LIST_PAGES = 1e3;
2051
2052
  function extractEntryPaths(data) {
2052
2053
  let payload = data;
2053
2054
  if (typeof payload === "string") {
@@ -2281,13 +2282,12 @@ var McpTestClient = class {
2281
2282
  /**
2282
2283
  * List all available tools
2283
2284
  */
2284
- list: async () => {
2285
- const response = await this.listTools();
2286
- if (!response.success || !response.data) {
2287
- throw new Error(`Failed to list tools: ${response.error?.message}`);
2288
- }
2289
- return response.data.tools;
2290
- },
2285
+ list: async () => this.listAllPages(
2286
+ "tools/list",
2287
+ "tools",
2288
+ (cursor) => this.listTools(cursor),
2289
+ (page) => page.tools
2290
+ ),
2291
2291
  /**
2292
2292
  * Call a tool by name with arguments
2293
2293
  */
@@ -2303,23 +2303,21 @@ var McpTestClient = class {
2303
2303
  /**
2304
2304
  * List all static resources
2305
2305
  */
2306
- list: async () => {
2307
- const response = await this.listResources();
2308
- if (!response.success || !response.data) {
2309
- throw new Error(`Failed to list resources: ${response.error?.message}`);
2310
- }
2311
- return response.data.resources;
2312
- },
2306
+ list: async () => this.listAllPages(
2307
+ "resources/list",
2308
+ "resources",
2309
+ (cursor) => this.listResources(cursor),
2310
+ (page) => page.resources
2311
+ ),
2313
2312
  /**
2314
2313
  * List all resource templates
2315
2314
  */
2316
- listTemplates: async () => {
2317
- const response = await this.listResourceTemplates();
2318
- if (!response.success || !response.data) {
2319
- throw new Error(`Failed to list resource templates: ${response.error?.message}`);
2320
- }
2321
- return response.data.resourceTemplates;
2322
- },
2315
+ listTemplates: async () => this.listAllPages(
2316
+ "resources/templates/list",
2317
+ "resource templates",
2318
+ (cursor) => this.listResourceTemplates(cursor),
2319
+ (page) => page.resourceTemplates
2320
+ ),
2323
2321
  /**
2324
2322
  * Read a resource by URI
2325
2323
  */
@@ -2347,13 +2345,12 @@ var McpTestClient = class {
2347
2345
  /**
2348
2346
  * List all available prompts
2349
2347
  */
2350
- list: async () => {
2351
- const response = await this.listPrompts();
2352
- if (!response.success || !response.data) {
2353
- throw new Error(`Failed to list prompts: ${response.error?.message}`);
2354
- }
2355
- return response.data.prompts;
2356
- },
2348
+ list: async () => this.listAllPages(
2349
+ "prompts/list",
2350
+ "prompts",
2351
+ (cursor) => this.listPrompts(cursor),
2352
+ (page) => page.prompts
2353
+ ),
2357
2354
  /**
2358
2355
  * Get a prompt with arguments
2359
2356
  */
@@ -2737,8 +2734,33 @@ var McpTestClient = class {
2737
2734
  clientInfo: this.config.clientInfo
2738
2735
  });
2739
2736
  }
2740
- async listTools() {
2741
- return this.request("tools/list", {});
2737
+ async listTools(cursor) {
2738
+ return this.request("tools/list", cursor ? { cursor } : {});
2739
+ }
2740
+ /**
2741
+ * Follow `nextCursor` until the server stops returning one, concatenating the
2742
+ * pages. A server that hands back a cursor it already returned, or never stops
2743
+ * paging, fails the call rather than looping.
2744
+ */
2745
+ async listAllPages(method, label, fetchPage, itemsOf) {
2746
+ const items = [];
2747
+ const seenCursors = /* @__PURE__ */ new Set();
2748
+ let cursor;
2749
+ for (let page = 0; page < MAX_LIST_PAGES; page++) {
2750
+ const response = await fetchPage(cursor);
2751
+ if (!response.success || !response.data) {
2752
+ throw new Error(`Failed to list ${label}: ${response.error?.message}`);
2753
+ }
2754
+ items.push(...itemsOf(response.data) ?? []);
2755
+ const next = response.data.nextCursor;
2756
+ if (!next) return items;
2757
+ if (seenCursors.has(next)) {
2758
+ throw new Error(`Failed to list ${label}: ${method} returned the cursor "${next}" twice`);
2759
+ }
2760
+ seenCursors.add(next);
2761
+ cursor = next;
2762
+ }
2763
+ throw new Error(`Failed to list ${label}: ${method} did not finish within ${MAX_LIST_PAGES} pages`);
2742
2764
  }
2743
2765
  async callTool(name, args, progressToken) {
2744
2766
  return this.request("tools/call", {
@@ -2763,17 +2785,17 @@ var McpTestClient = class {
2763
2785
  timestamp
2764
2786
  });
2765
2787
  };
2766
- async listResources() {
2767
- return this.request("resources/list", {});
2788
+ async listResources(cursor) {
2789
+ return this.request("resources/list", cursor ? { cursor } : {});
2768
2790
  }
2769
- async listResourceTemplates() {
2770
- return this.request("resources/templates/list", {});
2791
+ async listResourceTemplates(cursor) {
2792
+ return this.request("resources/templates/list", cursor ? { cursor } : {});
2771
2793
  }
2772
2794
  async readResource(uri) {
2773
2795
  return this.request("resources/read", { uri });
2774
2796
  }
2775
- async listPrompts() {
2776
- return this.request("prompts/list", {});
2797
+ async listPrompts(cursor) {
2798
+ return this.request("prompts/list", cursor ? { cursor } : {});
2777
2799
  }
2778
2800
  async getPrompt(name, args) {
2779
2801
  return this.request("prompts/get", {