@toolplex/client 0.1.1 → 0.1.3

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 (76) hide show
  1. package/dist/mcp-server/clientContext.d.ts +7 -4
  2. package/dist/mcp-server/clientContext.js +21 -10
  3. package/dist/mcp-server/index.js +9 -7
  4. package/dist/mcp-server/logging/telemetryLogger.d.ts +2 -2
  5. package/dist/mcp-server/logging/telemetryLogger.js +2 -2
  6. package/dist/mcp-server/policy/callToolObserver.js +4 -2
  7. package/dist/mcp-server/policy/feedbackPolicy.d.ts +4 -4
  8. package/dist/mcp-server/policy/feedbackPolicy.js +1 -1
  9. package/dist/mcp-server/policy/installObserver.js +4 -4
  10. package/dist/mcp-server/policy/playbookPolicy.d.ts +3 -3
  11. package/dist/mcp-server/policy/playbookPolicy.js +5 -5
  12. package/dist/mcp-server/policy/policyEnforcer.d.ts +4 -4
  13. package/dist/mcp-server/policy/policyEnforcer.js +13 -13
  14. package/dist/mcp-server/policy/serverPolicy.d.ts +1 -1
  15. package/dist/mcp-server/policy/serverPolicy.js +4 -2
  16. package/dist/mcp-server/promptsCache.js +2 -2
  17. package/dist/mcp-server/registry.d.ts +8 -8
  18. package/dist/mcp-server/registry.js +19 -17
  19. package/dist/mcp-server/serversCache.d.ts +1 -1
  20. package/dist/mcp-server/serversCache.js +6 -6
  21. package/dist/mcp-server/staticPrompts.js +2 -2
  22. package/dist/mcp-server/toolDefinitionsCache.d.ts +3 -3
  23. package/dist/mcp-server/toolDefinitionsCache.js +3 -3
  24. package/dist/mcp-server/toolHandlers/callToolHandler.d.ts +2 -2
  25. package/dist/mcp-server/toolHandlers/callToolHandler.js +32 -20
  26. package/dist/mcp-server/toolHandlers/getServerConfigHandler.d.ts +2 -2
  27. package/dist/mcp-server/toolHandlers/getServerConfigHandler.js +24 -18
  28. package/dist/mcp-server/toolHandlers/initHandler.d.ts +2 -2
  29. package/dist/mcp-server/toolHandlers/initHandler.js +41 -39
  30. package/dist/mcp-server/toolHandlers/installServerHandler.d.ts +2 -2
  31. package/dist/mcp-server/toolHandlers/installServerHandler.js +36 -32
  32. package/dist/mcp-server/toolHandlers/listServersHandler.d.ts +1 -1
  33. package/dist/mcp-server/toolHandlers/listServersHandler.js +21 -17
  34. package/dist/mcp-server/toolHandlers/listToolsHandler.d.ts +2 -2
  35. package/dist/mcp-server/toolHandlers/listToolsHandler.js +32 -26
  36. package/dist/mcp-server/toolHandlers/logPlaybookUsageHandler.d.ts +2 -2
  37. package/dist/mcp-server/toolHandlers/logPlaybookUsageHandler.js +14 -14
  38. package/dist/mcp-server/toolHandlers/lookupEntityHandler.d.ts +2 -2
  39. package/dist/mcp-server/toolHandlers/lookupEntityHandler.js +30 -28
  40. package/dist/mcp-server/toolHandlers/savePlaybookHandler.d.ts +2 -2
  41. package/dist/mcp-server/toolHandlers/savePlaybookHandler.js +17 -15
  42. package/dist/mcp-server/toolHandlers/searchHandler.d.ts +2 -2
  43. package/dist/mcp-server/toolHandlers/searchHandler.js +33 -28
  44. package/dist/mcp-server/toolHandlers/serverManagerUtils.d.ts +1 -1
  45. package/dist/mcp-server/toolHandlers/serverManagerUtils.js +2 -2
  46. package/dist/mcp-server/toolHandlers/submitFeedbackHandler.d.ts +2 -2
  47. package/dist/mcp-server/toolHandlers/submitFeedbackHandler.js +17 -15
  48. package/dist/mcp-server/toolHandlers/uninstallServerHandler.d.ts +2 -2
  49. package/dist/mcp-server/toolHandlers/uninstallServerHandler.js +21 -19
  50. package/dist/mcp-server/toolplexApi/service.d.ts +8 -8
  51. package/dist/mcp-server/toolplexApi/service.js +24 -28
  52. package/dist/mcp-server/toolplexApi/types.d.ts +3 -3
  53. package/dist/mcp-server/toolplexServer.d.ts +1 -1
  54. package/dist/mcp-server/toolplexServer.js +78 -77
  55. package/dist/mcp-server/tools.d.ts +1 -1
  56. package/dist/mcp-server/tools.js +3 -3
  57. package/dist/mcp-server/utils/initServerManagers.d.ts +4 -4
  58. package/dist/mcp-server/utils/initServerManagers.js +5 -5
  59. package/dist/mcp-server/utils/resultAnnotators.js +3 -7
  60. package/dist/mcp-server/utils/runtimeCheck.js +8 -8
  61. package/dist/server-manager/index.js +4 -4
  62. package/dist/server-manager/serverManager.d.ts +6 -6
  63. package/dist/server-manager/serverManager.js +34 -36
  64. package/dist/server-manager/stdioServer.js +37 -35
  65. package/dist/server-manager/stdioTransportProtocol.d.ts +2 -2
  66. package/dist/server-manager/stdioTransportProtocol.js +7 -7
  67. package/dist/shared/enhancedPath.js +13 -13
  68. package/dist/shared/fileLogger.js +19 -19
  69. package/dist/shared/mcpServerTypes.d.ts +4 -3
  70. package/dist/shared/mcpServerTypes.js +17 -10
  71. package/dist/shared/serverManagerTypes.d.ts +1 -1
  72. package/dist/shared/serverManagerTypes.js +1 -1
  73. package/dist/shared/stdioServerManagerClient.js +20 -18
  74. package/dist/version.d.ts +1 -1
  75. package/dist/version.js +1 -1
  76. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
- import { FileLogger } from '../../shared/fileLogger.js';
2
- import { findServerManagerClient } from './serverManagerUtils.js';
3
- import { ListToolsResultSchema, ListAllToolsResultSchema, } from '../../shared/serverManagerTypes.js';
4
- import Registry from '../registry.js';
1
+ import { FileLogger } from "../../shared/fileLogger.js";
2
+ import { findServerManagerClient } from "./serverManagerUtils.js";
3
+ import { ListToolsResultSchema, ListAllToolsResultSchema, } from "../../shared/serverManagerTypes.js";
4
+ import Registry from "../registry.js";
5
5
  const logger = FileLogger;
6
6
  export async function handleListTools(params) {
7
7
  const startTime = Date.now();
@@ -11,14 +11,16 @@ export async function handleListTools(params) {
11
11
  const policyEnforcer = Registry.getPolicyEnforcer();
12
12
  try {
13
13
  const server_id = params.server_id;
14
- let response = '';
14
+ let response = "";
15
15
  if (server_id) {
16
16
  // Check if server is blocked using policy enforcer
17
17
  policyEnforcer.enforceUseServerPolicy(server_id);
18
18
  await logger.debug(`Listing tools for specific server: ${server_id}`);
19
19
  const client = await findServerManagerClient(server_id, serverManagerClients);
20
- const response_data = await client.sendRequest('list_tools', { server_id: server_id });
21
- if ('error' in response_data) {
20
+ const response_data = await client.sendRequest("list_tools", {
21
+ server_id: server_id,
22
+ });
23
+ if ("error" in response_data) {
22
24
  throw new Error(`Failed to list tools for server_id ${server_id}, error message: ${response_data.error.message}`);
23
25
  }
24
26
  const parsed = ListToolsResultSchema.safeParse(response_data);
@@ -26,11 +28,11 @@ export async function handleListTools(params) {
26
28
  throw new Error(`Invalid response from server manager: ${parsed.error}`);
27
29
  }
28
30
  response = promptsCache
29
- .getPrompt('list_tools_server_header')
30
- .replace('{SERVER_ID}', parsed.data.server_id)
31
- .replace('{SERVER_NAME}', parsed.data.server_name);
31
+ .getPrompt("list_tools_server_header")
32
+ .replace("{SERVER_ID}", parsed.data.server_id)
33
+ .replace("{SERVER_NAME}", parsed.data.server_name);
32
34
  if (!parsed.data.tools || parsed.data.tools.length === 0) {
33
- response += promptsCache.getPrompt('list_tools_empty');
35
+ response += promptsCache.getPrompt("list_tools_empty");
34
36
  }
35
37
  else {
36
38
  parsed.data.tools.forEach((tool) => {
@@ -40,10 +42,10 @@ export async function handleListTools(params) {
40
42
  }
41
43
  }
42
44
  else {
43
- await logger.debug('Listing tools from all installed servers');
44
- response = promptsCache.getPrompt('list_tools_all_header');
45
+ await logger.debug("Listing tools from all installed servers");
46
+ response = promptsCache.getPrompt("list_tools_all_header");
45
47
  for (const [runtime, client] of Object.entries(serverManagerClients)) {
46
- const response_data = await client.sendRequest('list_all_tools', {});
48
+ const response_data = await client.sendRequest("list_all_tools", {});
47
49
  if (response_data.error) {
48
50
  continue;
49
51
  }
@@ -62,16 +64,16 @@ export async function handleListTools(params) {
62
64
  response += `- ${tool.name}: ${tool.description}\n`;
63
65
  response += ` Input Schema: ${JSON.stringify(tool.inputSchema, null, 2)}\n\n`;
64
66
  });
65
- response += '\n';
67
+ response += "\n";
66
68
  }
67
69
  }
68
70
  }
69
- if (response === promptsCache.getPrompt('list_tools_all_header')) {
70
- response += promptsCache.getPrompt('list_tools_empty');
71
+ if (response === promptsCache.getPrompt("list_tools_all_header")) {
72
+ response += promptsCache.getPrompt("list_tools_empty");
71
73
  }
72
74
  }
73
- await logger.debug('Successfully retrieved tools list');
74
- await telemetryLogger.log('client_list_tools', {
75
+ await logger.debug("Successfully retrieved tools list");
76
+ await telemetryLogger.log("client_list_tools", {
75
77
  success: true,
76
78
  log_context: {
77
79
  server_id: params.server_id,
@@ -79,19 +81,21 @@ export async function handleListTools(params) {
79
81
  latency_ms: Date.now() - startTime,
80
82
  });
81
83
  return {
82
- role: 'system',
84
+ role: "system",
83
85
  content: [
84
86
  {
85
- type: 'text',
87
+ type: "text",
86
88
  text: response,
87
89
  },
88
90
  ],
89
91
  };
90
92
  }
91
93
  catch (error) {
92
- const errorMessage = error instanceof Error ? error.message : promptsCache.getPrompt('unexpected_error');
94
+ const errorMessage = error instanceof Error
95
+ ? error.message
96
+ : promptsCache.getPrompt("unexpected_error");
93
97
  await logger.error(`Failed to list tools: ${errorMessage}`);
94
- await telemetryLogger.log('client_list_tools', {
98
+ await telemetryLogger.log("client_list_tools", {
95
99
  success: false,
96
100
  log_context: {
97
101
  server_id: params.server_id,
@@ -100,11 +104,13 @@ export async function handleListTools(params) {
100
104
  latency_ms: Date.now() - startTime,
101
105
  });
102
106
  return {
103
- role: 'system',
107
+ role: "system",
104
108
  content: [
105
109
  {
106
- type: 'text',
107
- text: promptsCache.getPrompt('list_tools_failure').replace('{ERROR}', errorMessage),
110
+ type: "text",
111
+ text: promptsCache
112
+ .getPrompt("list_tools_failure")
113
+ .replace("{ERROR}", errorMessage),
108
114
  },
109
115
  ],
110
116
  };
@@ -1,3 +1,3 @@
1
- import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
- import { LogPlaybookUsageParams } from '../../shared/mcpServerTypes.js';
1
+ import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
2
+ import { LogPlaybookUsageParams } from "../../shared/mcpServerTypes.js";
3
3
  export declare function handleLogPlaybookUsage(params: LogPlaybookUsageParams): Promise<CallToolResult>;
@@ -1,5 +1,5 @@
1
- import { FileLogger } from '../../shared/fileLogger.js';
2
- import Registry from '../registry.js';
1
+ import { FileLogger } from "../../shared/fileLogger.js";
2
+ import Registry from "../registry.js";
3
3
  const logger = FileLogger;
4
4
  export async function handleLogPlaybookUsage(params) {
5
5
  const startTime = Date.now();
@@ -13,14 +13,14 @@ export async function handleLogPlaybookUsage(params) {
13
13
  const clientContext = Registry.getClientContext();
14
14
  try {
15
15
  // Check if the client is in restricted mode
16
- if (clientContext.clientMode === 'restricted') {
17
- throw new Error('Playbook functionality is disabled in restricted mode.');
16
+ if (clientContext.clientMode === "restricted") {
17
+ throw new Error("Playbook functionality is disabled in restricted mode.");
18
18
  }
19
19
  // Enforce playbook usage logging policy
20
20
  policyEnforcer.enforceLogPlaybookUsagePolicy();
21
21
  await apiService.logPlaybookUsage(playbook_id, success, error_message);
22
- await logger.info('Playbook usage logged successfully');
23
- await telemetryLogger.log('client_log_playbook_usage', {
22
+ await logger.info("Playbook usage logged successfully");
23
+ await telemetryLogger.log("client_log_playbook_usage", {
24
24
  success: true,
25
25
  log_context: {
26
26
  playbook_id,
@@ -29,11 +29,11 @@ export async function handleLogPlaybookUsage(params) {
29
29
  latency_ms: Date.now() - startTime,
30
30
  });
31
31
  return {
32
- role: 'system',
32
+ role: "system",
33
33
  content: [
34
34
  {
35
- type: 'text',
36
- text: promptsCache.getPrompt('log_playbook_usage_success'),
35
+ type: "text",
36
+ text: promptsCache.getPrompt("log_playbook_usage_success"),
37
37
  },
38
38
  ],
39
39
  };
@@ -41,7 +41,7 @@ export async function handleLogPlaybookUsage(params) {
41
41
  catch (error) {
42
42
  const errorMessage = error instanceof Error ? error.message : String(error);
43
43
  await logger.error(`Failed to log playbook usage: ${errorMessage}`);
44
- await telemetryLogger.log('client_log_playbook_usage', {
44
+ await telemetryLogger.log("client_log_playbook_usage", {
45
45
  success: false,
46
46
  log_context: {
47
47
  playbook_id,
@@ -51,13 +51,13 @@ export async function handleLogPlaybookUsage(params) {
51
51
  latency_ms: Date.now() - startTime,
52
52
  });
53
53
  return {
54
- role: 'system',
54
+ role: "system",
55
55
  content: [
56
56
  {
57
- type: 'text',
57
+ type: "text",
58
58
  text: promptsCache
59
- .getPrompt('log_playbook_usage_failure')
60
- .replace('{ERROR}', errorMessage),
59
+ .getPrompt("log_playbook_usage_failure")
60
+ .replace("{ERROR}", errorMessage),
61
61
  },
62
62
  ],
63
63
  };
@@ -1,3 +1,3 @@
1
- import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
- import { LookupEntityParams } from '../../shared/mcpServerTypes.js';
1
+ import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
2
+ import { LookupEntityParams } from "../../shared/mcpServerTypes.js";
3
3
  export declare function handleLookupEntityTool(params: LookupEntityParams): Promise<CallToolResult>;
@@ -1,6 +1,6 @@
1
- import { FileLogger } from '../../shared/fileLogger.js';
2
- import Registry from '../registry.js';
3
- import { annotateInstalledServer } from '../utils/resultAnnotators.js';
1
+ import { FileLogger } from "../../shared/fileLogger.js";
2
+ import Registry from "../registry.js";
3
+ import { annotateInstalledServer } from "../utils/resultAnnotators.js";
4
4
  const logger = FileLogger;
5
5
  export async function handleLookupEntityTool(params) {
6
6
  const startTime = Date.now();
@@ -13,17 +13,17 @@ export async function handleLookupEntityTool(params) {
13
13
  const clientContext = Registry.getClientContext();
14
14
  try {
15
15
  // Check if the client is in restricted mode
16
- if (clientContext.clientMode === 'restricted') {
17
- throw new Error('Lookup functionality is disabled in restricted mode.');
16
+ if (clientContext.clientMode === "restricted") {
17
+ throw new Error("Lookup functionality is disabled in restricted mode.");
18
18
  }
19
19
  // Enforce blocked server policy if looking up a server
20
- if (params.entity_type === 'server') {
20
+ if (params.entity_type === "server") {
21
21
  policyEnforcer.enforceUseServerPolicy(params.entity_id);
22
22
  }
23
23
  let lookupResponse = await apiService.lookupEntity(params.entity_type, params.entity_id);
24
24
  if (!lookupResponse) {
25
- await logger.debug('No entity found');
26
- await telemetryLogger.log('client_lookup_entity', {
25
+ await logger.debug("No entity found");
26
+ await telemetryLogger.log("client_lookup_entity", {
27
27
  success: true,
28
28
  log_context: {
29
29
  entity_type: params.entity_type,
@@ -32,20 +32,22 @@ export async function handleLookupEntityTool(params) {
32
32
  latency_ms: Date.now() - startTime,
33
33
  });
34
34
  return {
35
- role: 'system',
35
+ role: "system",
36
36
  content: [
37
37
  {
38
- type: 'text',
38
+ type: "text",
39
39
  text: promptsCache
40
- .getPrompt('lookup_entity_not_found')
41
- .replace('{entity_type}', params.entity_type)
42
- .replace('{entity_id}', params.entity_id),
40
+ .getPrompt("lookup_entity_not_found")
41
+ .replace("{entity_type}", params.entity_type)
42
+ .replace("{entity_id}", params.entity_id),
43
43
  },
44
44
  ],
45
45
  };
46
46
  }
47
47
  // Use resultAnnotators to annotate if the server is installed
48
- if (params.entity_type === 'server' && lookupResponse && typeof lookupResponse === 'object') {
48
+ if (params.entity_type === "server" &&
49
+ lookupResponse &&
50
+ typeof lookupResponse === "object") {
49
51
  try {
50
52
  lookupResponse = annotateInstalledServer(lookupResponse, serversCache);
51
53
  }
@@ -57,9 +59,9 @@ export async function handleLookupEntityTool(params) {
57
59
  await logger.debug(`Found entity: ${JSON.stringify(lookupResponse)}`);
58
60
  let response = `Found ${params.entity_type}:\n`;
59
61
  response += JSON.stringify(lookupResponse, null, 2);
60
- response += '\n';
61
- await logger.debug('Lookup completed successfully');
62
- await telemetryLogger.log('client_lookup_entity', {
62
+ response += "\n";
63
+ await logger.debug("Lookup completed successfully");
64
+ await telemetryLogger.log("client_lookup_entity", {
63
65
  success: true,
64
66
  log_context: {
65
67
  entity_type: params.entity_type,
@@ -69,25 +71,25 @@ export async function handleLookupEntityTool(params) {
69
71
  });
70
72
  const content = [
71
73
  {
72
- type: 'text',
74
+ type: "text",
73
75
  text: response,
74
76
  },
75
77
  ];
76
- if (params.entity_type === 'server') {
78
+ if (params.entity_type === "server") {
77
79
  content.push({
78
- type: 'text',
79
- text: promptsCache.getPrompt('lookup_entity_install_guidance'),
80
+ type: "text",
81
+ text: promptsCache.getPrompt("lookup_entity_install_guidance"),
80
82
  });
81
83
  }
82
84
  return {
83
- role: 'system',
85
+ role: "system",
84
86
  content,
85
87
  };
86
88
  }
87
89
  catch (err) {
88
90
  const errorMessage = err instanceof Error ? err.message : String(err);
89
91
  await logger.error(`Error looking up entity: ${errorMessage}`);
90
- await telemetryLogger.log('client_lookup_entity', {
92
+ await telemetryLogger.log("client_lookup_entity", {
91
93
  success: false,
92
94
  log_context: {
93
95
  entity_type: params.entity_type,
@@ -97,14 +99,14 @@ export async function handleLookupEntityTool(params) {
97
99
  latency_ms: Date.now() - startTime,
98
100
  });
99
101
  return {
100
- role: 'system',
102
+ role: "system",
101
103
  content: [
102
104
  {
103
- type: 'text',
105
+ type: "text",
104
106
  text: promptsCache
105
- .getPrompt('lookup_entity_error')
106
- .replace('{entity_type}', params.entity_type)
107
- .replace('{ERROR}', errorMessage),
107
+ .getPrompt("lookup_entity_error")
108
+ .replace("{entity_type}", params.entity_type)
109
+ .replace("{ERROR}", errorMessage),
108
110
  },
109
111
  ],
110
112
  };
@@ -1,3 +1,3 @@
1
- import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
- import { SavePlaybookParams } from '../../shared/mcpServerTypes.js';
1
+ import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
2
+ import { SavePlaybookParams } from "../../shared/mcpServerTypes.js";
3
3
  export declare function handleSavePlaybook(params: SavePlaybookParams): Promise<CallToolResult>;
@@ -1,9 +1,9 @@
1
- import { FileLogger } from '../../shared/fileLogger.js';
2
- import Registry from '../registry.js';
1
+ import { FileLogger } from "../../shared/fileLogger.js";
2
+ import Registry from "../registry.js";
3
3
  const logger = FileLogger;
4
4
  export async function handleSavePlaybook(params) {
5
5
  const startTime = Date.now();
6
- await logger.info('Handling save playbook request');
6
+ await logger.info("Handling save playbook request");
7
7
  await logger.debug(`Playbook params: ${JSON.stringify(params)}`);
8
8
  const apiService = Registry.getToolplexApiService();
9
9
  const telemetryLogger = Registry.getTelemetryLogger();
@@ -12,19 +12,19 @@ export async function handleSavePlaybook(params) {
12
12
  const clientContext = Registry.getClientContext();
13
13
  try {
14
14
  // Check if the client is in restricted mode
15
- if (clientContext.clientMode === 'restricted') {
16
- throw new Error('Playbook functionality is disabled in restricted mode.');
15
+ if (clientContext.clientMode === "restricted") {
16
+ throw new Error("Playbook functionality is disabled in restricted mode.");
17
17
  }
18
18
  // Check if read-only mode is enabled
19
19
  if (clientContext.permissions.enable_read_only_mode) {
20
- throw new Error('Saving playbooks is disabled in read-only mode');
20
+ throw new Error("Saving playbooks is disabled in read-only mode");
21
21
  }
22
22
  // Enforce playbook policy before saving
23
23
  policyEnforcer.enforceSavePlaybookPolicy(params);
24
24
  const { description, actions, domain, keywords, requirements, source_playbook_id, fork_reason, } = params;
25
25
  const response = await apiService.createPlaybook(description, actions, domain, keywords, requirements, source_playbook_id, fork_reason);
26
26
  await logger.info(`Playbook created successfully with ID: ${response.id}`);
27
- await telemetryLogger.log('client_save_playbook', {
27
+ await telemetryLogger.log("client_save_playbook", {
28
28
  success: true,
29
29
  log_context: {
30
30
  playbook_id: response.id,
@@ -33,13 +33,13 @@ export async function handleSavePlaybook(params) {
33
33
  latency_ms: Date.now() - startTime,
34
34
  });
35
35
  return {
36
- role: 'system',
36
+ role: "system",
37
37
  content: [
38
38
  {
39
- type: 'text',
39
+ type: "text",
40
40
  text: promptsCache
41
- .getPrompt('save_playbook_success')
42
- .replace('{PLAYBOOK_ID}', response.id),
41
+ .getPrompt("save_playbook_success")
42
+ .replace("{PLAYBOOK_ID}", response.id),
43
43
  },
44
44
  ],
45
45
  };
@@ -47,17 +47,19 @@ export async function handleSavePlaybook(params) {
47
47
  catch (error) {
48
48
  const errorMessage = error instanceof Error ? error.message : String(error);
49
49
  await logger.error(`Failed to create playbook: ${errorMessage}`);
50
- await telemetryLogger.log('client_save_playbook', {
50
+ await telemetryLogger.log("client_save_playbook", {
51
51
  success: false,
52
52
  pii_sanitized_error_message: errorMessage,
53
53
  latency_ms: Date.now() - startTime,
54
54
  });
55
55
  return {
56
- role: 'system',
56
+ role: "system",
57
57
  content: [
58
58
  {
59
- type: 'text',
60
- text: promptsCache.getPrompt('save_playbook_failure').replace('{ERROR}', errorMessage),
59
+ type: "text",
60
+ text: promptsCache
61
+ .getPrompt("save_playbook_failure")
62
+ .replace("{ERROR}", errorMessage),
61
63
  },
62
64
  ],
63
65
  };
@@ -1,3 +1,3 @@
1
- import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
- import { SearchParams } from '../../shared/mcpServerTypes.js';
1
+ import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
2
+ import { SearchParams } from "../../shared/mcpServerTypes.js";
3
3
  export declare function handleSearchTool(params: SearchParams): Promise<CallToolResult>;
@@ -1,10 +1,10 @@
1
- import { FileLogger } from '../../shared/fileLogger.js';
2
- import Registry from '../registry.js';
3
- import { annotateInstalledServers } from '../utils/resultAnnotators.js';
1
+ import { FileLogger } from "../../shared/fileLogger.js";
2
+ import Registry from "../registry.js";
3
+ import { annotateInstalledServers } from "../utils/resultAnnotators.js";
4
4
  const logger = FileLogger;
5
5
  export async function handleSearchTool(params) {
6
6
  const startTime = Date.now();
7
- await logger.info('Handling search request');
7
+ await logger.info("Handling search request");
8
8
  await logger.debug(`Search params: ${JSON.stringify(params)}`);
9
9
  const apiService = Registry.getToolplexApiService();
10
10
  const telemetryLogger = Registry.getTelemetryLogger();
@@ -13,26 +13,29 @@ export async function handleSearchTool(params) {
13
13
  const clientContext = Registry.getClientContext();
14
14
  const query = params.query;
15
15
  const expandedKeywords = params.expanded_keywords || [];
16
- const filter = params.filter || 'all';
16
+ const filter = params.filter || "all";
17
17
  const size = params.size || 10;
18
18
  try {
19
19
  // Check if the client is in restricted mode
20
- if (clientContext.clientMode === 'restricted') {
21
- throw new Error('Search functionality is disabled in restricted mode.');
20
+ if (clientContext.clientMode === "restricted") {
21
+ throw new Error("Search functionality is disabled in restricted mode.");
22
22
  }
23
23
  const results = await apiService.search(query, expandedKeywords, filter, size);
24
24
  // Log telemetry event
25
- await telemetryLogger.log('client_search', {
25
+ await telemetryLogger.log("client_search", {
26
26
  success: true,
27
27
  log_context: {
28
28
  filter,
29
29
  size,
30
30
  num_expanded_keywords: expandedKeywords.length,
31
- num_results: (results.mcp_servers?.length ?? -1) + (results.playbooks?.length ?? -1),
31
+ num_results: (results.mcp_servers?.length ?? -1) +
32
+ (results.playbooks?.length ?? -1),
32
33
  },
33
34
  latency_ms: Date.now() - startTime,
34
35
  });
35
- const mcpServers = Array.isArray(results.mcp_servers) ? results.mcp_servers : [];
36
+ const mcpServers = Array.isArray(results.mcp_servers)
37
+ ? results.mcp_servers
38
+ : [];
36
39
  const playbooks = Array.isArray(results.playbooks) ? results.playbooks : [];
37
40
  const totalResults = mcpServers.length + playbooks.length;
38
41
  // Annotate installed servers using resultAnnotators
@@ -48,41 +51,41 @@ export async function handleSearchTool(params) {
48
51
  }
49
52
  }
50
53
  if (totalResults === 0) {
51
- await logger.info('No search results found');
54
+ await logger.info("No search results found");
52
55
  return {
53
- role: 'system',
56
+ role: "system",
54
57
  content: [
55
58
  {
56
- type: 'text',
57
- text: promptsCache.getPrompt('search_no_results'),
59
+ type: "text",
60
+ text: promptsCache.getPrompt("search_no_results"),
58
61
  },
59
62
  ],
60
63
  };
61
64
  }
62
65
  await logger.debug(`Found ${totalResults} results`);
63
- let response = promptsCache.getPrompt('search_results_header');
66
+ let response = promptsCache.getPrompt("search_results_header");
64
67
  if ((annotatedServers.length ?? 0) > 0) {
65
- response += '\n=== Servers ===\n';
68
+ response += "\n=== Servers ===\n";
66
69
  response += JSON.stringify(annotatedServers, null, 2);
67
- response += '\n';
70
+ response += "\n";
68
71
  }
69
72
  else {
70
- response += '\n(No servers found)\n';
73
+ response += "\n(No servers found)\n";
71
74
  }
72
75
  if (playbooks.length > 0) {
73
- response += '\n=== Playbooks ===\n';
76
+ response += "\n=== Playbooks ===\n";
74
77
  response += JSON.stringify(playbooks, null, 2);
75
- response += '\n';
78
+ response += "\n";
76
79
  }
77
80
  else {
78
- response += '\n(No playbooks found)\n';
81
+ response += "\n(No playbooks found)\n";
79
82
  }
80
- await logger.info('Search completed successfully');
83
+ await logger.info("Search completed successfully");
81
84
  return {
82
- role: 'system',
85
+ role: "system",
83
86
  content: [
84
87
  {
85
- type: 'text',
88
+ type: "text",
86
89
  text: response,
87
90
  },
88
91
  ],
@@ -91,7 +94,7 @@ export async function handleSearchTool(params) {
91
94
  catch (error) {
92
95
  const errorMessage = error instanceof Error ? error.message : String(error);
93
96
  await logger.error(`Search failed: ${errorMessage}`);
94
- await telemetryLogger.log('client_search', {
97
+ await telemetryLogger.log("client_search", {
95
98
  success: false,
96
99
  log_context: {
97
100
  filter,
@@ -102,11 +105,13 @@ export async function handleSearchTool(params) {
102
105
  latency_ms: Date.now() - startTime,
103
106
  });
104
107
  return {
105
- role: 'system',
108
+ role: "system",
106
109
  content: [
107
110
  {
108
- type: 'text',
109
- text: promptsCache.getPrompt('unexpected_error').replace('{ERROR}', errorMessage),
111
+ type: "text",
112
+ text: promptsCache
113
+ .getPrompt("unexpected_error")
114
+ .replace("{ERROR}", errorMessage),
110
115
  },
111
116
  ],
112
117
  };
@@ -1,2 +1,2 @@
1
- import { StdioServerManagerClient } from '../../shared/stdioServerManagerClient.js';
1
+ import { StdioServerManagerClient } from "../../shared/stdioServerManagerClient.js";
2
2
  export declare function findServerManagerClient(serverId: string, serverManagerClients: Record<string, StdioServerManagerClient>): Promise<StdioServerManagerClient>;
@@ -1,7 +1,7 @@
1
1
  export async function findServerManagerClient(serverId, serverManagerClients) {
2
2
  for (const client of Object.values(serverManagerClients)) {
3
- const response = await client.sendRequest('list_servers', {});
4
- if ('error' in response) {
3
+ const response = await client.sendRequest("list_servers", {});
4
+ if ("error" in response) {
5
5
  throw new Error(`Failed to list servers; error message: ${response.error.message}`);
6
6
  }
7
7
  // Handle both array and object responses
@@ -1,3 +1,3 @@
1
- import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
- import { SubmitFeedbackParams } from '../../shared/mcpServerTypes.js';
1
+ import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
2
+ import { SubmitFeedbackParams } from "../../shared/mcpServerTypes.js";
3
3
  export declare function handleSubmitFeedback(params: SubmitFeedbackParams): Promise<CallToolResult>;