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

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 +18 -3
@@ -0,0 +1,223 @@
1
+ import Ajv from 'ajv';
2
+ import { expect, vi } from 'vitest';
3
+ import { actorNameToToolName, defaults, getCategoryTools, getDefaultTools, getExpectedToolNamesByCategories, } from '@apify/actors-mcp-server/internals.js';
4
+ import { APIFY_ACTOR_RUN_META_KEY, AUTO_INJECTED_TOOLS, HELPER_TOOLS, toolCategoriesEnabledByDefault, } from '@apify/actors-mcp-server/internals/test-kit.js';
5
+ // Live fixtures from apify/mcp-server-test-actor (see DEVELOPMENT.md).
6
+ export const ACTOR_NORMAL_MODE = 'apify/normal-mode-test-actor';
7
+ export const ACTOR_EXAMPLE_MCP_SERVER = 'apify/example-mcp-server';
8
+ const STDIO_TRANSPORT = 'stdio';
9
+ export const RETIRED_SELECTORS = ['add-actor', 'experimental', 'preview'];
10
+ export const AUTO_INJECTED_TOOL_NAMES = AUTO_INJECTED_TOOLS.map((t) => t.name);
11
+ export const DEFAULT_ACTOR_NAMES = defaults.actors.map((actor) => actorNameToToolName(actor));
12
+ // Lazy: avoids circular import during module init.
13
+ export function getDefaultToolNames() {
14
+ return getExpectedToolNamesByCategories(toolCategoriesEnabledByDefault);
15
+ }
16
+ // report-problem is telemetry-gated (dev category); unit tests cover serve/hide/ack.
17
+ export function servedDefaultTools() {
18
+ return getDefaultTools('default');
19
+ }
20
+ export function servedDefaultToolNames() {
21
+ return getDefaultToolNames();
22
+ }
23
+ /** Create client, run testFn, always close. */
24
+ export function withClient(clientOptions, testFn) {
25
+ return async (ctx) => {
26
+ const client = await ctx.createClientFn(clientOptions);
27
+ try {
28
+ await testFn(client, ctx);
29
+ }
30
+ finally {
31
+ await client.close();
32
+ }
33
+ };
34
+ }
35
+ /** Skip unless transport is legacy streamable HTTP (`2025-11-25`). */
36
+ export function skipUnlessLegacyHttp(ctx) {
37
+ return ctx.transport !== '2025-11-25';
38
+ }
39
+ /** Skip on stdio. */
40
+ export function skipOnStdio(ctx) {
41
+ return ctx.transport === STDIO_TRANSPORT;
42
+ }
43
+ /** Skip on every transport except stdio. */
44
+ export function skipUnlessStdio(ctx) {
45
+ return ctx.transport !== STDIO_TRANSPORT;
46
+ }
47
+ export function getToolNames(tools) {
48
+ return tools.tools.map((tool) => tool.name);
49
+ }
50
+ export function expectToolNamesToContain(names, toolNames = []) {
51
+ toolNames.forEach((name) => expect(names).toContain(name));
52
+ }
53
+ export function buildExampleMcpServerAddToolContent(firstNumber, secondNumber) {
54
+ return [
55
+ {
56
+ type: 'text',
57
+ text: `The sum of ${firstNumber} and ${secondNumber} is ${firstNumber + secondNumber}`,
58
+ },
59
+ ];
60
+ }
61
+ export function validateStructuredOutput(result, toolOutputSchema, toolName) {
62
+ const resultWithStructured = result;
63
+ if (!resultWithStructured.structuredContent)
64
+ return;
65
+ const { structuredContent } = resultWithStructured;
66
+ expect(toolOutputSchema).toBeDefined();
67
+ if (toolOutputSchema) {
68
+ const ajv = new Ajv();
69
+ const validate = ajv.compile(toolOutputSchema);
70
+ const isValid = validate(structuredContent);
71
+ if (!isValid) {
72
+ // eslint-disable-next-line no-console
73
+ console.error(`Validation errors for ${toolName}:`, validate.errors);
74
+ }
75
+ expect(isValid).toBe(true);
76
+ expect(validate.errors).toBeNull();
77
+ }
78
+ }
79
+ /** Find tool by name for the given mode. */
80
+ export function findToolByName(name, mode) {
81
+ const resolved = getCategoryTools(mode);
82
+ for (const tools of Object.values(resolved)) {
83
+ const tool = tools.find((t) => t.name === name);
84
+ if (tool)
85
+ return tool;
86
+ }
87
+ return undefined;
88
+ }
89
+ export function validateStructuredOutputForTool(result, toolName, mode) {
90
+ var _a;
91
+ validateStructuredOutput(result, (_a = findToolByName(toolName, mode)) === null || _a === void 0 ? void 0 : _a.outputSchema, toolName);
92
+ }
93
+ /** Assert non-empty readme + inputSchema; optional actorInfo.fullName. */
94
+ export function expectReadmeInStructuredContent(result, expectedActorFullName) {
95
+ var _a, _b, _c, _d, _e;
96
+ const r = result;
97
+ expect(r.structuredContent).toBeDefined();
98
+ if (expectedActorFullName) {
99
+ expect((_b = (_a = r.structuredContent) === null || _a === void 0 ? void 0 : _a.actorInfo) === null || _b === void 0 ? void 0 : _b.fullName).toBe(expectedActorFullName);
100
+ }
101
+ expect((_c = r.structuredContent) === null || _c === void 0 ? void 0 : _c.readme).toBeDefined();
102
+ expect(typeof ((_d = r.structuredContent) === null || _d === void 0 ? void 0 : _d.readme)).toBe('string');
103
+ expect(r.structuredContent.readme.length).toBeGreaterThan(0);
104
+ expect((_e = r.structuredContent) === null || _e === void 0 ? void 0 : _e.inputSchema).toBeDefined();
105
+ }
106
+ /** Assert apps-mode widget tools carry MCP Apps `_meta.ui` (SEP-1865). */
107
+ export function expectWidgetToolMeta(tools) {
108
+ var _a;
109
+ const toolNames = [
110
+ HELPER_TOOLS.STORE_SEARCH_WIDGET,
111
+ HELPER_TOOLS.ACTOR_GET_DETAILS_WIDGET,
112
+ HELPER_TOOLS.ACTOR_CALL_WIDGET,
113
+ HELPER_TOOLS.ACTOR_RUNS_GET_WIDGET,
114
+ ];
115
+ for (const toolName of toolNames) {
116
+ const tool = tools.tools.find((t) => t.name === toolName);
117
+ expect(tool).toBeDefined();
118
+ expect(tool === null || tool === void 0 ? void 0 : tool._meta).toBeDefined();
119
+ const ui = (_a = tool === null || tool === void 0 ? void 0 : tool._meta) === null || _a === void 0 ? void 0 : _a.ui;
120
+ expect(ui).toBeDefined();
121
+ expect(ui === null || ui === void 0 ? void 0 : ui.resourceUri).toBeDefined();
122
+ expect(ui === null || ui === void 0 ? void 0 : ui.visibility).toEqual(['model', 'app']);
123
+ }
124
+ }
125
+ /**
126
+ * Assert canonical normal-mode-test-actor run response.
127
+ * Skips `itemCount` (dataset metadata can lag); requires dataset id + fields.
128
+ */
129
+ export function expectNormalModeTestStructuredContent(result) {
130
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
131
+ const resultWithStructured = result;
132
+ const sc = resultWithStructured.structuredContent;
133
+ expect(sc).toBeDefined();
134
+ expect(sc === null || sc === void 0 ? void 0 : sc.runId).toBeDefined();
135
+ expect(sc === null || sc === void 0 ? void 0 : sc.status).toBe('SUCCEEDED');
136
+ expect((_c = (_b = (_a = sc === null || sc === void 0 ? void 0 : sc.storages) === null || _a === void 0 ? void 0 : _a.datasets) === null || _b === void 0 ? void 0 : _b.default) === null || _c === void 0 ? void 0 : _c.id).toBeDefined();
137
+ expect((_g = (_f = (_e = (_d = sc === null || sc === void 0 ? void 0 : sc.storages) === null || _d === void 0 ? void 0 : _d.datasets) === null || _e === void 0 ? void 0 : _e.default) === null || _f === void 0 ? void 0 : _f.fields) !== null && _g !== void 0 ? _g : []).toEqual(expect.arrayContaining(['firstNumber', 'secondNumber', 'sum']));
138
+ expect(sc === null || sc === void 0 ? void 0 : sc.summary).toBeDefined();
139
+ expect(sc === null || sc === void 0 ? void 0 : sc.nextStep).toBeDefined();
140
+ // API-token clients get no Console URLs; UI-token path is unit-tested.
141
+ expect(sc === null || sc === void 0 ? void 0 : sc.apifyConsoleUrl).toBeUndefined();
142
+ expect((_k = (_j = (_h = sc === null || sc === void 0 ? void 0 : sc.storages) === null || _h === void 0 ? void 0 : _h.datasets) === null || _j === void 0 ? void 0 : _j.default) === null || _k === void 0 ? void 0 : _k.apifyConsoleUrl).toBeUndefined();
143
+ expect((_o = (_m = (_l = sc === null || sc === void 0 ? void 0 : sc.storages) === null || _l === void 0 ? void 0 : _l.keyValueStores) === null || _m === void 0 ? void 0 : _m.default) === null || _o === void 0 ? void 0 : _o.apifyConsoleUrl).toBeUndefined();
144
+ const narrative = (_q = (_p = resultWithStructured.content) === null || _p === void 0 ? void 0 : _p.map((c) => { var _a; return (_a = c.text) !== null && _a !== void 0 ? _a : ''; }).join('\n')) !== null && _q !== void 0 ? _q : '';
145
+ expect(narrative).not.toContain('Apify Console:');
146
+ }
147
+ /** Assert Apify usage-cost `_meta` shape. */
148
+ export function expectUsageCostMeta(result) {
149
+ var _a;
150
+ const resultWithMeta = result;
151
+ expect(resultWithMeta._meta).toBeDefined();
152
+ const actorRun = (_a = resultWithMeta._meta) === null || _a === void 0 ? void 0 : _a['com.apify/ActorRun'];
153
+ expect(actorRun).toBeDefined();
154
+ expect(typeof (actorRun === null || actorRun === void 0 ? void 0 : actorRun.usageTotalUsd)).toBe('number');
155
+ expect(actorRun.usageTotalUsd).toBeGreaterThanOrEqual(0);
156
+ const usageUsd = actorRun === null || actorRun === void 0 ? void 0 : actorRun.usageUsd;
157
+ if (usageUsd !== undefined) {
158
+ expect(typeof usageUsd).toBe('object');
159
+ }
160
+ }
161
+ const RUN_ABORT_WAIT_TIMEOUT_MS = 60000;
162
+ const RUN_ABORT_WAIT_INTERVAL_MS = 500;
163
+ const RUN_ID_PROGRESS_TIMEOUT_MS = 10000;
164
+ /** Capture runId from the first notifications/progress message. */
165
+ export function captureRunIdFromProgress() {
166
+ let resolveRunId;
167
+ const captured = new Promise((resolve) => {
168
+ resolveRunId = resolve;
169
+ });
170
+ const onprogress = (progress) => {
171
+ var _a;
172
+ // Progress type omits _meta; present at runtime.
173
+ const meta = progress._meta;
174
+ const runId = (_a = meta === null || meta === void 0 ? void 0 : meta[APIFY_ACTOR_RUN_META_KEY]) === null || _a === void 0 ? void 0 : _a.runId;
175
+ if (runId)
176
+ resolveRunId(runId);
177
+ };
178
+ const runIdPromise = Promise.race([
179
+ captured,
180
+ new Promise((_, reject) => {
181
+ const timer = setTimeout(() => reject(new Error(`No runId observed via notifications/progress within ${RUN_ID_PROGRESS_TIMEOUT_MS}ms`)), RUN_ID_PROGRESS_TIMEOUT_MS);
182
+ timer.unref();
183
+ void captured.then(() => clearTimeout(timer));
184
+ }),
185
+ ]);
186
+ return { onprogress, runIdPromise };
187
+ }
188
+ /** Poll a specific run by ID until it reaches ABORTED or ABORTING. */
189
+ export async function waitForRunAborted(apiClient, runId) {
190
+ await vi.waitUntil(async () => {
191
+ const run = await apiClient.run(runId).get();
192
+ return (run === null || run === void 0 ? void 0 : run.status) === 'ABORTED' || (run === null || run === void 0 ? void 0 : run.status) === 'ABORTING';
193
+ }, { timeout: RUN_ABORT_WAIT_TIMEOUT_MS, interval: RUN_ABORT_WAIT_INTERVAL_MS });
194
+ }
195
+ export async function assertStatusMessagePropagated(taskClient, stream) {
196
+ var _a;
197
+ let taskId = null;
198
+ let getTaskSawStatusMessage = false;
199
+ let listTasksSawStatusMessage = false;
200
+ for await (const message of stream) {
201
+ if (message.type === 'taskCreated') {
202
+ taskId = message.task.taskId;
203
+ }
204
+ else if (message.type === 'taskStatus') {
205
+ if ((_a = message.task) === null || _a === void 0 ? void 0 : _a.statusMessage) {
206
+ getTaskSawStatusMessage = true;
207
+ if (!listTasksSawStatusMessage && taskId) {
208
+ const currentTaskId = taskId;
209
+ const tasksList = await taskClient.experimental.tasks.listTasks();
210
+ const currentTask = tasksList.tasks.find((task) => task.taskId === currentTaskId);
211
+ if (currentTask === null || currentTask === void 0 ? void 0 : currentTask.statusMessage)
212
+ listTasksSawStatusMessage = true;
213
+ }
214
+ }
215
+ }
216
+ else if (message.type === 'error') {
217
+ throw message.error;
218
+ }
219
+ }
220
+ expect(getTaskSawStatusMessage).toBe(true);
221
+ expect(listTasksSawStatusMessage).toBe(true);
222
+ }
223
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../tests/test_kit/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * `./test-kit` export. Internal imports shared cases and runs `isDeploymentTest: true` against
3
+ * its live deploy. `vitest` is an optional peer — only `./test-kit` consumers need it.
4
+ */
5
+ export { createMcpStatelessClient, createMcpStreamableClient } from './mcp_client.js';
6
+ export type { SuiteClientOptions } from './mcp_client.js';
7
+ export { registerCases } from './register.js';
8
+ export type { Case, CaseCtx, Fixture, SuiteClient, Transport } from './types.js';
9
+ export { expectNormalModeTestStructuredContent, expectToolNamesToContain, expectWidgetToolMeta, getToolNames, withClient, } from './helpers.js';
10
+ export { actorsCases } from './cases/actors.cases.js';
11
+ export { appsCases } from './cases/apps.cases.js';
12
+ export { paymentsCases } from './cases/payments.cases.js';
13
+ export { registrationCases } from './cases/registration.cases.js';
14
+ export { storageCases } from './cases/storage.cases.js';
15
+ export { tasksCases } from './cases/tasks.cases.js';
16
+ export { toolsCases } from './cases/tools.cases.js';
17
+ import type { Case } from './types.js';
18
+ /** All cases from every capability group. */
19
+ export declare const allCases: Case[];
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../tests/test_kit/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AACtF,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EACH,qCAAqC,EACrC,wBAAwB,EACxB,oBAAoB,EACpB,YAAY,EACZ,UAAU,GACb,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AASpD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,6CAA6C;AAC7C,eAAO,MAAM,QAAQ,EAAE,IAAI,EAQ1B,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * `./test-kit` export. Internal imports shared cases and runs `isDeploymentTest: true` against
3
+ * its live deploy. `vitest` is an optional peer — only `./test-kit` consumers need it.
4
+ */
5
+ export { createMcpStatelessClient, createMcpStreamableClient } from './mcp_client.js';
6
+ export { registerCases } from './register.js';
7
+ export { expectNormalModeTestStructuredContent, expectToolNamesToContain, expectWidgetToolMeta, getToolNames, withClient, } from './helpers.js';
8
+ export { actorsCases } from './cases/actors.cases.js';
9
+ export { appsCases } from './cases/apps.cases.js';
10
+ export { paymentsCases } from './cases/payments.cases.js';
11
+ export { registrationCases } from './cases/registration.cases.js';
12
+ export { storageCases } from './cases/storage.cases.js';
13
+ export { tasksCases } from './cases/tasks.cases.js';
14
+ export { toolsCases } from './cases/tools.cases.js';
15
+ import { actorsCases } from './cases/actors.cases.js';
16
+ import { appsCases } from './cases/apps.cases.js';
17
+ import { paymentsCases } from './cases/payments.cases.js';
18
+ import { registrationCases } from './cases/registration.cases.js';
19
+ import { storageCases } from './cases/storage.cases.js';
20
+ import { tasksCases } from './cases/tasks.cases.js';
21
+ import { toolsCases } from './cases/tools.cases.js';
22
+ /** All cases from every capability group. */
23
+ export const allCases = [
24
+ ...registrationCases,
25
+ ...toolsCases,
26
+ ...actorsCases,
27
+ ...appsCases,
28
+ ...tasksCases,
29
+ ...storageCases,
30
+ ...paymentsCases,
31
+ ];
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../tests/test_kit/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAEtF,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EACH,qCAAqC,EACrC,wBAAwB,EACxB,oBAAoB,EACpB,YAAY,EACZ,UAAU,GACb,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,6CAA6C;AAC7C,MAAM,CAAC,MAAM,QAAQ,GAAW;IAC5B,GAAG,iBAAiB;IACpB,GAAG,UAAU;IACb,GAAG,WAAW;IACd,GAAG,SAAS;IACZ,GAAG,UAAU;IACb,GAAG,YAAY;IACf,GAAG,aAAa;CACnB,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { Client as StatelessClient } from '@modelcontextprotocol/client';
2
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
3
+ import type { ClientCapabilities } from '@modelcontextprotocol/sdk/types.js';
4
+ import type { ToolCategory } from '@apify/actors-mcp-server/internals.js';
5
+ import type { TelemetryEnv } from '@apify/actors-mcp-server/internals/test-kit.js';
6
+ /** Options for the published test-kit client factories. */
7
+ export interface SuiteClientOptions {
8
+ actors?: string[];
9
+ tools?: (ToolCategory | string)[];
10
+ useEnv?: boolean;
11
+ clientName?: string;
12
+ telemetry?: {
13
+ enabled?: boolean;
14
+ env?: TelemetryEnv;
15
+ };
16
+ serverMode?: string;
17
+ payment?: string;
18
+ clientCapabilities?: ClientCapabilities;
19
+ /** Bearer token. Omitted → `APIFY_TOKEN`. `null` → no Authorization header. */
20
+ token?: string | null;
21
+ }
22
+ export declare function resolveToken(options?: SuiteClientOptions): string | undefined;
23
+ /** Require a token unless `token: null` or payment mode. */
24
+ export declare function checkToken(options?: SuiteClientOptions): void;
25
+ export declare function createMcpStreamableClient(serverUrl: string, options?: SuiteClientOptions): Promise<Client>;
26
+ /**
27
+ * v2 SDK client (2026-07-28). `versionNegotiation: auto` probes via `server/discover`.
28
+ * Callers that must not fall back to legacy check `getDiscoverResult()`.
29
+ */
30
+ export declare function createMcpStatelessClient(serverUrl: string, options?: SuiteClientOptions): Promise<StatelessClient>;
31
+ //# sourceMappingURL=mcp_client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp_client.d.ts","sourceRoot":"","sources":["../../tests/test_kit/mcp_client.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,MAAM,IAAI,eAAe,EAG5B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gDAAgD,CAAC;AAEnF,2DAA2D;AAC3D,MAAM,WAAW,kBAAkB;IAC/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,CAAC,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,GAAG,CAAC,EAAE,YAAY,CAAC;KACtB,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,MAAM,GAAG,SAAS,CAI7E;AAED,4DAA4D;AAC5D,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAM7D;AAkBD,wBAAsB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAYhH;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC1C,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,kBAAkB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAkB1B"}
@@ -0,0 +1,73 @@
1
+ import { Client as StatelessClient, StreamableHTTPClientTransport as StatelessStreamableHTTPClientTransport, } from '@modelcontextprotocol/client';
2
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
3
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
4
+ export function resolveToken(options) {
5
+ if ((options === null || options === void 0 ? void 0 : options.token) === null)
6
+ return undefined;
7
+ if ((options === null || options === void 0 ? void 0 : options.token) !== undefined)
8
+ return options.token;
9
+ return process.env.APIFY_TOKEN;
10
+ }
11
+ /** Require a token unless `token: null` or payment mode. */
12
+ export function checkToken(options) {
13
+ if (options === null || options === void 0 ? void 0 : options.payment)
14
+ return;
15
+ if ((options === null || options === void 0 ? void 0 : options.token) === null)
16
+ return;
17
+ if (!resolveToken(options)) {
18
+ throw new Error('No token available: pass `token`, or set APIFY_TOKEN.');
19
+ }
20
+ }
21
+ function buildAuthHeaders(options) {
22
+ if (options === null || options === void 0 ? void 0 : options.payment)
23
+ return {};
24
+ const token = resolveToken(options);
25
+ return token ? { authorization: `Bearer ${token}` } : {};
26
+ }
27
+ function appendSearchParams(url, options) {
28
+ var _a;
29
+ const { actors, tools, telemetry, serverMode, payment } = options !== null && options !== void 0 ? options : {};
30
+ if (actors !== undefined)
31
+ url.searchParams.append('actors', actors.join(','));
32
+ if (tools !== undefined)
33
+ url.searchParams.append('tools', tools.join(','));
34
+ // Default to false for tests when not explicitly set.
35
+ url.searchParams.append('telemetry-enabled', ((_a = telemetry === null || telemetry === void 0 ? void 0 : telemetry.enabled) !== null && _a !== void 0 ? _a : false).toString());
36
+ if (serverMode !== undefined)
37
+ url.searchParams.append('ui', serverMode);
38
+ if (payment)
39
+ url.searchParams.append('payment', payment);
40
+ }
41
+ export async function createMcpStreamableClient(serverUrl, options) {
42
+ checkToken(options);
43
+ const url = new URL(serverUrl);
44
+ appendSearchParams(url, options);
45
+ const transport = new StreamableHTTPClientTransport(url, {
46
+ requestInit: { headers: buildAuthHeaders(options) },
47
+ });
48
+ const client = new Client({ name: (options === null || options === void 0 ? void 0 : options.clientName) || 'streamable-http-client', version: '1.0.0' });
49
+ if (options === null || options === void 0 ? void 0 : options.clientCapabilities)
50
+ client.registerCapabilities(options.clientCapabilities);
51
+ await client.connect(transport);
52
+ return client;
53
+ }
54
+ /**
55
+ * v2 SDK client (2026-07-28). `versionNegotiation: auto` probes via `server/discover`.
56
+ * Callers that must not fall back to legacy check `getDiscoverResult()`.
57
+ */
58
+ export async function createMcpStatelessClient(serverUrl, options) {
59
+ checkToken(options);
60
+ const url = new URL(serverUrl);
61
+ appendSearchParams(url, options);
62
+ const transport = new StatelessStreamableHTTPClientTransport(url, {
63
+ requestInit: { headers: buildAuthHeaders(options) },
64
+ });
65
+ const client = new StatelessClient({ name: (options === null || options === void 0 ? void 0 : options.clientName) || 'stateless-http-client', version: '1.0.0' }, { versionNegotiation: { mode: 'auto' } });
66
+ if (options === null || options === void 0 ? void 0 : options.clientCapabilities) {
67
+ // Shared option shape is v1; cast for v2 schema.
68
+ client.registerCapabilities(options.clientCapabilities);
69
+ }
70
+ await client.connect(transport);
71
+ return client;
72
+ }
73
+ //# sourceMappingURL=mcp_client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp_client.js","sourceRoot":"","sources":["../../tests/test_kit/mcp_client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Case, CaseCtx } from './types.js';
2
+ /**
3
+ * Register cases under `describe(suiteName)`.
4
+ * - `isDeploymentTestOnly`: non-deployment-test → `it.skip`
5
+ * - `skipIf`: also → `it.skip`
6
+ * - `getFixture`: memoized once per call by `fixture.key`
7
+ */
8
+ export declare function registerCases(suiteName: string, cases: Case[], ctx: Omit<CaseCtx, 'getFixture'>): void;
9
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../tests/test_kit/register.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAW,MAAM,YAAY,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,IAAI,CA6BtG"}
@@ -0,0 +1,39 @@
1
+ import { describe, it } from 'vitest';
2
+ /**
3
+ * Register cases under `describe(suiteName)`.
4
+ * - `isDeploymentTestOnly`: non-deployment-test → `it.skip`
5
+ * - `skipIf`: also → `it.skip`
6
+ * - `getFixture`: memoized once per call by `fixture.key`
7
+ */
8
+ export function registerCases(suiteName, cases, ctx) {
9
+ // eslint-disable-next-line vitest/valid-title -- suiteName is the caller's title string
10
+ describe(suiteName, () => {
11
+ var _a, _b;
12
+ const fixtureCache = new Map();
13
+ const fullCtx = {
14
+ ...ctx,
15
+ getFixture: async (fixture) => {
16
+ let cached = fixtureCache.get(fixture.key);
17
+ if (!cached) {
18
+ cached = fixture.setup(fullCtx);
19
+ fixtureCache.set(fixture.key, cached);
20
+ }
21
+ return cached;
22
+ },
23
+ };
24
+ for (const c of cases) {
25
+ const skip = (ctx.isDeploymentTestOnly && !c.isDeploymentTest) || ((_b = (_a = c.skipIf) === null || _a === void 0 ? void 0 : _a.call(c, fullCtx)) !== null && _b !== void 0 ? _b : false);
26
+ const runIt = skip ? it.skip : it;
27
+ const runFn = async () => c.run(fullCtx);
28
+ if (c.retry !== undefined) {
29
+ // eslint-disable-next-line vitest/valid-title vitest/expect-expect
30
+ runIt(c.name, { retry: c.retry }, runFn);
31
+ }
32
+ else {
33
+ // eslint-disable-next-line vitest/valid-title vitest/expect-expect
34
+ runIt(c.name, runFn);
35
+ }
36
+ }
37
+ });
38
+ }
39
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../tests/test_kit/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAItC;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,KAAa,EAAE,GAAgC;IAC5F,wFAAwF;IACxF,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;;QACrB,MAAM,YAAY,GAAG,IAAI,GAAG,EAA4B,CAAC;QACzD,MAAM,OAAO,GAAY;YACrB,GAAG,GAAG;YACN,UAAU,EAAE,KAAK,EAAK,OAAmB,EAAc,EAAE;gBACrD,IAAI,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAA2B,CAAC;gBACrE,IAAI,CAAC,MAAM,EAAE,CAAC;oBACV,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAChC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC1C,CAAC;gBACD,OAAO,MAAM,CAAC;YAClB,CAAC;SACJ,CAAC;QAEF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAA,MAAA,CAAC,CAAC,MAAM,kDAAG,OAAO,CAAC,mCAAI,KAAK,CAAC,CAAC;YACjG,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACzC,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,mEAAmE;gBACnE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;YAC7C,CAAC;iBAAM,CAAC;gBACJ,mEAAmE;gBACnE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACzB,CAAC;QACL,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}