55import type { Client } from '@modelcontextprotocol/sdk/client/index.js' ;
66import { Server } from '@modelcontextprotocol/sdk/server/index.js' ;
77import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js' ;
8- import { CallToolRequestSchema , ErrorCode , ListToolsRequestSchema , McpError } from '@modelcontextprotocol/sdk/types.js' ;
8+ import { CallToolRequestSchema , CallToolResultSchema , ErrorCode , ListToolsRequestSchema , McpError } from '@modelcontextprotocol/sdk/types.js' ;
99import type { ActorCallOptions } from 'apify-client' ;
1010
1111import log from '@apify/log' ;
@@ -17,20 +17,38 @@ import {
1717 SERVER_NAME ,
1818 SERVER_VERSION ,
1919} from '../const.js' ;
20- import { actorDefinitionTool , callActorGetDataset , getActorsAsTools , searchTool } from '../tools/index.js' ;
20+ import {
21+ actorDefinitionTool ,
22+ addTool ,
23+ callActorGetDataset ,
24+ getActorsAsTools ,
25+ removeTool ,
26+ searchTool ,
27+ } from '../tools/index.js' ;
2128import { actorNameToToolName } from '../tools/utils.js' ;
2229import type { ActorMCPTool , ActorTool , HelperTool , ToolWrap } from '../types.js' ;
2330import { createMCPClient } from './client.js' ;
31+ import { EXTERNAL_TOOL_CALL_TIMEOUT_MSEC } from './const.js' ;
2432import { processParamsGetTools } from './utils.js' ;
2533
34+ type ActorsMcpServerOptions = {
35+ enableAddingActors ?: boolean ;
36+ enableDefaultActors ?: boolean ;
37+ } ;
38+
2639/**
2740 * Create Apify MCP server
2841 */
2942export class ActorsMcpServer {
3043 public readonly server : Server ;
3144 public readonly tools : Map < string , ToolWrap > ;
45+ private readonly options : ActorsMcpServerOptions ;
3246
33- constructor ( ) {
47+ constructor ( options : ActorsMcpServerOptions = { } ) {
48+ this . options = {
49+ enableAddingActors : options . enableAddingActors ?? false ,
50+ enableDefaultActors : options . enableDefaultActors ?? true , // Default to true for backward compatibility
51+ } ;
3452 this . server = new Server (
3553 {
3654 name : SERVER_NAME ,
@@ -49,10 +67,29 @@ export class ActorsMcpServer {
4967
5068 // Add default tools
5169 this . updateTools ( [ searchTool , actorDefinitionTool ] ) ;
70+
71+ // Add tools to dynamically load Actors
72+ if ( this . options . enableAddingActors ) {
73+ this . loadToolsToAddActors ( ) ;
74+ }
75+
76+ // Initialize automatically for backward compatibility
77+ this . initialize ( ) . catch ( ( error ) => {
78+ log . error ( 'Failed to initialize server:' , error ) ;
79+ } ) ;
80+ }
81+
82+ /**
83+ * Initialize the server with default tools if enabled
84+ */
85+ public async initialize ( ) : Promise < void > {
86+ if ( this . options . enableDefaultActors ) {
87+ await this . loadDefaultTools ( process . env . APIFY_TOKEN as string ) ;
88+ }
5289 }
5390
5491 /**
55- * Loads missing default tools.
92+ * Loads default tools if not already loaded .
5693 */
5794 public async loadDefaultTools ( apifyToken : string ) {
5895 const missingDefaultTools = defaults . actors . filter ( ( name ) => ! this . tools . has ( actorNameToToolName ( name ) ) ) ;
@@ -66,7 +103,7 @@ export class ActorsMcpServer {
66103 /**
67104 * Loads tools from URL params.
68105 *
69- * This method also handles enabling of Actor auto loading via the processParamsGetTools.
106+ * This method also handles enabling of Actor autoloading via the processParamsGetTools.
70107 *
71108 * Used primarily for SSE.
72109 */
@@ -78,6 +115,13 @@ export class ActorsMcpServer {
78115 }
79116 }
80117
118+ /**
119+ * Add Actors to server dynamically
120+ */
121+ public loadToolsToAddActors ( ) {
122+ this . updateTools ( [ addTool , removeTool ] ) ;
123+ }
124+
81125 /**
82126 * Upsert new tools.
83127 * @param tools - Array of tool wrappers.
@@ -199,6 +243,8 @@ export class ActorsMcpServer {
199243 const res = await client . callTool ( {
200244 name : serverTool . originToolName ,
201245 arguments : args ,
246+ } , CallToolResultSchema , {
247+ timeout : EXTERNAL_TOOL_CALL_TIMEOUT_MSEC ,
202248 } ) ;
203249
204250 return { ...res } ;
0 commit comments