@apify/actors-mcp-server 0.1.22-beta.14 → 0.1.22-beta.15

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 (104) hide show
  1. package/README.md +62 -64
  2. package/dist/actors.d.ts +74 -0
  3. package/dist/actors.d.ts.map +1 -0
  4. package/dist/actors.js +327 -0
  5. package/dist/actors.js.map +1 -0
  6. package/dist/const.d.ts +19 -14
  7. package/dist/const.d.ts.map +1 -1
  8. package/dist/const.js +23 -22
  9. package/dist/const.js.map +1 -1
  10. package/dist/examples/clientSse.d.ts +1 -11
  11. package/dist/examples/clientSse.d.ts.map +1 -1
  12. package/dist/examples/clientSse.js +10 -13
  13. package/dist/examples/clientSse.js.map +1 -1
  14. package/dist/examples/clientStdio.js +6 -6
  15. package/dist/examples/clientStdio.js.map +1 -1
  16. package/dist/examples/clientStdioChat.js +16 -31
  17. package/dist/examples/clientStdioChat.js.map +1 -1
  18. package/dist/index.d.ts +14 -2
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +51 -6
  21. package/dist/index.js.map +1 -1
  22. package/dist/{actor/input.d.ts → input.d.ts} +1 -1
  23. package/dist/input.d.ts.map +1 -0
  24. package/dist/input.js +23 -0
  25. package/dist/input.js.map +1 -0
  26. package/dist/logger.d.ts +3 -0
  27. package/dist/logger.d.ts.map +1 -0
  28. package/dist/logger.js +4 -0
  29. package/dist/logger.js.map +1 -0
  30. package/dist/main.d.ts +0 -4
  31. package/dist/main.d.ts.map +1 -1
  32. package/dist/main.js +122 -23
  33. package/dist/main.js.map +1 -1
  34. package/dist/server.d.ts +43 -0
  35. package/dist/server.d.ts.map +1 -0
  36. package/dist/server.js +178 -0
  37. package/dist/server.js.map +1 -0
  38. package/dist/tools.d.ts +46 -0
  39. package/dist/tools.d.ts.map +1 -0
  40. package/dist/tools.js +128 -0
  41. package/dist/tools.js.map +1 -0
  42. package/dist/tsconfig.tsbuildinfo +1 -1
  43. package/dist/types.d.ts +10 -70
  44. package/dist/types.d.ts.map +1 -1
  45. package/package.json +15 -17
  46. package/dist/actor/const.d.ts +0 -12
  47. package/dist/actor/const.d.ts.map +0 -1
  48. package/dist/actor/const.js +0 -18
  49. package/dist/actor/const.js.map +0 -1
  50. package/dist/actor/input.d.ts.map +0 -1
  51. package/dist/actor/input.js +0 -21
  52. package/dist/actor/input.js.map +0 -1
  53. package/dist/actor/server.d.ts +0 -4
  54. package/dist/actor/server.d.ts.map +0 -1
  55. package/dist/actor/server.js +0 -154
  56. package/dist/actor/server.js.map +0 -1
  57. package/dist/actor/types.d.ts +0 -30
  58. package/dist/actor/types.d.ts.map +0 -1
  59. package/dist/actor/types.js +0 -2
  60. package/dist/actor/types.js.map +0 -1
  61. package/dist/actor/utils.d.ts +0 -11
  62. package/dist/actor/utils.d.ts.map +0 -1
  63. package/dist/actor/utils.js +0 -50
  64. package/dist/actor/utils.js.map +0 -1
  65. package/dist/examples/clientStreamableHttp.d.ts +0 -2
  66. package/dist/examples/clientStreamableHttp.d.ts.map +0 -1
  67. package/dist/examples/clientStreamableHttp.js +0 -93
  68. package/dist/examples/clientStreamableHttp.js.map +0 -1
  69. package/dist/mcp-server.d.ts +0 -39
  70. package/dist/mcp-server.d.ts.map +0 -1
  71. package/dist/mcp-server.js +0 -165
  72. package/dist/mcp-server.js.map +0 -1
  73. package/dist/stdio.d.ts +0 -15
  74. package/dist/stdio.d.ts.map +0 -1
  75. package/dist/stdio.js +0 -46
  76. package/dist/stdio.js.map +0 -1
  77. package/dist/tools/actor.d.ts +0 -37
  78. package/dist/tools/actor.d.ts.map +0 -1
  79. package/dist/tools/actor.js +0 -90
  80. package/dist/tools/actor.js.map +0 -1
  81. package/dist/tools/build.d.ts +0 -12
  82. package/dist/tools/build.d.ts.map +0 -1
  83. package/dist/tools/build.js +0 -121
  84. package/dist/tools/build.js.map +0 -1
  85. package/dist/tools/helpers.d.ts +0 -19
  86. package/dist/tools/helpers.d.ts.map +0 -1
  87. package/dist/tools/helpers.js +0 -62
  88. package/dist/tools/helpers.js.map +0 -1
  89. package/dist/tools/index.d.ts +0 -6
  90. package/dist/tools/index.d.ts.map +0 -1
  91. package/dist/tools/index.js +0 -8
  92. package/dist/tools/index.js.map +0 -1
  93. package/dist/tools/mcp-apify-client.d.ts +0 -6
  94. package/dist/tools/mcp-apify-client.d.ts.map +0 -1
  95. package/dist/tools/mcp-apify-client.js +0 -24
  96. package/dist/tools/mcp-apify-client.js.map +0 -1
  97. package/dist/tools/store_collection.d.ts +0 -21
  98. package/dist/tools/store_collection.d.ts.map +0 -1
  99. package/dist/tools/store_collection.js +0 -81
  100. package/dist/tools/store_collection.js.map +0 -1
  101. package/dist/tools/utils.d.ts +0 -77
  102. package/dist/tools/utils.d.ts.map +0 -1
  103. package/dist/tools/utils.js +0 -202
  104. package/dist/tools/utils.js.map +0 -1
package/dist/server.js ADDED
@@ -0,0 +1,178 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Model Context Protocol (MCP) server for Apify Actors
4
+ */
5
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
6
+ import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
7
+ import { Actor } from 'apify';
8
+ import { ApifyClient } from 'apify-client';
9
+ import { filterSchemaProperties, getActorDefinition, getActorsAsTools, shortenProperties, } from './actors.js';
10
+ import { ACTOR_OUTPUT_MAX_CHARS_PER_ITEM, ACTOR_OUTPUT_TRUNCATED_MESSAGE, defaults, InternalTools, SERVER_NAME, SERVER_VERSION, USER_AGENT_ORIGIN, } from './const.js';
11
+ import { log } from './logger.js';
12
+ import { RemoveActorToolArgsSchema, AddActorToToolsArgsSchema, DiscoverActorsArgsSchema, searchActorsByKeywords, GetActorDefinition, } from './tools.js';
13
+ /**
14
+ * Create Apify MCP server
15
+ */
16
+ export class ApifyMcpServer {
17
+ server;
18
+ tools;
19
+ constructor() {
20
+ this.server = new Server({
21
+ name: SERVER_NAME,
22
+ version: SERVER_VERSION,
23
+ }, {
24
+ capabilities: {
25
+ tools: { listChanged: true },
26
+ },
27
+ });
28
+ this.tools = new Map();
29
+ this.setupErrorHandling();
30
+ this.setupToolHandlers();
31
+ }
32
+ /**
33
+ * Adds a User-Agent header to the request config.
34
+ * @param config
35
+ * @private
36
+ */
37
+ addUserAgent(config) {
38
+ const updatedConfig = { ...config };
39
+ updatedConfig.headers = updatedConfig.headers ?? {};
40
+ updatedConfig.headers['User-Agent'] = `${updatedConfig.headers['User-Agent'] ?? ''}; ${USER_AGENT_ORIGIN}`;
41
+ return updatedConfig;
42
+ }
43
+ /**
44
+ * Calls an Apify actor and retrieves the dataset items.
45
+ *
46
+ * It requires the `APIFY_TOKEN` environment variable to be set.
47
+ * If the `APIFY_IS_AT_HOME` the dataset items are pushed to the Apify dataset.
48
+ *
49
+ * @param {string} actorName - The name of the actor to call.
50
+ * @param {ActorCallOptions} callOptions - The options to pass to the actor.
51
+ * @param {unknown} input - The input to pass to the actor.
52
+ * @returns {Promise<object[]>} - A promise that resolves to an array of dataset items.
53
+ * @throws {Error} - Throws an error if the `APIFY_TOKEN` is not set
54
+ */
55
+ async callActorGetDataset(actorName, input, callOptions = undefined) {
56
+ const name = actorName;
57
+ try {
58
+ log.info(`Calling actor ${name} with input: ${JSON.stringify(input)}`);
59
+ const options = { requestInterceptors: [this.addUserAgent] };
60
+ const client = new ApifyClient({ ...options, token: process.env.APIFY_TOKEN });
61
+ const actorClient = client.actor(name);
62
+ const results = await actorClient.call(input, callOptions);
63
+ const dataset = await client.dataset(results.defaultDatasetId).listItems();
64
+ log.info(`Actor ${name} finished with ${dataset.items.length} items`);
65
+ if (process.env.APIFY_IS_AT_HOME) {
66
+ await Actor.pushData(dataset.items);
67
+ log.info(`Pushed ${dataset.items.length} items to the dataset`);
68
+ }
69
+ return dataset.items;
70
+ }
71
+ catch (error) {
72
+ log.error(`Error calling actor: ${error}. Actor: ${name}, input: ${JSON.stringify(input)}`);
73
+ throw new Error(`Error calling actor: ${error}`);
74
+ }
75
+ }
76
+ async addToolsFromActors(actors) {
77
+ const tools = await getActorsAsTools(actors);
78
+ this.updateTools(tools);
79
+ return tools;
80
+ }
81
+ async addToolsFromDefaultActors() {
82
+ await this.addToolsFromActors(defaults.actors);
83
+ }
84
+ updateTools(tools) {
85
+ for (const tool of tools) {
86
+ this.tools.set(tool.name, tool);
87
+ log.info(`Added/Updated tool: ${tool.actorFullName} (tool: ${tool.name})`);
88
+ }
89
+ }
90
+ /**
91
+ * Returns an array of tool names.
92
+ * @returns {string[]} - An array of tool names.
93
+ */
94
+ getToolNames() {
95
+ return Array.from(this.tools.keys());
96
+ }
97
+ setupErrorHandling() {
98
+ this.server.onerror = (error) => {
99
+ console.error('[MCP Error]', error); // eslint-disable-line no-console
100
+ };
101
+ process.on('SIGINT', async () => {
102
+ await this.server.close();
103
+ process.exit(0);
104
+ });
105
+ }
106
+ setupToolHandlers() {
107
+ this.server.setRequestHandler(ListToolsRequestSchema, async () => {
108
+ return { tools: Array.from(this.tools.values()) };
109
+ });
110
+ /**
111
+ * Handles the request to call a tool.
112
+ * @param {object} request - The request object containing tool name and arguments.
113
+ * @throws {Error} - Throws an error if the tool is unknown or arguments are invalid.
114
+ */
115
+ this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
116
+ const { name, arguments: args } = request.params;
117
+ const tool = Array.from(this.tools.values()).find((t) => t.name === name || t.actorFullName === name);
118
+ if (!tool) {
119
+ throw new Error(`Unknown tool: ${name}`);
120
+ }
121
+ if (!args) {
122
+ throw new Error(`Missing arguments for tool: ${name}`);
123
+ }
124
+ log.info(`Validate arguments for tool: ${tool.name} with arguments: ${JSON.stringify(args)}`);
125
+ if (!tool.ajvValidate(args)) {
126
+ throw new Error(`Invalid arguments for tool ${tool.name}: args: ${JSON.stringify(args)} error: ${JSON.stringify(tool?.ajvValidate.errors)}`);
127
+ }
128
+ try {
129
+ switch (name) {
130
+ case InternalTools.ADD_ACTOR_TO_TOOLS: {
131
+ const parsed = AddActorToToolsArgsSchema.parse(args);
132
+ const toolsAdded = await this.addToolsFromActors([parsed.actorName]);
133
+ await this.server.notification({ method: 'notifications/tools/list_changed' });
134
+ return { content: [{ type: 'text', text: `Actor added: ${toolsAdded.map((t) => `${t.actorFullName} (tool name: ${t.name})`).join(', ')}` }] };
135
+ }
136
+ case InternalTools.REMOVE_ACTOR_FROM_TOOLS: {
137
+ const parsed = RemoveActorToolArgsSchema.parse(args);
138
+ this.tools.delete(parsed.toolName);
139
+ await this.server.notification({ method: 'notifications/tools/list_changed' });
140
+ return { content: [{ type: 'text', text: `Tool ${parsed.toolName} was removed` }] };
141
+ }
142
+ case InternalTools.DISCOVER_ACTORS: {
143
+ const parsed = DiscoverActorsArgsSchema.parse(args);
144
+ const actors = await searchActorsByKeywords(parsed.search, parsed.limit, parsed.offset);
145
+ return { content: actors?.map((item) => ({ type: 'text', text: JSON.stringify(item) })) };
146
+ }
147
+ case InternalTools.GET_ACTOR_DETAILS: {
148
+ const parsed = GetActorDefinition.parse(args);
149
+ const v = await getActorDefinition(parsed.actorName, parsed.limit);
150
+ if (v && v.input && 'properties' in v.input && v.input) {
151
+ const properties = filterSchemaProperties(v.input.properties);
152
+ v.input.properties = shortenProperties(properties);
153
+ }
154
+ return { content: [{ type: 'text', text: JSON.stringify(v) }] };
155
+ }
156
+ default: {
157
+ const items = await this.callActorGetDataset(tool.actorFullName, args, { memory: tool.memoryMbytes });
158
+ const content = items.map((item) => {
159
+ const text = JSON.stringify(item).slice(0, ACTOR_OUTPUT_MAX_CHARS_PER_ITEM);
160
+ return text.length === ACTOR_OUTPUT_MAX_CHARS_PER_ITEM
161
+ ? { type: 'text', text: `${text} ... ${ACTOR_OUTPUT_TRUNCATED_MESSAGE}` }
162
+ : { type: 'text', text };
163
+ });
164
+ return { content };
165
+ }
166
+ }
167
+ }
168
+ catch (error) {
169
+ log.error(`Error calling tool: ${error}`);
170
+ throw new Error(`Error calling tool: ${error}`);
171
+ }
172
+ });
173
+ }
174
+ async connect(transport) {
175
+ await this.server.connect(transport);
176
+ }
177
+ }
178
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { z } from 'zod';
2
+ import type { ActorStorePruned, Tool } from './types.js';
3
+ export declare const DiscoverActorsArgsSchema: z.ZodObject<{
4
+ limit: z.ZodDefault<z.ZodNumber>;
5
+ offset: z.ZodDefault<z.ZodNumber>;
6
+ search: z.ZodDefault<z.ZodString>;
7
+ category: z.ZodDefault<z.ZodString>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ search: string;
10
+ limit: number;
11
+ offset: number;
12
+ category: string;
13
+ }, {
14
+ search?: string | undefined;
15
+ limit?: number | undefined;
16
+ offset?: number | undefined;
17
+ category?: string | undefined;
18
+ }>;
19
+ export declare const RemoveActorToolArgsSchema: z.ZodObject<{
20
+ toolName: z.ZodEffects<z.ZodString, string, string>;
21
+ }, "strip", z.ZodTypeAny, {
22
+ toolName: string;
23
+ }, {
24
+ toolName: string;
25
+ }>;
26
+ export declare const AddActorToToolsArgsSchema: z.ZodObject<{
27
+ actorName: z.ZodString;
28
+ }, "strip", z.ZodTypeAny, {
29
+ actorName: string;
30
+ }, {
31
+ actorName: string;
32
+ }>;
33
+ export declare const GetActorDefinition: z.ZodObject<{
34
+ actorName: z.ZodString;
35
+ limit: z.ZodDefault<z.ZodNumber>;
36
+ }, "strip", z.ZodTypeAny, {
37
+ limit: number;
38
+ actorName: string;
39
+ }, {
40
+ actorName: string;
41
+ limit?: number | undefined;
42
+ }>;
43
+ export declare function getActorAutoLoadingTools(): Tool[];
44
+ export declare function getActorDiscoveryTools(): Tool[];
45
+ export declare function searchActorsByKeywords(search: string, limit?: number | undefined, offset?: number | undefined): Promise<ActorStorePruned[] | null>;
46
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,KAAK,EAAE,gBAAgB,EAAe,IAAI,EAAE,MAAM,YAAY,CAAC;AAEtE,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;EAqBnC,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;EAIpC,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;EAIpC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;EAQ7B,CAAC;AAEH,wBAAgB,wBAAwB,IAAI,IAAI,EAAE,CAsBjD;AAED,wBAAgB,sBAAsB,IAAI,IAAI,EAAE,CA0B/C;AA4BD,wBAAsB,sBAAsB,CACxC,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAM,GAAG,SAAqB,EACrC,MAAM,GAAE,MAAM,GAAG,SAAqB,GACvC,OAAO,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,CAIpC"}
package/dist/tools.js ADDED
@@ -0,0 +1,128 @@
1
+ import { Ajv } from 'ajv';
2
+ import { ApifyClient } from 'apify-client';
3
+ import { z } from 'zod';
4
+ import { zodToJsonSchema } from 'zod-to-json-schema';
5
+ import { actorNameToToolName } from './actors.js';
6
+ import { ACTOR_README_MAX_LENGTH, InternalTools } from './const.js';
7
+ export const DiscoverActorsArgsSchema = z.object({
8
+ limit: z.number()
9
+ .int()
10
+ .min(1)
11
+ .max(100)
12
+ .default(10)
13
+ .describe('The maximum number of Actors to return. Default value is 10.'),
14
+ offset: z.number()
15
+ .int()
16
+ .min(0)
17
+ .default(0)
18
+ .describe('The number of elements that should be skipped at the start. Default value is 0.'),
19
+ search: z.string()
20
+ .default('')
21
+ .describe('String of key words to search by. '
22
+ + 'Searches the title, name, description, username, and readme of an Actor.'
23
+ + 'Only key word search is supported, no advanced search.'
24
+ + 'Always prefer simple keywords over complex queries.'),
25
+ category: z.string()
26
+ .default('')
27
+ .describe('Filters the results by the specified category.'),
28
+ });
29
+ export const RemoveActorToolArgsSchema = z.object({
30
+ toolName: z.string()
31
+ .describe('Tool name to remove from available tools.')
32
+ .transform((val) => actorNameToToolName(val)),
33
+ });
34
+ export const AddActorToToolsArgsSchema = z.object({
35
+ actorName: z.string()
36
+ .describe('Add an Actor to available tools by Actor ID or Actor full name.'
37
+ + 'Actor name is always composed from `username/name`'),
38
+ });
39
+ export const GetActorDefinition = z.object({
40
+ actorName: z.string()
41
+ .describe('Retrieve input, readme, and other details for Actor ID or Actor full name. '
42
+ + 'Actor name is always composed from `username/name`'),
43
+ limit: z.number()
44
+ .int()
45
+ .default(ACTOR_README_MAX_LENGTH)
46
+ .describe(`Truncate the README to this limit. Default value is ${ACTOR_README_MAX_LENGTH}.`),
47
+ });
48
+ export function getActorAutoLoadingTools() {
49
+ const ajv = new Ajv({ coerceTypes: 'array', strict: false });
50
+ return [
51
+ {
52
+ name: InternalTools.ADD_ACTOR_TO_TOOLS,
53
+ actorFullName: InternalTools.ADD_ACTOR_TO_TOOLS,
54
+ description: 'Add an Actor to available tools by Actor ID or Actor name. '
55
+ + 'Do not execute the Actor, only add it and list it in available tools. '
56
+ + 'Never run the tool without user consent! '
57
+ + 'For example, add a tool with username/name when user wants to scrape data from a website.',
58
+ inputSchema: zodToJsonSchema(AddActorToToolsArgsSchema),
59
+ ajvValidate: ajv.compile(zodToJsonSchema(AddActorToToolsArgsSchema)),
60
+ },
61
+ {
62
+ name: InternalTools.REMOVE_ACTOR_FROM_TOOLS,
63
+ actorFullName: InternalTools.REMOVE_ACTOR_FROM_TOOLS,
64
+ description: 'Remove tool by name from available tools. '
65
+ + 'For example, when user says, I do not need a tool username/name anymore',
66
+ inputSchema: zodToJsonSchema(RemoveActorToolArgsSchema),
67
+ ajvValidate: ajv.compile(zodToJsonSchema(RemoveActorToolArgsSchema)),
68
+ },
69
+ ];
70
+ }
71
+ export function getActorDiscoveryTools() {
72
+ const ajv = new Ajv({ coerceTypes: 'array', strict: false });
73
+ return [
74
+ {
75
+ name: InternalTools.DISCOVER_ACTORS,
76
+ actorFullName: InternalTools.DISCOVER_ACTORS,
77
+ description: `Discover available Actors using full text search using keywords.`
78
+ + `Users try to discover Actors using free form query in this case search query needs to be converted to full text search. `
79
+ + `Prefer Actors from Apify as they are generally more reliable and have better support. `
80
+ + `Returns a list of Actors with name, description, run statistics, pricing, starts, and URL. `
81
+ + `You perhaps need to use this tool several times to find the right Actor. `
82
+ + `Limit number of results returned but ensure that relevant results are returned. `,
83
+ inputSchema: zodToJsonSchema(DiscoverActorsArgsSchema),
84
+ ajvValidate: ajv.compile(zodToJsonSchema(DiscoverActorsArgsSchema)),
85
+ },
86
+ {
87
+ name: InternalTools.GET_ACTOR_DETAILS,
88
+ actorFullName: InternalTools.GET_ACTOR_DETAILS,
89
+ description: 'Get documentation, readme, input schema and other details about an Actor. '
90
+ + 'For example, when user says, I need to know more about web crawler Actor.'
91
+ + 'Get details for an Actor with with Actor ID or Actor full name, i.e. username/name.'
92
+ + `Limit the length of the README if needed.`,
93
+ inputSchema: zodToJsonSchema(GetActorDefinition),
94
+ ajvValidate: ajv.compile(zodToJsonSchema(GetActorDefinition)),
95
+ },
96
+ ];
97
+ }
98
+ function pruneActorStoreInfo(response) {
99
+ const stats = response.stats || {};
100
+ const pricingInfo = (response.currentPricingInfo || {});
101
+ return {
102
+ id: response.id,
103
+ name: response.name?.toString() || '',
104
+ username: response.username?.toString() || '',
105
+ actorFullName: `${response.username}/${response.name}`,
106
+ title: response.title?.toString() || '',
107
+ description: response.description?.toString() || '',
108
+ stats: {
109
+ totalRuns: stats.totalRuns,
110
+ totalUsers30Days: stats.totalUsers30Days,
111
+ publicActorRunStats30Days: 'publicActorRunStats30Days' in stats
112
+ ? stats.publicActorRunStats30Days : {},
113
+ },
114
+ currentPricingInfo: {
115
+ pricingModel: pricingInfo.pricingModel?.toString() || '',
116
+ pricePerUnitUsd: pricingInfo?.pricePerUnitUsd ?? 0,
117
+ trialMinutes: pricingInfo?.trialMinutes ?? 0,
118
+ },
119
+ url: response.url?.toString() || '',
120
+ totalStars: 'totalStars' in response ? response.totalStars : null,
121
+ };
122
+ }
123
+ export async function searchActorsByKeywords(search, limit = undefined, offset = undefined) {
124
+ const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
125
+ const results = await client.store().list({ search, limit, offset });
126
+ return results.items.map((x) => pruneActorStoreInfo(x));
127
+ }
128
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}