@cloudbase/agent-tools 0.0.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/CHANGELOG.md +416 -0
- package/dist/agent_tool.d.ts +7 -0
- package/dist/agent_tool.d.ts.map +1 -0
- package/dist/agent_tool.js +16 -0
- package/dist/agent_tool.js.map +1 -0
- package/dist/bash/bash-tool.d.ts +61 -0
- package/dist/bash/bash-tool.d.ts.map +1 -0
- package/dist/bash/bash-tool.js +191 -0
- package/dist/bash/bash-tool.js.map +1 -0
- package/dist/bash/index.d.ts +7 -0
- package/dist/bash/index.d.ts.map +1 -0
- package/dist/bash/index.js +17 -0
- package/dist/bash/index.js.map +1 -0
- package/dist/bash/operator/base-operator.d.ts +44 -0
- package/dist/bash/operator/base-operator.d.ts.map +1 -0
- package/dist/bash/operator/base-operator.js +14 -0
- package/dist/bash/operator/base-operator.js.map +1 -0
- package/dist/bash/operator/local-operator.d.ts +15 -0
- package/dist/bash/operator/local-operator.d.ts.map +1 -0
- package/dist/bash/operator/local-operator.js +145 -0
- package/dist/bash/operator/local-operator.js.map +1 -0
- package/dist/bash/operator/sandbox-operator.d.ts +22 -0
- package/dist/bash/operator/sandbox-operator.d.ts.map +1 -0
- package/dist/bash/operator/sandbox-operator.js +112 -0
- package/dist/bash/operator/sandbox-operator.js.map +1 -0
- package/dist/bash/utils.d.ts +106 -0
- package/dist/bash/utils.d.ts.map +1 -0
- package/dist/bash/utils.js +197 -0
- package/dist/bash/utils.js.map +1 -0
- package/dist/browser/browser-instance-manager.d.ts +79 -0
- package/dist/browser/browser-instance-manager.d.ts.map +1 -0
- package/dist/browser/browser-instance-manager.js +242 -0
- package/dist/browser/browser-instance-manager.js.map +1 -0
- package/dist/browser/browser-tool-executor.d.ts +57 -0
- package/dist/browser/browser-tool-executor.d.ts.map +1 -0
- package/dist/browser/browser-tool-executor.js +205 -0
- package/dist/browser/browser-tool-executor.js.map +1 -0
- package/dist/browser/browser_client_unified.d.ts +52 -0
- package/dist/browser/browser_client_unified.d.ts.map +1 -0
- package/dist/browser/browser_client_unified.js +381 -0
- package/dist/browser/browser_client_unified.js.map +1 -0
- package/dist/browser/browser_tool_unified.d.ts +93 -0
- package/dist/browser/browser_tool_unified.d.ts.map +1 -0
- package/dist/browser/browser_tool_unified.js +181 -0
- package/dist/browser/browser_tool_unified.js.map +1 -0
- package/dist/browser/index.d.ts +7 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +19 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/sandbox-connector.d.ts +93 -0
- package/dist/browser/sandbox-connector.d.ts.map +1 -0
- package/dist/browser/sandbox-connector.js +272 -0
- package/dist/browser/sandbox-connector.js.map +1 -0
- package/dist/browser/types.d.ts +53 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +3 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/code_executers/base_code_executor.d.ts +17 -0
- package/dist/code_executers/base_code_executor.d.ts.map +1 -0
- package/dist/code_executers/base_code_executor.js +20 -0
- package/dist/code_executers/base_code_executor.js.map +1 -0
- package/dist/code_executers/built_in_code_executor.d.ts +25 -0
- package/dist/code_executers/built_in_code_executor.d.ts.map +1 -0
- package/dist/code_executers/built_in_code_executor.js +106 -0
- package/dist/code_executers/built_in_code_executor.js.map +1 -0
- package/dist/code_executers/unsafe_local_code_executor.d.ts +118 -0
- package/dist/code_executers/unsafe_local_code_executor.d.ts.map +1 -0
- package/dist/code_executers/unsafe_local_code_executor.js +605 -0
- package/dist/code_executers/unsafe_local_code_executor.js.map +1 -0
- package/dist/fs/edit-tool.d.ts +26 -0
- package/dist/fs/edit-tool.d.ts.map +1 -0
- package/dist/fs/edit-tool.js +202 -0
- package/dist/fs/edit-tool.js.map +1 -0
- package/dist/fs/glob-tool.d.ts +31 -0
- package/dist/fs/glob-tool.d.ts.map +1 -0
- package/dist/fs/glob-tool.js +287 -0
- package/dist/fs/glob-tool.js.map +1 -0
- package/dist/fs/grep-tool.d.ts +32 -0
- package/dist/fs/grep-tool.d.ts.map +1 -0
- package/dist/fs/grep-tool.js +353 -0
- package/dist/fs/grep-tool.js.map +1 -0
- package/dist/fs/index.d.ts +11 -0
- package/dist/fs/index.d.ts.map +1 -0
- package/dist/fs/index.js +38 -0
- package/dist/fs/index.js.map +1 -0
- package/dist/fs/ls-tool.d.ts +26 -0
- package/dist/fs/ls-tool.d.ts.map +1 -0
- package/dist/fs/ls-tool.js +235 -0
- package/dist/fs/ls-tool.js.map +1 -0
- package/dist/fs/multiedit-tool.d.ts +34 -0
- package/dist/fs/multiedit-tool.d.ts.map +1 -0
- package/dist/fs/multiedit-tool.js +158 -0
- package/dist/fs/multiedit-tool.js.map +1 -0
- package/dist/fs/operator/base-operator.d.ts +28 -0
- package/dist/fs/operator/base-operator.d.ts.map +1 -0
- package/dist/fs/operator/base-operator.js +21 -0
- package/dist/fs/operator/base-operator.js.map +1 -0
- package/dist/fs/operator/in-memory-operator.d.ts +39 -0
- package/dist/fs/operator/in-memory-operator.d.ts.map +1 -0
- package/dist/fs/operator/in-memory-operator.js +115 -0
- package/dist/fs/operator/in-memory-operator.js.map +1 -0
- package/dist/fs/operator/index.d.ts +6 -0
- package/dist/fs/operator/index.d.ts.map +1 -0
- package/dist/fs/operator/index.js +28 -0
- package/dist/fs/operator/index.js.map +1 -0
- package/dist/fs/operator/local-operator.d.ts +25 -0
- package/dist/fs/operator/local-operator.d.ts.map +1 -0
- package/dist/fs/operator/local-operator.js +62 -0
- package/dist/fs/operator/local-operator.js.map +1 -0
- package/dist/fs/operator/sanbox-operator.d.ts +31 -0
- package/dist/fs/operator/sanbox-operator.d.ts.map +1 -0
- package/dist/fs/operator/sanbox-operator.js +172 -0
- package/dist/fs/operator/sanbox-operator.js.map +1 -0
- package/dist/fs/operator/transaction/index.d.ts +6 -0
- package/dist/fs/operator/transaction/index.d.ts.map +1 -0
- package/dist/fs/operator/transaction/index.js +28 -0
- package/dist/fs/operator/transaction/index.js.map +1 -0
- package/dist/fs/operator/transaction/snapshot-strategies.d.ts +54 -0
- package/dist/fs/operator/transaction/snapshot-strategies.d.ts.map +1 -0
- package/dist/fs/operator/transaction/snapshot-strategies.js +278 -0
- package/dist/fs/operator/transaction/snapshot-strategies.js.map +1 -0
- package/dist/fs/operator/transaction/transaction-operator.d.ts +53 -0
- package/dist/fs/operator/transaction/transaction-operator.d.ts.map +1 -0
- package/dist/fs/operator/transaction/transaction-operator.js +195 -0
- package/dist/fs/operator/transaction/transaction-operator.js.map +1 -0
- package/dist/fs/operator/transaction/transaction-utils.d.ts +80 -0
- package/dist/fs/operator/transaction/transaction-utils.d.ts.map +1 -0
- package/dist/fs/operator/transaction/transaction-utils.js +156 -0
- package/dist/fs/operator/transaction/transaction-utils.js.map +1 -0
- package/dist/fs/read-tool.d.ts +32 -0
- package/dist/fs/read-tool.d.ts.map +1 -0
- package/dist/fs/read-tool.js +271 -0
- package/dist/fs/read-tool.js.map +1 -0
- package/dist/fs/str-replace-editor.d.ts +23 -0
- package/dist/fs/str-replace-editor.d.ts.map +1 -0
- package/dist/fs/str-replace-editor.js +74 -0
- package/dist/fs/str-replace-editor.js.map +1 -0
- package/dist/fs/toolkit.d.ts +61 -0
- package/dist/fs/toolkit.d.ts.map +1 -0
- package/dist/fs/toolkit.js +113 -0
- package/dist/fs/toolkit.js.map +1 -0
- package/dist/fs/utils.d.ts +32 -0
- package/dist/fs/utils.d.ts.map +1 -0
- package/dist/fs/utils.js +133 -0
- package/dist/fs/utils.js.map +1 -0
- package/dist/fs/write-tool.d.ts +26 -0
- package/dist/fs/write-tool.d.ts.map +1 -0
- package/dist/fs/write-tool.js +110 -0
- package/dist/fs/write-tool.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/agkit-mcp-server.d.ts +291 -0
- package/dist/mcp/agkit-mcp-server.d.ts.map +1 -0
- package/dist/mcp/agkit-mcp-server.js +821 -0
- package/dist/mcp/agkit-mcp-server.js.map +1 -0
- package/dist/mcp/client-tool.d.ts +65 -0
- package/dist/mcp/client-tool.d.ts.map +1 -0
- package/dist/mcp/client-tool.js +220 -0
- package/dist/mcp/client-tool.js.map +1 -0
- package/dist/mcp/index.d.ts +14 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +26 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/mcp-client-manager.d.ts +153 -0
- package/dist/mcp/mcp-client-manager.d.ts.map +1 -0
- package/dist/mcp/mcp-client-manager.js +606 -0
- package/dist/mcp/mcp-client-manager.js.map +1 -0
- package/dist/mcp/mcp-toolkit.d.ts +112 -0
- package/dist/mcp/mcp-toolkit.d.ts.map +1 -0
- package/dist/mcp/mcp-toolkit.js +188 -0
- package/dist/mcp/mcp-toolkit.js.map +1 -0
- package/dist/mcp/types.d.ts +157 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +34 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/mcp/utils.d.ts +17 -0
- package/dist/mcp/utils.d.ts.map +1 -0
- package/dist/mcp/utils.js +48 -0
- package/dist/mcp/utils.js.map +1 -0
- package/dist/types/index.d.ts +31 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/zod.d.ts +18 -0
- package/dist/types/zod.d.ts.map +1 -0
- package/dist/types/zod.js +3 -0
- package/dist/types/zod.js.map +1 -0
- package/dist/utils.d.ts +141 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +379 -0
- package/dist/utils.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,606 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Client Manager
|
|
4
|
+
*
|
|
5
|
+
* Manages connections to external MCP servers and provides tools from those servers
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.MCPClientManager = void 0;
|
|
9
|
+
const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
|
|
10
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/client/stdio.js");
|
|
11
|
+
const sse_js_1 = require("@modelcontextprotocol/sdk/client/sse.js");
|
|
12
|
+
const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/client/streamableHttp.js");
|
|
13
|
+
const client_tool_1 = require("./client-tool");
|
|
14
|
+
const types_1 = require("./types");
|
|
15
|
+
const agkit_mcp_server_1 = require("./agkit-mcp-server");
|
|
16
|
+
/**
|
|
17
|
+
* MCP Client Manager - manages connections to external MCP servers
|
|
18
|
+
*/
|
|
19
|
+
class MCPClientManager {
|
|
20
|
+
constructor() {
|
|
21
|
+
this.clients = new Map();
|
|
22
|
+
this.transports = new Map();
|
|
23
|
+
this.connections = new Map();
|
|
24
|
+
this.availableTools = new Map();
|
|
25
|
+
this.eventListeners = new Set();
|
|
26
|
+
// Enhanced connection management
|
|
27
|
+
this.connectionOptions = new Map();
|
|
28
|
+
this.serverStatus = new Map();
|
|
29
|
+
this.reconnectTimers = new Map();
|
|
30
|
+
this.heartbeatTimers = new Map();
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Add a new MCP server connection
|
|
34
|
+
*/
|
|
35
|
+
async addServer(serverId, config, connectionOptions) {
|
|
36
|
+
if (this.clients.has(serverId)) {
|
|
37
|
+
throw new Error(`Server '${serverId}' is already registered`);
|
|
38
|
+
}
|
|
39
|
+
// Set up connection options with defaults
|
|
40
|
+
const options = {
|
|
41
|
+
autoReconnect: true,
|
|
42
|
+
reconnectDelay: 5000,
|
|
43
|
+
maxReconnectAttempts: 3,
|
|
44
|
+
...connectionOptions,
|
|
45
|
+
};
|
|
46
|
+
// Initialize server status
|
|
47
|
+
const status = {
|
|
48
|
+
connected: false,
|
|
49
|
+
toolCount: 0,
|
|
50
|
+
resourceCount: 0,
|
|
51
|
+
promptCount: 0,
|
|
52
|
+
errors: [],
|
|
53
|
+
lastActivity: new Date(),
|
|
54
|
+
reconnectAttempts: 0,
|
|
55
|
+
};
|
|
56
|
+
let client;
|
|
57
|
+
// If a pre-connected client is provided, use it directly
|
|
58
|
+
if (config.client) {
|
|
59
|
+
client = config.client;
|
|
60
|
+
status.connected = true; // Assume pre-connected client is already connected
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// Validate that transport config is provided
|
|
64
|
+
if (!config.transport) {
|
|
65
|
+
throw new Error(`Either 'client' or 'transport' must be provided in config`);
|
|
66
|
+
}
|
|
67
|
+
// Create new client
|
|
68
|
+
client = new index_js_1.Client({
|
|
69
|
+
name: config.name || "ag-kit-mcp-client",
|
|
70
|
+
version: config.version || "1.0.0",
|
|
71
|
+
}, {
|
|
72
|
+
capabilities: {
|
|
73
|
+
tools: {},
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
this.clients.set(serverId, client);
|
|
78
|
+
this.connections.set(serverId, config);
|
|
79
|
+
this.connectionOptions.set(serverId, options);
|
|
80
|
+
this.serverStatus.set(serverId, status);
|
|
81
|
+
try {
|
|
82
|
+
// Only connect if we created a new client (not pre-connected)
|
|
83
|
+
if (!config.client) {
|
|
84
|
+
await this.connectServer(serverId);
|
|
85
|
+
}
|
|
86
|
+
await this.loadServerTools(serverId);
|
|
87
|
+
// Set up heartbeat if configured
|
|
88
|
+
if (options.heartbeatInterval) {
|
|
89
|
+
this.setupHeartbeat(serverId);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
// Clean up on failure
|
|
94
|
+
this.cleanupServer(serverId);
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Connect to a specific server
|
|
100
|
+
*/
|
|
101
|
+
async connectServer(serverId) {
|
|
102
|
+
const client = this.clients.get(serverId);
|
|
103
|
+
const config = this.connections.get(serverId);
|
|
104
|
+
const status = this.serverStatus.get(serverId);
|
|
105
|
+
if (!client || !config || !status) {
|
|
106
|
+
throw new Error(`Server '${serverId}' not found`);
|
|
107
|
+
}
|
|
108
|
+
// Validate transport config exists (should not be called for pre-connected clients)
|
|
109
|
+
if (!config.transport) {
|
|
110
|
+
throw new Error(`Transport config is required for server '${serverId}'`);
|
|
111
|
+
}
|
|
112
|
+
// Check if already connected
|
|
113
|
+
if (status.connected && this.transports.has(serverId)) {
|
|
114
|
+
console.log(`[MCPClientManager] Server '${serverId}' is already connected`);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Create transport based on configuration
|
|
118
|
+
const transport = await this.createTransport(config.transport);
|
|
119
|
+
// Connect with timeout
|
|
120
|
+
const connectPromise = client.connect(transport);
|
|
121
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
122
|
+
setTimeout(() => reject(new Error("Connection timeout")), config.transport.timeout || 10000);
|
|
123
|
+
});
|
|
124
|
+
await Promise.race([connectPromise, timeoutPromise]);
|
|
125
|
+
this.transports.set(serverId, transport);
|
|
126
|
+
// Update status
|
|
127
|
+
status.connected = true;
|
|
128
|
+
status.lastActivity = new Date();
|
|
129
|
+
status.reconnectAttempts = 0;
|
|
130
|
+
this.emit({
|
|
131
|
+
type: "connected",
|
|
132
|
+
clientName: serverId,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Create transport instance based on configuration
|
|
137
|
+
*/
|
|
138
|
+
async createTransport(transportConfig) {
|
|
139
|
+
const transportType = (0, types_1.detectTransportType)(transportConfig);
|
|
140
|
+
switch (transportType) {
|
|
141
|
+
case "stdio":
|
|
142
|
+
if (!transportConfig.command) {
|
|
143
|
+
throw new Error("Command is required for stdio transport");
|
|
144
|
+
}
|
|
145
|
+
return new stdio_js_1.StdioClientTransport({
|
|
146
|
+
command: transportConfig.command,
|
|
147
|
+
args: transportConfig.args || [],
|
|
148
|
+
});
|
|
149
|
+
case "sse": {
|
|
150
|
+
const { type, url, timeout, ...restOptions } = transportConfig;
|
|
151
|
+
if (!url) {
|
|
152
|
+
throw new Error("URL is required for SSE transport");
|
|
153
|
+
}
|
|
154
|
+
return new sse_js_1.SSEClientTransport(new URL(url), restOptions);
|
|
155
|
+
}
|
|
156
|
+
case "streamableHttp": {
|
|
157
|
+
const { type, url, timeout, ...restOptions } = transportConfig;
|
|
158
|
+
if (!url) {
|
|
159
|
+
throw new Error("URL is required for StreamableHTTP transport");
|
|
160
|
+
}
|
|
161
|
+
return new streamableHttp_js_1.StreamableHTTPClientTransport(new URL(url), restOptions);
|
|
162
|
+
}
|
|
163
|
+
case "memory":
|
|
164
|
+
if (!transportConfig.memoryId) {
|
|
165
|
+
throw new Error("Memory ID is required for InMemory transport");
|
|
166
|
+
}
|
|
167
|
+
// Import the memory transport registry from agkit-mcp-server
|
|
168
|
+
return agkit_mcp_server_1.memoryTransportRegistry.getClientTransport(transportConfig.memoryId);
|
|
169
|
+
case "custom":
|
|
170
|
+
if (!transportConfig.transport) {
|
|
171
|
+
throw new Error("Transport instance is required for custom transport");
|
|
172
|
+
}
|
|
173
|
+
return transportConfig.transport;
|
|
174
|
+
default:
|
|
175
|
+
throw new Error(`Transport type '${transportType}' is not supported. ` +
|
|
176
|
+
`Supported types: stdio, sse, streamableHttp, memory, custom`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Load tools from a specific server
|
|
181
|
+
*/
|
|
182
|
+
async loadServerTools(serverId) {
|
|
183
|
+
const client = this.clients.get(serverId);
|
|
184
|
+
if (!client) {
|
|
185
|
+
throw new Error(`Server '${serverId}' not found`);
|
|
186
|
+
}
|
|
187
|
+
try {
|
|
188
|
+
const response = await client.listTools();
|
|
189
|
+
// Type assertion for MCP SDK response
|
|
190
|
+
const listResponse = response;
|
|
191
|
+
this.availableTools.set(serverId, listResponse.tools || []);
|
|
192
|
+
(listResponse.tools || []).forEach((tool) => {
|
|
193
|
+
this.emit({
|
|
194
|
+
type: "tool_discovered",
|
|
195
|
+
tool: {
|
|
196
|
+
name: tool.name,
|
|
197
|
+
description: tool.description || "",
|
|
198
|
+
inputSchema: tool.inputSchema,
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
this.emit({
|
|
205
|
+
type: "error",
|
|
206
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
207
|
+
context: `load_tools:${serverId}`,
|
|
208
|
+
});
|
|
209
|
+
throw error;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get all available tools from all connected servers
|
|
214
|
+
*/
|
|
215
|
+
getAllTools(serverId) {
|
|
216
|
+
const allTools = [];
|
|
217
|
+
for (const [_serverId, tools] of serverId
|
|
218
|
+
? new Map([[serverId, this.getServerTools(serverId)]]).entries()
|
|
219
|
+
: this.availableTools.entries()) {
|
|
220
|
+
for (const tool of tools) {
|
|
221
|
+
allTools.push({ serverId: _serverId, tool });
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return allTools;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Get tools from a specific server
|
|
228
|
+
*/
|
|
229
|
+
getServerTools(serverId) {
|
|
230
|
+
return this.availableTools.get(serverId) || [];
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Create MCPClientTool instances for all available tools
|
|
234
|
+
*/
|
|
235
|
+
createClientTools(serverId) {
|
|
236
|
+
const clientTools = [];
|
|
237
|
+
for (const { serverId: _serverId, tool } of this.getAllTools(serverId)) {
|
|
238
|
+
// Use createClientTool to avoid code duplication
|
|
239
|
+
const clientTool = this.createClientTool(_serverId, tool.name, `${_serverId}:${tool.name}` // Use server:tool format as AG-Kit tool name
|
|
240
|
+
);
|
|
241
|
+
clientTools.push(clientTool);
|
|
242
|
+
}
|
|
243
|
+
return clientTools;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Create a specific client tool
|
|
247
|
+
*/
|
|
248
|
+
createClientTool(serverId, toolName, agKitToolName) {
|
|
249
|
+
const tools = this.getServerTools(serverId);
|
|
250
|
+
const tool = tools.find((t) => t.name === toolName);
|
|
251
|
+
if (!tool) {
|
|
252
|
+
throw new Error(`Tool '${toolName}' not found on server '${serverId}'`);
|
|
253
|
+
}
|
|
254
|
+
const config = this.connections.get(serverId);
|
|
255
|
+
const toolMetadata = {
|
|
256
|
+
name: tool.name,
|
|
257
|
+
description: tool.description || "",
|
|
258
|
+
inputSchema: tool.inputSchema,
|
|
259
|
+
};
|
|
260
|
+
// Create a wrapper that uses this manager's client
|
|
261
|
+
const client = new Proxy(this.clients.get(serverId), {
|
|
262
|
+
get: (_, prop) => {
|
|
263
|
+
if (prop === "callTool") {
|
|
264
|
+
return async (params) => {
|
|
265
|
+
return this.callTool(serverId, params.name, params.arguments);
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
return Reflect.get(_, prop);
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
return new client_tool_1.MCPClientTool(client, toolMetadata, {
|
|
272
|
+
name: agKitToolName || `${serverId}:${toolName}`,
|
|
273
|
+
}, { includeMetadata: true });
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Call a tool on a specific server
|
|
277
|
+
*/
|
|
278
|
+
async callTool(serverId, toolName, args) {
|
|
279
|
+
const client = this.clients.get(serverId);
|
|
280
|
+
if (!client) {
|
|
281
|
+
throw new Error(`Server '${serverId}' not connected`);
|
|
282
|
+
}
|
|
283
|
+
try {
|
|
284
|
+
this.emit({
|
|
285
|
+
type: "tool_called",
|
|
286
|
+
toolName: `${serverId}:${toolName}`,
|
|
287
|
+
arguments: args,
|
|
288
|
+
});
|
|
289
|
+
const callResponse = await client.callTool({
|
|
290
|
+
name: toolName,
|
|
291
|
+
arguments: args,
|
|
292
|
+
});
|
|
293
|
+
this.emit({
|
|
294
|
+
type: "tool_result",
|
|
295
|
+
toolName: `${serverId}:${toolName}`,
|
|
296
|
+
result: callResponse,
|
|
297
|
+
});
|
|
298
|
+
return callResponse;
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
this.emit({
|
|
302
|
+
type: "error",
|
|
303
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
304
|
+
context: `tool_call:${serverId}:${toolName}`,
|
|
305
|
+
});
|
|
306
|
+
throw error;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Disconnect from a specific server
|
|
311
|
+
*/
|
|
312
|
+
async disconnectServer(serverId) {
|
|
313
|
+
const client = this.clients.get(serverId);
|
|
314
|
+
const transport = this.transports.get(serverId);
|
|
315
|
+
if (client && transport) {
|
|
316
|
+
try {
|
|
317
|
+
await client.close();
|
|
318
|
+
this.emit({
|
|
319
|
+
type: "disconnected",
|
|
320
|
+
clientName: serverId,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
catch (error) {
|
|
324
|
+
this.emit({
|
|
325
|
+
type: "error",
|
|
326
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
327
|
+
context: `disconnect:${serverId}`,
|
|
328
|
+
});
|
|
329
|
+
throw error;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
this.cleanupServer(serverId);
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Disconnect from all servers
|
|
336
|
+
*/
|
|
337
|
+
async disconnectAll() {
|
|
338
|
+
const serverIds = Array.from(this.clients.keys());
|
|
339
|
+
for (const serverId of serverIds) {
|
|
340
|
+
try {
|
|
341
|
+
await this.disconnectServer(serverId);
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
console.error(`Error disconnecting from server '${serverId}':`, error);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Refresh connections and reload tools
|
|
350
|
+
*/
|
|
351
|
+
async refresh() {
|
|
352
|
+
const serverIds = Array.from(this.connections.keys());
|
|
353
|
+
for (const serverId of serverIds) {
|
|
354
|
+
try {
|
|
355
|
+
const config = this.connections.get(serverId);
|
|
356
|
+
if (!config)
|
|
357
|
+
continue;
|
|
358
|
+
// Skip refresh for pre-connected clients
|
|
359
|
+
if (config.client) {
|
|
360
|
+
console.warn(`Skipping refresh for server '${serverId}' - it uses a pre-connected client. ` +
|
|
361
|
+
`Please handle refresh externally.`);
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
await this.disconnectServer(serverId);
|
|
365
|
+
await this.addServer(serverId, config, this.connectionOptions.get(serverId));
|
|
366
|
+
}
|
|
367
|
+
catch (error) {
|
|
368
|
+
console.error(`Error refreshing server '${serverId}':`, error);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Check if a server is connected
|
|
374
|
+
*/
|
|
375
|
+
isServerConnected(serverId) {
|
|
376
|
+
const status = this.serverStatus.get(serverId);
|
|
377
|
+
return status?.connected === true && this.transports.has(serverId);
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Get connection status for all servers
|
|
381
|
+
*/
|
|
382
|
+
getConnectionStatus() {
|
|
383
|
+
const status = {};
|
|
384
|
+
for (const serverId of this.clients.keys()) {
|
|
385
|
+
status[serverId] = this.isServerConnected(serverId);
|
|
386
|
+
}
|
|
387
|
+
return status;
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Add event listener
|
|
391
|
+
*/
|
|
392
|
+
addEventListener(listener) {
|
|
393
|
+
this.eventListeners.add(listener);
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Remove event listener
|
|
397
|
+
*/
|
|
398
|
+
removeEventListener(listener) {
|
|
399
|
+
return this.eventListeners.delete(listener);
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Emit event to all listeners
|
|
403
|
+
*/
|
|
404
|
+
emit(event) {
|
|
405
|
+
this.eventListeners.forEach((listener) => {
|
|
406
|
+
try {
|
|
407
|
+
listener(event);
|
|
408
|
+
}
|
|
409
|
+
catch (error) {
|
|
410
|
+
console.error("[MCPClientManager] Error in event listener:", error);
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Get statistics
|
|
416
|
+
*/
|
|
417
|
+
getStats() {
|
|
418
|
+
return {
|
|
419
|
+
connectedServers: this.clients.size,
|
|
420
|
+
totalTools: Array.from(this.availableTools.values()).reduce((sum, tools) => sum + tools.length, 0),
|
|
421
|
+
serverStatus: this.getConnectionStatus(),
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Set up heartbeat to keep connection alive
|
|
426
|
+
*/
|
|
427
|
+
setupHeartbeat(serverId) {
|
|
428
|
+
const options = this.connectionOptions.get(serverId);
|
|
429
|
+
if (!options?.heartbeatInterval)
|
|
430
|
+
return;
|
|
431
|
+
const config = this.connections.get(serverId);
|
|
432
|
+
const heartbeatTimer = setInterval(async () => {
|
|
433
|
+
const client = this.clients.get(serverId);
|
|
434
|
+
const status = this.serverStatus.get(serverId);
|
|
435
|
+
if (client && status?.connected) {
|
|
436
|
+
try {
|
|
437
|
+
// Send ping to keep connection alive
|
|
438
|
+
await client.ping?.();
|
|
439
|
+
if (status) {
|
|
440
|
+
status.lastActivity = new Date();
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
catch (error) {
|
|
444
|
+
this.handleError(serverId, error instanceof Error ? error : new Error(String(error)), "heartbeat");
|
|
445
|
+
// Only auto-reconnect if we have transport config (not pre-connected client)
|
|
446
|
+
if (options.autoReconnect && config.transport) {
|
|
447
|
+
this.scheduleReconnect(serverId);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
}, options.heartbeatInterval);
|
|
452
|
+
this.heartbeatTimers.set(serverId, heartbeatTimer);
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Schedule automatic reconnection
|
|
456
|
+
*/
|
|
457
|
+
scheduleReconnect(serverId) {
|
|
458
|
+
const options = this.connectionOptions.get(serverId);
|
|
459
|
+
const status = this.serverStatus.get(serverId);
|
|
460
|
+
const config = this.connections.get(serverId);
|
|
461
|
+
if (!options?.autoReconnect || !status || !config)
|
|
462
|
+
return;
|
|
463
|
+
// Don't auto-reconnect pre-connected clients without callback
|
|
464
|
+
if (config.client && !config.onReconnectNeeded) {
|
|
465
|
+
this.emit({
|
|
466
|
+
type: "error",
|
|
467
|
+
error: new Error(`Cannot auto-reconnect server '${serverId}' - it uses a pre-connected client without onReconnectNeeded callback. ` +
|
|
468
|
+
`Please provide an onReconnectNeeded callback or handle reconnection externally.`),
|
|
469
|
+
context: `auto_reconnect:${serverId}`,
|
|
470
|
+
});
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
// Clear existing timer
|
|
474
|
+
const existingTimer = this.reconnectTimers.get(serverId);
|
|
475
|
+
if (existingTimer) {
|
|
476
|
+
clearTimeout(existingTimer);
|
|
477
|
+
}
|
|
478
|
+
// Check if we've exceeded max attempts
|
|
479
|
+
if (options.maxReconnectAttempts &&
|
|
480
|
+
status.reconnectAttempts >= options.maxReconnectAttempts) {
|
|
481
|
+
this.emit({
|
|
482
|
+
type: "error",
|
|
483
|
+
error: new Error(`Max reconnection attempts (${options.maxReconnectAttempts}) exceeded for server '${serverId}'`),
|
|
484
|
+
context: `reconnect:${serverId}`,
|
|
485
|
+
});
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
488
|
+
const reconnectTimer = setTimeout(async () => {
|
|
489
|
+
try {
|
|
490
|
+
status.reconnectAttempts = (status.reconnectAttempts || 0) + 1;
|
|
491
|
+
await this.reconnectServer(serverId);
|
|
492
|
+
}
|
|
493
|
+
catch (error) {
|
|
494
|
+
console.error(`Reconnection failed for server '${serverId}':`, error);
|
|
495
|
+
// Schedule another reconnect attempt
|
|
496
|
+
this.scheduleReconnect(serverId);
|
|
497
|
+
}
|
|
498
|
+
}, options.reconnectDelay || 5000);
|
|
499
|
+
this.reconnectTimers.set(serverId, reconnectTimer);
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Manually reconnect to a specific server
|
|
503
|
+
*/
|
|
504
|
+
async reconnectServer(serverId) {
|
|
505
|
+
const config = this.connections.get(serverId);
|
|
506
|
+
if (!config) {
|
|
507
|
+
throw new Error(`Server '${serverId}' not found`);
|
|
508
|
+
}
|
|
509
|
+
// Clear existing timer
|
|
510
|
+
const existingTimer = this.reconnectTimers.get(serverId);
|
|
511
|
+
if (existingTimer) {
|
|
512
|
+
clearTimeout(existingTimer);
|
|
513
|
+
this.reconnectTimers.delete(serverId);
|
|
514
|
+
}
|
|
515
|
+
try {
|
|
516
|
+
await this.disconnectServer(serverId);
|
|
517
|
+
// Handle pre-connected client with reconnection callback
|
|
518
|
+
if (config.client) {
|
|
519
|
+
if (config.onReconnectNeeded) {
|
|
520
|
+
// Use the reconnection callback to get a new connected client
|
|
521
|
+
const newClient = await config.onReconnectNeeded(serverId, config);
|
|
522
|
+
const newConfig = { ...config, client: newClient };
|
|
523
|
+
await this.addServer(serverId, newConfig, this.connectionOptions.get(serverId));
|
|
524
|
+
}
|
|
525
|
+
else {
|
|
526
|
+
throw new Error(`Cannot reconnect server '${serverId}' - it uses a pre-connected client but no onReconnectNeeded callback is provided. ` +
|
|
527
|
+
`Please provide an onReconnectNeeded callback or handle reconnection externally.`);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
else if (config.transport) {
|
|
531
|
+
// Standard reconnection using transport config
|
|
532
|
+
await this.addServer(serverId, config, this.connectionOptions.get(serverId));
|
|
533
|
+
}
|
|
534
|
+
else {
|
|
535
|
+
throw new Error(`Cannot reconnect server '${serverId}' - no transport configuration or reconnection callback available`);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
catch (error) {
|
|
539
|
+
this.handleError(serverId, error instanceof Error ? error : new Error(String(error)), "reconnection");
|
|
540
|
+
throw error;
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* Handle errors and update status
|
|
545
|
+
*/
|
|
546
|
+
handleError(serverId, error, context) {
|
|
547
|
+
const status = this.serverStatus.get(serverId);
|
|
548
|
+
if (!status)
|
|
549
|
+
return;
|
|
550
|
+
status.errors.push({
|
|
551
|
+
timestamp: new Date(),
|
|
552
|
+
error,
|
|
553
|
+
context,
|
|
554
|
+
});
|
|
555
|
+
// Keep only last 10 errors
|
|
556
|
+
if (status.errors.length > 10) {
|
|
557
|
+
status.errors = status.errors.slice(-10);
|
|
558
|
+
}
|
|
559
|
+
this.emit({
|
|
560
|
+
type: "error",
|
|
561
|
+
error,
|
|
562
|
+
context: `${context}:${serverId}`,
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Clean up server resources
|
|
567
|
+
*/
|
|
568
|
+
cleanupServer(serverId) {
|
|
569
|
+
// Clear timers
|
|
570
|
+
const reconnectTimer = this.reconnectTimers.get(serverId);
|
|
571
|
+
if (reconnectTimer) {
|
|
572
|
+
clearTimeout(reconnectTimer);
|
|
573
|
+
this.reconnectTimers.delete(serverId);
|
|
574
|
+
}
|
|
575
|
+
const heartbeatTimer = this.heartbeatTimers.get(serverId);
|
|
576
|
+
if (heartbeatTimer) {
|
|
577
|
+
clearInterval(heartbeatTimer);
|
|
578
|
+
this.heartbeatTimers.delete(serverId);
|
|
579
|
+
}
|
|
580
|
+
// Remove from maps
|
|
581
|
+
this.clients.delete(serverId);
|
|
582
|
+
this.connections.delete(serverId);
|
|
583
|
+
this.transports.delete(serverId);
|
|
584
|
+
this.availableTools.delete(serverId);
|
|
585
|
+
this.connectionOptions.delete(serverId);
|
|
586
|
+
this.serverStatus.delete(serverId);
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* Get server status
|
|
590
|
+
*/
|
|
591
|
+
getServerStatus(serverId) {
|
|
592
|
+
return this.serverStatus.get(serverId);
|
|
593
|
+
}
|
|
594
|
+
/**
|
|
595
|
+
* Get all server statuses
|
|
596
|
+
*/
|
|
597
|
+
getAllServerStatuses() {
|
|
598
|
+
const statuses = {};
|
|
599
|
+
for (const [serverId, status] of this.serverStatus.entries()) {
|
|
600
|
+
statuses[serverId] = { ...status };
|
|
601
|
+
}
|
|
602
|
+
return statuses;
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
exports.MCPClientManager = MCPClientManager;
|
|
606
|
+
//# sourceMappingURL=mcp-client-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-client-manager.js","sourceRoot":"","sources":["../../src/mcp/mcp-client-manager.ts"],"names":[],"mappings":"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"}
|