@apify/actors-mcp-server 0.14.4-beta.1 → 0.14.4-beta.3

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.
Files changed (58) hide show
  1. package/dist/apify_client.d.ts.map +1 -1
  2. package/dist/apify_client.js +3 -2
  3. package/dist/apify_client.js.map +1 -1
  4. package/dist/index_internals_test_kit.d.ts +11 -0
  5. package/dist/index_internals_test_kit.d.ts.map +1 -0
  6. package/dist/index_internals_test_kit.js +15 -0
  7. package/dist/index_internals_test_kit.js.map +1 -0
  8. package/dist/test_kit/cases/actors.cases.d.ts +4 -0
  9. package/dist/test_kit/cases/actors.cases.d.ts.map +1 -0
  10. package/dist/test_kit/cases/actors.cases.js +911 -0
  11. package/dist/test_kit/cases/actors.cases.js.map +1 -0
  12. package/dist/test_kit/cases/apps.cases.d.ts +4 -0
  13. package/dist/test_kit/cases/apps.cases.d.ts.map +1 -0
  14. package/dist/test_kit/cases/apps.cases.js +111 -0
  15. package/dist/test_kit/cases/apps.cases.js.map +1 -0
  16. package/dist/test_kit/cases/payments.cases.d.ts +4 -0
  17. package/dist/test_kit/cases/payments.cases.d.ts.map +1 -0
  18. package/dist/test_kit/cases/payments.cases.js +207 -0
  19. package/dist/test_kit/cases/payments.cases.js.map +1 -0
  20. package/dist/test_kit/cases/registration.cases.d.ts +4 -0
  21. package/dist/test_kit/cases/registration.cases.d.ts.map +1 -0
  22. package/dist/test_kit/cases/registration.cases.js +431 -0
  23. package/dist/test_kit/cases/registration.cases.js.map +1 -0
  24. package/dist/test_kit/cases/storage.cases.d.ts +4 -0
  25. package/dist/test_kit/cases/storage.cases.d.ts.map +1 -0
  26. package/dist/test_kit/cases/storage.cases.js +378 -0
  27. package/dist/test_kit/cases/storage.cases.js.map +1 -0
  28. package/dist/test_kit/cases/tasks.cases.d.ts +4 -0
  29. package/dist/test_kit/cases/tasks.cases.d.ts.map +1 -0
  30. package/dist/test_kit/cases/tasks.cases.js +320 -0
  31. package/dist/test_kit/cases/tasks.cases.js.map +1 -0
  32. package/dist/test_kit/cases/tools.cases.d.ts +4 -0
  33. package/dist/test_kit/cases/tools.cases.d.ts.map +1 -0
  34. package/dist/test_kit/cases/tools.cases.js +204 -0
  35. package/dist/test_kit/cases/tools.cases.js.map +1 -0
  36. package/dist/test_kit/helpers.d.ts +69 -0
  37. package/dist/test_kit/helpers.d.ts.map +1 -0
  38. package/dist/test_kit/helpers.js +223 -0
  39. package/dist/test_kit/helpers.js.map +1 -0
  40. package/dist/test_kit/index.d.ts +20 -0
  41. package/dist/test_kit/index.d.ts.map +1 -0
  42. package/dist/test_kit/index.js +32 -0
  43. package/dist/test_kit/index.js.map +1 -0
  44. package/dist/test_kit/mcp_client.d.ts +31 -0
  45. package/dist/test_kit/mcp_client.d.ts.map +1 -0
  46. package/dist/test_kit/mcp_client.js +73 -0
  47. package/dist/test_kit/mcp_client.js.map +1 -0
  48. package/dist/test_kit/register.d.ts +9 -0
  49. package/dist/test_kit/register.d.ts.map +1 -0
  50. package/dist/test_kit/register.js +39 -0
  51. package/dist/test_kit/register.js.map +1 -0
  52. package/dist/test_kit/tsconfig.tsbuildinfo +1 -0
  53. package/dist/test_kit/types.d.ts +45 -0
  54. package/dist/test_kit/types.d.ts.map +1 -0
  55. package/dist/test_kit/types.js +2 -0
  56. package/dist/test_kit/types.js.map +1 -0
  57. package/dist/tsconfig.tsbuildinfo +1 -1
  58. package/package.json +19 -3
@@ -0,0 +1,320 @@
1
+ import { CallToolResultSchema } from '@modelcontextprotocol/sdk/types.js';
2
+ import { expect } from 'vitest';
3
+ import { actorNameToToolName } from '@apify/actors-mcp-server/internals.js';
4
+ import { HELPER_TOOLS } from '@apify/actors-mcp-server/internals/test-kit.js';
5
+ import { ACTOR_NORMAL_MODE, assertStatusMessagePropagated, captureRunIdFromProgress, waitForRunAborted, } from '../helpers.js';
6
+ // v2 stateless client has no .experimental.tasks; v1 (stdio + 2025-11-25) does.
7
+ function lacksTaskSupport(ctx) {
8
+ return ctx.transport === '2026-07-28';
9
+ }
10
+ /** Async tasks: call/get/list/cancel + statusMessage. All isDeploymentTest. */
11
+ export const tasksCases = [
12
+ {
13
+ name: 'should abort actor run on notifications/cancelled',
14
+ isDeploymentTest: true,
15
+ skipIf: lacksTaskSupport,
16
+ retry: 2,
17
+ run: async (ctx) => {
18
+ const selectedToolName = actorNameToToolName(ACTOR_NORMAL_MODE);
19
+ // Load the Actor at connection time — add-actor's dynamic add is gone (PR 0).
20
+ const client = (await ctx.createClientFn({ actors: [ACTOR_NORMAL_MODE] }));
21
+ try {
22
+ const api = ctx.createApifyClient();
23
+ const controller = new AbortController();
24
+ const { onprogress, runIdPromise } = captureRunIdFromProgress();
25
+ const requestPromise = client
26
+ .request({
27
+ method: 'tools/call',
28
+ params: {
29
+ name: selectedToolName,
30
+ arguments: { firstNumber: 1, secondNumber: 2, waitSeconds: 60 },
31
+ },
32
+ }, CallToolResultSchema, { signal: controller.signal, onprogress })
33
+ // Swallow "AbortError: This operation was aborted" — expected after cancel.
34
+ .catch(() => undefined);
35
+ const runId = await runIdPromise;
36
+ expect(runId).toBeTruthy();
37
+ controller.abort();
38
+ await requestPromise;
39
+ await waitForRunAborted(api, runId);
40
+ }
41
+ finally {
42
+ await client.close();
43
+ }
44
+ },
45
+ },
46
+ {
47
+ name: 'should abort call-actor tool on notifications/cancelled',
48
+ isDeploymentTest: true,
49
+ skipIf: lacksTaskSupport,
50
+ retry: 1,
51
+ run: async (ctx) => {
52
+ const client = (await ctx.createClientFn({ tools: ['actors'] }));
53
+ try {
54
+ const api = ctx.createApifyClient();
55
+ const controller = new AbortController();
56
+ const { onprogress, runIdPromise } = captureRunIdFromProgress();
57
+ const requestPromise = client
58
+ .request({
59
+ method: 'tools/call',
60
+ params: {
61
+ name: HELPER_TOOLS.ACTOR_CALL,
62
+ arguments: {
63
+ actor: ACTOR_NORMAL_MODE,
64
+ step: 'call',
65
+ input: { firstNumber: 1, secondNumber: 2, waitSeconds: 60 },
66
+ },
67
+ },
68
+ }, CallToolResultSchema, { signal: controller.signal, onprogress })
69
+ .catch(() => undefined);
70
+ const runId = await runIdPromise;
71
+ expect(runId).toBeTruthy();
72
+ controller.abort();
73
+ await requestPromise;
74
+ await waitForRunAborted(api, runId);
75
+ }
76
+ finally {
77
+ await client.close();
78
+ }
79
+ },
80
+ },
81
+ {
82
+ name: 'should be able to call a long running task tool call',
83
+ isDeploymentTest: true,
84
+ skipIf: lacksTaskSupport,
85
+ run: async (ctx) => {
86
+ const client = (await ctx.createClientFn({ tools: [ACTOR_NORMAL_MODE] }));
87
+ try {
88
+ const stream = client.experimental.tasks.callToolStream({
89
+ name: actorNameToToolName(ACTOR_NORMAL_MODE),
90
+ // waitSeconds keeps the run open long enough to emit taskStatus updates.
91
+ arguments: { firstNumber: 1, secondNumber: 2, waitSeconds: 10 },
92
+ }, CallToolResultSchema, { task: { ttl: 60000 } });
93
+ let lastStatus = '';
94
+ let taskStatusCount = 0;
95
+ let resultReceived = false;
96
+ for await (const message of stream) {
97
+ switch (message.type) {
98
+ case 'taskCreated':
99
+ break;
100
+ case 'taskStatus':
101
+ taskStatusCount++;
102
+ lastStatus = message.task.status;
103
+ break;
104
+ case 'result':
105
+ message.result.content.forEach((item) => {
106
+ expect(item).toHaveProperty('type');
107
+ });
108
+ resultReceived = true;
109
+ break;
110
+ case 'error':
111
+ throw message.error;
112
+ default:
113
+ throw new Error(`Unknown message type: ${message.type}`);
114
+ }
115
+ }
116
+ expect(resultReceived).toBe(true);
117
+ // Regression: taskStatus must arrive over session SSE.
118
+ expect(taskStatusCount).toBeGreaterThan(0);
119
+ expect(lastStatus).not.toBe('');
120
+ }
121
+ finally {
122
+ await client.close();
123
+ }
124
+ },
125
+ },
126
+ {
127
+ name: 'should be able to call a long running task and list it, get the status and then separately retrieve the result',
128
+ isDeploymentTest: true,
129
+ skipIf: lacksTaskSupport,
130
+ run: async (ctx) => {
131
+ const client = (await ctx.createClientFn({ tools: [ACTOR_NORMAL_MODE] }));
132
+ try {
133
+ const stream = client.experimental.tasks.callToolStream({
134
+ name: actorNameToToolName(ACTOR_NORMAL_MODE),
135
+ // waitSeconds keeps the run open long enough to observe `working` status.
136
+ arguments: { firstNumber: 3, secondNumber: 4, waitSeconds: 10 },
137
+ }, CallToolResultSchema, { task: { ttl: 60000 } });
138
+ let taskId = null;
139
+ for await (const message of stream) {
140
+ if (message.type === 'taskCreated') {
141
+ taskId = message.task.taskId;
142
+ const taskStatus = await client.experimental.tasks.getTask(taskId);
143
+ expect(taskStatus).toHaveProperty('status');
144
+ expect(taskStatus.status).toBe('working');
145
+ const tasks = await client.experimental.tasks.listTasks();
146
+ const taskIds = tasks.tasks.map((task) => task.taskId);
147
+ expect(taskIds).toContain(taskId);
148
+ }
149
+ else if (message.type === 'result') {
150
+ if (!taskId)
151
+ throw new Error('Task ID should be set before receiving result');
152
+ const result = await client.experimental.tasks.getTaskResult(taskId, CallToolResultSchema);
153
+ const content = result.content;
154
+ expect(content.length).toBe(2);
155
+ }
156
+ }
157
+ }
158
+ finally {
159
+ await client.close();
160
+ }
161
+ },
162
+ },
163
+ {
164
+ name: 'should be able to call a long running task and then cancel it midway',
165
+ isDeploymentTest: true,
166
+ skipIf: lacksTaskSupport,
167
+ run: async (ctx) => {
168
+ const client = (await ctx.createClientFn({ tools: [ACTOR_NORMAL_MODE] }));
169
+ try {
170
+ const stream = client.experimental.tasks.callToolStream({
171
+ name: actorNameToToolName(ACTOR_NORMAL_MODE),
172
+ // waitSeconds keeps the run open long enough to cancel it mid-flight.
173
+ arguments: { firstNumber: 5, secondNumber: 6, waitSeconds: 60 },
174
+ }, CallToolResultSchema, { task: { ttl: 60000 } });
175
+ for await (const message of stream) {
176
+ if (message.type === 'taskCreated') {
177
+ await client.experimental.tasks.cancelTask(message.task.taskId);
178
+ }
179
+ else if (message.type === 'taskStatus') {
180
+ expect(message.task.status).toBe('cancelled');
181
+ }
182
+ else if (message.type === 'result') {
183
+ throw new Error('Task should have been cancelled before completion');
184
+ }
185
+ }
186
+ }
187
+ finally {
188
+ await client.close();
189
+ }
190
+ },
191
+ },
192
+ {
193
+ name: 'should abort the Apify run when tasks/cancel is sent (direct actor tool)',
194
+ isDeploymentTest: true,
195
+ skipIf: lacksTaskSupport,
196
+ retry: 3,
197
+ // Cancel must abort the underlying Apify run, not only the task status.
198
+ run: async (ctx) => {
199
+ const client = (await ctx.createClientFn({ tools: [ACTOR_NORMAL_MODE] }));
200
+ try {
201
+ const api = ctx.createApifyClient();
202
+ const { onprogress, runIdPromise } = captureRunIdFromProgress();
203
+ const stream = client.experimental.tasks.callToolStream({
204
+ name: actorNameToToolName(ACTOR_NORMAL_MODE),
205
+ // waitSeconds keeps the run open long enough to capture, cancel, and verify abort.
206
+ arguments: { firstNumber: 1, secondNumber: 2, waitSeconds: 60 },
207
+ }, CallToolResultSchema, { task: { ttl: 60000 }, onprogress });
208
+ let cancelled = false;
209
+ for await (const message of stream) {
210
+ if (message.type === 'taskCreated') {
211
+ // Cancel once the run is confirmed started (runId observed), not before.
212
+ await runIdPromise;
213
+ await client.experimental.tasks.cancelTask(message.task.taskId);
214
+ cancelled = true;
215
+ }
216
+ else if (message.type === 'result') {
217
+ throw new Error('Task should have been cancelled before completion');
218
+ }
219
+ }
220
+ expect(cancelled).toBe(true);
221
+ const runId = await runIdPromise;
222
+ await waitForRunAborted(api, runId);
223
+ }
224
+ finally {
225
+ await client.close();
226
+ }
227
+ },
228
+ },
229
+ {
230
+ name: 'should support call-actor tool in task mode (internal tool with taskSupport)',
231
+ isDeploymentTest: true,
232
+ skipIf: lacksTaskSupport,
233
+ run: async (ctx) => {
234
+ const client = (await ctx.createClientFn({ tools: ['actors'] }));
235
+ try {
236
+ const stream = client.experimental.tasks.callToolStream({
237
+ name: HELPER_TOOLS.ACTOR_CALL,
238
+ arguments: { actor: ACTOR_NORMAL_MODE, input: { firstNumber: 10, secondNumber: 20 } },
239
+ }, CallToolResultSchema, { task: { ttl: 60000 } });
240
+ let resultReceived = false;
241
+ let taskCreated = false;
242
+ for await (const message of stream) {
243
+ switch (message.type) {
244
+ case 'taskCreated':
245
+ taskCreated = true;
246
+ expect(message.task.taskId).toBeDefined();
247
+ break;
248
+ case 'taskStatus':
249
+ expect(['working', 'completed']).toContain(message.task.status);
250
+ break;
251
+ case 'result': {
252
+ const content = message.result.content;
253
+ expect(content.length).toBeGreaterThan(0);
254
+ const resultText = content.map((c) => c.text).join(' ');
255
+ expect(resultText.length).toBeGreaterThan(0);
256
+ resultReceived = true;
257
+ break;
258
+ }
259
+ case 'error':
260
+ throw message.error;
261
+ default:
262
+ throw new Error(`Unknown message type: ${message.type}`);
263
+ }
264
+ }
265
+ expect(taskCreated).toBe(true);
266
+ expect(resultReceived).toBe(true);
267
+ }
268
+ finally {
269
+ await client.close();
270
+ }
271
+ },
272
+ },
273
+ {
274
+ name: 'should propagate statusMessage to tasks/get and tasks/list for internal tools in task mode',
275
+ isDeploymentTest: true,
276
+ skipIf: lacksTaskSupport,
277
+ retry: 1,
278
+ // Flaky on streamable HTTP if Actor finishes before PROGRESS_NOTIFICATION_INTERVAL_MS (#558).
279
+ run: async (ctx) => {
280
+ const client = (await ctx.createClientFn({ tools: ['actors'] }));
281
+ try {
282
+ const stream = client.experimental.tasks.callToolStream({
283
+ name: HELPER_TOOLS.ACTOR_CALL,
284
+ // waitSeconds keeps the run open long enough for the polling interval to
285
+ // emit at least one statusMessage notification.
286
+ arguments: {
287
+ actor: ACTOR_NORMAL_MODE,
288
+ input: { firstNumber: 1, secondNumber: 2, waitSeconds: 10 },
289
+ },
290
+ }, CallToolResultSchema, { task: { ttl: 60000 } });
291
+ await assertStatusMessagePropagated(client, stream);
292
+ }
293
+ finally {
294
+ await client.close();
295
+ }
296
+ },
297
+ },
298
+ {
299
+ name: 'should propagate statusMessage to tasks/get and tasks/list for actor tools in task mode',
300
+ isDeploymentTest: true,
301
+ skipIf: lacksTaskSupport,
302
+ retry: 1,
303
+ run: async (ctx) => {
304
+ const client = (await ctx.createClientFn({ tools: [ACTOR_NORMAL_MODE] }));
305
+ try {
306
+ const stream = client.experimental.tasks.callToolStream({
307
+ name: actorNameToToolName(ACTOR_NORMAL_MODE),
308
+ // waitSeconds keeps the run open long enough for the polling interval to
309
+ // emit at least one statusMessage notification.
310
+ arguments: { firstNumber: 1, secondNumber: 2, waitSeconds: 10 },
311
+ }, CallToolResultSchema, { task: { ttl: 60000 } });
312
+ await assertStatusMessagePropagated(client, stream);
313
+ }
314
+ finally {
315
+ await client.close();
316
+ }
317
+ },
318
+ },
319
+ ];
320
+ //# sourceMappingURL=tasks.cases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.cases.js","sourceRoot":"","sources":["../../../tests/test_kit/cases/tasks.cases.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,gDAAgD,CAAC;AAE9E,OAAO,EACH,iBAAiB,EACjB,6BAA6B,EAC7B,wBAAwB,EACxB,iBAAiB,GACpB,MAAM,eAAe,CAAC;AAGvB,gFAAgF;AAChF,SAAS,gBAAgB,CAAC,GAAY;IAClC,OAAO,GAAG,CAAC,SAAS,KAAK,YAAY,CAAC;AAC1C,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,MAAM,UAAU,GAAW;IAC9B;QACI,IAAI,EAAE,mDAAmD;QACzD,gBAAgB,EAAE,IAAI;QACtB,MAAM,EAAE,gBAAgB;QACxB,KAAK,EAAE,CAAC;QACR,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACf,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;YAChE,8EAA8E;YAC9E,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAa,CAAC;YACvF,IAAI,CAAC;gBACD,MAAM,GAAG,GAAG,GAAG,CAAC,iBAAiB,EAAE,CAAC;gBACpC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,wBAAwB,EAAE,CAAC;gBAChE,MAAM,cAAc,GAAG,MAAM;qBACxB,OAAO,CACJ;oBACI,MAAM,EAAE,YAAqB;oBAC7B,MAAM,EAAE;wBACJ,IAAI,EAAE,gBAAgB;wBACtB,SAAS,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE;qBAClE;iBACJ,EACD,oBAAoB,EACpB,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,CAC5C;oBACD,4EAA4E;qBAC3E,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAE5B,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC;gBACjC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC;gBAC3B,UAAU,CAAC,KAAK,EAAE,CAAC;gBACnB,MAAM,cAAc,CAAC;gBAErB,MAAM,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACxC,CAAC;oBAAS,CAAC;gBACP,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;QACL,CAAC;KACJ;IACD;QACI,IAAI,EAAE,yDAAyD;QAC/D,gBAAgB,EAAE,IAAI;QACtB,MAAM,EAAE,gBAAgB;QACxB,KAAK,EAAE,CAAC;QACR,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACf,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAa,CAAC;YAC7E,IAAI,CAAC;gBACD,MAAM,GAAG,GAAG,GAAG,CAAC,iBAAiB,EAAE,CAAC;gBACpC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,wBAAwB,EAAE,CAAC;gBAChE,MAAM,cAAc,GAAG,MAAM;qBACxB,OAAO,CACJ;oBACI,MAAM,EAAE,YAAqB;oBAC7B,MAAM,EAAE;wBACJ,IAAI,EAAE,YAAY,CAAC,UAAU;wBAC7B,SAAS,EAAE;4BACP,KAAK,EAAE,iBAAiB;4BACxB,IAAI,EAAE,MAAM;4BACZ,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE;yBAC9D;qBACJ;iBACJ,EACD,oBAAoB,EACpB,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,CAC5C;qBACA,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAE5B,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC;gBACjC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC;gBAC3B,UAAU,CAAC,KAAK,EAAE,CAAC;gBACnB,MAAM,cAAc,CAAC;gBAErB,MAAM,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACxC,CAAC;oBAAS,CAAC;gBACP,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;QACL,CAAC;KACJ;IACD;QACI,IAAI,EAAE,sDAAsD;QAC5D,gBAAgB,EAAE,IAAI;QACtB,MAAM,EAAE,gBAAgB;QACxB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACf,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAa,CAAC;YACtF,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,cAAc,CACnD;oBACI,IAAI,EAAE,mBAAmB,CAAC,iBAAiB,CAAC;oBAC5C,yEAAyE;oBACzE,SAAS,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE;iBAClE,EACD,oBAAoB,EACpB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAC3B,CAAC;gBAEF,IAAI,UAAU,GAAG,EAAE,CAAC;gBACpB,IAAI,eAAe,GAAG,CAAC,CAAC;gBACxB,IAAI,cAAc,GAAG,KAAK,CAAC;gBAC3B,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;oBACjC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;wBACnB,KAAK,aAAa;4BACd,MAAM;wBACV,KAAK,YAAY;4BACb,eAAe,EAAE,CAAC;4BAClB,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;4BACjC,MAAM;wBACV,KAAK,QAAQ;4BACT,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gCACpC,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;4BACxC,CAAC,CAAC,CAAC;4BACH,cAAc,GAAG,IAAI,CAAC;4BACtB,MAAM;wBACV,KAAK,OAAO;4BACR,MAAM,OAAO,CAAC,KAAK,CAAC;wBACxB;4BACI,MAAM,IAAI,KAAK,CAAC,yBAA0B,OAAuC,CAAC,IAAI,EAAE,CAAC,CAAC;oBAClG,CAAC;gBACL,CAAC;gBACD,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClC,uDAAuD;gBACvD,MAAM,CAAC,eAAe,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;gBAC3C,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpC,CAAC;oBAAS,CAAC;gBACP,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;QACL,CAAC;KACJ;IACD;QACI,IAAI,EAAE,gHAAgH;QACtH,gBAAgB,EAAE,IAAI;QACtB,MAAM,EAAE,gBAAgB;QACxB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACf,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAa,CAAC;YACtF,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,cAAc,CACnD;oBACI,IAAI,EAAE,mBAAmB,CAAC,iBAAiB,CAAC;oBAC5C,0EAA0E;oBAC1E,SAAS,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE;iBAClE,EACD,oBAAoB,EACpB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAC3B,CAAC;gBAEF,IAAI,MAAM,GAAkB,IAAI,CAAC;gBACjC,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;oBACjC,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;wBACjC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;wBAE7B,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;wBACnE,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;wBAC5C,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBAE1C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;wBAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACvD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;oBACtC,CAAC;yBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACnC,IAAI,CAAC,MAAM;4BAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;wBAC9E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;wBAC3F,MAAM,OAAO,GAAG,MAAM,CAAC,OAA2C,CAAC;wBACnE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACnC,CAAC;gBACL,CAAC;YACL,CAAC;oBAAS,CAAC;gBACP,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;QACL,CAAC;KACJ;IACD;QACI,IAAI,EAAE,sEAAsE;QAC5E,gBAAgB,EAAE,IAAI;QACtB,MAAM,EAAE,gBAAgB;QACxB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACf,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAa,CAAC;YACtF,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,cAAc,CACnD;oBACI,IAAI,EAAE,mBAAmB,CAAC,iBAAiB,CAAC;oBAC5C,sEAAsE;oBACtE,SAAS,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE;iBAClE,EACD,oBAAoB,EACpB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAC3B,CAAC;gBAEF,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;oBACjC,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;wBACjC,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACpE,CAAC;yBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;wBACvC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBAClD,CAAC;yBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACnC,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;oBACzE,CAAC;gBACL,CAAC;YACL,CAAC;oBAAS,CAAC;gBACP,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;QACL,CAAC;KACJ;IACD;QACI,IAAI,EAAE,0EAA0E;QAChF,gBAAgB,EAAE,IAAI;QACtB,MAAM,EAAE,gBAAgB;QACxB,KAAK,EAAE,CAAC;QACR,wEAAwE;QACxE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACf,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAa,CAAC;YACtF,IAAI,CAAC;gBACD,MAAM,GAAG,GAAG,GAAG,CAAC,iBAAiB,EAAE,CAAC;gBACpC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,wBAAwB,EAAE,CAAC;gBAEhE,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,cAAc,CACnD;oBACI,IAAI,EAAE,mBAAmB,CAAC,iBAAiB,CAAC;oBAC5C,mFAAmF;oBACnF,SAAS,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE;iBAClE,EACD,oBAAoB,EACpB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,CACvC,CAAC;gBAEF,IAAI,SAAS,GAAG,KAAK,CAAC;gBACtB,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;oBACjC,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;wBACjC,yEAAyE;wBACzE,MAAM,YAAY,CAAC;wBACnB,MAAM,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBAChE,SAAS,GAAG,IAAI,CAAC;oBACrB,CAAC;yBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACnC,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;oBACzE,CAAC;gBACL,CAAC;gBACD,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAE7B,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC;gBACjC,MAAM,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACxC,CAAC;oBAAS,CAAC;gBACP,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;QACL,CAAC;KACJ;IACD;QACI,IAAI,EAAE,8EAA8E;QACpF,gBAAgB,EAAE,IAAI;QACtB,MAAM,EAAE,gBAAgB;QACxB,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACf,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAa,CAAC;YAC7E,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,cAAc,CACnD;oBACI,IAAI,EAAE,YAAY,CAAC,UAAU;oBAC7B,SAAS,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE;iBACxF,EACD,oBAAoB,EACpB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAC3B,CAAC;gBAEF,IAAI,cAAc,GAAG,KAAK,CAAC;gBAC3B,IAAI,WAAW,GAAG,KAAK,CAAC;gBACxB,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;oBACjC,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;wBACnB,KAAK,aAAa;4BACd,WAAW,GAAG,IAAI,CAAC;4BACnB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;4BAC1C,MAAM;wBACV,KAAK,YAAY;4BACb,MAAM,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;4BAChE,MAAM;wBACV,KAAK,QAAQ,CAAC,CAAC,CAAC;4BACZ,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAA2C,CAAC;4BAC3E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;4BAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;4BACxD,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;4BAC7C,cAAc,GAAG,IAAI,CAAC;4BACtB,MAAM;wBACV,CAAC;wBACD,KAAK,OAAO;4BACR,MAAM,OAAO,CAAC,KAAK,CAAC;wBACxB;4BACI,MAAM,IAAI,KAAK,CAAC,yBAA0B,OAAuC,CAAC,IAAI,EAAE,CAAC,CAAC;oBAClG,CAAC;gBACL,CAAC;gBAED,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/B,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,CAAC;oBAAS,CAAC;gBACP,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;QACL,CAAC;KACJ;IACD;QACI,IAAI,EAAE,4FAA4F;QAClG,gBAAgB,EAAE,IAAI;QACtB,MAAM,EAAE,gBAAgB;QACxB,KAAK,EAAE,CAAC;QACR,8FAA8F;QAC9F,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACf,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAa,CAAC;YAC7E,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,cAAc,CACnD;oBACI,IAAI,EAAE,YAAY,CAAC,UAAU;oBAC7B,yEAAyE;oBACzE,gDAAgD;oBAChD,SAAS,EAAE;wBACP,KAAK,EAAE,iBAAiB;wBACxB,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE;qBAC9D;iBACJ,EACD,oBAAoB,EACpB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAC3B,CAAC;gBAEF,MAAM,6BAA6B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACxD,CAAC;oBAAS,CAAC;gBACP,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;QACL,CAAC;KACJ;IACD;QACI,IAAI,EAAE,yFAAyF;QAC/F,gBAAgB,EAAE,IAAI;QACtB,MAAM,EAAE,gBAAgB;QACxB,KAAK,EAAE,CAAC;QACR,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACf,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAa,CAAC;YACtF,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,cAAc,CACnD;oBACI,IAAI,EAAE,mBAAmB,CAAC,iBAAiB,CAAC;oBAC5C,yEAAyE;oBACzE,gDAAgD;oBAChD,SAAS,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE;iBAClE,EACD,oBAAoB,EACpB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAC3B,CAAC;gBAEF,MAAM,6BAA6B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACxD,CAAC;oBAAS,CAAC;gBACP,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC;QACL,CAAC;KACJ;CACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Case } from '../types.js';
2
+ /** Protocol/tool behavior: prompts, docs, report-problem, schemas, MCP passthrough. */
3
+ export declare const toolsCases: Case[];
4
+ //# sourceMappingURL=tools.cases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.cases.d.ts","sourceRoot":"","sources":["../../../tests/test_kit/cases/tools.cases.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,uFAAuF;AACvF,eAAO,MAAM,UAAU,EAAE,IAAI,EAsN5B,CAAC"}
@@ -0,0 +1,204 @@
1
+ import { expect } from 'vitest';
2
+ import { CALL_ACTOR_MCP_MISSING_TOOL_NAME_MSG, HELPER_TOOLS } from '@apify/actors-mcp-server/internals/test-kit.js';
3
+ import { ACTOR_EXAMPLE_MCP_SERVER, buildExampleMcpServerAddToolContent, getToolNames, skipUnlessLegacyHttp, validateStructuredOutputForTool, withClient, } from '../helpers.js';
4
+ /** Protocol/tool behavior: prompts, docs, report-problem, schemas, MCP passthrough. */
5
+ export const toolsCases = [
6
+ {
7
+ // telemetry off → report-problem absent; serve/hide paths are unit-tested.
8
+ name: 'report-problem is not served when telemetry is disabled',
9
+ isDeploymentTest: false,
10
+ run: withClient(undefined, async (client) => {
11
+ const names = getToolNames(await client.listTools());
12
+ expect(names).not.toContain(HELPER_TOOLS.PROBLEM_REPORT);
13
+ }),
14
+ },
15
+ {
16
+ name: 'should return outputSchema, title, and icons in tools list response',
17
+ isDeploymentTest: false,
18
+ run: withClient(undefined, async (client) => {
19
+ const response = await client.listTools();
20
+ // Find a tool with outputSchema (e.g., search-apify-docs)
21
+ const searchApiifyDocsTool = response.tools.find((tool) => tool.name === 'search-apify-docs');
22
+ expect(searchApiifyDocsTool).toBeDefined();
23
+ // Verify that outputSchema is present
24
+ expect(typeof (searchApiifyDocsTool === null || searchApiifyDocsTool === void 0 ? void 0 : searchApiifyDocsTool.outputSchema)).toBe('object');
25
+ expect(searchApiifyDocsTool === null || searchApiifyDocsTool === void 0 ? void 0 : searchApiifyDocsTool.outputSchema).toHaveProperty('type');
26
+ expect(searchApiifyDocsTool === null || searchApiifyDocsTool === void 0 ? void 0 : searchApiifyDocsTool.outputSchema).toHaveProperty('properties');
27
+ }),
28
+ },
29
+ {
30
+ // Regression #415: after listTools caches validators, MCP passthrough must return structuredContent.
31
+ name: 'MCP server actor:tool pass-through returns structuredContent satisfying outputSchema',
32
+ isDeploymentTest: false,
33
+ run: withClient({ tools: ['actors'] }, async (client) => {
34
+ var _a;
35
+ // Populates the SDK's `_cachedToolOutputValidators` map so callTool runs schema validation.
36
+ await client.listTools();
37
+ const callResult = await client.callTool({
38
+ name: HELPER_TOOLS.ACTOR_CALL,
39
+ arguments: { actor: `${ACTOR_EXAMPLE_MCP_SERVER}:add`, input: { firstNumber: 2, secondNumber: 3 } },
40
+ });
41
+ // Passthrough has no Apify run — expect sentinel structuredContent fields.
42
+ const sc = callResult.structuredContent;
43
+ expect(sc).toBeDefined();
44
+ expect(sc).toHaveProperty('runId');
45
+ expect(sc).toHaveProperty('actorId');
46
+ expect(sc).toHaveProperty('status');
47
+ expect(sc).toHaveProperty('storages');
48
+ expect(sc).toHaveProperty('summary');
49
+ expect(sc).toHaveProperty('nextStep');
50
+ // Remote payload must still flow through content.
51
+ const content = callResult.content;
52
+ expect(content).toEqual(buildExampleMcpServerAddToolContent(2, 3));
53
+ // isError must be forwarded from the remote tool.
54
+ expect((_a = callResult.isError) !== null && _a !== void 0 ? _a : false).toBe(false);
55
+ }),
56
+ },
57
+ {
58
+ name: 'should search Apify documentation',
59
+ isDeploymentTest: false,
60
+ run: withClient({ tools: ['docs'] }, async (client) => {
61
+ const toolName = HELPER_TOOLS.DOCS_SEARCH;
62
+ const query = 'standby actor';
63
+ const result = await client.callTool({ name: toolName, arguments: { query, limit: 5, offset: 0 } });
64
+ const content = result.content;
65
+ expect(content.length).toBeGreaterThan(0);
66
+ // Should contain at least one apify docs url
67
+ const standbyDocUrl = 'https://docs.apify.com';
68
+ expect(content.some((item) => item.text.includes(standbyDocUrl))).toBe(true);
69
+ }),
70
+ },
71
+ {
72
+ name: 'should fetch Apify documentation page',
73
+ isDeploymentTest: false,
74
+ run: withClient({ tools: ['docs'] }, async (client) => {
75
+ const documentUrl = 'https://docs.apify.com/academy/getting-started/creating-actors';
76
+ const result = await client.callTool({ name: HELPER_TOOLS.DOCS_FETCH, arguments: { url: documentUrl } });
77
+ const content = result.content;
78
+ expect(content.length).toBeGreaterThan(0);
79
+ expect(content[0].text).toContain(documentUrl);
80
+ }),
81
+ },
82
+ {
83
+ name: 'should reject fetch-apify-docs with forbidden URL (not from allowed domains)',
84
+ isDeploymentTest: false,
85
+ run: withClient({ tools: ['docs'] }, async (client) => {
86
+ const forbiddenUrl = 'https://example.com/some-page';
87
+ const result = await client.callTool({ name: HELPER_TOOLS.DOCS_FETCH, arguments: { url: forbiddenUrl } });
88
+ const content = result.content;
89
+ expect(content.length).toBeGreaterThan(0);
90
+ // Verify it's an error response
91
+ expect(result.isError).toBe(true);
92
+ // Verify the error message contains helpful information
93
+ expect(content[0].text).toContain('Invalid URL');
94
+ expect(content[0].text).toContain('https://docs.apify.com');
95
+ expect(content[0].text).toContain('https://crawlee.dev');
96
+ }),
97
+ },
98
+ {
99
+ name: 'should allow fetch-apify-docs from Crawlee domain (https://crawlee.dev)',
100
+ isDeploymentTest: false,
101
+ run: withClient({ tools: ['docs'] }, async (client) => {
102
+ const crawleeDocsUrl = 'https://crawlee.dev/js/docs/quick-start';
103
+ const result = await client.callTool({ name: HELPER_TOOLS.DOCS_FETCH, arguments: { url: crawleeDocsUrl } });
104
+ // Should not have error status
105
+ expect(result.isError).not.toBe(true);
106
+ const content = result.content;
107
+ expect(content.length).toBeGreaterThan(0);
108
+ // Verify the response contains the URL we fetched
109
+ expect(content[0].text).toContain('Fetched content from');
110
+ }),
111
+ },
112
+ {
113
+ name: 'should return structured output for search-apify-docs matching outputSchema',
114
+ isDeploymentTest: false,
115
+ run: withClient({ tools: ['docs'] }, async (client) => {
116
+ const toolName = HELPER_TOOLS.DOCS_SEARCH;
117
+ const query = 'standby actor';
118
+ const result = await client.callTool({ name: toolName, arguments: { query, limit: 5, offset: 0 } });
119
+ const content = result.content;
120
+ expect(content.length).toBeGreaterThan(0);
121
+ validateStructuredOutputForTool(result, HELPER_TOOLS.DOCS_SEARCH, 'default');
122
+ }),
123
+ },
124
+ {
125
+ name: 'should return structured output for fetch-apify-docs matching outputSchema',
126
+ isDeploymentTest: false,
127
+ run: withClient({ tools: ['docs'] }, async (client) => {
128
+ const toolName = HELPER_TOOLS.DOCS_FETCH;
129
+ const result = await client.callTool({
130
+ name: toolName,
131
+ arguments: { url: 'https://docs.apify.com/platform/actors/development' },
132
+ });
133
+ const content = result.content;
134
+ expect(content.length).toBeGreaterThan(0);
135
+ validateStructuredOutputForTool(result, HELPER_TOOLS.DOCS_FETCH, 'default');
136
+ }),
137
+ },
138
+ {
139
+ name: 'should list all prompts',
140
+ isDeploymentTest: false,
141
+ run: withClient(undefined, async (client) => {
142
+ const prompts = await client.listPrompts();
143
+ expect(prompts.prompts.length).toBe(0);
144
+ }),
145
+ },
146
+ {
147
+ // Session termination is only possible for streamable HTTP transport.
148
+ name: 'should successfully terminate streamable session',
149
+ isDeploymentTest: false,
150
+ skipIf: skipUnlessLegacyHttp,
151
+ run: withClient(undefined, async (client) => {
152
+ await client.listTools();
153
+ await expect(client.transport.terminateSession()).resolves.toBeUndefined();
154
+ }),
155
+ },
156
+ {
157
+ name: 'should connect to MCP server and at least one tool is available',
158
+ isDeploymentTest: false,
159
+ run: withClient({ tools: [ACTOR_EXAMPLE_MCP_SERVER] }, async (client) => {
160
+ const tools = await client.listTools();
161
+ expect(tools.tools.length).toBeGreaterThan(0);
162
+ }),
163
+ },
164
+ {
165
+ name: 'should serve call-actor when a dynamic-tools client selects the actors category',
166
+ isDeploymentTest: false,
167
+ run: withClient({ clientName: 'Visual Studio Code', tools: ['actors'] }, async (client) => {
168
+ const names = getToolNames(await client.listTools());
169
+ // call-actor is served for a dynamic-tools-capable client
170
+ expect(names).toContain('call-actor');
171
+ }),
172
+ },
173
+ {
174
+ name: 'should serve call-actor for a dynamic-tools client with the default tool set',
175
+ isDeploymentTest: false,
176
+ run: withClient({ clientName: 'Visual Studio Code' }, async (client) => {
177
+ const names = getToolNames(await client.listTools());
178
+ expect(names).toContain('call-actor');
179
+ }),
180
+ },
181
+ {
182
+ name: 'should serve call-actor for a dynamic-tools client that selects call-actor explicitly',
183
+ isDeploymentTest: false,
184
+ run: withClient({ clientName: 'Visual Studio Code', tools: ['call-actor'] }, async (client) => {
185
+ const names = getToolNames(await client.listTools());
186
+ expect(names).toContain('call-actor');
187
+ }),
188
+ },
189
+ {
190
+ name: 'should return error message when trying to call MCP server Actor without tool name in actor parameter',
191
+ isDeploymentTest: false,
192
+ run: withClient({ tools: ['actors'] }, async (client) => {
193
+ const response = await client.callTool({
194
+ name: 'call-actor',
195
+ arguments: { actor: ACTOR_EXAMPLE_MCP_SERVER, input: { firstNumber: 1, secondNumber: 2 } },
196
+ });
197
+ const content = response.content;
198
+ expect(content.length).toBeGreaterThan(0);
199
+ expect(content[0].text).toContain(CALL_ACTOR_MCP_MISSING_TOOL_NAME_MSG);
200
+ expect(response.isError).toBe(true);
201
+ }),
202
+ },
203
+ ];
204
+ //# sourceMappingURL=tools.cases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.cases.js","sourceRoot":"","sources":["../../../tests/test_kit/cases/tools.cases.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { Client as ClientV1 } from '@modelcontextprotocol/sdk/client/index.js';
2
+ import type { Progress } from '@modelcontextprotocol/sdk/types.js';
3
+ import type { ApifyClient } from '@apify/actors-mcp-server/internals.js';
4
+ import type { SERVER_MODE, ToolEntry } from '@apify/actors-mcp-server/internals/test-kit.js';
5
+ import type { CaseCtx, SuiteClient } from './types.js';
6
+ export declare const ACTOR_NORMAL_MODE = "apify/normal-mode-test-actor";
7
+ export declare const ACTOR_EXAMPLE_MCP_SERVER = "apify/example-mcp-server";
8
+ export declare const RETIRED_SELECTORS: readonly ["add-actor", "experimental", "preview"];
9
+ export declare const AUTO_INJECTED_TOOL_NAMES: string[];
10
+ export declare const DEFAULT_ACTOR_NAMES: string[];
11
+ export declare function getDefaultToolNames(): string[];
12
+ export declare function servedDefaultTools(): ToolEntry[];
13
+ export declare function servedDefaultToolNames(): string[];
14
+ /** Create client, run testFn, always close. */
15
+ export declare function withClient(clientOptions: Parameters<CaseCtx['createClientFn']>[0], testFn: (client: SuiteClient, ctx: CaseCtx) => Promise<void>): (ctx: CaseCtx) => Promise<void>;
16
+ /** Skip unless transport is legacy streamable HTTP (`2025-11-25`). */
17
+ export declare function skipUnlessLegacyHttp(ctx: CaseCtx): boolean;
18
+ /** Skip on stdio. */
19
+ export declare function skipOnStdio(ctx: CaseCtx): boolean;
20
+ /** Skip on every transport except stdio. */
21
+ export declare function skipUnlessStdio(ctx: CaseCtx): boolean;
22
+ export declare function getToolNames(tools: {
23
+ tools: {
24
+ name: string;
25
+ }[];
26
+ }): string[];
27
+ export declare function expectToolNamesToContain(names: string[], toolNames?: string[]): void;
28
+ export declare function buildExampleMcpServerAddToolContent(firstNumber: number, secondNumber: number): {
29
+ type: "text";
30
+ text: string;
31
+ }[];
32
+ export declare function validateStructuredOutput(result: unknown, toolOutputSchema: unknown, toolName: string): void;
33
+ /** Find tool by name for the given mode. */
34
+ export declare function findToolByName(name: string, mode: SERVER_MODE): ToolEntry | undefined;
35
+ export declare function validateStructuredOutputForTool(result: unknown, toolName: string, mode: SERVER_MODE): void;
36
+ /** Assert non-empty readme + inputSchema; optional actorInfo.fullName. */
37
+ export declare function expectReadmeInStructuredContent(result: unknown, expectedActorFullName?: string): void;
38
+ /** Assert apps-mode widget tools carry MCP Apps `_meta.ui` (SEP-1865). */
39
+ export declare function expectWidgetToolMeta(tools: {
40
+ tools: {
41
+ name: string;
42
+ _meta?: Record<string, unknown>;
43
+ }[];
44
+ }): void;
45
+ /**
46
+ * Assert canonical normal-mode-test-actor run response.
47
+ * Skips `itemCount` (dataset metadata can lag); requires dataset id + fields.
48
+ */
49
+ export declare function expectNormalModeTestStructuredContent(result: unknown): void;
50
+ /** Assert Apify usage-cost `_meta` shape. */
51
+ export declare function expectUsageCostMeta(result: unknown): void;
52
+ /** Capture runId from the first notifications/progress message. */
53
+ export declare function captureRunIdFromProgress(): {
54
+ onprogress: (progress: Progress) => void;
55
+ runIdPromise: Promise<string>;
56
+ };
57
+ /** Poll a specific run by ID until it reaches ABORTED or ABORTING. */
58
+ export declare function waitForRunAborted(apiClient: ApifyClient, runId: string): Promise<void>;
59
+ type TaskStreamMessage = {
60
+ type: string;
61
+ task?: {
62
+ taskId: string;
63
+ statusMessage?: string;
64
+ };
65
+ error?: Error;
66
+ };
67
+ export declare function assertStatusMessagePropagated(taskClient: ClientV1, stream: AsyncIterable<TaskStreamMessage>): Promise<void>;
68
+ export {};
69
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../tests/test_kit/helpers.ts"],"names":[],"mappings":"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"}