@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
@@ -1,202 +0,0 @@
1
- import { ACTOR_ENUM_MAX_LENGTH, ACTOR_MAX_DESCRIPTION_LENGTH } from '../const.js';
2
- export function actorNameToToolName(actorName) {
3
- return actorName
4
- .replace(/\//g, '-slash-')
5
- .replace(/\./g, '-dot-')
6
- .slice(0, 64);
7
- }
8
- /**
9
- * Builds nested properties for object types in the schema.
10
- *
11
- * Specifically handles special cases like proxy configuration and request list sources
12
- * by adding predefined nested properties to these object types.
13
- * This is necessary for the agent to correctly infer how to structure object inputs
14
- * when passing arguments to the Actor.
15
- *
16
- * For proxy objects (type='object', editor='proxy'), adds 'useApifyProxy' property.
17
- * For request list sources (type='array', editor='requestListSources'), adds URL structure to items.
18
- *
19
- * @param {Record<string, ISchemaProperties>} properties - The input schema properties
20
- * @returns {Record<string, ISchemaProperties>} Modified properties with nested properties
21
- */
22
- export function buildNestedProperties(properties) {
23
- const clonedProperties = { ...properties };
24
- for (const [propertyName, property] of Object.entries(clonedProperties)) {
25
- if (property.type === 'object' && property.editor === 'proxy') {
26
- clonedProperties[propertyName] = {
27
- ...property,
28
- properties: {
29
- ...property.properties,
30
- useApifyProxy: {
31
- title: 'Use Apify Proxy',
32
- type: 'boolean',
33
- description: 'Whether to use Apify Proxy - ALWAYS SET TO TRUE.',
34
- default: true,
35
- examples: [true],
36
- },
37
- },
38
- required: ['useApifyProxy'],
39
- };
40
- }
41
- else if (property.type === 'array' && property.editor === 'requestListSources') {
42
- clonedProperties[propertyName] = {
43
- ...property,
44
- items: {
45
- ...property.items,
46
- type: 'object',
47
- title: 'Request list source',
48
- description: 'Request list source',
49
- properties: {
50
- url: {
51
- title: 'URL',
52
- type: 'string',
53
- description: 'URL of the request list source',
54
- },
55
- },
56
- },
57
- };
58
- }
59
- }
60
- return clonedProperties;
61
- }
62
- /**
63
- * Filters schema properties to include only the necessary fields.
64
- *
65
- * This is done to reduce the size of the input schema and to make it more readable.
66
- *
67
- * @param properties
68
- */
69
- export function filterSchemaProperties(properties) {
70
- var _a, _b, _c;
71
- const filteredProperties = {};
72
- for (const [key, property] of Object.entries(properties)) {
73
- filteredProperties[key] = {
74
- title: property.title,
75
- description: property.description,
76
- enum: property.enum,
77
- type: property.type,
78
- default: property.default,
79
- prefill: property.prefill,
80
- properties: property.properties,
81
- items: property.items,
82
- required: property.required,
83
- };
84
- if (property.type === 'array' && !((_a = property.items) === null || _a === void 0 ? void 0 : _a.type)) {
85
- const itemsType = inferArrayItemType(property);
86
- if (itemsType) {
87
- filteredProperties[key].items = {
88
- ...filteredProperties[key].items,
89
- title: (_b = filteredProperties[key].title) !== null && _b !== void 0 ? _b : 'Item',
90
- description: (_c = filteredProperties[key].description) !== null && _c !== void 0 ? _c : 'Item',
91
- type: itemsType,
92
- };
93
- }
94
- }
95
- }
96
- return filteredProperties;
97
- }
98
- /**
99
- * Marks input properties as required by adding a "REQUIRED" prefix to their descriptions.
100
- * Takes an IActorInput object and returns a modified Record of SchemaProperties.
101
- *
102
- * This is done for maximum compatibility in case where library or agent framework does not consider
103
- * required fields and does not handle the JSON schema properly: we are prepending this to the description
104
- * as a preventive measure.
105
- * @param {IActorInputSchema} input - Actor input object containing properties and required fields
106
- * @returns {Record<string, ISchemaProperties>} - Modified properties with required fields marked
107
- */
108
- export function markInputPropertiesAsRequired(input) {
109
- const { required = [], properties } = input;
110
- for (const property of Object.keys(properties)) {
111
- if (required.includes(property)) {
112
- properties[property] = {
113
- ...properties[property],
114
- description: `**REQUIRED** ${properties[property].description}`,
115
- };
116
- }
117
- }
118
- return properties;
119
- }
120
- /**
121
- * Helps determine the type of items in an array schema property.
122
- * Priority order: explicit type in items > prefill type > default value type > editor type.
123
- *
124
- * Based on JSON schema, the array needs a type, and most of the time Actor input schema does not have this, so we need to infer that.
125
- *
126
- */
127
- export function inferArrayItemType(property) {
128
- var _a;
129
- return ((_a = property.items) === null || _a === void 0 ? void 0 : _a.type)
130
- || (Array.isArray(property.prefill) && property.prefill.length > 0 && typeof property.prefill[0])
131
- || (Array.isArray(property.default) && property.default.length > 0 && typeof property.default[0])
132
- || (property.editor && getEditorItemType(property.editor))
133
- || null;
134
- function getEditorItemType(editor) {
135
- const editorTypeMap = {
136
- requestListSources: 'object',
137
- stringList: 'string',
138
- json: 'object',
139
- globs: 'object',
140
- };
141
- return editorTypeMap[editor] || null;
142
- }
143
- }
144
- /**
145
- * Add enum values as string to property descriptions.
146
- *
147
- * This is done as a preventive measure to prevent cases where library or agent framework
148
- * does not handle enums or examples based on JSON schema definition.
149
- *
150
- * https://json-schema.org/understanding-json-schema/reference/enum
151
- * https://json-schema.org/understanding-json-schema/reference/annotations
152
- *
153
- * @param properties
154
- */
155
- export function addEnumsToDescriptionsWithExamples(properties) {
156
- var _a;
157
- for (const property of Object.values(properties)) {
158
- if (property.enum && property.enum.length > 0) {
159
- property.description = `${property.description}\nPossible values: ${property.enum.slice(0, 20).join(',')}`;
160
- }
161
- const value = (_a = property.prefill) !== null && _a !== void 0 ? _a : property.default;
162
- if (value && !(Array.isArray(value) && value.length === 0)) {
163
- property.examples = Array.isArray(value) ? value : [value];
164
- property.description = `${property.description}\nExample values: ${JSON.stringify(value)}`;
165
- }
166
- }
167
- return properties;
168
- }
169
- /**
170
- * Helper function to shorten the enum list if it is too long.
171
- *
172
- * @param {string[]} enumList - The list of enum values to be shortened.
173
- * @returns {string[] | undefined} - The shortened enum list or undefined if the list is too long.
174
- */
175
- export function shortenEnum(enumList) {
176
- let charCount = 0;
177
- const resultEnumList = enumList.filter((enumValue) => {
178
- charCount += enumValue.length;
179
- return charCount <= ACTOR_ENUM_MAX_LENGTH;
180
- });
181
- return resultEnumList.length > 0 ? resultEnumList : undefined;
182
- }
183
- /**
184
- * Shortens the description, enum, and items.enum properties of the schema properties.
185
- * @param properties
186
- */
187
- export function shortenProperties(properties) {
188
- var _a, _b;
189
- for (const property of Object.values(properties)) {
190
- if (property.description.length > ACTOR_MAX_DESCRIPTION_LENGTH) {
191
- property.description = `${property.description.slice(0, ACTOR_MAX_DESCRIPTION_LENGTH)}...`;
192
- }
193
- if (property.enum && ((_a = property.enum) === null || _a === void 0 ? void 0 : _a.length) > 0) {
194
- property.enum = shortenEnum(property.enum);
195
- }
196
- if (((_b = property.items) === null || _b === void 0 ? void 0 : _b.enum) && property.items.enum.length > 0) {
197
- property.items.enum = shortenEnum(property.items.enum);
198
- }
199
- }
200
- return properties;
201
- }
202
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/tools/utils.ts"],"names":[],"mappings":"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"}