@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.
- package/client/mcp-test-client.d.ts +6 -0
- package/client/mcp-test-client.d.ts.map +1 -1
- package/esm/fixtures/index.mjs +58 -36
- package/esm/index.mjs +58 -36
- package/esm/package.json +6 -6
- package/esm/perf/index.mjs +58 -36
- package/fixtures/index.js +58 -36
- package/index.js +58 -36
- package/package.json +6 -6
- package/perf/index.js +58 -36
|
@@ -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":"AAAA;;;GAGG;AAEH,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACzB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EACV,SAAS,EAET,kBAAkB,EAElB,gBAAgB,EAChB,eAAe,EAKf,QAAQ,EAGR,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,MAAM,EACN,mBAAmB,EAEnB,YAAY,EACZ,QAAQ,EACR,sBAAsB,EACtB,gBAAgB,EAChB,WAAW,EAEX,iBAAiB,EACjB,IAAI,EACJ,eAAe,EACf,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-test-client.d.ts","sourceRoot":"","sources":["../../src/client/mcp-test-client.ts"],"names":[],"mappings":"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"}
|
package/esm/fixtures/index.mjs
CHANGED
|
@@ -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
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
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
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
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
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
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
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
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
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
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
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
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
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
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
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
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.
|
|
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.
|
|
91
|
-
"@frontmcp/sdk": "1.8.
|
|
92
|
-
"@frontmcp/ui": "1.8.
|
|
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.
|
|
116
|
-
"@frontmcp/utils": "1.8.
|
|
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/esm/perf/index.mjs
CHANGED
|
@@ -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
|
-
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
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
|
-
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
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
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
|
|
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
|
-
|
|
2290
|
-
|
|
2291
|
-
|
|
2292
|
-
|
|
2293
|
-
|
|
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
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
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
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
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
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
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
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
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
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
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
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
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
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
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
|
-
|
|
1725
|
-
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
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.
|
|
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.
|
|
91
|
-
"@frontmcp/sdk": "1.8.
|
|
92
|
-
"@frontmcp/ui": "1.8.
|
|
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.
|
|
116
|
-
"@frontmcp/utils": "1.8.
|
|
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
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
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
|
-
|
|
2308
|
-
|
|
2309
|
-
|
|
2310
|
-
|
|
2311
|
-
|
|
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
|
-
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
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
|
-
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
|
|
2355
|
-
|
|
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", {
|