@apify/actors-mcp-server 0.3.8 → 0.4.0

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.
Files changed (80) hide show
  1. package/README.md +92 -20
  2. package/dist/actor/server.d.ts +1 -5
  3. package/dist/actor/server.d.ts.map +1 -1
  4. package/dist/actor/server.js +7 -24
  5. package/dist/actor/server.js.map +1 -1
  6. package/dist/apify-client.d.ts.map +1 -1
  7. package/dist/apify-client.js +11 -0
  8. package/dist/apify-client.js.map +1 -1
  9. package/dist/const.d.ts +1 -1
  10. package/dist/const.d.ts.map +1 -1
  11. package/dist/const.js +1 -1
  12. package/dist/const.js.map +1 -1
  13. package/dist/index-internals.d.ts +6 -4
  14. package/dist/index-internals.d.ts.map +1 -1
  15. package/dist/index-internals.js +6 -4
  16. package/dist/index-internals.js.map +1 -1
  17. package/dist/input.d.ts +11 -3
  18. package/dist/input.d.ts.map +1 -1
  19. package/dist/input.js +64 -20
  20. package/dist/input.js.map +1 -1
  21. package/dist/main.js +3 -15
  22. package/dist/main.js.map +1 -1
  23. package/dist/mcp/server.d.ts +6 -30
  24. package/dist/mcp/server.d.ts.map +1 -1
  25. package/dist/mcp/server.js +14 -82
  26. package/dist/mcp/server.js.map +1 -1
  27. package/dist/stdio.js +27 -26
  28. package/dist/stdio.js.map +1 -1
  29. package/dist/tools/actor.d.ts.map +1 -1
  30. package/dist/tools/actor.js +75 -40
  31. package/dist/tools/actor.js.map +1 -1
  32. package/dist/tools/fetch-actor-details.d.ts +3 -0
  33. package/dist/tools/fetch-actor-details.d.ts.map +1 -0
  34. package/dist/tools/fetch-actor-details.js +45 -0
  35. package/dist/tools/fetch-actor-details.js.map +1 -0
  36. package/dist/tools/helpers.d.ts.map +1 -1
  37. package/dist/tools/helpers.js +3 -5
  38. package/dist/tools/helpers.js.map +1 -1
  39. package/dist/tools/index.d.ts +2 -2
  40. package/dist/tools/index.d.ts.map +1 -1
  41. package/dist/tools/index.js +12 -13
  42. package/dist/tools/index.js.map +1 -1
  43. package/dist/tools/utils.js +1 -1
  44. package/dist/tools/utils.js.map +1 -1
  45. package/dist/tsconfig.tsbuildinfo +1 -1
  46. package/dist/types.d.ts +17 -3
  47. package/dist/types.d.ts.map +1 -1
  48. package/dist/utils/actor-details.d.ts +11 -0
  49. package/dist/utils/actor-details.d.ts.map +1 -0
  50. package/dist/utils/actor-details.js +27 -0
  51. package/dist/utils/actor-details.js.map +1 -0
  52. package/dist/utils/tools-loader.d.ts +1 -2
  53. package/dist/utils/tools-loader.d.ts.map +1 -1
  54. package/dist/utils/tools-loader.js +98 -24
  55. package/dist/utils/tools-loader.js.map +1 -1
  56. package/dist/utils/tools.d.ts +9 -1
  57. package/dist/utils/tools.d.ts.map +1 -1
  58. package/dist/utils/tools.js +14 -0
  59. package/dist/utils/tools.js.map +1 -1
  60. package/package.json +5 -5
  61. package/dist/examples/clientSse.d.ts +0 -18
  62. package/dist/examples/clientSse.d.ts.map +0 -1
  63. package/dist/examples/clientSse.js +0 -85
  64. package/dist/examples/clientSse.js.map +0 -1
  65. package/dist/examples/clientStdio.d.ts +0 -8
  66. package/dist/examples/clientStdio.d.ts.map +0 -1
  67. package/dist/examples/clientStdio.js +0 -68
  68. package/dist/examples/clientStdio.js.map +0 -1
  69. package/dist/examples/clientStdioChat.d.ts +0 -23
  70. package/dist/examples/clientStdioChat.d.ts.map +0 -1
  71. package/dist/examples/clientStdioChat.js +0 -216
  72. package/dist/examples/clientStdioChat.js.map +0 -1
  73. package/dist/examples/clientStreamableHttp.d.ts +0 -2
  74. package/dist/examples/clientStreamableHttp.d.ts.map +0 -1
  75. package/dist/examples/clientStreamableHttp.js +0 -96
  76. package/dist/examples/clientStreamableHttp.js.map +0 -1
  77. package/dist/tools/get-actor-details.d.ts +0 -3
  78. package/dist/tools/get-actor-details.d.ts.map +0 -1
  79. package/dist/tools/get-actor-details.js +0 -59
  80. package/dist/tools/get-actor-details.js.map +0 -1
@@ -1,216 +0,0 @@
1
- /* eslint-disable no-console */
2
- /**
3
- * Create a simple chat client that connects to the Model Context Protocol server using the stdio transport.
4
- * Based on the user input, the client sends a query to the MCP server, retrieves results and processes them.
5
- *
6
- * You can expect the following output:
7
- *
8
- * MCP Client Started!
9
- * Type your queries or 'quit|q|exit' to exit.
10
- * You: Find to articles about AI agent and return URLs
11
- * [internal] Received response from Claude: [{"type":"text","text":"I'll search for information about AI agents
12
- * and provide you with a summary."},{"type":"tool_use","id":"tool_01He9TkzQfh2979bbeuxWVqM","name":"search",
13
- * "input":{"query":"what are AI agents definition capabilities applications","maxResults":2}}]
14
- * [internal] Calling tool: {"name":"search","arguments":{"query":"what are AI agents definition ...
15
- * I can help analyze the provided content about AI agents.
16
- * This appears to be crawled content from AWS and IBM websites explaining what AI agents are.
17
- * Let me summarize the key points:
18
- */
19
- import { execSync } from 'node:child_process';
20
- import path from 'node:path';
21
- import * as readline from 'node:readline';
22
- import { fileURLToPath } from 'node:url';
23
- import { Anthropic } from '@anthropic-ai/sdk'; // eslint-disable-line import/no-extraneous-dependencies
24
- import { Client } from '@modelcontextprotocol/sdk/client/index.js';
25
- import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
26
- import { CallToolResultSchema } from '@modelcontextprotocol/sdk/types.js';
27
- import dotenv from 'dotenv'; // eslint-disable-line import/no-extraneous-dependencies
28
- const filename = fileURLToPath(import.meta.url);
29
- const dirname = path.dirname(filename);
30
- dotenv.config({ path: path.resolve(dirname, '../../.env') });
31
- const REQUEST_TIMEOUT = 120000; // 2 minutes
32
- const MAX_TOKENS = 2048; // Maximum tokens for Claude response
33
- // const CLAUDE_MODEL = 'claude-3-5-sonnet-20241022'; // the most intelligent model
34
- // const CLAUDE_MODEL = 'claude-3-5-haiku-20241022'; // a fastest model
35
- const CLAUDE_MODEL = 'claude-3-haiku-20240307'; // a fastest and most compact model for near-instant responsiveness
36
- const DEBUG = true;
37
- const DEBUG_SERVER_PATH = path.resolve(dirname, '../../dist/stdio.js');
38
- const NODE_PATH = execSync('which node').toString().trim();
39
- dotenv.config(); // Load environment variables from .env
40
- class MCPClient {
41
- constructor() {
42
- Object.defineProperty(this, "anthropic", {
43
- enumerable: true,
44
- configurable: true,
45
- writable: true,
46
- value: void 0
47
- });
48
- Object.defineProperty(this, "client", {
49
- enumerable: true,
50
- configurable: true,
51
- writable: true,
52
- value: new Client({
53
- name: 'example-client',
54
- version: '0.1.0',
55
- }, {
56
- capabilities: {}, // Optional capabilities
57
- })
58
- });
59
- Object.defineProperty(this, "tools", {
60
- enumerable: true,
61
- configurable: true,
62
- writable: true,
63
- value: []
64
- });
65
- this.anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY });
66
- }
67
- /**
68
- * Start the server using node and provided server script path.
69
- * Connect to the server using stdio transport and list available tools.
70
- */
71
- async connectToServer(serverArgs) {
72
- const transport = new StdioClientTransport({
73
- command: NODE_PATH,
74
- args: serverArgs,
75
- env: { APIFY_TOKEN: process.env.APIFY_TOKEN || '' },
76
- });
77
- await this.client.connect(transport);
78
- const response = await this.client.listTools();
79
- this.tools = response.tools.map((x) => ({
80
- name: x.name,
81
- description: x.description,
82
- input_schema: x.inputSchema,
83
- }));
84
- console.log('Connected to server with tools:', this.tools.map((x) => x.name));
85
- }
86
- /**
87
- * Process LLM response and check whether it contains any tool calls.
88
- * If a tool call is found, call the tool and return the response and save the results to messages with type: user.
89
- * If the tools response is too large, truncate it to the limit.
90
- */
91
- async processMsg(response, messages) {
92
- for (const content of response.content) {
93
- if (content.type === 'text') {
94
- messages.push({ role: 'assistant', content: content.text });
95
- }
96
- else if (content.type === 'tool_use') {
97
- await this.handleToolCall(content, messages);
98
- }
99
- }
100
- return messages;
101
- }
102
- /**
103
- * Call the tool and return the response.
104
- */
105
- async handleToolCall(content, messages, toolCallCount = 0) {
106
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
107
- const params = { name: content.name, arguments: content.input };
108
- console.log(`[internal] Calling tool (count: ${toolCallCount}): ${JSON.stringify(params)}`);
109
- let results;
110
- try {
111
- results = await this.client.callTool(params, CallToolResultSchema, { timeout: REQUEST_TIMEOUT });
112
- if (results.content instanceof Array && results.content.length !== 0) {
113
- const text = results.content.map((x) => x.text);
114
- messages.push({ role: 'user', content: `Tool result: ${text.join('\n\n')}` });
115
- }
116
- else {
117
- messages.push({ role: 'user', content: `No results retrieved from ${params.name}` });
118
- }
119
- }
120
- catch (error) {
121
- messages.push({ role: 'user', content: `Error calling tool: ${params.name}, error: ${error}` });
122
- }
123
- // Get next response from Claude
124
- const nextResponse = await this.anthropic.messages.create({
125
- model: CLAUDE_MODEL,
126
- max_tokens: MAX_TOKENS,
127
- messages,
128
- tools: this.tools, // eslint-disable-line @typescript-eslint/no-explicit-any
129
- });
130
- for (const c of nextResponse.content) {
131
- if (c.type === 'text') {
132
- messages.push({ role: 'assistant', content: c.text });
133
- }
134
- else if (c.type === 'tool_use' && toolCallCount < 3) {
135
- return await this.handleToolCall(c, messages, toolCallCount + 1);
136
- }
137
- }
138
- return messages;
139
- }
140
- /**
141
- * Process user query by sending it to the server and returning the response.
142
- * Also, process any tool calls.
143
- */
144
- async processQuery(query, messages) {
145
- messages.push({ role: 'user', content: query });
146
- const response = await this.anthropic.messages.create({
147
- model: CLAUDE_MODEL,
148
- max_tokens: MAX_TOKENS,
149
- messages,
150
- tools: this.tools, // eslint-disable-line @typescript-eslint/no-explicit-any
151
- });
152
- console.log('[internal] Received response from Claude:', JSON.stringify(response.content));
153
- return await this.processMsg(response, messages);
154
- }
155
- /**
156
- * Create a chat loop that reads user input from the console and sends it to the server for processing.
157
- */
158
- async chatLoop() {
159
- const rl = readline.createInterface({
160
- input: process.stdin,
161
- output: process.stdout,
162
- prompt: 'You: ',
163
- });
164
- console.log("MCP Client Started!\nType your queries or 'quit|q|exit' to exit.");
165
- rl.prompt();
166
- let lastPrintMessage = 0;
167
- const messages = [];
168
- rl.on('line', async (input) => {
169
- const v = input.trim().toLowerCase();
170
- if (v === 'quit' || v === 'q' || v === 'exit') {
171
- rl.close();
172
- return;
173
- }
174
- try {
175
- await this.processQuery(input, messages);
176
- for (let i = lastPrintMessage + 1; i < messages.length; i++) {
177
- if (messages[i].role === 'assistant') {
178
- console.log('CLAUDE:', messages[i].content);
179
- }
180
- else if (messages[i].role === 'user') {
181
- console.log('USER:', messages[i].content.slice(0, 500), '...');
182
- }
183
- else {
184
- console.log('CLAUDE[thinking]:', messages[i].content);
185
- }
186
- }
187
- lastPrintMessage += messages.length;
188
- }
189
- catch (error) {
190
- console.error('Error processing query:', error);
191
- }
192
- rl.prompt();
193
- });
194
- }
195
- }
196
- async function main() {
197
- const client = new MCPClient();
198
- if (process.argv.length < 3) {
199
- if (DEBUG) {
200
- process.argv.push(DEBUG_SERVER_PATH);
201
- }
202
- else {
203
- console.error('Usage: node <path_to_server_script>');
204
- process.exit(1);
205
- }
206
- }
207
- try {
208
- await client.connectToServer(process.argv.slice(2));
209
- await client.chatLoop();
210
- }
211
- catch (error) {
212
- console.error('Error:', error);
213
- }
214
- }
215
- main().catch(console.error);
216
- //# sourceMappingURL=clientStdioChat.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clientStdioChat.js","sourceRoot":"","sources":["../../src/examples/clientStdioChat.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=clientStreamableHttp.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clientStreamableHttp.d.ts","sourceRoot":"","sources":["../../src/examples/clientStreamableHttp.ts"],"names":[],"mappings":""}
@@ -1,96 +0,0 @@
1
- import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
- import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
3
- import { CallToolResultSchema, ListToolsResultSchema, LoggingMessageNotificationSchema, } from '@modelcontextprotocol/sdk/types.js';
4
- import log from '@apify/log';
5
- import { HelperTools } from '../const.js';
6
- log.setLevel(log.LEVELS.DEBUG);
7
- async function main() {
8
- // Create a new client with streamable HTTP transport
9
- const client = new Client({
10
- name: 'example-client',
11
- version: '1.0.0',
12
- });
13
- const transport = new StreamableHTTPClientTransport(new URL('http://localhost:3000/mcp'));
14
- // Connect the client using the transport and initialize the server
15
- await client.connect(transport);
16
- log.debug('Connected to MCP server');
17
- // Set up notification handlers for server-initiated messages
18
- client.setNotificationHandler(LoggingMessageNotificationSchema, (notification) => {
19
- log.debug('Notification received', { level: notification.params.level, data: notification.params.data });
20
- });
21
- // List and call tools
22
- await listTools(client);
23
- await callSearchTool(client);
24
- await callActor(client);
25
- // Keep the connection open to receive notifications
26
- log.debug('\nKeeping connection open to receive notifications. Press Ctrl+C to exit.');
27
- }
28
- async function listTools(client) {
29
- try {
30
- const toolsRequest = {
31
- method: 'tools/list',
32
- params: {},
33
- };
34
- const toolsResult = await client.request(toolsRequest, ListToolsResultSchema);
35
- log.debug('Tools available', { itemCount: toolsResult.tools.length });
36
- for (const tool of toolsResult.tools) {
37
- log.debug('Tool detail', { toolName: tool.name, description: tool.description });
38
- }
39
- if (toolsResult.tools.length === 0) {
40
- log.debug('No tools available from the server');
41
- }
42
- }
43
- catch (error) {
44
- log.error('Tools not supported by this server', { error });
45
- }
46
- }
47
- async function callSearchTool(client) {
48
- try {
49
- const searchRequest = {
50
- method: 'tools/call',
51
- params: {
52
- name: HelperTools.STORE_SEARCH,
53
- arguments: { search: 'rag web browser', limit: 1 },
54
- },
55
- };
56
- const searchResult = await client.request(searchRequest, CallToolResultSchema);
57
- log.debug('Search result:');
58
- const resultContent = searchResult.content || [];
59
- resultContent.forEach((item) => {
60
- if (item.type === 'text') {
61
- log.debug('Search result item', { text: item.text });
62
- }
63
- });
64
- }
65
- catch (error) {
66
- log.error('Error calling greet tool', { error });
67
- }
68
- }
69
- async function callActor(client) {
70
- try {
71
- log.debug('\nCalling Actor...');
72
- const actorRequest = {
73
- method: 'tools/call',
74
- params: {
75
- name: 'apify/rag-web-browser',
76
- arguments: { query: 'apify mcp server' },
77
- },
78
- };
79
- const actorResult = await client.request(actorRequest, CallToolResultSchema);
80
- log.debug('Actor results:');
81
- const resultContent = actorResult.content || [];
82
- resultContent.forEach((item) => {
83
- if (item.type === 'text') {
84
- log.debug('Actor result item', { text: item.text });
85
- }
86
- });
87
- }
88
- catch (error) {
89
- log.error('Error calling Actor', { error });
90
- }
91
- }
92
- main().catch((error) => {
93
- log.error('Error running MCP client', { error: error });
94
- process.exit(1);
95
- });
96
- //# sourceMappingURL=clientStreamableHttp.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clientStreamableHttp.js","sourceRoot":"","sources":["../../src/examples/clientStreamableHttp.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { ToolEntry } from '../types.js';
2
- export declare const getActorDetailsTool: ToolEntry;
3
- //# sourceMappingURL=get-actor-details.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-actor-details.d.ts","sourceRoot":"","sources":["../../src/tools/get-actor-details.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAmC,SAAS,EAAE,MAAM,aAAa,CAAC;AAW9E,eAAO,MAAM,mBAAmB,EAAE,SAmDjC,CAAC"}
@@ -1,59 +0,0 @@
1
- import { z } from 'zod';
2
- import zodToJsonSchema from 'zod-to-json-schema';
3
- import { ApifyClient } from '../apify-client.js';
4
- import { HelperTools } from '../const.js';
5
- import { formatActorToActorCard } from '../utils/actor-card.js';
6
- import { ajv } from '../utils/ajv.js';
7
- import { filterSchemaProperties, shortenProperties } from './utils.js';
8
- const getActorDetailsToolArgsSchema = z.object({
9
- actor: z.string()
10
- .min(1)
11
- .describe(`Actor ID or full name in the format "username/name", e.g., "apify/rag-web-browser".`),
12
- });
13
- export const getActorDetailsTool = {
14
- type: 'internal',
15
- tool: {
16
- name: HelperTools.ACTOR_GET_DETAILS,
17
- description: `Get detailed information about an Actor by its ID or full name.\n`
18
- + `This tool returns title, description, URL, README (Actor's documentation), input schema, and usage statistics. \n`
19
- + `The Actor name is always composed of "username/name", for example, "apify/rag-web-browser".\n`
20
- + `Present Actor information in user-friendly format as an Actor card.\n`
21
- + `USAGE:\n`
22
- + `- Use when user asks about an Actor its details, description, input schema, etc.\n`
23
- + `EXAMPLES:\n`
24
- + `- user_input: How to use apify/rag-web-browser\n`
25
- + `- user_input: What is the input schema for apify/rag-web-browser`,
26
- inputSchema: zodToJsonSchema(getActorDetailsToolArgsSchema),
27
- ajvValidate: ajv.compile(zodToJsonSchema(getActorDetailsToolArgsSchema)),
28
- call: async (toolArgs) => {
29
- const { args, apifyToken } = toolArgs;
30
- const parsed = getActorDetailsToolArgsSchema.parse(args);
31
- const client = new ApifyClient({ token: apifyToken });
32
- const [actorInfo, buildInfo] = await Promise.all([
33
- client.actor(parsed.actor).get(),
34
- client.actor(parsed.actor).defaultBuild().then(async (build) => build.get()),
35
- ]);
36
- if (!actorInfo || !buildInfo || !buildInfo.actorDefinition) {
37
- return {
38
- content: [{ type: 'text', text: `Actor information for '${parsed.actor}' was not found. Please check the Actor ID or name and ensure the Actor exists.` }],
39
- };
40
- }
41
- const inputSchema = (buildInfo.actorDefinition.input || {
42
- type: 'object',
43
- properties: {},
44
- });
45
- inputSchema.properties = filterSchemaProperties(inputSchema.properties);
46
- inputSchema.properties = shortenProperties(inputSchema.properties);
47
- // Use the actor formatter to get the main actor details
48
- const actorCard = formatActorToActorCard(actorInfo);
49
- return {
50
- content: [
51
- { type: 'text', text: `**Actor card**:\n${actorCard}` },
52
- { type: 'text', text: `**README:**\n${buildInfo.actorDefinition.readme || 'No README provided.'}` },
53
- { type: 'text', text: `**Input Schema:**\n${JSON.stringify(inputSchema, null, 0)}` },
54
- ],
55
- };
56
- },
57
- },
58
- };
59
- //# sourceMappingURL=get-actor-details.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-actor-details.js","sourceRoot":"","sources":["../../src/tools/get-actor-details.ts"],"names":[],"mappings":"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"}