@apify/actors-mcp-server 0.1.23 → 0.1.24-beta.1
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/README.md +58 -2
- package/dist/actor/const.d.ts +12 -0
- package/dist/actor/const.d.ts.map +1 -0
- package/dist/actor/const.js +18 -0
- package/dist/actor/const.js.map +1 -0
- package/dist/actor/server.d.ts +4 -0
- package/dist/actor/server.d.ts.map +1 -0
- package/dist/actor/server.js +161 -0
- package/dist/actor/server.js.map +1 -0
- package/dist/actor/types.d.ts +23 -0
- package/dist/actor/types.d.ts.map +1 -0
- package/dist/actor/types.js +2 -0
- package/dist/actor/types.js.map +1 -0
- package/dist/actor/utils.d.ts +3 -0
- package/dist/actor/utils.d.ts.map +1 -0
- package/dist/actor/utils.js +26 -0
- package/dist/actor/utils.js.map +1 -0
- package/dist/apify-client.d.ts +7 -0
- package/dist/apify-client.d.ts.map +1 -0
- package/dist/apify-client.js +30 -0
- package/dist/apify-client.js.map +1 -0
- package/dist/const.d.ts +15 -19
- package/dist/const.d.ts.map +1 -1
- package/dist/const.js +23 -23
- package/dist/const.js.map +1 -1
- package/dist/examples/clientSse.d.ts +11 -1
- package/dist/examples/clientSse.d.ts.map +1 -1
- package/dist/examples/clientSse.js +13 -10
- package/dist/examples/clientSse.js.map +1 -1
- package/dist/examples/clientStdio.js +6 -6
- package/dist/examples/clientStdio.js.map +1 -1
- package/dist/examples/clientStdioChat.js +31 -16
- package/dist/examples/clientStdioChat.js.map +1 -1
- package/dist/examples/clientStreamableHttp.d.ts +2 -0
- package/dist/examples/clientStreamableHttp.d.ts.map +1 -0
- package/dist/examples/clientStreamableHttp.js +93 -0
- package/dist/examples/clientStreamableHttp.js.map +1 -0
- package/dist/index.d.ts +2 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -51
- package/dist/index.js.map +1 -1
- package/dist/input.d.ts +1 -1
- package/dist/input.d.ts.map +1 -1
- package/dist/input.js +15 -7
- package/dist/input.js.map +1 -1
- package/dist/main.d.ts +4 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +22 -125
- package/dist/main.js.map +1 -1
- package/dist/mcp/actors.d.ts +22 -0
- package/dist/mcp/actors.d.ts.map +1 -0
- package/dist/mcp/actors.js +76 -0
- package/dist/mcp/actors.js.map +1 -0
- package/dist/mcp/client.d.ts +6 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +33 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/const.d.ts +3 -0
- package/dist/mcp/const.d.ts.map +1 -0
- package/dist/mcp/const.js +3 -0
- package/dist/mcp/const.js.map +1 -0
- package/dist/mcp/proxy.d.ts +4 -0
- package/dist/mcp/proxy.d.ts.map +1 -0
- package/dist/mcp/proxy.js +29 -0
- package/dist/mcp/proxy.js.map +1 -0
- package/dist/mcp/server.d.ts +41 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +191 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/utils.d.ts +26 -0
- package/dist/mcp/utils.d.ts.map +1 -0
- package/dist/mcp/utils.js +53 -0
- package/dist/mcp/utils.js.map +1 -0
- package/dist/stdio.d.ts +15 -0
- package/dist/stdio.d.ts.map +1 -0
- package/dist/stdio.js +57 -0
- package/dist/stdio.js.map +1 -0
- package/dist/tools/actor.d.ts +40 -0
- package/dist/tools/actor.d.ts.map +1 -0
- package/dist/tools/actor.js +138 -0
- package/dist/tools/actor.js.map +1 -0
- package/dist/tools/build.d.ts +13 -0
- package/dist/tools/build.d.ts.map +1 -0
- package/dist/tools/build.js +122 -0
- package/dist/tools/build.js.map +1 -0
- package/dist/tools/helpers.d.ts +19 -0
- package/dist/tools/helpers.d.ts.map +1 -0
- package/dist/tools/helpers.js +62 -0
- package/dist/tools/helpers.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/store_collection.d.ts +21 -0
- package/dist/tools/store_collection.d.ts.map +1 -0
- package/dist/tools/store_collection.js +82 -0
- package/dist/tools/store_collection.js.map +1 -0
- package/dist/tools/utils.d.ts +77 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +202 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +97 -10
- package/dist/types.d.ts.map +1 -1
- package/package.json +17 -14
- package/dist/actors.d.ts +0 -74
- package/dist/actors.d.ts.map +0 -1
- package/dist/actors.js +0 -327
- package/dist/actors.js.map +0 -1
- package/dist/logger.d.ts +0 -3
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -4
- package/dist/logger.js.map +0 -1
- package/dist/server.d.ts +0 -43
- package/dist/server.d.ts.map +0 -1
- package/dist/server.js +0 -178
- package/dist/server.js.map +0 -1
- package/dist/tools.d.ts +0 -46
- package/dist/tools.d.ts.map +0 -1
- package/dist/tools.js +0 -128
- package/dist/tools.js.map +0 -1
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAG9B,OAAO,GAAG,MAAM,YAAY,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG7G,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC;AAE7D,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;AAEnB,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,iBAA2B,CAAC,CAAC,CAAC,kBAAkB,CAAC;AAC7F,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAE9E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IAC3B,GAAG,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;IAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;AAExC,MAAM,KAAK,GAAG,YAAY,CAAC,MAAA,CAAC,MAAM,KAAK,CAAC,QAAQ,EAAkB,CAAC,mCAAK,EAAY,CAAC,CAAC;AACtF,GAAG,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAEpD,IAAI,YAAY,EAAE,CAAC;IACf,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9C,GAAG,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IAClD,kGAAkG;IAClG,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC;IAChD,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACpC,CAAC;IACD,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7B,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QAClB,GAAG,CAAC,IAAI,CAAC,0DAA0D,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;AACP,CAAC;KAAM,CAAC;IACJ,GAAG,CAAC,IAAI,CAAC,8FAA8F,CAAC,CAAC;IAEzG,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC;QACvD,MAAM,KAAK,CAAC,IAAI,CAAC,8GAA8G,CAAC,CAAC;IACrI,CAAC;IACD,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,mBAAmB,EAAsB,CAAC;IAC1E,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,UAAW,EAAE,KAAK,CAAC,eAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAErH,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,MAAM,uBAAuB,CAAC,CAAC;IACxD,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ActorDefinition } from 'apify-client';
|
|
2
|
+
export declare function isActorMCPServer(actorID: string, apifyToken: string): Promise<boolean>;
|
|
3
|
+
export declare function getActorsMCPServerPath(actorID: string, apifyToken: string): Promise<string | undefined>;
|
|
4
|
+
export declare function getActorsMCPServerURL(actorID: string, apifyToken: string): Promise<string>;
|
|
5
|
+
/**
|
|
6
|
+
* Gets Actor ID from the Actor object.
|
|
7
|
+
*
|
|
8
|
+
* @param actorID
|
|
9
|
+
* @param apifyToken
|
|
10
|
+
*/
|
|
11
|
+
export declare function getRealActorID(actorID: string, apifyToken: string): Promise<string>;
|
|
12
|
+
/**
|
|
13
|
+
* Returns standby URL for given Actor ID.
|
|
14
|
+
*
|
|
15
|
+
* @param actorID
|
|
16
|
+
* @param standbyBaseUrl
|
|
17
|
+
* @param apifyToken
|
|
18
|
+
* @returns
|
|
19
|
+
*/
|
|
20
|
+
export declare function getActorStandbyURL(actorID: string, apifyToken: string, standbyBaseUrl?: string): Promise<string>;
|
|
21
|
+
export declare function getActorDefinition(actorID: string, apifyToken: string): Promise<ActorDefinition>;
|
|
22
|
+
//# sourceMappingURL=actors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actors.d.ts","sourceRoot":"","sources":["../../src/mcp/actors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAIpD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAG5F;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAQ7G;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOhG;AAED;;;;;EAKE;AACF,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CASzF;AAED;;;;;;;EAOE;AACF,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,SAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAG7H;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA6BtG"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { ApifyClient, getApifyAPIBaseUrl } from '../apify-client.js';
|
|
2
|
+
export async function isActorMCPServer(actorID, apifyToken) {
|
|
3
|
+
const mcpPath = await getActorsMCPServerPath(actorID, apifyToken);
|
|
4
|
+
return ((mcpPath === null || mcpPath === void 0 ? void 0 : mcpPath.length) || 0) > 0;
|
|
5
|
+
}
|
|
6
|
+
export async function getActorsMCPServerPath(actorID, apifyToken) {
|
|
7
|
+
const actorDefinition = await getActorDefinition(actorID, apifyToken);
|
|
8
|
+
if ('webServerMcpPath' in actorDefinition && typeof actorDefinition.webServerMcpPath === 'string') {
|
|
9
|
+
return actorDefinition.webServerMcpPath;
|
|
10
|
+
}
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
export async function getActorsMCPServerURL(actorID, apifyToken) {
|
|
14
|
+
// TODO: get from API instead
|
|
15
|
+
const standbyBaseUrl = process.env.HOSTNAME === 'mcp-securitybyobscurity.apify.com'
|
|
16
|
+
? 'securitybyobscurity.apify.actor' : 'apify.actor';
|
|
17
|
+
const standbyUrl = await getActorStandbyURL(actorID, apifyToken, standbyBaseUrl);
|
|
18
|
+
const mcpPath = await getActorsMCPServerPath(actorID, apifyToken);
|
|
19
|
+
return `${standbyUrl}${mcpPath}`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Gets Actor ID from the Actor object.
|
|
23
|
+
*
|
|
24
|
+
* @param actorID
|
|
25
|
+
* @param apifyToken
|
|
26
|
+
*/
|
|
27
|
+
export async function getRealActorID(actorID, apifyToken) {
|
|
28
|
+
const apifyClient = new ApifyClient({ token: apifyToken });
|
|
29
|
+
const actor = apifyClient.actor(actorID);
|
|
30
|
+
const info = await actor.get();
|
|
31
|
+
if (!info) {
|
|
32
|
+
throw new Error(`Actor ${actorID} not found`);
|
|
33
|
+
}
|
|
34
|
+
return info.id;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Returns standby URL for given Actor ID.
|
|
38
|
+
*
|
|
39
|
+
* @param actorID
|
|
40
|
+
* @param standbyBaseUrl
|
|
41
|
+
* @param apifyToken
|
|
42
|
+
* @returns
|
|
43
|
+
*/
|
|
44
|
+
export async function getActorStandbyURL(actorID, apifyToken, standbyBaseUrl = 'apify.actor') {
|
|
45
|
+
const actorRealID = await getRealActorID(actorID, apifyToken);
|
|
46
|
+
return `https://${actorRealID}.${standbyBaseUrl}`;
|
|
47
|
+
}
|
|
48
|
+
export async function getActorDefinition(actorID, apifyToken) {
|
|
49
|
+
const apifyClient = new ApifyClient({ token: apifyToken });
|
|
50
|
+
const actor = apifyClient.actor(actorID);
|
|
51
|
+
const info = await actor.get();
|
|
52
|
+
if (!info) {
|
|
53
|
+
throw new Error(`Actor ${actorID} not found`);
|
|
54
|
+
}
|
|
55
|
+
const actorObjID = info.id;
|
|
56
|
+
const res = await fetch(`${getApifyAPIBaseUrl()}/v2/acts/${actorObjID}/builds/default`, {
|
|
57
|
+
headers: {
|
|
58
|
+
// This is done so tests can pass with public Actors without token
|
|
59
|
+
...(apifyToken ? { Authorization: `Bearer ${apifyToken}` } : {}),
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
if (!res.ok) {
|
|
63
|
+
throw new Error(`Failed to fetch default build for actor ${actorID}: ${res.statusText}`);
|
|
64
|
+
}
|
|
65
|
+
const json = await res.json(); // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
66
|
+
const buildInfo = json.data;
|
|
67
|
+
if (!buildInfo) {
|
|
68
|
+
throw new Error(`Default build for Actor ${actorID} not found`);
|
|
69
|
+
}
|
|
70
|
+
const { actorDefinition } = buildInfo;
|
|
71
|
+
if (!actorDefinition) {
|
|
72
|
+
throw new Error(`Actor default build ${actorID} does not have Actor definition`);
|
|
73
|
+
}
|
|
74
|
+
return actorDefinition;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=actors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actors.js","sourceRoot":"","sources":["../../src/mcp/actors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAKnE;;GAEG;AACH,wBAAsB,eAAe,CACjC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAC3B,OAAO,CAAC,MAAM,CAAC,CA8BjB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
|
|
3
|
+
import { getMCPServerID } from './utils.js';
|
|
4
|
+
/**
|
|
5
|
+
* Creates and connects a ModelContextProtocol client.
|
|
6
|
+
*/
|
|
7
|
+
export async function createMCPClient(url, token) {
|
|
8
|
+
const transport = new SSEClientTransport(new URL(url), {
|
|
9
|
+
requestInit: {
|
|
10
|
+
headers: {
|
|
11
|
+
authorization: `Bearer ${token}`,
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
eventSourceInit: {
|
|
15
|
+
// The EventSource package augments EventSourceInit with a "fetch" parameter.
|
|
16
|
+
// You can use this to set additional headers on the outgoing request.
|
|
17
|
+
// Based on this example: https://github.com/modelcontextprotocol/typescript-sdk/issues/118
|
|
18
|
+
async fetch(input, init) {
|
|
19
|
+
const headers = new Headers((init === null || init === void 0 ? void 0 : init.headers) || {});
|
|
20
|
+
headers.set('authorization', `Bearer ${token}`);
|
|
21
|
+
return fetch(input, { ...init, headers });
|
|
22
|
+
},
|
|
23
|
+
// We have to cast to "any" to use it, since it's non-standard
|
|
24
|
+
}, // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
25
|
+
});
|
|
26
|
+
const client = new Client({
|
|
27
|
+
name: getMCPServerID(url),
|
|
28
|
+
version: '1.0.0',
|
|
29
|
+
});
|
|
30
|
+
await client.connect(transport);
|
|
31
|
+
return client;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAE7E,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACjC,GAAW,EAAE,KAAa;IAE1B,MAAM,SAAS,GAAG,IAAI,kBAAkB,CACpC,IAAI,GAAG,CAAC,GAAG,CAAC,EACZ;QACI,WAAW,EAAE;YACT,OAAO,EAAE;gBACL,aAAa,EAAE,UAAU,KAAK,EAAE;aACnC;SACJ;QACD,eAAe,EAAE;YACb,6EAA6E;YAC7E,sEAAsE;YACtE,2FAA2F;YAC3F,KAAK,CAAC,KAAK,CAAC,KAA6B,EAAE,IAAkB;gBACzD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,KAAI,EAAE,CAAC,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC;gBAChD,OAAO,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9C,CAAC;YACL,8DAA8D;SACtD,EAAE,yDAAyD;KACtE,CAAC,CAAC;IAEP,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACtB,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC;QACzB,OAAO,EAAE,OAAO;KACnB,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"const.d.ts","sourceRoot":"","sources":["../../src/mcp/const.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,gBAAgB,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../src/mcp/const.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import type { ToolWrap } from '../types.js';
|
|
3
|
+
export declare function getMCPServerTools(actorID: string, client: Client, serverUrl: string): Promise<ToolWrap[]>;
|
|
4
|
+
//# sourceMappingURL=proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/mcp/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGxE,OAAO,KAAK,EAAgB,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG1D,wBAAsB,iBAAiB,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EAEd,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,QAAQ,EAAE,CAAC,CA6BrB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import Ajv from 'ajv';
|
|
2
|
+
import { getMCPServerID, getProxyMCPServerToolName } from './utils.js';
|
|
3
|
+
export async function getMCPServerTools(actorID, client,
|
|
4
|
+
// Name of the MCP server
|
|
5
|
+
serverUrl) {
|
|
6
|
+
const res = await client.listTools();
|
|
7
|
+
const { tools } = res;
|
|
8
|
+
const ajv = new Ajv({ coerceTypes: 'array', strict: false });
|
|
9
|
+
const compiledTools = [];
|
|
10
|
+
for (const tool of tools) {
|
|
11
|
+
const mcpTool = {
|
|
12
|
+
actorID,
|
|
13
|
+
serverId: getMCPServerID(serverUrl),
|
|
14
|
+
serverUrl,
|
|
15
|
+
originToolName: tool.name,
|
|
16
|
+
name: getProxyMCPServerToolName(serverUrl, tool.name),
|
|
17
|
+
description: tool.description || '',
|
|
18
|
+
inputSchema: tool.inputSchema,
|
|
19
|
+
ajvValidate: ajv.compile(tool.inputSchema),
|
|
20
|
+
};
|
|
21
|
+
const wrap = {
|
|
22
|
+
type: 'actor-mcp',
|
|
23
|
+
tool: mcpTool,
|
|
24
|
+
};
|
|
25
|
+
compiledTools.push(wrap);
|
|
26
|
+
}
|
|
27
|
+
return compiledTools;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/mcp/proxy.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,KAAK,CAAC;AAGtB,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACnC,OAAe,EACf,MAAc;AACd,yBAAyB;AACzB,SAAiB;IAEjB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;IACrC,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IAEtB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAE7D,MAAM,aAAa,GAAe,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,OAAO,GAAiB;YAC1B,OAAO;YACP,QAAQ,EAAE,cAAc,CAAC,SAAS,CAAC;YACnC,SAAS;YACT,cAAc,EAAE,IAAI,CAAC,IAAI;YAEzB,IAAI,EAAE,yBAAyB,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC;YACrD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YACnC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;SAC7C,CAAC;QAEF,MAAM,IAAI,GAAa;YACnB,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,OAAO;SAChB,CAAC;QAEF,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,aAAa,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Context Protocol (MCP) server for Apify Actors
|
|
3
|
+
*/
|
|
4
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
5
|
+
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
6
|
+
import type { ToolWrap } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Create Apify MCP server
|
|
9
|
+
*/
|
|
10
|
+
export declare class ActorsMcpServer {
|
|
11
|
+
readonly server: Server;
|
|
12
|
+
readonly tools: Map<string, ToolWrap>;
|
|
13
|
+
constructor();
|
|
14
|
+
/**
|
|
15
|
+
* Loads missing default tools.
|
|
16
|
+
*/
|
|
17
|
+
loadDefaultTools(apifyToken: string): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Loads tools from URL params.
|
|
20
|
+
*
|
|
21
|
+
* This method also handles enabling of Actor auto loading via the processParamsGetTools.
|
|
22
|
+
*
|
|
23
|
+
* Used primarily for SSE.
|
|
24
|
+
*/
|
|
25
|
+
loadToolsFromUrl(url: string, apifyToken: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Upsert new tools.
|
|
28
|
+
* @param tools - Array of tool wrappers.
|
|
29
|
+
* @returns Array of tool wrappers.
|
|
30
|
+
*/
|
|
31
|
+
updateTools(tools: ToolWrap[]): ToolWrap[];
|
|
32
|
+
/**
|
|
33
|
+
* Returns an array of tool names.
|
|
34
|
+
* @returns {string[]} - An array of tool names.
|
|
35
|
+
*/
|
|
36
|
+
getToolNames(): string[];
|
|
37
|
+
private setupErrorHandling;
|
|
38
|
+
private setupToolHandlers;
|
|
39
|
+
connect(transport: Transport): Promise<void>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAe/E,OAAO,KAAK,EAAuC,QAAQ,EAAE,MAAM,aAAa,CAAC;AAIjF;;GAEG;AACH,qBAAa,eAAe;IACxB,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;;IAuB7C;;OAEG;IACU,gBAAgB,CAAC,UAAU,EAAE,MAAM;IAMhD;;;;;;OAMG;IACU,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAK7D;;;;OAIG;IACI,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE;IAQpC;;;OAGG;IACI,YAAY,IAAI,MAAM,EAAE;IAI/B,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,iBAAiB;IA0GnB,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAGrD"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Context Protocol (MCP) server for Apify Actors
|
|
3
|
+
*/
|
|
4
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
5
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
6
|
+
import log from '@apify/log';
|
|
7
|
+
import { ACTOR_OUTPUT_MAX_CHARS_PER_ITEM, ACTOR_OUTPUT_TRUNCATED_MESSAGE, defaults, SERVER_NAME, SERVER_VERSION, } from '../const.js';
|
|
8
|
+
import { actorDefinitionTool, callActorGetDataset, getActorsAsTools, searchTool } from '../tools/index.js';
|
|
9
|
+
import { actorNameToToolName } from '../tools/utils.js';
|
|
10
|
+
import { createMCPClient } from './client.js';
|
|
11
|
+
import { processParamsGetTools } from './utils.js';
|
|
12
|
+
/**
|
|
13
|
+
* Create Apify MCP server
|
|
14
|
+
*/
|
|
15
|
+
export class ActorsMcpServer {
|
|
16
|
+
constructor() {
|
|
17
|
+
Object.defineProperty(this, "server", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true,
|
|
21
|
+
value: void 0
|
|
22
|
+
});
|
|
23
|
+
Object.defineProperty(this, "tools", {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
configurable: true,
|
|
26
|
+
writable: true,
|
|
27
|
+
value: void 0
|
|
28
|
+
});
|
|
29
|
+
this.server = new Server({
|
|
30
|
+
name: SERVER_NAME,
|
|
31
|
+
version: SERVER_VERSION,
|
|
32
|
+
}, {
|
|
33
|
+
capabilities: {
|
|
34
|
+
tools: { listChanged: true },
|
|
35
|
+
logging: {},
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
this.tools = new Map();
|
|
39
|
+
this.setupErrorHandling();
|
|
40
|
+
this.setupToolHandlers();
|
|
41
|
+
// Add default tools
|
|
42
|
+
this.updateTools([searchTool, actorDefinitionTool]);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Loads missing default tools.
|
|
46
|
+
*/
|
|
47
|
+
async loadDefaultTools(apifyToken) {
|
|
48
|
+
const missingDefaultTools = defaults.actors.filter((name) => !this.tools.has(actorNameToToolName(name)));
|
|
49
|
+
const tools = await getActorsAsTools(missingDefaultTools, apifyToken);
|
|
50
|
+
if (tools.length > 0)
|
|
51
|
+
this.updateTools(tools);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Loads tools from URL params.
|
|
55
|
+
*
|
|
56
|
+
* This method also handles enabling of Actor auto loading via the processParamsGetTools.
|
|
57
|
+
*
|
|
58
|
+
* Used primarily for SSE.
|
|
59
|
+
*/
|
|
60
|
+
async loadToolsFromUrl(url, apifyToken) {
|
|
61
|
+
const tools = await processParamsGetTools(url, apifyToken);
|
|
62
|
+
if (tools.length > 0)
|
|
63
|
+
this.updateTools(tools);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Upsert new tools.
|
|
67
|
+
* @param tools - Array of tool wrappers.
|
|
68
|
+
* @returns Array of tool wrappers.
|
|
69
|
+
*/
|
|
70
|
+
updateTools(tools) {
|
|
71
|
+
for (const wrap of tools) {
|
|
72
|
+
this.tools.set(wrap.tool.name, wrap);
|
|
73
|
+
log.info(`Added/updated tool: ${wrap.tool.name}`);
|
|
74
|
+
}
|
|
75
|
+
return tools;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Returns an array of tool names.
|
|
79
|
+
* @returns {string[]} - An array of tool names.
|
|
80
|
+
*/
|
|
81
|
+
getToolNames() {
|
|
82
|
+
return Array.from(this.tools.keys());
|
|
83
|
+
}
|
|
84
|
+
setupErrorHandling() {
|
|
85
|
+
this.server.onerror = (error) => {
|
|
86
|
+
console.error('[MCP Error]', error); // eslint-disable-line no-console
|
|
87
|
+
};
|
|
88
|
+
process.on('SIGINT', async () => {
|
|
89
|
+
await this.server.close();
|
|
90
|
+
process.exit(0);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
setupToolHandlers() {
|
|
94
|
+
/**
|
|
95
|
+
* Handles the request to list tools.
|
|
96
|
+
* @param {object} request - The request object.
|
|
97
|
+
* @returns {object} - The response object containing the tools.
|
|
98
|
+
*/
|
|
99
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
100
|
+
// TODO if there is actor-mcp as a tool, also list the tools from that Actor
|
|
101
|
+
const tools = Array.from(this.tools.values()).map((tool) => (tool.tool));
|
|
102
|
+
return { tools };
|
|
103
|
+
});
|
|
104
|
+
/**
|
|
105
|
+
* Handles the request to call a tool.
|
|
106
|
+
* @param {object} request - The request object containing tool name and arguments.
|
|
107
|
+
* @throws {Error} - Throws an error if the tool is unknown or arguments are invalid.
|
|
108
|
+
*/
|
|
109
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
110
|
+
const { name, arguments: args } = request.params;
|
|
111
|
+
const apifyToken = (request.params.apifyToken || process.env.APIFY_TOKEN);
|
|
112
|
+
// Remove apifyToken from request.params just in case
|
|
113
|
+
delete request.params.apifyToken;
|
|
114
|
+
// Validate token
|
|
115
|
+
if (!apifyToken) {
|
|
116
|
+
throw new Error('APIFY_TOKEN is required but not set in the environment variables or passed as a parameter.');
|
|
117
|
+
}
|
|
118
|
+
// TODO - log errors
|
|
119
|
+
// TODO: handle errors better, server.sendLoggingMessage ( )
|
|
120
|
+
// TODO - do not raise but return mcp errors
|
|
121
|
+
// TODO - if connection is /mcp client will not receive notification on tool change
|
|
122
|
+
// Find tool by name or actor full name
|
|
123
|
+
const tool = Array.from(this.tools.values())
|
|
124
|
+
.find((t) => t.tool.name === name || (t.type === 'actor' && t.tool.actorFullName === name));
|
|
125
|
+
if (!tool) {
|
|
126
|
+
await this.server.sendLoggingMessage({ level: 'info', data: `Unknown tool $\{name}, available tools ${this.getToolNames()}` });
|
|
127
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
128
|
+
}
|
|
129
|
+
if (!args) {
|
|
130
|
+
throw new Error(`Missing arguments for tool: ${name}`);
|
|
131
|
+
}
|
|
132
|
+
log.info(`Validate arguments for tool: ${tool.tool.name} with arguments: ${JSON.stringify(args)}`);
|
|
133
|
+
if (!tool.tool.ajvValidate(args)) {
|
|
134
|
+
throw new Error(`Invalid arguments for tool ${tool.tool.name}: args: ${JSON.stringify(args)} error: ${JSON.stringify(tool === null || tool === void 0 ? void 0 : tool.tool.ajvValidate.errors)}`);
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
// Handle internal tool
|
|
138
|
+
if (tool.type === 'internal') {
|
|
139
|
+
const internalTool = tool.tool;
|
|
140
|
+
const res = await internalTool.call({
|
|
141
|
+
args,
|
|
142
|
+
apifyMcpServer: this,
|
|
143
|
+
mcpServer: this.server,
|
|
144
|
+
apifyToken,
|
|
145
|
+
});
|
|
146
|
+
return { ...res };
|
|
147
|
+
}
|
|
148
|
+
if (tool.type === 'actor-mcp') {
|
|
149
|
+
const serverTool = tool.tool;
|
|
150
|
+
let client;
|
|
151
|
+
try {
|
|
152
|
+
client = await createMCPClient(serverTool.serverUrl, apifyToken);
|
|
153
|
+
const res = await client.callTool({
|
|
154
|
+
name: serverTool.originToolName,
|
|
155
|
+
arguments: args,
|
|
156
|
+
});
|
|
157
|
+
return { ...res };
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
if (client)
|
|
161
|
+
await client.close();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Handle actor tool
|
|
165
|
+
if (tool.type === 'actor') {
|
|
166
|
+
const actorTool = tool.tool;
|
|
167
|
+
const callOptions = {
|
|
168
|
+
memory: actorTool.memoryMbytes,
|
|
169
|
+
};
|
|
170
|
+
const items = await callActorGetDataset(actorTool.actorFullName, args, apifyToken, callOptions);
|
|
171
|
+
const content = items.map((item) => {
|
|
172
|
+
const text = JSON.stringify(item).slice(0, ACTOR_OUTPUT_MAX_CHARS_PER_ITEM);
|
|
173
|
+
return text.length === ACTOR_OUTPUT_MAX_CHARS_PER_ITEM
|
|
174
|
+
? { type: 'text', text: `${text} ... ${ACTOR_OUTPUT_TRUNCATED_MESSAGE}` }
|
|
175
|
+
: { type: 'text', text };
|
|
176
|
+
});
|
|
177
|
+
return { content };
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
log.error(`Error calling tool: ${error}`);
|
|
182
|
+
throw new Error(`Error calling tool: ${error}`);
|
|
183
|
+
}
|
|
184
|
+
throw new Error(`Tool ${name} is not implemented`);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
async connect(transport) {
|
|
188
|
+
await this.server.connect(transport);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Input, ToolWrap } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generates a unique server ID based on the provided URL.
|
|
4
|
+
*
|
|
5
|
+
* URL is used instead of Actor ID becase one Actor may expose multiple servers - legacy SSE / streamable HTTP.
|
|
6
|
+
*
|
|
7
|
+
* @param url The URL to generate the server ID from.
|
|
8
|
+
* @returns A unique server ID.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getMCPServerID(url: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Generates a unique tool name based on the provided URL and tool name.
|
|
13
|
+
* @param url The URL to generate the tool name from.
|
|
14
|
+
* @param toolName The tool name to generate the tool name from.
|
|
15
|
+
* @returns A unique tool name.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getProxyMCPServerToolName(url: string, toolName: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* Process input parameters and get tools
|
|
20
|
+
* If URL contains query parameter `actors`, return tools from Actors otherwise return null.
|
|
21
|
+
* @param url
|
|
22
|
+
* @param apifyToken
|
|
23
|
+
*/
|
|
24
|
+
export declare function processParamsGetTools(url: string, apifyToken: string): Promise<ToolWrap[]>;
|
|
25
|
+
export declare function parseInputParamsFromUrl(url: string): Input;
|
|
26
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/mcp/utils.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGnD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK/E;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,uBAY1E;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAI1D"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { parse } from 'node:querystring';
|
|
3
|
+
import { processInput } from '../input.js';
|
|
4
|
+
import { addTool, getActorsAsTools, removeTool } from '../tools/index.js';
|
|
5
|
+
import { MAX_TOOL_NAME_LENGTH, SERVER_ID_LENGTH } from './const.js';
|
|
6
|
+
/**
|
|
7
|
+
* Generates a unique server ID based on the provided URL.
|
|
8
|
+
*
|
|
9
|
+
* URL is used instead of Actor ID becase one Actor may expose multiple servers - legacy SSE / streamable HTTP.
|
|
10
|
+
*
|
|
11
|
+
* @param url The URL to generate the server ID from.
|
|
12
|
+
* @returns A unique server ID.
|
|
13
|
+
*/
|
|
14
|
+
export function getMCPServerID(url) {
|
|
15
|
+
const serverHashDigest = createHash('sha256').update(url).digest('hex');
|
|
16
|
+
return serverHashDigest.slice(0, SERVER_ID_LENGTH);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generates a unique tool name based on the provided URL and tool name.
|
|
20
|
+
* @param url The URL to generate the tool name from.
|
|
21
|
+
* @param toolName The tool name to generate the tool name from.
|
|
22
|
+
* @returns A unique tool name.
|
|
23
|
+
*/
|
|
24
|
+
export function getProxyMCPServerToolName(url, toolName) {
|
|
25
|
+
const prefix = getMCPServerID(url);
|
|
26
|
+
const fullName = `${prefix}-${toolName}`;
|
|
27
|
+
return fullName.slice(0, MAX_TOOL_NAME_LENGTH);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Process input parameters and get tools
|
|
31
|
+
* If URL contains query parameter `actors`, return tools from Actors otherwise return null.
|
|
32
|
+
* @param url
|
|
33
|
+
* @param apifyToken
|
|
34
|
+
*/
|
|
35
|
+
export async function processParamsGetTools(url, apifyToken) {
|
|
36
|
+
const input = parseInputParamsFromUrl(url);
|
|
37
|
+
let tools = [];
|
|
38
|
+
if (input.actors) {
|
|
39
|
+
const actors = input.actors;
|
|
40
|
+
// Normal Actors as a tool
|
|
41
|
+
tools = await getActorsAsTools(actors, apifyToken);
|
|
42
|
+
}
|
|
43
|
+
if (input.enableAddingActors) {
|
|
44
|
+
tools.push(addTool, removeTool);
|
|
45
|
+
}
|
|
46
|
+
return tools;
|
|
47
|
+
}
|
|
48
|
+
export function parseInputParamsFromUrl(url) {
|
|
49
|
+
const query = url.split('?')[1] || '';
|
|
50
|
+
const params = parse(query);
|
|
51
|
+
return processInput(params);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/mcp/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE1E,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACtC,MAAM,gBAAgB,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAExE,OAAO,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAW,EAAE,QAAgB;IACnE,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAEnC,MAAM,QAAQ,GAAG,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC;IACzC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;AACnD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAW,EAAE,UAAkB;IACvE,MAAM,KAAK,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,KAAK,GAAe,EAAE,CAAC;IAC3B,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,CAAC,MAAkB,CAAC;QACxC,0BAA0B;QAC1B,KAAK,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAW;IAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAqB,CAAC;IAChD,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC"}
|
package/dist/stdio.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* This script initializes and starts the Apify MCP server using the Stdio transport.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* node <script_name> --actors=<actor1,actor2,...>
|
|
7
|
+
*
|
|
8
|
+
* Command-line arguments:
|
|
9
|
+
* --actors - A comma-separated list of Actor full names to add to the server.
|
|
10
|
+
*
|
|
11
|
+
* Example:
|
|
12
|
+
* node stdio.js --actors=apify/google-search-scraper,apify/instagram-scraper
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=stdio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG"}
|