@toolplex/client 0.1.1 → 0.1.2
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/dist/mcp-server/clientContext.d.ts +7 -4
- package/dist/mcp-server/clientContext.js +21 -10
- package/dist/mcp-server/index.js +9 -7
- package/dist/mcp-server/logging/telemetryLogger.d.ts +2 -2
- package/dist/mcp-server/logging/telemetryLogger.js +2 -2
- package/dist/mcp-server/policy/callToolObserver.js +4 -2
- package/dist/mcp-server/policy/feedbackPolicy.d.ts +4 -4
- package/dist/mcp-server/policy/feedbackPolicy.js +1 -1
- package/dist/mcp-server/policy/installObserver.js +4 -4
- package/dist/mcp-server/policy/playbookPolicy.d.ts +3 -3
- package/dist/mcp-server/policy/playbookPolicy.js +5 -5
- package/dist/mcp-server/policy/policyEnforcer.d.ts +4 -4
- package/dist/mcp-server/policy/policyEnforcer.js +13 -13
- package/dist/mcp-server/policy/serverPolicy.d.ts +1 -1
- package/dist/mcp-server/policy/serverPolicy.js +4 -2
- package/dist/mcp-server/promptsCache.js +2 -2
- package/dist/mcp-server/registry.d.ts +8 -8
- package/dist/mcp-server/registry.js +19 -17
- package/dist/mcp-server/serversCache.d.ts +1 -1
- package/dist/mcp-server/serversCache.js +6 -6
- package/dist/mcp-server/staticPrompts.js +2 -2
- package/dist/mcp-server/toolDefinitionsCache.d.ts +3 -3
- package/dist/mcp-server/toolDefinitionsCache.js +3 -3
- package/dist/mcp-server/toolHandlers/callToolHandler.d.ts +2 -2
- package/dist/mcp-server/toolHandlers/callToolHandler.js +22 -20
- package/dist/mcp-server/toolHandlers/getServerConfigHandler.d.ts +2 -2
- package/dist/mcp-server/toolHandlers/getServerConfigHandler.js +24 -18
- package/dist/mcp-server/toolHandlers/initHandler.d.ts +2 -2
- package/dist/mcp-server/toolHandlers/initHandler.js +41 -39
- package/dist/mcp-server/toolHandlers/installServerHandler.d.ts +2 -2
- package/dist/mcp-server/toolHandlers/installServerHandler.js +36 -32
- package/dist/mcp-server/toolHandlers/listServersHandler.d.ts +1 -1
- package/dist/mcp-server/toolHandlers/listServersHandler.js +21 -17
- package/dist/mcp-server/toolHandlers/listToolsHandler.d.ts +2 -2
- package/dist/mcp-server/toolHandlers/listToolsHandler.js +32 -26
- package/dist/mcp-server/toolHandlers/logPlaybookUsageHandler.d.ts +2 -2
- package/dist/mcp-server/toolHandlers/logPlaybookUsageHandler.js +14 -14
- package/dist/mcp-server/toolHandlers/lookupEntityHandler.d.ts +2 -2
- package/dist/mcp-server/toolHandlers/lookupEntityHandler.js +30 -28
- package/dist/mcp-server/toolHandlers/savePlaybookHandler.d.ts +2 -2
- package/dist/mcp-server/toolHandlers/savePlaybookHandler.js +17 -15
- package/dist/mcp-server/toolHandlers/searchHandler.d.ts +2 -2
- package/dist/mcp-server/toolHandlers/searchHandler.js +33 -28
- package/dist/mcp-server/toolHandlers/serverManagerUtils.d.ts +1 -1
- package/dist/mcp-server/toolHandlers/serverManagerUtils.js +2 -2
- package/dist/mcp-server/toolHandlers/submitFeedbackHandler.d.ts +2 -2
- package/dist/mcp-server/toolHandlers/submitFeedbackHandler.js +17 -15
- package/dist/mcp-server/toolHandlers/uninstallServerHandler.d.ts +2 -2
- package/dist/mcp-server/toolHandlers/uninstallServerHandler.js +21 -19
- package/dist/mcp-server/toolplexApi/service.d.ts +8 -8
- package/dist/mcp-server/toolplexApi/service.js +24 -28
- package/dist/mcp-server/toolplexApi/types.d.ts +3 -3
- package/dist/mcp-server/toolplexServer.d.ts +1 -1
- package/dist/mcp-server/toolplexServer.js +78 -77
- package/dist/mcp-server/tools.d.ts +1 -1
- package/dist/mcp-server/tools.js +3 -3
- package/dist/mcp-server/utils/initServerManagers.d.ts +4 -4
- package/dist/mcp-server/utils/initServerManagers.js +5 -5
- package/dist/mcp-server/utils/resultAnnotators.js +3 -7
- package/dist/mcp-server/utils/runtimeCheck.js +8 -8
- package/dist/server-manager/index.js +4 -4
- package/dist/server-manager/serverManager.d.ts +6 -6
- package/dist/server-manager/serverManager.js +34 -36
- package/dist/server-manager/stdioServer.js +37 -35
- package/dist/server-manager/stdioTransportProtocol.d.ts +2 -2
- package/dist/server-manager/stdioTransportProtocol.js +7 -7
- package/dist/shared/enhancedPath.js +13 -13
- package/dist/shared/fileLogger.js +19 -19
- package/dist/shared/mcpServerTypes.d.ts +4 -3
- package/dist/shared/mcpServerTypes.js +17 -10
- package/dist/shared/serverManagerTypes.d.ts +1 -1
- package/dist/shared/serverManagerTypes.js +1 -1
- package/dist/shared/stdioServerManagerClient.js +20 -18
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { FileLogger } from
|
|
2
|
-
import { findServerManagerClient } from
|
|
3
|
-
import { ListToolsResultSchema, ListAllToolsResultSchema, } from
|
|
4
|
-
import Registry from
|
|
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(
|
|
21
|
-
|
|
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(
|
|
30
|
-
.replace(
|
|
31
|
-
.replace(
|
|
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(
|
|
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(
|
|
44
|
-
response = promptsCache.getPrompt(
|
|
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(
|
|
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 +=
|
|
67
|
+
response += "\n";
|
|
66
68
|
}
|
|
67
69
|
}
|
|
68
70
|
}
|
|
69
|
-
if (response === promptsCache.getPrompt(
|
|
70
|
-
response += promptsCache.getPrompt(
|
|
71
|
+
if (response === promptsCache.getPrompt("list_tools_all_header")) {
|
|
72
|
+
response += promptsCache.getPrompt("list_tools_empty");
|
|
71
73
|
}
|
|
72
74
|
}
|
|
73
|
-
await logger.debug(
|
|
74
|
-
await telemetryLogger.log(
|
|
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:
|
|
84
|
+
role: "system",
|
|
83
85
|
content: [
|
|
84
86
|
{
|
|
85
|
-
type:
|
|
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
|
|
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(
|
|
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:
|
|
107
|
+
role: "system",
|
|
104
108
|
content: [
|
|
105
109
|
{
|
|
106
|
-
type:
|
|
107
|
-
text: promptsCache
|
|
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
|
|
2
|
-
import { LogPlaybookUsageParams } from
|
|
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
|
|
2
|
-
import Registry from
|
|
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 ===
|
|
17
|
-
throw new Error(
|
|
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(
|
|
23
|
-
await telemetryLogger.log(
|
|
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:
|
|
32
|
+
role: "system",
|
|
33
33
|
content: [
|
|
34
34
|
{
|
|
35
|
-
type:
|
|
36
|
-
text: promptsCache.getPrompt(
|
|
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(
|
|
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:
|
|
54
|
+
role: "system",
|
|
55
55
|
content: [
|
|
56
56
|
{
|
|
57
|
-
type:
|
|
57
|
+
type: "text",
|
|
58
58
|
text: promptsCache
|
|
59
|
-
.getPrompt(
|
|
60
|
-
.replace(
|
|
59
|
+
.getPrompt("log_playbook_usage_failure")
|
|
60
|
+
.replace("{ERROR}", errorMessage),
|
|
61
61
|
},
|
|
62
62
|
],
|
|
63
63
|
};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { CallToolResult } from
|
|
2
|
-
import { LookupEntityParams } from
|
|
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
|
|
2
|
-
import Registry from
|
|
3
|
-
import { annotateInstalledServer } from
|
|
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 ===
|
|
17
|
-
throw new Error(
|
|
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 ===
|
|
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(
|
|
26
|
-
await telemetryLogger.log(
|
|
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:
|
|
35
|
+
role: "system",
|
|
36
36
|
content: [
|
|
37
37
|
{
|
|
38
|
-
type:
|
|
38
|
+
type: "text",
|
|
39
39
|
text: promptsCache
|
|
40
|
-
.getPrompt(
|
|
41
|
-
.replace(
|
|
42
|
-
.replace(
|
|
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 ===
|
|
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 +=
|
|
61
|
-
await logger.debug(
|
|
62
|
-
await telemetryLogger.log(
|
|
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:
|
|
74
|
+
type: "text",
|
|
73
75
|
text: response,
|
|
74
76
|
},
|
|
75
77
|
];
|
|
76
|
-
if (params.entity_type ===
|
|
78
|
+
if (params.entity_type === "server") {
|
|
77
79
|
content.push({
|
|
78
|
-
type:
|
|
79
|
-
text: promptsCache.getPrompt(
|
|
80
|
+
type: "text",
|
|
81
|
+
text: promptsCache.getPrompt("lookup_entity_install_guidance"),
|
|
80
82
|
});
|
|
81
83
|
}
|
|
82
84
|
return {
|
|
83
|
-
role:
|
|
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(
|
|
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:
|
|
102
|
+
role: "system",
|
|
101
103
|
content: [
|
|
102
104
|
{
|
|
103
|
-
type:
|
|
105
|
+
type: "text",
|
|
104
106
|
text: promptsCache
|
|
105
|
-
.getPrompt(
|
|
106
|
-
.replace(
|
|
107
|
-
.replace(
|
|
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
|
|
2
|
-
import { SavePlaybookParams } from
|
|
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
|
|
2
|
-
import Registry from
|
|
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(
|
|
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 ===
|
|
16
|
-
throw new Error(
|
|
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(
|
|
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(
|
|
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:
|
|
36
|
+
role: "system",
|
|
37
37
|
content: [
|
|
38
38
|
{
|
|
39
|
-
type:
|
|
39
|
+
type: "text",
|
|
40
40
|
text: promptsCache
|
|
41
|
-
.getPrompt(
|
|
42
|
-
.replace(
|
|
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(
|
|
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:
|
|
56
|
+
role: "system",
|
|
57
57
|
content: [
|
|
58
58
|
{
|
|
59
|
-
type:
|
|
60
|
-
text: promptsCache
|
|
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
|
|
2
|
-
import { SearchParams } from
|
|
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
|
|
2
|
-
import Registry from
|
|
3
|
-
import { annotateInstalledServers } from
|
|
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(
|
|
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 ||
|
|
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 ===
|
|
21
|
-
throw new Error(
|
|
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(
|
|
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) +
|
|
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)
|
|
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(
|
|
54
|
+
await logger.info("No search results found");
|
|
52
55
|
return {
|
|
53
|
-
role:
|
|
56
|
+
role: "system",
|
|
54
57
|
content: [
|
|
55
58
|
{
|
|
56
|
-
type:
|
|
57
|
-
text: promptsCache.getPrompt(
|
|
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(
|
|
66
|
+
let response = promptsCache.getPrompt("search_results_header");
|
|
64
67
|
if ((annotatedServers.length ?? 0) > 0) {
|
|
65
|
-
response +=
|
|
68
|
+
response += "\n=== Servers ===\n";
|
|
66
69
|
response += JSON.stringify(annotatedServers, null, 2);
|
|
67
|
-
response +=
|
|
70
|
+
response += "\n";
|
|
68
71
|
}
|
|
69
72
|
else {
|
|
70
|
-
response +=
|
|
73
|
+
response += "\n(No servers found)\n";
|
|
71
74
|
}
|
|
72
75
|
if (playbooks.length > 0) {
|
|
73
|
-
response +=
|
|
76
|
+
response += "\n=== Playbooks ===\n";
|
|
74
77
|
response += JSON.stringify(playbooks, null, 2);
|
|
75
|
-
response +=
|
|
78
|
+
response += "\n";
|
|
76
79
|
}
|
|
77
80
|
else {
|
|
78
|
-
response +=
|
|
81
|
+
response += "\n(No playbooks found)\n";
|
|
79
82
|
}
|
|
80
|
-
await logger.info(
|
|
83
|
+
await logger.info("Search completed successfully");
|
|
81
84
|
return {
|
|
82
|
-
role:
|
|
85
|
+
role: "system",
|
|
83
86
|
content: [
|
|
84
87
|
{
|
|
85
|
-
type:
|
|
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(
|
|
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:
|
|
108
|
+
role: "system",
|
|
106
109
|
content: [
|
|
107
110
|
{
|
|
108
|
-
type:
|
|
109
|
-
text: promptsCache
|
|
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
|
|
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(
|
|
4
|
-
if (
|
|
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
|
|
2
|
-
import { SubmitFeedbackParams } from
|
|
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>;
|