@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.
- package/dist/apify_client.js +1 -4
- package/dist/apify_client.js.map +1 -1
- package/dist/const.js +1 -4
- package/dist/const.js.map +1 -1
- package/dist/dev_server.d.ts.map +1 -1
- package/dist/dev_server.js +38 -45
- package/dist/dev_server.js.map +1 -1
- package/dist/errors.js +1 -4
- package/dist/errors.js.map +1 -1
- package/dist/index.js +1 -4
- package/dist/index.js.map +1 -1
- package/dist/index_internals.d.ts +2 -3
- package/dist/index_internals.d.ts.map +1 -1
- package/dist/index_internals.js +2 -6
- package/dist/index_internals.js.map +1 -1
- package/dist/input.js +1 -4
- package/dist/input.js.map +1 -1
- package/dist/instrument.js +1 -4
- package/dist/instrument.js.map +1 -1
- package/dist/mcp/actors.js +1 -4
- package/dist/mcp/actors.js.map +1 -1
- package/dist/mcp/client.js +1 -4
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/const.js +1 -4
- package/dist/mcp/const.js.map +1 -1
- package/dist/mcp/proxy.js +1 -4
- package/dist/mcp/proxy.js.map +1 -1
- package/dist/mcp/server.d.ts +44 -17
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +180 -65
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/utils.d.ts +2 -1
- package/dist/mcp/utils.d.ts.map +1 -1
- package/dist/mcp/utils.js +3 -5
- package/dist/mcp/utils.js.map +1 -1
- package/dist/payments/helpers.js +1 -4
- package/dist/payments/helpers.js.map +1 -1
- package/dist/payments/index.js +1 -4
- package/dist/payments/index.js.map +1 -1
- package/dist/payments/resolve.js +1 -4
- package/dist/payments/resolve.js.map +1 -1
- package/dist/payments/skyfire.js +1 -4
- package/dist/payments/skyfire.js.map +1 -1
- package/dist/payments/types.js +1 -4
- package/dist/payments/types.js.map +1 -1
- package/dist/payments/x402.js +1 -4
- package/dist/payments/x402.js.map +1 -1
- package/dist/prompts/index.js +1 -4
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/latest_news_on_topic.js +1 -4
- package/dist/prompts/latest_news_on_topic.js.map +1 -1
- package/dist/resources/resource_service.d.ts +9 -2
- package/dist/resources/resource_service.d.ts.map +1 -1
- package/dist/resources/resource_service.js +5 -7
- package/dist/resources/resource_service.js.map +1 -1
- package/dist/resources/widgets.js +1 -4
- package/dist/resources/widgets.js.map +1 -1
- package/dist/server_card.js +1 -4
- package/dist/server_card.js.map +1 -1
- package/dist/state.js +1 -4
- package/dist/state.js.map +1 -1
- package/dist/stdio.js +15 -28
- package/dist/stdio.js.map +1 -1
- package/dist/telemetry.js +1 -4
- package/dist/telemetry.js.map +1 -1
- package/dist/tools/{openai → apps}/actor_executor.d.ts +2 -2
- package/dist/tools/apps/actor_executor.d.ts.map +1 -0
- package/dist/tools/{openai → apps}/actor_executor.js +3 -6
- package/dist/tools/apps/actor_executor.js.map +1 -0
- package/dist/tools/{openai → apps}/call_actor.d.ts +2 -2
- package/dist/tools/apps/call_actor.d.ts.map +1 -0
- package/dist/tools/{openai → apps}/call_actor.js +7 -10
- package/dist/tools/apps/call_actor.js.map +1 -0
- package/dist/tools/apps/fetch_actor_details.d.ts +7 -0
- package/dist/tools/apps/fetch_actor_details.d.ts.map +1 -0
- package/dist/tools/{openai → apps}/fetch_actor_details.js +4 -7
- package/dist/tools/apps/fetch_actor_details.js.map +1 -0
- package/dist/tools/apps/fetch_actor_details_internal.d.ts.map +1 -0
- package/dist/tools/{openai → apps}/fetch_actor_details_internal.js +3 -6
- package/dist/tools/apps/fetch_actor_details_internal.js.map +1 -0
- package/dist/tools/{openai → apps}/get_actor_run.d.ts +2 -2
- package/dist/tools/apps/get_actor_run.d.ts.map +1 -0
- package/dist/tools/{openai → apps}/get_actor_run.js +3 -6
- package/dist/tools/apps/get_actor_run.js.map +1 -0
- package/dist/tools/apps/search_actors.d.ts +7 -0
- package/dist/tools/apps/search_actors.d.ts.map +1 -0
- package/dist/tools/{openai → apps}/search_actors.js +4 -7
- package/dist/tools/apps/search_actors.js.map +1 -0
- package/dist/tools/apps/search_actors_internal.d.ts.map +1 -0
- package/dist/tools/{openai → apps}/search_actors_internal.js +3 -6
- package/dist/tools/apps/search_actors_internal.js.map +1 -0
- package/dist/tools/build.js +1 -4
- package/dist/tools/build.js.map +1 -1
- package/dist/tools/categories.d.ts +10 -10
- package/dist/tools/categories.d.ts.map +1 -1
- package/dist/tools/categories.js +18 -21
- package/dist/tools/categories.js.map +1 -1
- package/dist/tools/common/abort_actor_run.js +1 -4
- package/dist/tools/common/abort_actor_run.js.map +1 -1
- package/dist/tools/common/add_actor.js +1 -4
- package/dist/tools/common/add_actor.js.map +1 -1
- package/dist/tools/common/dataset_collection.js +1 -4
- package/dist/tools/common/dataset_collection.js.map +1 -1
- package/dist/tools/common/fetch_apify_docs.js +1 -4
- package/dist/tools/common/fetch_apify_docs.js.map +1 -1
- package/dist/tools/common/get_actor_output.js +1 -4
- package/dist/tools/common/get_actor_output.js.map +1 -1
- package/dist/tools/common/get_actor_run_log.js +1 -4
- package/dist/tools/common/get_actor_run_log.js.map +1 -1
- package/dist/tools/common/get_dataset.js +1 -4
- package/dist/tools/common/get_dataset.js.map +1 -1
- package/dist/tools/common/get_dataset_items.js +1 -4
- package/dist/tools/common/get_dataset_items.js.map +1 -1
- package/dist/tools/common/get_dataset_schema.js +1 -4
- package/dist/tools/common/get_dataset_schema.js.map +1 -1
- package/dist/tools/common/get_key_value_store.js +1 -4
- package/dist/tools/common/get_key_value_store.js.map +1 -1
- package/dist/tools/common/get_key_value_store_keys.js +1 -4
- package/dist/tools/common/get_key_value_store_keys.js.map +1 -1
- package/dist/tools/common/get_key_value_store_record.js +1 -4
- package/dist/tools/common/get_key_value_store_record.js.map +1 -1
- package/dist/tools/common/key_value_store_collection.js +1 -4
- package/dist/tools/common/key_value_store_collection.js.map +1 -1
- package/dist/tools/common/run_collection.js +1 -4
- package/dist/tools/common/run_collection.js.map +1 -1
- package/dist/tools/common/search_apify_docs.js +1 -4
- package/dist/tools/common/search_apify_docs.js.map +1 -1
- package/dist/tools/core/actor_execution.js +1 -4
- package/dist/tools/core/actor_execution.js.map +1 -1
- package/dist/tools/core/actor_response.js +1 -4
- package/dist/tools/core/actor_response.js.map +1 -1
- package/dist/tools/core/actor_tools_factory.js +2 -5
- package/dist/tools/core/actor_tools_factory.js.map +1 -1
- package/dist/tools/core/call_actor_common.d.ts +2 -2
- package/dist/tools/core/call_actor_common.js +3 -6
- package/dist/tools/core/call_actor_common.js.map +1 -1
- package/dist/tools/core/fetch_actor_details_common.d.ts +2 -2
- package/dist/tools/core/fetch_actor_details_common.js +4 -7
- package/dist/tools/core/fetch_actor_details_common.js.map +1 -1
- package/dist/tools/core/get_actor_run_common.d.ts +3 -3
- package/dist/tools/core/get_actor_run_common.js +5 -8
- package/dist/tools/core/get_actor_run_common.js.map +1 -1
- package/dist/tools/core/search_actors_common.d.ts +2 -2
- package/dist/tools/core/search_actors_common.js +4 -7
- package/dist/tools/core/search_actors_common.js.map +1 -1
- package/dist/tools/default/actor_executor.js +1 -4
- package/dist/tools/default/actor_executor.js.map +1 -1
- package/dist/tools/default/call_actor.js +2 -5
- package/dist/tools/default/call_actor.js.map +1 -1
- package/dist/tools/default/fetch_actor_details.js +1 -4
- package/dist/tools/default/fetch_actor_details.js.map +1 -1
- package/dist/tools/default/get_actor_run.js +1 -4
- package/dist/tools/default/get_actor_run.js.map +1 -1
- package/dist/tools/default/search_actors.js +1 -4
- package/dist/tools/default/search_actors.js.map +1 -1
- package/dist/tools/index.d.ts +2 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +4 -6
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/structured_output_schemas.js +3 -6
- package/dist/tools/structured_output_schemas.js.map +1 -1
- package/dist/tools/utils.js +1 -4
- package/dist/tools/utils.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +41 -23
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +52 -15
- package/dist/types.js.map +1 -1
- package/dist/utils/actor.js +1 -4
- package/dist/utils/actor.js.map +1 -1
- package/dist/utils/actor_card.js +1 -4
- package/dist/utils/actor_card.js.map +1 -1
- package/dist/utils/actor_details.d.ts +1 -1
- package/dist/utils/actor_details.js +2 -5
- package/dist/utils/actor_details.js.map +1 -1
- package/dist/utils/actor_search.js +1 -4
- package/dist/utils/actor_search.js.map +1 -1
- package/dist/utils/ajv.js +1 -4
- package/dist/utils/ajv.js.map +1 -1
- package/dist/utils/apify_docs.js +1 -4
- package/dist/utils/apify_docs.js.map +1 -1
- package/dist/utils/apify_properties.js +1 -4
- package/dist/utils/apify_properties.js.map +1 -1
- package/dist/utils/auth.js +1 -4
- package/dist/utils/auth.js.map +1 -1
- package/dist/utils/generic.js +1 -4
- package/dist/utils/generic.js.map +1 -1
- package/dist/utils/logging.js +1 -4
- package/dist/utils/logging.js.map +1 -1
- package/dist/utils/mcp.js +1 -4
- package/dist/utils/mcp.js.map +1 -1
- package/dist/utils/mcp_clients.js +1 -4
- package/dist/utils/mcp_clients.js.map +1 -1
- package/dist/utils/payment_errors.js +1 -4
- package/dist/utils/payment_errors.js.map +1 -1
- package/dist/utils/pricing_info.js +1 -4
- package/dist/utils/pricing_info.js.map +1 -1
- package/dist/utils/progress.js +1 -4
- package/dist/utils/progress.js.map +1 -1
- package/dist/utils/schema_generation.js +1 -4
- package/dist/utils/schema_generation.js.map +1 -1
- package/dist/utils/server-instructions/index.d.ts +16 -4
- package/dist/utils/server-instructions/index.d.ts.map +1 -1
- package/dist/utils/server-instructions/index.js +75 -16
- package/dist/utils/server-instructions/index.js.map +1 -1
- package/dist/utils/tool_categories_helpers.js +1 -4
- package/dist/utils/tool_categories_helpers.js.map +1 -1
- package/dist/utils/tool_status.js +1 -4
- package/dist/utils/tool_status.js.map +1 -1
- package/dist/utils/tools.d.ts +2 -1
- package/dist/utils/tools.d.ts.map +1 -1
- package/dist/utils/tools.js +4 -6
- package/dist/utils/tools.js.map +1 -1
- package/dist/utils/tools_loader.d.ts +11 -13
- package/dist/utils/tools_loader.d.ts.map +1 -1
- package/dist/utils/tools_loader.js +126 -89
- package/dist/utils/tools_loader.js.map +1 -1
- package/dist/utils/ttl_lru.js +1 -4
- package/dist/utils/ttl_lru.js.map +1 -1
- package/dist/utils/userid_cache.js +1 -4
- package/dist/utils/userid_cache.js.map +1 -1
- package/dist/utils/version.js +1 -4
- package/dist/utils/version.js.map +1 -1
- package/dist/web/dist/actor-detail-widget.js +0 -2
- package/dist/web/dist/actor-run-widget.js +0 -2
- package/dist/web/dist/search-actors-widget.js +0 -2
- package/manifest.json +1 -1
- package/package.json +1 -1
- package/server.json +1 -1
- package/dist/tools/openai/actor_executor.d.ts.map +0 -1
- package/dist/tools/openai/actor_executor.js.map +0 -1
- package/dist/tools/openai/call_actor.d.ts.map +0 -1
- package/dist/tools/openai/call_actor.js.map +0 -1
- package/dist/tools/openai/fetch_actor_details.d.ts +0 -7
- package/dist/tools/openai/fetch_actor_details.d.ts.map +0 -1
- package/dist/tools/openai/fetch_actor_details.js.map +0 -1
- package/dist/tools/openai/fetch_actor_details_internal.d.ts.map +0 -1
- package/dist/tools/openai/fetch_actor_details_internal.js.map +0 -1
- package/dist/tools/openai/get_actor_run.d.ts.map +0 -1
- package/dist/tools/openai/get_actor_run.js.map +0 -1
- package/dist/tools/openai/search_actors.d.ts +0 -7
- package/dist/tools/openai/search_actors.d.ts.map +0 -1
- package/dist/tools/openai/search_actors.js.map +0 -1
- package/dist/tools/openai/search_actors_internal.d.ts.map +0 -1
- package/dist/tools/openai/search_actors_internal.js.map +0 -1
- package/dist/utils/server-instructions/common.d.ts +0 -19
- package/dist/utils/server-instructions/common.d.ts.map +0 -1
- package/dist/utils/server-instructions/common.js +0 -61
- package/dist/utils/server-instructions/common.js.map +0 -1
- package/dist/utils/server-instructions/default.d.ts +0 -6
- package/dist/utils/server-instructions/default.d.ts.map +0 -1
- package/dist/utils/server-instructions/default.js +0 -17
- package/dist/utils/server-instructions/default.js.map +0 -1
- package/dist/utils/server-instructions/openai.d.ts +0 -7
- package/dist/utils/server-instructions/openai.d.ts.map +0 -1
- package/dist/utils/server-instructions/openai.js +0 -33
- package/dist/utils/server-instructions/openai.js.map +0 -1
- /package/dist/tools/{openai → apps}/fetch_actor_details_internal.d.ts +0 -0
- /package/dist/tools/{openai → apps}/search_actors_internal.d.ts +0 -0
package/dist/mcp/server.d.ts
CHANGED
|
@@ -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,
|
|
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
|
-
/**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
*
|
|
40
|
-
*
|
|
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
|
|
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
|
-
*
|
|
99
|
-
*
|
|
100
|
-
*
|
|
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
|
-
*
|
|
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
|
-
|
|
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[];
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -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
|
|
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
|
|
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,
|
|
39
|
+
import { isTaskCancelled, parseInputParamsFromUrl } from './utils.js';
|
|
36
40
|
/** Mode → actor executor. Add new modes here. */
|
|
37
41
|
const actorExecutorsByMode = {
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
/**
|
|
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
|
-
|
|
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(
|
|
241
|
+
instructions: getServerInstructions(),
|
|
182
242
|
});
|
|
183
243
|
this.setupTelemetry();
|
|
184
|
-
this.
|
|
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
|
-
*
|
|
217
|
-
*
|
|
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
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
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
|
|
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
|
-
|
|
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 !==
|
|
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
|