Skip to content

Commit c273cfb

Browse files
committed
organize, fix passing of apify token
1 parent b91a305 commit c273cfb

File tree

11 files changed

+34
-19
lines changed

11 files changed

+34
-19
lines changed

src/actor/server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import express from 'express';
99
import log from '@apify/log';
1010

1111
import { HEADER_READINESS_PROBE, Routes } from './const.js';
12-
import { type ActorsMcpServer } from '../mcp/mcp-server.js';
12+
import { type ActorsMcpServer } from '../mcp/server.js';
1313
import { getActorRunData } from './utils.js';
1414
import { processParamsGetTools } from '../mcp/utils.js';
1515

src/tools/mcp-apify-client.ts renamed to src/apify-client.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { ApifyClientOptions } from 'apify';
33
import { ApifyClient as _ApifyClient } from 'apify-client';
44
import type { AxiosRequestConfig } from 'axios';
55

6-
import { USER_AGENT_ORIGIN } from '../const.js';
6+
import { USER_AGENT_ORIGIN } from './const.js';
77

88
/**
99
* Adds a User-Agent header to the request config.

src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
12
/*
23
This file provides essential functions and tools for MCP servers, serving as a library.
34
The ActorsMcpServer should be the only class exported from the package
45
*/
56

6-
import { ActorsMcpServer } from './mcp/mcp-server.js';
7+
import { ActorsMcpServer } from './mcp/server.js';
78
export default ActorsMcpServer;

src/main.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
12
/**
23
* Serves as an Actor MCP SSE server entry point.
34
* This file needs to be named `main.ts` to be recognized by the Apify platform.
@@ -11,7 +12,7 @@ import log from '@apify/log';
1112
import { processInput } from './input.js';
1213
import { createExpressApp } from './actor/server.js';
1314
import type { Input } from './types.js';
14-
import { ActorsMcpServer } from './mcp/mcp-server.js';
15+
import { ActorsMcpServer } from './mcp/server.js';
1516
import { actorDefinitionTool, addTool, removeTool, searchTool, callActorGetDataset } from './tools/index.js';
1617

1718
const STANDBY_MODE = Actor.getEnv().metaOrigin === 'STANDBY';
File renamed without changes.

src/stdio.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import minimist from 'minimist';
1818
import log from '@apify/log';
1919

2020
import { defaults } from './const.js';
21-
import { ActorsMcpServer } from './mcp/mcp-server.js';
21+
import { ActorsMcpServer } from './mcp/server.js';
2222
import { addTool, removeTool, getActorsAsTools } from './tools/index.js';
2323

2424
// Configure logging, set to ERROR

src/tools/actor.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import log from '@apify/log';
66
import type { ToolWrap } from '../types.js';
77
import { getActorDefinition } from './build.js';
88
import { ACTOR_ADDITIONAL_INSTRUCTIONS, ACTOR_MAX_MEMORY_MBYTES } from '../const.js';
9-
import { ApifyClient } from './mcp-apify-client.js';
9+
import { ApifyClient } from '../apify-client.js';
1010
import {
1111
actorNameToToolName,
1212
addEnumsToDescriptionsWithExamples,
@@ -79,9 +79,16 @@ export async function callActorGetDataset(
7979
* @param {string[]} actors - An array of actor IDs or Actor full names.
8080
* @returns {Promise<Tool[]>} - A promise that resolves to an array of MCP tools.
8181
*/
82-
export async function getNormalActorsAsTools(actors: string[]): Promise<ToolWrap[]> {
82+
export async function getNormalActorsAsTools(
83+
actors: string[],
84+
apifyToken: string,
85+
): Promise<ToolWrap[]> {
8386
const ajv = new Ajv({ coerceTypes: 'array', strict: false });
84-
const results = await Promise.all(actors.map(getActorDefinition));
87+
const getActorDefinitionWithToken = async (actorId: string) => {
88+
const actor = await getActorDefinition(actorId, apifyToken);
89+
return actor;
90+
};
91+
const results = await Promise.all(actors.map(getActorDefinitionWithToken));
8592
const tools: ToolWrap[] = [];
8693
for (const result of results) {
8794
if (result) {
@@ -153,7 +160,7 @@ export async function getActorsAsTools(
153160
console.log('toolActors', toolActors);
154161

155162
// Normal Actors as a tool
156-
const normalTools = await getNormalActorsAsTools(toolActors);
163+
const normalTools = await getNormalActorsAsTools(toolActors, apifyToken);
157164

158165
// Tools from Actorized MCP servers
159166
const mcpServerTools = await getMCPServersAsTools(actorsMCPServer, apifyToken);

src/tools/build.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Ajv } from 'ajv';
2-
import { ApifyClient } from 'apify-client';
2+
import { ApifyClient } from '../apify-client.js';
33
import { z } from 'zod';
44
import zodToJsonSchema from 'zod-to-json-schema';
55

@@ -19,8 +19,12 @@ const ajv = new Ajv({ coerceTypes: 'array', strict: false });
1919
* @param {number} limit - Truncate the README to this limit.
2020
* @returns {Promise<ActorDefinitionWithDesc | null>} - The actor definition with description or null if not found.
2121
*/
22-
export async function getActorDefinition(actorIdOrName: string, limit: number = ACTOR_README_MAX_LENGTH): Promise<ActorDefinitionPruned | null> {
23-
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
22+
export async function getActorDefinition(
23+
actorIdOrName: string,
24+
apifyToken: string,
25+
limit: number = ACTOR_README_MAX_LENGTH
26+
): Promise<ActorDefinitionPruned | null> {
27+
const client = new ApifyClient({ token: apifyToken });
2428
const actorClient = client.actor(actorIdOrName);
2529
try {
2630
// Fetch actor details
@@ -114,10 +118,10 @@ export const actorDefinitionTool: ToolWrap = {
114118
inputSchema: zodToJsonSchema(GetActorDefinitionArgsSchema),
115119
ajvValidate: ajv.compile(zodToJsonSchema(GetActorDefinitionArgsSchema)),
116120
call: async (toolArgs) => {
117-
const { args } = toolArgs;
121+
const { args, apifyToken } = toolArgs;
118122

119123
const parsed = GetActorDefinitionArgsSchema.parse(args);
120-
const v = await getActorDefinition(parsed.actorName, parsed.limit);
124+
const v = await getActorDefinition(parsed.actorName, apifyToken, parsed.limit);
121125
if (v && v.input && 'properties' in v.input && v.input) {
122126
const properties = filterSchemaProperties(v.input.properties as { [key: string]: ISchemaProperties });
123127
v.input.properties = shortenProperties(properties);

src/tools/store_collection.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Ajv } from 'ajv';
22
import type { ActorStoreList } from 'apify-client';
3-
import { ApifyClient } from 'apify-client';
3+
import { ApifyClient } from '../apify-client.js';
44
import { z } from 'zod';
55
import zodToJsonSchema from 'zod-to-json-schema';
66

@@ -35,10 +35,11 @@ function pruneActorStoreInfo(response: ActorStoreList): ActorStorePruned {
3535

3636
export async function searchActorsByKeywords(
3737
search: string,
38+
apifyToken: string,
3839
limit: number | undefined = undefined,
3940
offset: number | undefined = undefined,
4041
): Promise<ActorStorePruned[] | null> {
41-
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
42+
const client = new ApifyClient({ token: apifyToken });
4243
const results = await client.store().list({ search, limit, offset });
4344
return results.items.map((x) => pruneActorStoreInfo(x));
4445
}
@@ -80,10 +81,11 @@ export const searchTool: ToolWrap = {
8081
inputSchema: zodToJsonSchema(SearchToolArgsSchema),
8182
ajvValidate: ajv.compile(zodToJsonSchema(SearchToolArgsSchema)),
8283
call: async (toolArgs) => {
83-
const { args } = toolArgs;
84+
const { args, apifyToken } = toolArgs;
8485
const parsed = SearchToolArgsSchema.parse(args);
8586
const actors = await searchActorsByKeywords(
8687
parsed.search,
88+
apifyToken,
8789
parsed.limit,
8890
parsed.offset,
8991
);

src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { Server } from '@modelcontextprotocol/sdk/server/index.js';
33
import type { ValidateFunction } from 'ajv';
44
import type { ActorDefaultRunOptions, ActorDefinition } from 'apify-client';
55

6-
import type { ActorsMcpServer } from './mcp/mcp-server.js';
6+
import type { ActorsMcpServer } from './mcp/server.js';
77

88
export interface ISchemaProperties {
99
type: string;

0 commit comments

Comments
 (0)