@apify/actors-mcp-server 0.9.20 → 0.9.21-beta.0

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 (259) hide show
  1. package/dist/apify_client.js +1 -4
  2. package/dist/apify_client.js.map +1 -1
  3. package/dist/const.js +1 -4
  4. package/dist/const.js.map +1 -1
  5. package/dist/dev_server.d.ts.map +1 -1
  6. package/dist/dev_server.js +38 -45
  7. package/dist/dev_server.js.map +1 -1
  8. package/dist/errors.js +1 -4
  9. package/dist/errors.js.map +1 -1
  10. package/dist/index.js +1 -4
  11. package/dist/index.js.map +1 -1
  12. package/dist/index_internals.d.ts +2 -3
  13. package/dist/index_internals.d.ts.map +1 -1
  14. package/dist/index_internals.js +2 -6
  15. package/dist/index_internals.js.map +1 -1
  16. package/dist/input.js +1 -4
  17. package/dist/input.js.map +1 -1
  18. package/dist/instrument.js +1 -4
  19. package/dist/instrument.js.map +1 -1
  20. package/dist/mcp/actors.js +1 -4
  21. package/dist/mcp/actors.js.map +1 -1
  22. package/dist/mcp/client.js +1 -4
  23. package/dist/mcp/client.js.map +1 -1
  24. package/dist/mcp/const.js +1 -4
  25. package/dist/mcp/const.js.map +1 -1
  26. package/dist/mcp/proxy.js +1 -4
  27. package/dist/mcp/proxy.js.map +1 -1
  28. package/dist/mcp/server.d.ts +44 -17
  29. package/dist/mcp/server.d.ts.map +1 -1
  30. package/dist/mcp/server.js +180 -65
  31. package/dist/mcp/server.js.map +1 -1
  32. package/dist/mcp/utils.d.ts +2 -1
  33. package/dist/mcp/utils.d.ts.map +1 -1
  34. package/dist/mcp/utils.js +3 -5
  35. package/dist/mcp/utils.js.map +1 -1
  36. package/dist/payments/helpers.js +1 -4
  37. package/dist/payments/helpers.js.map +1 -1
  38. package/dist/payments/index.js +1 -4
  39. package/dist/payments/index.js.map +1 -1
  40. package/dist/payments/resolve.js +1 -4
  41. package/dist/payments/resolve.js.map +1 -1
  42. package/dist/payments/skyfire.js +1 -4
  43. package/dist/payments/skyfire.js.map +1 -1
  44. package/dist/payments/types.js +1 -4
  45. package/dist/payments/types.js.map +1 -1
  46. package/dist/payments/x402.js +1 -4
  47. package/dist/payments/x402.js.map +1 -1
  48. package/dist/prompts/index.js +1 -4
  49. package/dist/prompts/index.js.map +1 -1
  50. package/dist/prompts/latest_news_on_topic.js +1 -4
  51. package/dist/prompts/latest_news_on_topic.js.map +1 -1
  52. package/dist/resources/resource_service.d.ts +9 -2
  53. package/dist/resources/resource_service.d.ts.map +1 -1
  54. package/dist/resources/resource_service.js +5 -7
  55. package/dist/resources/resource_service.js.map +1 -1
  56. package/dist/resources/widgets.js +1 -4
  57. package/dist/resources/widgets.js.map +1 -1
  58. package/dist/server_card.js +1 -4
  59. package/dist/server_card.js.map +1 -1
  60. package/dist/state.js +1 -4
  61. package/dist/state.js.map +1 -1
  62. package/dist/stdio.js +15 -28
  63. package/dist/stdio.js.map +1 -1
  64. package/dist/telemetry.js +1 -4
  65. package/dist/telemetry.js.map +1 -1
  66. package/dist/tools/{openai → apps}/actor_executor.d.ts +2 -2
  67. package/dist/tools/apps/actor_executor.d.ts.map +1 -0
  68. package/dist/tools/{openai → apps}/actor_executor.js +3 -6
  69. package/dist/tools/apps/actor_executor.js.map +1 -0
  70. package/dist/tools/{openai → apps}/call_actor.d.ts +2 -2
  71. package/dist/tools/apps/call_actor.d.ts.map +1 -0
  72. package/dist/tools/{openai → apps}/call_actor.js +7 -10
  73. package/dist/tools/apps/call_actor.js.map +1 -0
  74. package/dist/tools/apps/fetch_actor_details.d.ts +7 -0
  75. package/dist/tools/apps/fetch_actor_details.d.ts.map +1 -0
  76. package/dist/tools/{openai → apps}/fetch_actor_details.js +4 -7
  77. package/dist/tools/apps/fetch_actor_details.js.map +1 -0
  78. package/dist/tools/apps/fetch_actor_details_internal.d.ts.map +1 -0
  79. package/dist/tools/{openai → apps}/fetch_actor_details_internal.js +3 -6
  80. package/dist/tools/apps/fetch_actor_details_internal.js.map +1 -0
  81. package/dist/tools/{openai → apps}/get_actor_run.d.ts +2 -2
  82. package/dist/tools/apps/get_actor_run.d.ts.map +1 -0
  83. package/dist/tools/{openai → apps}/get_actor_run.js +3 -6
  84. package/dist/tools/apps/get_actor_run.js.map +1 -0
  85. package/dist/tools/apps/search_actors.d.ts +7 -0
  86. package/dist/tools/apps/search_actors.d.ts.map +1 -0
  87. package/dist/tools/{openai → apps}/search_actors.js +4 -7
  88. package/dist/tools/apps/search_actors.js.map +1 -0
  89. package/dist/tools/apps/search_actors_internal.d.ts.map +1 -0
  90. package/dist/tools/{openai → apps}/search_actors_internal.js +3 -6
  91. package/dist/tools/apps/search_actors_internal.js.map +1 -0
  92. package/dist/tools/build.js +1 -4
  93. package/dist/tools/build.js.map +1 -1
  94. package/dist/tools/categories.d.ts +10 -10
  95. package/dist/tools/categories.d.ts.map +1 -1
  96. package/dist/tools/categories.js +18 -21
  97. package/dist/tools/categories.js.map +1 -1
  98. package/dist/tools/common/abort_actor_run.js +1 -4
  99. package/dist/tools/common/abort_actor_run.js.map +1 -1
  100. package/dist/tools/common/add_actor.js +1 -4
  101. package/dist/tools/common/add_actor.js.map +1 -1
  102. package/dist/tools/common/dataset_collection.js +1 -4
  103. package/dist/tools/common/dataset_collection.js.map +1 -1
  104. package/dist/tools/common/fetch_apify_docs.js +1 -4
  105. package/dist/tools/common/fetch_apify_docs.js.map +1 -1
  106. package/dist/tools/common/get_actor_output.js +1 -4
  107. package/dist/tools/common/get_actor_output.js.map +1 -1
  108. package/dist/tools/common/get_actor_run_log.js +1 -4
  109. package/dist/tools/common/get_actor_run_log.js.map +1 -1
  110. package/dist/tools/common/get_dataset.js +1 -4
  111. package/dist/tools/common/get_dataset.js.map +1 -1
  112. package/dist/tools/common/get_dataset_items.js +1 -4
  113. package/dist/tools/common/get_dataset_items.js.map +1 -1
  114. package/dist/tools/common/get_dataset_schema.js +1 -4
  115. package/dist/tools/common/get_dataset_schema.js.map +1 -1
  116. package/dist/tools/common/get_key_value_store.js +1 -4
  117. package/dist/tools/common/get_key_value_store.js.map +1 -1
  118. package/dist/tools/common/get_key_value_store_keys.js +1 -4
  119. package/dist/tools/common/get_key_value_store_keys.js.map +1 -1
  120. package/dist/tools/common/get_key_value_store_record.js +1 -4
  121. package/dist/tools/common/get_key_value_store_record.js.map +1 -1
  122. package/dist/tools/common/key_value_store_collection.js +1 -4
  123. package/dist/tools/common/key_value_store_collection.js.map +1 -1
  124. package/dist/tools/common/run_collection.js +1 -4
  125. package/dist/tools/common/run_collection.js.map +1 -1
  126. package/dist/tools/common/search_apify_docs.js +1 -4
  127. package/dist/tools/common/search_apify_docs.js.map +1 -1
  128. package/dist/tools/core/actor_execution.js +1 -4
  129. package/dist/tools/core/actor_execution.js.map +1 -1
  130. package/dist/tools/core/actor_response.js +1 -4
  131. package/dist/tools/core/actor_response.js.map +1 -1
  132. package/dist/tools/core/actor_tools_factory.js +2 -5
  133. package/dist/tools/core/actor_tools_factory.js.map +1 -1
  134. package/dist/tools/core/call_actor_common.d.ts +2 -2
  135. package/dist/tools/core/call_actor_common.js +3 -6
  136. package/dist/tools/core/call_actor_common.js.map +1 -1
  137. package/dist/tools/core/fetch_actor_details_common.d.ts +2 -2
  138. package/dist/tools/core/fetch_actor_details_common.js +4 -7
  139. package/dist/tools/core/fetch_actor_details_common.js.map +1 -1
  140. package/dist/tools/core/get_actor_run_common.d.ts +3 -3
  141. package/dist/tools/core/get_actor_run_common.js +5 -8
  142. package/dist/tools/core/get_actor_run_common.js.map +1 -1
  143. package/dist/tools/core/search_actors_common.d.ts +2 -2
  144. package/dist/tools/core/search_actors_common.js +4 -7
  145. package/dist/tools/core/search_actors_common.js.map +1 -1
  146. package/dist/tools/default/actor_executor.js +1 -4
  147. package/dist/tools/default/actor_executor.js.map +1 -1
  148. package/dist/tools/default/call_actor.js +2 -5
  149. package/dist/tools/default/call_actor.js.map +1 -1
  150. package/dist/tools/default/fetch_actor_details.js +1 -4
  151. package/dist/tools/default/fetch_actor_details.js.map +1 -1
  152. package/dist/tools/default/get_actor_run.js +1 -4
  153. package/dist/tools/default/get_actor_run.js.map +1 -1
  154. package/dist/tools/default/search_actors.js +1 -4
  155. package/dist/tools/default/search_actors.js.map +1 -1
  156. package/dist/tools/index.d.ts +2 -1
  157. package/dist/tools/index.d.ts.map +1 -1
  158. package/dist/tools/index.js +4 -6
  159. package/dist/tools/index.js.map +1 -1
  160. package/dist/tools/structured_output_schemas.js +3 -6
  161. package/dist/tools/structured_output_schemas.js.map +1 -1
  162. package/dist/tools/utils.js +1 -4
  163. package/dist/tools/utils.js.map +1 -1
  164. package/dist/tsconfig.tsbuildinfo +1 -1
  165. package/dist/types.d.ts +41 -23
  166. package/dist/types.d.ts.map +1 -1
  167. package/dist/types.js +52 -15
  168. package/dist/types.js.map +1 -1
  169. package/dist/utils/actor.js +1 -4
  170. package/dist/utils/actor.js.map +1 -1
  171. package/dist/utils/actor_card.js +1 -4
  172. package/dist/utils/actor_card.js.map +1 -1
  173. package/dist/utils/actor_details.d.ts +1 -1
  174. package/dist/utils/actor_details.js +2 -5
  175. package/dist/utils/actor_details.js.map +1 -1
  176. package/dist/utils/actor_search.js +1 -4
  177. package/dist/utils/actor_search.js.map +1 -1
  178. package/dist/utils/ajv.js +1 -4
  179. package/dist/utils/ajv.js.map +1 -1
  180. package/dist/utils/apify_docs.js +1 -4
  181. package/dist/utils/apify_docs.js.map +1 -1
  182. package/dist/utils/apify_properties.js +1 -4
  183. package/dist/utils/apify_properties.js.map +1 -1
  184. package/dist/utils/auth.js +1 -4
  185. package/dist/utils/auth.js.map +1 -1
  186. package/dist/utils/generic.js +1 -4
  187. package/dist/utils/generic.js.map +1 -1
  188. package/dist/utils/logging.js +1 -4
  189. package/dist/utils/logging.js.map +1 -1
  190. package/dist/utils/mcp.js +1 -4
  191. package/dist/utils/mcp.js.map +1 -1
  192. package/dist/utils/mcp_clients.js +1 -4
  193. package/dist/utils/mcp_clients.js.map +1 -1
  194. package/dist/utils/payment_errors.js +1 -4
  195. package/dist/utils/payment_errors.js.map +1 -1
  196. package/dist/utils/pricing_info.js +1 -4
  197. package/dist/utils/pricing_info.js.map +1 -1
  198. package/dist/utils/progress.js +1 -4
  199. package/dist/utils/progress.js.map +1 -1
  200. package/dist/utils/schema_generation.js +1 -4
  201. package/dist/utils/schema_generation.js.map +1 -1
  202. package/dist/utils/server-instructions/index.d.ts +16 -4
  203. package/dist/utils/server-instructions/index.d.ts.map +1 -1
  204. package/dist/utils/server-instructions/index.js +75 -16
  205. package/dist/utils/server-instructions/index.js.map +1 -1
  206. package/dist/utils/tool_categories_helpers.js +1 -4
  207. package/dist/utils/tool_categories_helpers.js.map +1 -1
  208. package/dist/utils/tool_status.js +1 -4
  209. package/dist/utils/tool_status.js.map +1 -1
  210. package/dist/utils/tools.d.ts +2 -1
  211. package/dist/utils/tools.d.ts.map +1 -1
  212. package/dist/utils/tools.js +4 -6
  213. package/dist/utils/tools.js.map +1 -1
  214. package/dist/utils/tools_loader.d.ts +11 -13
  215. package/dist/utils/tools_loader.d.ts.map +1 -1
  216. package/dist/utils/tools_loader.js +126 -89
  217. package/dist/utils/tools_loader.js.map +1 -1
  218. package/dist/utils/ttl_lru.js +1 -4
  219. package/dist/utils/ttl_lru.js.map +1 -1
  220. package/dist/utils/userid_cache.js +1 -4
  221. package/dist/utils/userid_cache.js.map +1 -1
  222. package/dist/utils/version.js +1 -4
  223. package/dist/utils/version.js.map +1 -1
  224. package/dist/web/dist/actor-detail-widget.js +0 -2
  225. package/dist/web/dist/actor-run-widget.js +0 -2
  226. package/dist/web/dist/search-actors-widget.js +0 -2
  227. package/manifest.json +1 -1
  228. package/package.json +1 -1
  229. package/server.json +1 -1
  230. package/dist/tools/openai/actor_executor.d.ts.map +0 -1
  231. package/dist/tools/openai/actor_executor.js.map +0 -1
  232. package/dist/tools/openai/call_actor.d.ts.map +0 -1
  233. package/dist/tools/openai/call_actor.js.map +0 -1
  234. package/dist/tools/openai/fetch_actor_details.d.ts +0 -7
  235. package/dist/tools/openai/fetch_actor_details.d.ts.map +0 -1
  236. package/dist/tools/openai/fetch_actor_details.js.map +0 -1
  237. package/dist/tools/openai/fetch_actor_details_internal.d.ts.map +0 -1
  238. package/dist/tools/openai/fetch_actor_details_internal.js.map +0 -1
  239. package/dist/tools/openai/get_actor_run.d.ts.map +0 -1
  240. package/dist/tools/openai/get_actor_run.js.map +0 -1
  241. package/dist/tools/openai/search_actors.d.ts +0 -7
  242. package/dist/tools/openai/search_actors.d.ts.map +0 -1
  243. package/dist/tools/openai/search_actors.js.map +0 -1
  244. package/dist/tools/openai/search_actors_internal.d.ts.map +0 -1
  245. package/dist/tools/openai/search_actors_internal.js.map +0 -1
  246. package/dist/utils/server-instructions/common.d.ts +0 -19
  247. package/dist/utils/server-instructions/common.d.ts.map +0 -1
  248. package/dist/utils/server-instructions/common.js +0 -61
  249. package/dist/utils/server-instructions/common.js.map +0 -1
  250. package/dist/utils/server-instructions/default.d.ts +0 -6
  251. package/dist/utils/server-instructions/default.d.ts.map +0 -1
  252. package/dist/utils/server-instructions/default.js +0 -17
  253. package/dist/utils/server-instructions/default.js.map +0 -1
  254. package/dist/utils/server-instructions/openai.d.ts +0 -7
  255. package/dist/utils/server-instructions/openai.d.ts.map +0 -1
  256. package/dist/utils/server-instructions/openai.js +0 -33
  257. package/dist/utils/server-instructions/openai.js.map +0 -1
  258. /package/dist/tools/{openai → apps}/fetch_actor_details_internal.d.ts +0 -0
  259. /package/dist/tools/{openai → apps}/search_actors_internal.d.ts +0 -0
@@ -5,7 +5,8 @@ import type { TaskStore } from '@modelcontextprotocol/sdk/experimental/tasks/int
5
5
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
6
6
  import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
7
7
  import { ApifyClient } from '../apify_client.js';
8
- import type { ActorsMcpServerOptions, ActorStore, ServerMode, ToolEntry } from '../types.js';
8
+ import type { ActorsMcpServerOptions, ActorStore, Input, ToolEntry } from '../types.js';
9
+ import { ServerMode } from '../types.js';
9
10
  /**
10
11
  * Create Apify MCP server
11
12
  */
@@ -18,17 +19,33 @@ export declare class ActorsMcpServer {
18
19
  readonly options: ActorsMcpServerOptions;
19
20
  readonly taskStore: TaskStore;
20
21
  readonly actorStore?: ActorStore;
21
- /** Resolved server mode — normalized once at construction from options.uiMode. */
22
- readonly serverMode: ServerMode;
23
- /** Mode-specific executor for direct actor tools (`type: 'actor'`). */
24
- private readonly actorExecutor;
22
+ /**
23
+ * Resolved server mode. Preliminary value at construction (`'auto'` → `DEFAULT`).
24
+ * Finalized inside the `initialize` request handler (see constructor) once the
25
+ * client's capabilities are known. Effectively set-once per connection.
26
+ */
27
+ serverMode: ServerMode;
28
+ /** Mode-specific executor for direct actor tools (`type: 'actor'`). Finalized with `serverMode`. */
29
+ private actorExecutor;
30
+ /**
31
+ * Raw option captured from `options.serverMode` (or the legacy `uiMode`). Re-resolved
32
+ * inside the initialize handler when set to `'auto'`; explicit `'default'`/`'apps'`
33
+ * values bypass auto-detect.
34
+ */
35
+ private readonly serverModeOption;
36
+ /** True once mode is final. False for `'auto'` until the initialize handler resolves client capabilities. */
37
+ private serverModeResolved;
38
+ /**
39
+ * Tool requests queued before mode is final. Actor tools are upserted immediately
40
+ * (mode-agnostic); we also capture the exact actor-tool slice fetched for each
41
+ * request so the flush composes every entry against *its own* actor list rather
42
+ * than the accumulated union across unrelated requests.
43
+ */
44
+ private pendingToolsAfterModeResolved;
25
45
  private telemetryEnabled;
26
46
  private telemetryEnv;
27
47
  private availableWidgets;
28
- /**
29
- * Whether the connected client advertises MCP Apps UI support (`io.modelcontextprotocol/ui` extension).
30
- * NOTE: This is currently informational only (logged for observability) and does not yet gate widget behavior.
31
- */
48
+ /** Set in the initialize handler once client capabilities are known. */
32
49
  clientSupportsUi: boolean;
33
50
  constructor(options?: ActorsMcpServerOptions);
34
51
  /**
@@ -36,10 +53,16 @@ export declare class ActorsMcpServer {
36
53
  */
37
54
  private setupTelemetry;
38
55
  /**
39
- * Detects MCP Apps UI support from client capabilities after initialization.
40
- * Checks for the `io.modelcontextprotocol/ui` extension with `text/html;profile=mcp-app` MIME type.
56
+ * Override the SDK's `initialize` request handler to run mode resolution and
57
+ * pending-source flush before `InitializeResult` is sent. Delegates boilerplate
58
+ * (protocolVersion, capabilities, instructions) to the SDK's captured `_oninitialize`.
59
+ *
60
+ * Not using `server.oninitialized`: the SDK dispatches notification handlers
61
+ * fire-and-forget (separate microtask), so a follow-up `tools/list` can race past them.
62
+ * The request handler guarantees tools are final before the response and the first `tools/list`.
41
63
  */
42
- private setupCapabilityNegotiation;
64
+ private setupInitializeHandler;
65
+ private updateToolsAfterServerModeResolved;
43
66
  /**
44
67
  * Returns an array of tool names.
45
68
  * @returns {string[]} - An array of tool names.
@@ -94,14 +117,18 @@ export declare class ActorsMcpServer {
94
117
  * @returns Promise<ToolEntry[]> - Array of loaded tool entries
95
118
  */
96
119
  loadActorsAsTools(actorIdsOrNames: string[], apifyClient: ApifyClient): Promise<ToolEntry[]>;
120
+ /** Load tools from URL params. Used by SSE and HTTP entry points. */
121
+ loadToolsFromUrl(url: string, apifyClient: ApifyClient): Promise<void>;
97
122
  /**
98
- * Loads tools from URL params.
99
- *
100
- * This method also handles enabling of Actor autoloading via the processParamsGetTools.
123
+ * Two-phase: getActors (async, mode-agnostic Apify fetch) then getToolsForServerMode
124
+ * (sync, mode-dependent compose). When mode is unresolved, queue actorTools and let
125
+ * the initialize handler compose them later.
101
126
  *
102
- * Used primarily for SSE.
127
+ * Don't move the getActors await into the initialize handler — clients time out
128
+ * waiting for InitializeResult. The queue buffers already-fetched data, not network
129
+ * work. See #721.
103
130
  */
104
- loadToolsFromUrl(url: string, apifyClient: ApifyClient): Promise<void>;
131
+ loadToolsFromInput(input: Input, apifyClient: ApifyClient): Promise<void>;
105
132
  /** Delete tools from the server and notify the handler.
106
133
  */
107
134
  removeToolsByName(toolNames: string[], shouldNotifyToolsChangedHandler?: boolean): string[];
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4DAA4D,CAAC;AAE5F,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAEnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AA0B/E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAsBjD,OAAO,KAAK,EAER,sBAAsB,EACtB,UAAU,EAGV,UAAU,EAGV,SAAS,EAEZ,MAAM,aAAa,CAAC;AAsBrB;;GAEG;AACH,qBAAa,eAAe;IACxB,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9C,OAAO,CAAC,mBAAmB,CAAkC;IAC7D,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,eAAe,CAAU;IACjC,SAAgB,OAAO,EAAE,sBAAsB,CAAC;IAChD,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC,SAAgB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxC,kFAAkF;IAClF,SAAgB,UAAU,EAAE,UAAU,CAAC;IACvC,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAG9C,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,YAAY,CAAuC;IAG3D,OAAO,CAAC,gBAAgB,CAA2C;IAEnE;;;OAGG;IACI,gBAAgB,UAAS;gBAEpB,OAAO,GAAE,sBAA2B;IA+DhD;;OAEG;IACH,OAAO,CAAC,cAAc;IAetB;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IAalC;;;OAGG;IACI,aAAa,IAAI,MAAM,EAAE;IAIhC;;;;;;;MAOE;IACK,2BAA2B,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,IAAI;IAOzE;;;MAGE;IACK,6BAA6B;IAOpC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAM7B;;;OAGG;IACI,kBAAkB,IAAI,MAAM,EAAE;IAMrC;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAQjC;;;OAGG;IACI,gBAAgB,IAAI,MAAM,EAAE;IAInC;;;;;MAKE;IACW,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW;IA6B1E;;;;;;OAMG;IACU,iBAAiB,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAQzG;;;;;;OAMG;IACU,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW;IAQnE;OACG;IACI,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,+BAA+B,UAAQ,GAAG,MAAM,EAAE;IAahG;;;;;OAKG;IACI,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,+BAA+B,UAAQ;IAS9E,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,kBAAkB;IAyB1B,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,qBAAqB;IAoB7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyC3B;;QAEI;IACJ,OAAO,CAAC,iBAAiB;IAyFzB,OAAO,CAAC,iBAAiB;IAubzB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAiC/B;;;;;;;;;;;OAWG;YAEW,wBAAwB;YA8PxB,oBAAoB;IAiClC;;OAEG;YACW,cAAc;IA4CtB,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAoB/B"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4DAA4D,CAAC;AAE5F,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAEnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AA2B/E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAsBjD,OAAO,KAAK,EAER,sBAAsB,EACtB,UAAU,EAGV,KAAK,EAIL,SAAS,EAEZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAsC,UAAU,EAAE,MAAM,aAAa,CAAC;AAwC7E;;GAEG;AACH,qBAAa,eAAe;IACxB,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC9C,OAAO,CAAC,mBAAmB,CAAkC;IAC7D,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,eAAe,CAAU;IACjC,SAAgB,OAAO,EAAE,sBAAsB,CAAC;IAChD,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC,SAAgB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxC;;;;OAIG;IACI,UAAU,EAAE,UAAU,CAAC;IAC9B,oGAAoG;IACpG,OAAO,CAAC,aAAa,CAAgB;IACrC;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,6GAA6G;IAC7G,OAAO,CAAC,kBAAkB,CAAU;IACpC;;;;;OAKG;IACH,OAAO,CAAC,6BAA6B,CAAmD;IAGxF,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,YAAY,CAAuC;IAG3D,OAAO,CAAC,gBAAgB,CAA2C;IAEnE,wEAAwE;IACjE,gBAAgB,UAAS;gBAEpB,OAAO,GAAE,sBAA2B;IA4EhD;;OAEG;IACH,OAAO,CAAC,cAAc;IAetB;;;;;;;;OAQG;IACH,OAAO,CAAC,sBAAsB;IA2C9B,OAAO,CAAC,kCAAkC;IAiB1C;;;OAGG;IACI,aAAa,IAAI,MAAM,EAAE;IAIhC;;;;;;;MAOE;IACK,2BAA2B,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,IAAI;IAOzE;;;MAGE;IACK,6BAA6B;IAOpC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAM7B;;;OAGG;IACI,kBAAkB,IAAI,MAAM,EAAE;IAMrC;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAQjC;;;OAGG;IACI,gBAAgB,IAAI,MAAM,EAAE;IAInC;;;;;MAKE;IACW,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW;IAoB1E;;;;;;OAMG;IACU,iBAAiB,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAQzG,qEAAqE;IACxD,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW;IAoBnE;;;;;;;;OAQG;IACU,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAWtF;OACG;IACI,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,+BAA+B,UAAQ,GAAG,MAAM,EAAE;IAahG;;;;;OAKG;IACI,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,+BAA+B,UAAQ;IAS9E,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,kBAAkB;IAyB1B,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,qBAAqB;IAoB7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyC3B;;QAEI;IACJ,OAAO,CAAC,iBAAiB;IAyFzB,OAAO,CAAC,iBAAiB;IAubzB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAiC/B;;;;;;;;;;;OAWG;YAEW,wBAAwB;YA8PxB,oBAAoB;IAiClC;;OAEG;YACW,cAAc;IA4CtB,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAoB/B"}
@@ -1,12 +1,14 @@
1
1
  /**
2
2
  * Model Context Protocol (MCP) server for Apify Actors
3
3
  */
4
-
5
- !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="374f6a13-0750-5a19-ac52-42edce3f2308")}catch(e){}}();
6
4
  import { randomUUID } from 'node:crypto';
5
+ // The ext-apps package exposes `./server` via conditional exports only (no `./server/index.js`
6
+ // wildcard), so we can't satisfy the `import/extensions` rule on this subpath.
7
+ // eslint-disable-next-line import/extensions
8
+ import { getUiCapability, RESOURCE_MIME_TYPE } from '@modelcontextprotocol/ext-apps/server';
7
9
  import { InMemoryTaskStore } from '@modelcontextprotocol/sdk/experimental/tasks/stores/in-memory.js';
8
10
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
9
- import { CallToolRequestSchema, CallToolResultSchema, CancelTaskRequestSchema, ErrorCode, GetPromptRequestSchema, GetTaskPayloadRequestSchema, GetTaskRequestSchema, ListPromptsRequestSchema, ListResourcesRequestSchema, ListResourceTemplatesRequestSchema, ListTasksRequestSchema, ListToolsRequestSchema, McpError, ReadResourceRequestSchema, ServerNotificationSchema, SetLevelRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
11
+ import { CallToolRequestSchema, CallToolResultSchema, CancelTaskRequestSchema, ErrorCode, GetPromptRequestSchema, GetTaskPayloadRequestSchema, GetTaskRequestSchema, InitializeRequestSchema, ListPromptsRequestSchema, ListResourcesRequestSchema, ListResourceTemplatesRequestSchema, ListTasksRequestSchema, ListToolsRequestSchema, McpError, ReadResourceRequestSchema, ServerNotificationSchema, SetLevelRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
10
12
  import dedent from 'dedent';
11
13
  import log from '@apify/log';
12
14
  import { parseBooleanOrNull } from '@apify/utilities';
@@ -15,12 +17,13 @@ import { ALLOWED_TASK_TOOL_EXECUTION_MODES, APIFY_MCP_URL, DEFAULT_TELEMETRY_ENA
15
17
  import { prepareToolCallContext } from '../payments/helpers.js';
16
18
  import { prompts } from '../prompts/index.js';
17
19
  import { createResourceService } from '../resources/resource_service.js';
18
- import { resolveAvailableWidgets, RESOURCE_MIME_TYPE } from '../resources/widgets.js';
20
+ import { resolveAvailableWidgets } from '../resources/widgets.js';
19
21
  import { getTelemetryEnv, trackToolCall } from '../telemetry.js';
22
+ import { appsActorExecutor } from '../tools/apps/actor_executor.js';
20
23
  import { defaultActorExecutor } from '../tools/default/actor_executor.js';
21
- import { getActorsAsTools, getCategoryTools, getDefaultTools } from '../tools/index.js';
22
- import { openaiActorExecutor } from '../tools/openai/actor_executor.js';
24
+ import { getActorsAsTools } from '../tools/index.js';
23
25
  import { decodeDotPropertyNames, legacyToolNameToNew } from '../tools/utils.js';
26
+ import { parseServerMode, resolveServerMode, ServerMode } from '../types.js';
24
27
  import { getHttpStatusCode, logHttpError } from '../utils/logging.js';
25
28
  import { buildMCPResponse, getToolCallErrorUserText } from '../utils/mcp.js';
26
29
  import { buildPaymentRequiredResponse } from '../utils/payment_errors.js';
@@ -28,22 +31,35 @@ import { createProgressTracker } from '../utils/progress.js';
28
31
  import { getServerInstructions } from '../utils/server-instructions/index.js';
29
32
  import { classifyFailureCategory, extractAjvErrorDetails, extractToolTelemetry, getToolStatusFromError } from '../utils/tool_status.js';
30
33
  import { buildActorFields, extractActorId, extractActorName, getToolFullName, getToolPublicFieldOnly } from '../utils/tools.js';
34
+ import { getActors, getToolsForServerMode, toolNamesToInput, } from '../utils/tools_loader.js';
31
35
  import { getUserInfoCached } from '../utils/userid_cache.js';
32
36
  import { getPackageVersion } from '../utils/version.js';
33
37
  import { connectMCPClient } from './client.js';
34
38
  import { EXTERNAL_TOOL_CALL_TIMEOUT_MSEC, LOG_LEVEL_MAP } from './const.js';
35
- import { isTaskCancelled, processParamsGetTools } from './utils.js';
39
+ import { isTaskCancelled, parseInputParamsFromUrl } from './utils.js';
36
40
  /** Mode → actor executor. Add new modes here. */
37
41
  const actorExecutorsByMode = {
38
- default: defaultActorExecutor,
39
- openai: openaiActorExecutor,
42
+ [ServerMode.DEFAULT]: defaultActorExecutor,
43
+ [ServerMode.APPS]: appsActorExecutor,
40
44
  };
45
+ /**
46
+ * Returns true when the initialize request advertises the MCP Apps UI extension
47
+ * with the widget MIME type. Used to resolve `'auto'` server mode.
48
+ *
49
+ * Uses {@link getUiCapability} from `@modelcontextprotocol/ext-apps/server` to
50
+ * read the `io.modelcontextprotocol/ui` extension from client capabilities — the
51
+ * canonical way per the MCP Apps spec.
52
+ */
53
+ function isUiSupportedByClient(request) {
54
+ var _a, _b, _c;
55
+ const uiCap = getUiCapability((_a = request === null || request === void 0 ? void 0 : request.params) === null || _a === void 0 ? void 0 : _a.capabilities);
56
+ return (_c = (_b = uiCap === null || uiCap === void 0 ? void 0 : uiCap.mimeTypes) === null || _b === void 0 ? void 0 : _b.includes(RESOURCE_MIME_TYPE)) !== null && _c !== void 0 ? _c : false;
57
+ }
41
58
  /**
42
59
  * Create Apify MCP server
43
60
  */
44
61
  export class ActorsMcpServer {
45
62
  constructor(options = {}) {
46
- var _a;
47
63
  Object.defineProperty(this, "server", {
48
64
  enumerable: true,
49
65
  configurable: true,
@@ -92,20 +108,54 @@ export class ActorsMcpServer {
92
108
  writable: true,
93
109
  value: void 0
94
110
  });
95
- /** Resolved server mode — normalized once at construction from options.uiMode. */
111
+ /**
112
+ * Resolved server mode. Preliminary value at construction (`'auto'` → `DEFAULT`).
113
+ * Finalized inside the `initialize` request handler (see constructor) once the
114
+ * client's capabilities are known. Effectively set-once per connection.
115
+ */
96
116
  Object.defineProperty(this, "serverMode", {
97
117
  enumerable: true,
98
118
  configurable: true,
99
119
  writable: true,
100
120
  value: void 0
101
121
  });
102
- /** Mode-specific executor for direct actor tools (`type: 'actor'`). */
122
+ /** Mode-specific executor for direct actor tools (`type: 'actor'`). Finalized with `serverMode`. */
103
123
  Object.defineProperty(this, "actorExecutor", {
104
124
  enumerable: true,
105
125
  configurable: true,
106
126
  writable: true,
107
127
  value: void 0
108
128
  });
129
+ /**
130
+ * Raw option captured from `options.serverMode` (or the legacy `uiMode`). Re-resolved
131
+ * inside the initialize handler when set to `'auto'`; explicit `'default'`/`'apps'`
132
+ * values bypass auto-detect.
133
+ */
134
+ Object.defineProperty(this, "serverModeOption", {
135
+ enumerable: true,
136
+ configurable: true,
137
+ writable: true,
138
+ value: void 0
139
+ });
140
+ /** True once mode is final. False for `'auto'` until the initialize handler resolves client capabilities. */
141
+ Object.defineProperty(this, "serverModeResolved", {
142
+ enumerable: true,
143
+ configurable: true,
144
+ writable: true,
145
+ value: void 0
146
+ });
147
+ /**
148
+ * Tool requests queued before mode is final. Actor tools are upserted immediately
149
+ * (mode-agnostic); we also capture the exact actor-tool slice fetched for each
150
+ * request so the flush composes every entry against *its own* actor list rather
151
+ * than the accumulated union across unrelated requests.
152
+ */
153
+ Object.defineProperty(this, "pendingToolsAfterModeResolved", {
154
+ enumerable: true,
155
+ configurable: true,
156
+ writable: true,
157
+ value: []
158
+ });
109
159
  // Telemetry configuration (resolved from options and env vars in setupTelemetry)
110
160
  Object.defineProperty(this, "telemetryEnabled", {
111
161
  enumerable: true,
@@ -126,10 +176,7 @@ export class ActorsMcpServer {
126
176
  writable: true,
127
177
  value: new Map()
128
178
  });
129
- /**
130
- * Whether the connected client advertises MCP Apps UI support (`io.modelcontextprotocol/ui` extension).
131
- * NOTE: This is currently informational only (logged for observability) and does not yet gate widget behavior.
132
- */
179
+ /** Set in the initialize handler once client capabilities are known. */
133
180
  Object.defineProperty(this, "clientSupportsUi", {
134
181
  enumerable: true,
135
182
  configurable: true,
@@ -148,7 +195,20 @@ export class ActorsMcpServer {
148
195
  throw new Error('Task store must be provided for non-stdio transport types');
149
196
  }
150
197
  this.actorStore = options.actorStore;
151
- this.serverMode = (_a = options.uiMode) !== null && _a !== void 0 ? _a : 'default';
198
+ // Constructor is an ingestion boundary for programmatic callers. Normalize via
199
+ // parseServerMode so that runtime-invalid values ('openai' alias, stray strings)
200
+ // and the legacy `uiMode` field name are accepted gracefully during the transition
201
+ // to the canonical `serverMode` API. Remove the `uiMode` fallback once internal
202
+ // consumers have migrated (see apify-mcp-server-internal#454).
203
+ const legacyUiMode = options.uiMode;
204
+ const rawServerMode = options.serverMode;
205
+ this.serverModeOption = rawServerMode !== undefined
206
+ ? parseServerMode(rawServerMode)
207
+ : parseServerMode(legacyUiMode);
208
+ // Preliminary resolution — re-resolved inside the initialize handler once
209
+ // client capabilities are known (only for 'auto').
210
+ this.serverMode = resolveServerMode(this.serverModeOption, false);
211
+ this.serverModeResolved = this.serverModeOption !== 'auto';
152
212
  this.actorExecutor = actorExecutorsByMode[this.serverMode];
153
213
  const { setupSigintHandler = true } = options;
154
214
  this.server = new Server({
@@ -178,10 +238,10 @@ export class ActorsMcpServer {
178
238
  prompts: {},
179
239
  logging: {},
180
240
  },
181
- instructions: getServerInstructions(this.serverMode),
241
+ instructions: getServerInstructions(),
182
242
  });
183
243
  this.setupTelemetry();
184
- this.setupCapabilityNegotiation();
244
+ this.setupInitializeHandler();
185
245
  this.setupLoggingProxy();
186
246
  this.tools = new Map();
187
247
  this.setupErrorHandling(setupSigintHandler);
@@ -213,18 +273,59 @@ export class ActorsMcpServer {
213
273
  }
214
274
  }
215
275
  /**
216
- * Detects MCP Apps UI support from client capabilities after initialization.
217
- * Checks for the `io.modelcontextprotocol/ui` extension with `text/html;profile=mcp-app` MIME type.
276
+ * Override the SDK's `initialize` request handler to run mode resolution and
277
+ * pending-source flush before `InitializeResult` is sent. Delegates boilerplate
278
+ * (protocolVersion, capabilities, instructions) to the SDK's captured `_oninitialize`.
279
+ *
280
+ * Not using `server.oninitialized`: the SDK dispatches notification handlers
281
+ * fire-and-forget (separate microtask), so a follow-up `tools/list` can race past them.
282
+ * The request handler guarantees tools are final before the response and the first `tools/list`.
218
283
  */
219
- setupCapabilityNegotiation() {
220
- const MCP_APPS_EXTENSION_ID = 'io.modelcontextprotocol/ui';
221
- this.server.oninitialized = () => {
222
- var _a, _b, _c;
223
- const caps = this.server.getClientCapabilities();
224
- const uiCap = (_a = caps === null || caps === void 0 ? void 0 : caps.extensions) === null || _a === void 0 ? void 0 : _a[MCP_APPS_EXTENSION_ID];
225
- this.clientSupportsUi = (_c = (_b = uiCap === null || uiCap === void 0 ? void 0 : uiCap.mimeTypes) === null || _b === void 0 ? void 0 : _b.includes(RESOURCE_MIME_TYPE)) !== null && _c !== void 0 ? _c : false;
226
- log.info('Client MCP Apps UI support', { clientSupportsUi: this.clientSupportsUi });
227
- };
284
+ setupInitializeHandler() {
285
+ // Capture the SDK's default initialize handler installed in its constructor.
286
+ // Private-field access on the SDK Server — verified against
287
+ // @modelcontextprotocol/sdk ^1.25.x (see package.json). On SDK bumps, re-check
288
+ // `@modelcontextprotocol/sdk/shared/protocol.js` for a still-named `_oninitialize`;
289
+ // if renamed or made non-delegable, rebuild the InitializeResult shape here
290
+ // (protocolVersion, serverInfo, capabilities, instructions) instead of delegating.
291
+ // The capability-gating unit tests construct a server and act as a canary.
292
+ // eslint-disable-next-line no-underscore-dangle
293
+ const sdkInitHandler = this.server._oninitialize.bind(this.server);
294
+ this.server.setRequestHandler(InitializeRequestSchema, async (request) => {
295
+ this.clientSupportsUi = isUiSupportedByClient(request);
296
+ if (this.serverModeOption === 'auto') {
297
+ const resolved = resolveServerMode('auto', this.clientSupportsUi);
298
+ if (resolved !== this.serverMode) {
299
+ this.serverMode = resolved;
300
+ this.actorExecutor = actorExecutorsByMode[this.serverMode];
301
+ }
302
+ this.serverModeResolved = true;
303
+ }
304
+ this.options.initializeRequestData = request;
305
+ log.info('Resolved server mode for connection', {
306
+ serverMode: this.serverMode,
307
+ serverModeOption: this.serverModeOption,
308
+ clientSupportsUi: this.clientSupportsUi,
309
+ });
310
+ this.updateToolsAfterServerModeResolved();
311
+ await this.resolveWidgets();
312
+ const result = await sdkInitHandler(request);
313
+ result.instructions = getServerInstructions(this.serverMode);
314
+ return result;
315
+ });
316
+ }
317
+ updateToolsAfterServerModeResolved() {
318
+ if (this.pendingToolsAfterModeResolved.length === 0)
319
+ return;
320
+ const tools = this.pendingToolsAfterModeResolved.flatMap(({ input, actorTools }) => getToolsForServerMode(input, actorTools, this.serverMode));
321
+ this.pendingToolsAfterModeResolved = [];
322
+ // Notify after the flush so shared-state handlers (e.g. Redis recovery) see
323
+ // the final tool set, including mode-specific helpers added here. Pre-init,
324
+ // `loadToolsByName` may have fired `upsertTools(actorTools, true)` with actor
325
+ // tools only (helpers still queued), and `loadToolsFromUrl` / `loadToolsFromInput`
326
+ // don't notify at all — this call reconciles both paths to the complete set.
327
+ if (tools.length > 0)
328
+ this.upsertTools(tools, true);
228
329
  }
229
330
  /**
230
331
  * Returns an array of tool names.
@@ -300,31 +401,21 @@ export class ActorsMcpServer {
300
401
  * @param apifyClient
301
402
  */
302
403
  async loadToolsByName(toolNames, apifyClient) {
303
- const loadedTools = this.listAllToolNames();
304
- const actorsToLoad = [];
305
- const toolsToLoad = [];
306
- const internalToolMap = new Map([
307
- ...getDefaultTools(this.serverMode),
308
- ...Object.values(getCategoryTools(this.serverMode)).flat(),
309
- ].map((tool) => [tool.name, tool]));
310
- for (const tool of toolNames) {
311
- // Skip if the tool is already loaded
312
- if (loadedTools.includes(tool))
313
- continue;
314
- // Load internal tool
315
- if (internalToolMap.has(tool)) {
316
- toolsToLoad.push(internalToolMap.get(tool));
317
- // Load Actor
318
- }
319
- else {
320
- actorsToLoad.push(tool);
321
- }
404
+ const loadedTools = new Set(this.listAllToolNames());
405
+ const missingToolNames = toolNames.filter((toolName) => !loadedTools.has(toolName));
406
+ if (missingToolNames.length === 0)
407
+ return;
408
+ const restoreInput = toolNamesToInput(missingToolNames);
409
+ const actorTools = await getActors(restoreInput, apifyClient, this.actorStore);
410
+ if (!this.serverModeResolved) {
411
+ this.pendingToolsAfterModeResolved.push({ input: restoreInput, actorTools });
412
+ if (actorTools.length > 0)
413
+ this.upsertTools(actorTools, true);
414
+ return;
322
415
  }
416
+ const toolsToLoad = getToolsForServerMode(restoreInput, actorTools, this.serverMode);
323
417
  if (toolsToLoad.length > 0) {
324
- this.upsertTools(toolsToLoad);
325
- }
326
- if (actorsToLoad.length > 0) {
327
- await this.loadActorsAsTools(actorsToLoad, apifyClient);
418
+ this.upsertTools(toolsToLoad, actorTools.length > 0);
328
419
  }
329
420
  }
330
421
  /**
@@ -341,20 +432,45 @@ export class ActorsMcpServer {
341
432
  }
342
433
  return actorTools;
343
434
  }
344
- /**
345
- * Loads tools from URL params.
346
- *
347
- * This method also handles enabling of Actor autoloading via the processParamsGetTools.
348
- *
349
- * Used primarily for SSE.
350
- */
435
+ /** Load tools from URL params. Used by SSE and HTTP entry points. */
351
436
  async loadToolsFromUrl(url, apifyClient) {
352
- const tools = await processParamsGetTools(url, apifyClient, this.serverMode, this.actorStore);
437
+ const input = parseInputParamsFromUrl(url);
438
+ const actorTools = await getActors(input, apifyClient, this.actorStore);
439
+ if (!this.serverModeResolved) {
440
+ this.pendingToolsAfterModeResolved.push({ input, actorTools });
441
+ if (actorTools.length > 0) {
442
+ log.debug('Loading actor tools from query parameters before mode resolution');
443
+ this.upsertTools(actorTools, false);
444
+ }
445
+ return;
446
+ }
447
+ const tools = getToolsForServerMode(input, actorTools, this.serverMode);
353
448
  if (tools.length > 0) {
354
449
  log.debug('Loading tools from query parameters');
355
450
  this.upsertTools(tools, false);
356
451
  }
357
452
  }
453
+ /**
454
+ * Two-phase: getActors (async, mode-agnostic Apify fetch) then getToolsForServerMode
455
+ * (sync, mode-dependent compose). When mode is unresolved, queue actorTools and let
456
+ * the initialize handler compose them later.
457
+ *
458
+ * Don't move the getActors await into the initialize handler — clients time out
459
+ * waiting for InitializeResult. The queue buffers already-fetched data, not network
460
+ * work. See #721.
461
+ */
462
+ async loadToolsFromInput(input, apifyClient) {
463
+ const actorTools = await getActors(input, apifyClient, this.actorStore);
464
+ if (!this.serverModeResolved) {
465
+ this.pendingToolsAfterModeResolved.push({ input, actorTools });
466
+ if (actorTools.length > 0)
467
+ this.upsertTools(actorTools);
468
+ return;
469
+ }
470
+ const tools = getToolsForServerMode(input, actorTools, this.serverMode);
471
+ if (tools.length > 0)
472
+ this.upsertTools(tools);
473
+ }
358
474
  /** Delete tools from the server and notify the handler.
359
475
  */
360
476
  removeToolsByName(toolNames, shouldNotifyToolsChangedHandler = false) {
@@ -452,7 +568,7 @@ export class ActorsMcpServer {
452
568
  setupResourceHandlers() {
453
569
  const resourceService = createResourceService({
454
570
  paymentProvider: this.options.paymentProvider,
455
- mode: this.serverMode,
571
+ getMode: () => this.serverMode,
456
572
  getAvailableWidgets: () => this.availableWidgets,
457
573
  });
458
574
  this.server.setRequestHandler(ListResourcesRequestSchema, async () => {
@@ -1271,7 +1387,7 @@ export class ActorsMcpServer {
1271
1387
  * Resolves widgets and determines which ones are ready to be served.
1272
1388
  */
1273
1389
  async resolveWidgets() {
1274
- if (this.serverMode !== 'openai') {
1390
+ if (this.serverMode !== ServerMode.APPS) {
1275
1391
  return;
1276
1392
  }
1277
1393
  try {
@@ -1333,5 +1449,4 @@ export class ActorsMcpServer {
1333
1449
  await this.server.close();
1334
1450
  }
1335
1451
  }
1336
- //# sourceMappingURL=server.js.map
1337
- //# debugId=374f6a13-0750-5a19-ac52-42edce3f2308
1452
+ //# sourceMappingURL=server.js.map