diff --git a/.actor/input_schema.json b/.actor/input_schema.json index 09fb4393..e2686372 100644 --- a/.actor/input_schema.json +++ b/.actor/input_schema.json @@ -25,7 +25,7 @@ "title": "Enable adding Actors based on context and use-case (experimental, check if it supported by your client)", "type": "boolean", "description": "When enabled, the server can dynamically add Actors as tools based on user requests and context. \n\nNote: MCP client must support notification on tool updates. To try it, you can use the [Tester MCP Client](https://apify.com/jiri.spilka/tester-mcp-client). This is an experimental feature and may require client-specific support.", - "default": false + "default": true }, "maxActorMemoryBytes": { "title": "Limit the maximum memory used by an Actor", @@ -48,7 +48,7 @@ "description": "Specify the input for the Actor that will be used for debugging in normal mode", "editor": "json", "prefill": { - "query": "hello world" + "query": "hello world" } } } diff --git a/src/input.ts b/src/input.ts index 81e5d806..1fdbdeae 100644 --- a/src/input.ts +++ b/src/input.ts @@ -24,7 +24,7 @@ export function processInput(originalInput: Partial): Input { log.warning('enableActorAutoLoading is deprecated, use enableAddingActors instead'); input.enableAddingActors = input.enableActorAutoLoading === true || input.enableActorAutoLoading === 'true'; } else { - input.enableAddingActors = false; + input.enableAddingActors = true; } } else { input.enableAddingActors = input.enableAddingActors === true || input.enableAddingActors === 'true'; diff --git a/src/mcp/server.ts b/src/mcp/server.ts index d5b10cee..3a599238 100644 --- a/src/mcp/server.ts +++ b/src/mcp/server.ts @@ -50,7 +50,7 @@ export class ActorsMcpServer { constructor(options: ActorsMcpServerOptions = {}, setupSigintHandler = true) { this.options = { - enableAddingActors: options.enableAddingActors ?? false, + enableAddingActors: options.enableAddingActors ?? true, enableDefaultActors: options.enableDefaultActors ?? true, // Default to true for backward compatibility }; this.server = new Server( diff --git a/src/stdio.ts b/src/stdio.ts index 45fe18ff..fc537260 100644 --- a/src/stdio.ts +++ b/src/stdio.ts @@ -33,8 +33,9 @@ import { getActorsAsTools } from './tools/index.js'; */ interface CliArgs { actors?: string; - 'enable-adding-actors'?: boolean; - enableActorAutoLoading?: boolean; + enableAddingActors: boolean; + /** @deprecated */ + enableActorAutoLoading: boolean; } // Configure logging, set to ERROR @@ -50,12 +51,12 @@ const argv = yargs(hideBin(process.argv)) }) .option('enable-adding-actors', { type: 'boolean', - default: false, + default: true, describe: 'Enable dynamically adding Actors as tools based on user requests', }) .option('enableActorAutoLoading', { type: 'boolean', - default: false, + default: true, hidden: true, describe: 'Deprecated: use enable-adding-actors instead', }) @@ -69,7 +70,7 @@ const argv = yargs(hideBin(process.argv)) .epilogue('For more information, visit https://github.com/apify/actors-mcp-server') .parseSync() as CliArgs; -const enableAddingActors = argv['enable-adding-actors'] || argv.enableActorAutoLoading || false; +const enableAddingActors = argv.enableAddingActors && argv.enableActorAutoLoading; const actors = argv.actors as string || ''; const actorList = actors ? actors.split(',').map((a: string) => a.trim()) : []; diff --git a/tests/helpers.ts b/tests/helpers.ts index 45d70bf5..8ab1addb 100644 --- a/tests/helpers.ts +++ b/tests/helpers.ts @@ -23,8 +23,8 @@ export async function createMcpSseClient( if (actors) { url.searchParams.append('actors', actors.join(',')); } - if (enableAddingActors) { - url.searchParams.append('enableAddingActors', 'true'); + if (enableAddingActors !== undefined) { + url.searchParams.append('enableAddingActors', enableAddingActors.toString()); } const transport = new SSEClientTransport( @@ -59,8 +59,8 @@ export async function createMcpStreamableClient( if (actors) { url.searchParams.append('actors', actors.join(',')); } - if (enableAddingActors) { - url.searchParams.append('enableAddingActors', 'true'); + if (enableAddingActors !== undefined) { + url.searchParams.append('enableAddingActors', enableAddingActors.toString()); } const transport = new StreamableHTTPClientTransport( @@ -94,8 +94,8 @@ export async function createMcpStdioClient( if (actors) { args.push('--actors', actors.join(',')); } - if (enableAddingActors) { - args.push('--enable-adding-actors'); + if (enableAddingActors !== undefined) { + args.push('--enable-adding-actors', enableAddingActors.toString()); } const transport = new StdioClientTransport({ command: 'node', diff --git a/tests/integration/suite.ts b/tests/integration/suite.ts index 1a583bb8..7288676a 100644 --- a/tests/integration/suite.ts +++ b/tests/integration/suite.ts @@ -82,18 +82,19 @@ export function createIntegrationTestsSuite( describe(suiteName, { concurrent: false, // Make all tests sequential to prevent state interference }, () => { - it('should list all default tools and default Actors', async () => { + it('should list all default tools and Actors', async () => { const client = await createClientFn(); const tools = await client.listTools(); - expect(tools.tools.length).toEqual(defaultTools.length + defaults.actors.length); + expect(tools.tools.length).toEqual(defaultTools.length + defaults.actors.length + addRemoveTools.length); const names = getToolNames(tools); expectToolNamesToContain(names, DEFAULT_TOOL_NAMES); expectToolNamesToContain(names, DEFAULT_ACTOR_NAMES); + expectToolNamesToContain(names, addRemoveTools.map((tool) => tool.tool.name)); await client.close(); }); - it('should list all default tools, tools for adding/removing Actors, and default Actors', async () => { + it('should list all default tools and Actors, with add/remove tools', async () => { const client = await createClientFn({ enableAddingActors: true }); const names = getToolNames(await client.listTools()); expect(names.length).toEqual(defaultTools.length + defaults.actors.length + addRemoveTools.length); @@ -104,6 +105,16 @@ export function createIntegrationTestsSuite( await client.close(); }); + it('should list all default tools and Actors, without add/remove tools', async () => { + const client = await createClientFn({ enableAddingActors: false }); + const names = getToolNames(await client.listTools()); + expect(names.length).toEqual(defaultTools.length + defaults.actors.length); + + expectToolNamesToContain(names, DEFAULT_TOOL_NAMES); + expectToolNamesToContain(names, DEFAULT_ACTOR_NAMES); + await client.close(); + }); + it('should list all default tools and two loaded Actors', async () => { const actors = ['apify/website-content-crawler', 'apify/instagram-scraper']; const client = await createClientFn({ actors, enableAddingActors: false }); diff --git a/tests/unit/input.test.ts b/tests/unit/input.test.ts index 7752d0e3..643e5baa 100644 --- a/tests/unit/input.test.ts +++ b/tests/unit/input.test.ts @@ -39,11 +39,11 @@ describe('processInput', () => { expect(processed.enableAddingActors).toBe(false); }); - it('should default enableAddingActors to false when not provided', async () => { + it('should default enableAddingActors to true when not provided', async () => { const input: Partial = { actors: ['actor1'], }; const processed = processInput(input); - expect(processed.enableAddingActors).toBe(false); + expect(processed.enableAddingActors).toBe(true); }); });