Skip to content

Commit c319b96

Browse files
committed
vibe reafactor tool loading logic from input (url and cli args)
1 parent babe4c6 commit c319b96

File tree

3 files changed

+74
-35
lines changed

3 files changed

+74
-35
lines changed

src/mcp/utils.ts

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { createHash } from 'node:crypto';
22
import { parse } from 'node:querystring';
33

44
import { processInput } from '../input.js';
5-
import { addRemoveTools, betaTools, featureTools, getActorsAsTools } from '../tools/index.js';
6-
import type { FeatureToolKey, Input, ToolEntry } from '../types.js';
5+
import type { Input } from '../types.js';
6+
import { loadToolsFromInput } from '../utils/tools-loader.js';
77
import { MAX_TOOL_NAME_LENGTH, SERVER_ID_LENGTH } from './const.js';
88

99
/**
@@ -34,34 +34,14 @@ export function getProxyMCPServerToolName(url: string, toolName: string): string
3434
}
3535

3636
/**
37-
* Process input parameters and get tools
37+
* Process input parameters from URL and get tools
3838
* If URL contains query parameter `actors`, return tools from Actors otherwise return null.
3939
* @param url
4040
* @param apifyToken
4141
*/
4242
export async function processParamsGetTools(url: string, apifyToken: string) {
4343
const input = parseInputParamsFromUrl(url);
44-
let tools: ToolEntry[] = [];
45-
if (input.actors) {
46-
const actors = input.actors as string[];
47-
// Normal Actors as a tool
48-
tools = await getActorsAsTools(actors, apifyToken);
49-
}
50-
if (input.enableAddingActors) {
51-
tools.push(...addRemoveTools);
52-
}
53-
if (input.beta) {
54-
tools.push(...betaTools);
55-
}
56-
if (input.tools) {
57-
for (const toolKey of input.tools) {
58-
// Get tools by feature key
59-
const keyTools = featureTools[toolKey as FeatureToolKey] || [];
60-
// Push them into the tools array
61-
tools.push(...keyTools);
62-
}
63-
}
64-
return tools;
44+
return await loadToolsFromInput(input, apifyToken);
6545
}
6646

6747
export function parseInputParamsFromUrl(url: string): Input {

src/stdio.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ import { hideBin } from 'yargs/helpers';
2222

2323
import log from '@apify/log';
2424

25-
import { defaults } from './const.js';
2625
import { ActorsMcpServer } from './mcp/server.js';
27-
import { featureTools, getActorsAsTools } from './tools/index.js';
28-
import type { FeatureToolKey } from './types.js';
26+
import { featureTools } from './tools/index.js';
27+
import type { FeatureToolKey, Input } from './types.js';
28+
import { loadToolsFromInput } from './utils/tools-loader.js';
2929

3030
// Keeping this interface here and not types.ts since
3131
// it is only relevant to the CLI/STDIO transport in this file
@@ -108,14 +108,18 @@ if (!process.env.APIFY_TOKEN) {
108108

109109
async function main() {
110110
const mcpServer = new ActorsMcpServer({ enableAddingActors, enableDefaultActors: false, enableBeta });
111-
const tools = await getActorsAsTools(actorList.length ? actorList : defaults.actors, process.env.APIFY_TOKEN as string);
112-
// Add feature tools based on the command line arguments
113-
if (featureToolKeys.length > 0) {
114-
for (const key of featureToolKeys) {
115-
const featureToolsList = featureTools[key as FeatureToolKey] || [];
116-
tools.push(...featureToolsList);
117-
}
118-
}
111+
112+
// Create an Input object from CLI arguments
113+
const input: Input = {
114+
actors: actorList.length ? actorList : [],
115+
enableAddingActors,
116+
beta: enableBeta,
117+
tools: featureToolKeys as FeatureToolKey[],
118+
};
119+
120+
// Use the shared tools loading logic
121+
const tools = await loadToolsFromInput(input, process.env.APIFY_TOKEN as string, actorList.length === 0);
122+
119123
mcpServer.upsertTools(tools);
120124

121125
// Start server

src/utils/tools-loader.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/**
2+
* Shared logic for loading tools based on Input type.
3+
* This eliminates duplication between stdio.ts and processParamsGetTools.
4+
*/
5+
6+
import { defaults } from '../const.js';
7+
import { addRemoveTools, betaTools, featureTools, getActorsAsTools } from '../tools/index.js';
8+
import type { FeatureToolKey, Input, ToolEntry } from '../types.js';
9+
10+
/**
11+
* Load tools based on the provided Input object.
12+
* This function is used by both the stdio.ts and the processParamsGetTools function.
13+
*
14+
* @param input The processed Input object
15+
* @param apifyToken The Apify API token
16+
* @param useDefaultActors Whether to use default actors if no actors are specified
17+
* @returns An array of tool entries
18+
*/
19+
export async function loadToolsFromInput(
20+
input: Input,
21+
apifyToken: string,
22+
useDefaultActors = false,
23+
): Promise<ToolEntry[]> {
24+
let tools: ToolEntry[] = [];
25+
26+
// Load actors as tools
27+
if (input.actors && (Array.isArray(input.actors) ? input.actors.length > 0 : input.actors)) {
28+
const actors = Array.isArray(input.actors) ? input.actors : [input.actors];
29+
tools = await getActorsAsTools(actors, apifyToken);
30+
} else if (useDefaultActors) {
31+
// Use default actors if no actors are specified and useDefaultActors is true
32+
tools = await getActorsAsTools(defaults.actors, apifyToken);
33+
}
34+
35+
// Add tools for adding/removing actors if enabled
36+
if (input.enableAddingActors) {
37+
tools.push(...addRemoveTools);
38+
}
39+
40+
// Add beta tools if enabled
41+
if (input.beta) {
42+
tools.push(...betaTools);
43+
}
44+
45+
// Add feature tools based on the input
46+
if (input.tools) {
47+
const toolKeys = Array.isArray(input.tools) ? input.tools : [input.tools];
48+
for (const toolKey of toolKeys) {
49+
const keyTools = featureTools[toolKey as FeatureToolKey] || [];
50+
tools.push(...keyTools);
51+
}
52+
}
53+
54+
return tools;
55+
}

0 commit comments

Comments
 (0)