@juspay/neurolink 6.1.0 → 6.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -6
- package/dist/agent/direct-tools.js +6 -5
- package/dist/cli/commands/config.d.ts +13 -13
- package/dist/cli/index.js +3 -9
- package/dist/config/configManager.js +11 -10
- package/dist/core/analytics.d.ts +11 -1
- package/dist/core/analytics.js +2 -2
- package/dist/core/base-provider.js +4 -18
- package/dist/core/dynamic-models.d.ts +8 -8
- package/dist/core/factory.js +3 -11
- package/dist/index.d.ts +2 -4
- package/dist/index.js +2 -11
- package/dist/lib/agent/direct-tools.js +6 -5
- package/dist/lib/config/configManager.js +11 -10
- package/dist/lib/core/analytics.d.ts +11 -1
- package/dist/lib/core/analytics.js +2 -2
- package/dist/lib/core/base-provider.js +4 -18
- package/dist/lib/core/dynamic-models.d.ts +8 -8
- package/dist/lib/core/factory.js +3 -11
- package/dist/lib/index.d.ts +2 -4
- package/dist/lib/index.js +2 -11
- package/dist/lib/mcp/factory.d.ts +1 -1
- package/dist/lib/mcp/index.d.ts +9 -21
- package/dist/lib/mcp/index.js +16 -57
- package/dist/lib/mcp/registry.js +1 -1
- package/dist/lib/mcp/servers/ai-providers/ai-analysis-tools.js +2 -1
- package/dist/lib/mcp/tool-registry.js +1 -1
- package/dist/lib/neurolink.d.ts +1 -9
- package/dist/lib/neurolink.js +22 -71
- package/dist/lib/providers/amazon-bedrock.js +5 -16
- package/dist/lib/providers/anthropic-baseprovider.js +3 -21
- package/dist/lib/providers/anthropic.js +4 -7
- package/dist/lib/providers/azure-openai.js +6 -3
- package/dist/lib/providers/google-vertex.js +5 -9
- package/dist/lib/providers/huggingFace.js +5 -10
- package/dist/lib/providers/mistral.js +5 -8
- package/dist/lib/providers/openAI.js +4 -7
- package/dist/lib/telemetry/index.js +2 -1
- package/dist/lib/utils/logger.d.ts +62 -2
- package/dist/lib/utils/logger.js +174 -9
- package/dist/lib/utils/providerConfig.d.ts +117 -0
- package/dist/lib/utils/providerConfig.js +353 -0
- package/dist/lib/utils/providerUtils.d.ts +2 -1
- package/dist/lib/utils/providerUtils.js +53 -36
- package/dist/lib/utils/timeout.d.ts +72 -1
- package/dist/lib/utils/timeout.js +203 -2
- package/dist/mcp/factory.d.ts +1 -1
- package/dist/mcp/index.d.ts +9 -21
- package/dist/mcp/index.js +16 -57
- package/dist/mcp/registry.js +1 -1
- package/dist/mcp/servers/ai-providers/ai-analysis-tools.js +2 -1
- package/dist/mcp/tool-registry.js +1 -1
- package/dist/neurolink.d.ts +1 -9
- package/dist/neurolink.js +22 -71
- package/dist/providers/amazon-bedrock.js +5 -16
- package/dist/providers/anthropic-baseprovider.js +3 -21
- package/dist/providers/anthropic.js +4 -7
- package/dist/providers/azure-openai.js +6 -3
- package/dist/providers/google-vertex.js +5 -9
- package/dist/providers/huggingFace.js +5 -10
- package/dist/providers/mistral.js +5 -8
- package/dist/providers/openAI.js +4 -7
- package/dist/telemetry/index.js +2 -1
- package/dist/utils/logger.d.ts +62 -2
- package/dist/utils/logger.js +174 -9
- package/dist/utils/providerConfig.d.ts +117 -0
- package/dist/utils/providerConfig.js +353 -0
- package/dist/utils/providerUtils.d.ts +2 -1
- package/dist/utils/providerUtils.js +53 -36
- package/dist/utils/timeout.d.ts +72 -1
- package/dist/utils/timeout.js +203 -2
- package/package.json +1 -1
- package/dist/chat/client-utils.d.ts +0 -95
- package/dist/chat/client-utils.js +0 -315
- package/dist/chat/index.d.ts +0 -24
- package/dist/chat/index.js +0 -33
- package/dist/chat/session-storage.d.ts +0 -77
- package/dist/chat/session-storage.js +0 -233
- package/dist/chat/session.d.ts +0 -96
- package/dist/chat/session.js +0 -257
- package/dist/chat/sse-handler.d.ts +0 -49
- package/dist/chat/sse-handler.js +0 -259
- package/dist/chat/types.d.ts +0 -74
- package/dist/chat/types.js +0 -5
- package/dist/chat/websocket-chat-handler.d.ts +0 -37
- package/dist/chat/websocket-chat-handler.js +0 -262
- package/dist/cli/commands/mcp.d.ts +0 -20
- package/dist/cli/commands/mcp.js +0 -1272
- package/dist/core/defaults.d.ts +0 -19
- package/dist/core/defaults.js +0 -29
- package/dist/core/evaluation-config.d.ts +0 -29
- package/dist/core/evaluation-config.js +0 -144
- package/dist/factories/compatibility-factory.d.ts +0 -35
- package/dist/factories/compatibility-factory.js +0 -71
- package/dist/factories/provider-generate-factory.d.ts +0 -20
- package/dist/factories/provider-generate-factory.js +0 -93
- package/dist/lib/chat/client-utils.d.ts +0 -95
- package/dist/lib/chat/client-utils.js +0 -315
- package/dist/lib/chat/index.d.ts +0 -24
- package/dist/lib/chat/index.js +0 -33
- package/dist/lib/chat/session-storage.d.ts +0 -77
- package/dist/lib/chat/session-storage.js +0 -233
- package/dist/lib/chat/session.d.ts +0 -96
- package/dist/lib/chat/session.js +0 -257
- package/dist/lib/chat/sse-handler.d.ts +0 -49
- package/dist/lib/chat/sse-handler.js +0 -259
- package/dist/lib/chat/types.d.ts +0 -74
- package/dist/lib/chat/types.js +0 -5
- package/dist/lib/chat/websocket-chat-handler.d.ts +0 -37
- package/dist/lib/chat/websocket-chat-handler.js +0 -262
- package/dist/lib/core/defaults.d.ts +0 -19
- package/dist/lib/core/defaults.js +0 -29
- package/dist/lib/core/evaluation-config.d.ts +0 -29
- package/dist/lib/core/evaluation-config.js +0 -144
- package/dist/lib/factories/compatibility-factory.d.ts +0 -35
- package/dist/lib/factories/compatibility-factory.js +0 -71
- package/dist/lib/factories/provider-generate-factory.d.ts +0 -20
- package/dist/lib/factories/provider-generate-factory.js +0 -93
- package/dist/lib/mcp/adapters/plugin-bridge.d.ts +0 -40
- package/dist/lib/mcp/adapters/plugin-bridge.js +0 -89
- package/dist/lib/mcp/auto-discovery.d.ts +0 -62
- package/dist/lib/mcp/auto-discovery.js +0 -149
- package/dist/lib/mcp/client.d.ts +0 -68
- package/dist/lib/mcp/client.js +0 -248
- package/dist/lib/mcp/config.d.ts +0 -31
- package/dist/lib/mcp/config.js +0 -99
- package/dist/lib/mcp/context-manager.d.ts +0 -171
- package/dist/lib/mcp/context-manager.js +0 -362
- package/dist/lib/mcp/contracts/mcp-contract.d.ts +0 -169
- package/dist/lib/mcp/contracts/mcp-contract.js +0 -58
- package/dist/lib/mcp/core/plugin-manager.d.ts +0 -46
- package/dist/lib/mcp/core/plugin-manager.js +0 -110
- package/dist/lib/mcp/demo/plugin-demo.d.ts +0 -20
- package/dist/lib/mcp/demo/plugin-demo.js +0 -118
- package/dist/lib/mcp/dynamic-chain-executor.d.ts +0 -225
- package/dist/lib/mcp/dynamic-chain-executor.js +0 -489
- package/dist/lib/mcp/dynamic-orchestrator.d.ts +0 -115
- package/dist/lib/mcp/dynamic-orchestrator.js +0 -351
- package/dist/lib/mcp/ecosystem.d.ts +0 -75
- package/dist/lib/mcp/ecosystem.js +0 -161
- package/dist/lib/mcp/error-manager.d.ts +0 -254
- package/dist/lib/mcp/error-manager.js +0 -501
- package/dist/lib/mcp/error-recovery.d.ts +0 -159
- package/dist/lib/mcp/error-recovery.js +0 -405
- package/dist/lib/mcp/external-client.d.ts +0 -88
- package/dist/lib/mcp/external-client.js +0 -331
- package/dist/lib/mcp/external-manager.d.ts +0 -112
- package/dist/lib/mcp/external-manager.js +0 -308
- package/dist/lib/mcp/function-calling.d.ts +0 -65
- package/dist/lib/mcp/function-calling.js +0 -642
- package/dist/lib/mcp/health-monitor.d.ts +0 -257
- package/dist/lib/mcp/health-monitor.js +0 -630
- package/dist/lib/mcp/initialize-tools.d.ts +0 -29
- package/dist/lib/mcp/initialize-tools.js +0 -261
- package/dist/lib/mcp/initialize.d.ts +0 -18
- package/dist/lib/mcp/initialize.js +0 -62
- package/dist/lib/mcp/logging.d.ts +0 -38
- package/dist/lib/mcp/logging.js +0 -100
- package/dist/lib/mcp/manager.d.ts +0 -68
- package/dist/lib/mcp/manager.js +0 -176
- package/dist/lib/mcp/neurolink-mcp-client.d.ts +0 -97
- package/dist/lib/mcp/neurolink-mcp-client.js +0 -462
- package/dist/lib/mcp/orchestrator.d.ts +0 -302
- package/dist/lib/mcp/orchestrator.js +0 -703
- package/dist/lib/mcp/plugin-manager.d.ts +0 -98
- package/dist/lib/mcp/plugin-manager.js +0 -296
- package/dist/lib/mcp/plugins/core/filesystem-mcp.d.ts +0 -36
- package/dist/lib/mcp/plugins/core/filesystem-mcp.js +0 -142
- package/dist/lib/mcp/plugins/filesystem-mcp.d.ts +0 -37
- package/dist/lib/mcp/plugins/filesystem-mcp.js +0 -54
- package/dist/lib/mcp/security-manager.d.ts +0 -87
- package/dist/lib/mcp/security-manager.js +0 -344
- package/dist/lib/mcp/semaphore-manager.d.ts +0 -137
- package/dist/lib/mcp/semaphore-manager.js +0 -329
- package/dist/lib/mcp/session-manager.d.ts +0 -187
- package/dist/lib/mcp/session-manager.js +0 -400
- package/dist/lib/mcp/session-persistence.d.ts +0 -93
- package/dist/lib/mcp/session-persistence.js +0 -301
- package/dist/lib/mcp/tool-integration.d.ts +0 -58
- package/dist/lib/mcp/tool-integration.js +0 -203
- package/dist/lib/mcp/transport-manager.d.ts +0 -154
- package/dist/lib/mcp/transport-manager.js +0 -334
- package/dist/lib/mcp/unified-mcp.d.ts +0 -133
- package/dist/lib/mcp/unified-mcp.js +0 -251
- package/dist/lib/mcp/unified-registry.d.ts +0 -165
- package/dist/lib/mcp/unified-registry.js +0 -538
- package/dist/lib/providers/analytics-helper.d.ts +0 -38
- package/dist/lib/providers/analytics-helper.js +0 -216
- package/dist/lib/providers/function-calling-provider.d.ts +0 -142
- package/dist/lib/providers/function-calling-provider.js +0 -630
- package/dist/lib/providers/mcp-provider.d.ts +0 -75
- package/dist/lib/providers/mcp-provider.js +0 -283
- package/dist/lib/providers/timeout-wrapper.d.ts +0 -40
- package/dist/lib/providers/timeout-wrapper.js +0 -100
- package/dist/lib/sdk/tool-extension.d.ts +0 -181
- package/dist/lib/sdk/tool-extension.js +0 -284
- package/dist/lib/services/streaming/streaming-manager.d.ts +0 -29
- package/dist/lib/services/streaming/streaming-manager.js +0 -245
- package/dist/lib/services/types.d.ts +0 -156
- package/dist/lib/services/types.js +0 -2
- package/dist/lib/services/websocket/websocket-server.d.ts +0 -34
- package/dist/lib/services/websocket/websocket-server.js +0 -305
- package/dist/lib/utils/provider-validation.d.ts +0 -36
- package/dist/lib/utils/provider-validation.js +0 -625
- package/dist/lib/utils/providerUtils-fixed.d.ts +0 -8
- package/dist/lib/utils/providerUtils-fixed.js +0 -94
- package/dist/lib/utils/streaming-utils.d.ts +0 -79
- package/dist/lib/utils/streaming-utils.js +0 -198
- package/dist/lib/utils/timeout-manager.d.ts +0 -75
- package/dist/lib/utils/timeout-manager.js +0 -244
- package/dist/mcp/adapters/plugin-bridge.d.ts +0 -40
- package/dist/mcp/adapters/plugin-bridge.js +0 -89
- package/dist/mcp/auto-discovery.d.ts +0 -62
- package/dist/mcp/auto-discovery.js +0 -149
- package/dist/mcp/client.d.ts +0 -68
- package/dist/mcp/client.js +0 -248
- package/dist/mcp/config.d.ts +0 -31
- package/dist/mcp/config.js +0 -99
- package/dist/mcp/context-manager.d.ts +0 -171
- package/dist/mcp/context-manager.js +0 -362
- package/dist/mcp/contracts/mcp-contract.d.ts +0 -169
- package/dist/mcp/contracts/mcp-contract.js +0 -58
- package/dist/mcp/core/plugin-manager.d.ts +0 -46
- package/dist/mcp/core/plugin-manager.js +0 -110
- package/dist/mcp/demo/plugin-demo.d.ts +0 -20
- package/dist/mcp/demo/plugin-demo.js +0 -118
- package/dist/mcp/dynamic-chain-executor.d.ts +0 -225
- package/dist/mcp/dynamic-chain-executor.js +0 -489
- package/dist/mcp/dynamic-orchestrator.d.ts +0 -115
- package/dist/mcp/dynamic-orchestrator.js +0 -351
- package/dist/mcp/ecosystem.d.ts +0 -75
- package/dist/mcp/ecosystem.js +0 -162
- package/dist/mcp/error-manager.d.ts +0 -254
- package/dist/mcp/error-manager.js +0 -501
- package/dist/mcp/error-recovery.d.ts +0 -159
- package/dist/mcp/error-recovery.js +0 -405
- package/dist/mcp/external-client.d.ts +0 -88
- package/dist/mcp/external-client.js +0 -331
- package/dist/mcp/external-manager.d.ts +0 -112
- package/dist/mcp/external-manager.js +0 -308
- package/dist/mcp/function-calling.d.ts +0 -65
- package/dist/mcp/function-calling.js +0 -642
- package/dist/mcp/health-monitor.d.ts +0 -257
- package/dist/mcp/health-monitor.js +0 -630
- package/dist/mcp/initialize-tools.d.ts +0 -29
- package/dist/mcp/initialize-tools.js +0 -262
- package/dist/mcp/initialize.d.ts +0 -18
- package/dist/mcp/initialize.js +0 -62
- package/dist/mcp/logging.d.ts +0 -38
- package/dist/mcp/logging.js +0 -100
- package/dist/mcp/manager.d.ts +0 -68
- package/dist/mcp/manager.js +0 -176
- package/dist/mcp/neurolink-mcp-client.d.ts +0 -97
- package/dist/mcp/neurolink-mcp-client.js +0 -462
- package/dist/mcp/orchestrator.d.ts +0 -302
- package/dist/mcp/orchestrator.js +0 -703
- package/dist/mcp/plugin-manager.d.ts +0 -98
- package/dist/mcp/plugin-manager.js +0 -297
- package/dist/mcp/plugins/core/filesystem-mcp.d.ts +0 -36
- package/dist/mcp/plugins/core/filesystem-mcp.js +0 -142
- package/dist/mcp/plugins/core/neurolink-mcp.json +0 -17
- package/dist/mcp/plugins/filesystem-mcp.d.ts +0 -37
- package/dist/mcp/plugins/filesystem-mcp.js +0 -54
- package/dist/mcp/security-manager.d.ts +0 -87
- package/dist/mcp/security-manager.js +0 -344
- package/dist/mcp/semaphore-manager.d.ts +0 -137
- package/dist/mcp/semaphore-manager.js +0 -329
- package/dist/mcp/session-manager.d.ts +0 -187
- package/dist/mcp/session-manager.js +0 -400
- package/dist/mcp/session-persistence.d.ts +0 -93
- package/dist/mcp/session-persistence.js +0 -302
- package/dist/mcp/tool-integration.d.ts +0 -58
- package/dist/mcp/tool-integration.js +0 -203
- package/dist/mcp/transport-manager.d.ts +0 -154
- package/dist/mcp/transport-manager.js +0 -335
- package/dist/mcp/unified-mcp.d.ts +0 -133
- package/dist/mcp/unified-mcp.js +0 -251
- package/dist/mcp/unified-registry.d.ts +0 -165
- package/dist/mcp/unified-registry.js +0 -539
- package/dist/providers/analytics-helper.d.ts +0 -38
- package/dist/providers/analytics-helper.js +0 -216
- package/dist/providers/function-calling-provider.d.ts +0 -142
- package/dist/providers/function-calling-provider.js +0 -630
- package/dist/providers/mcp-provider.d.ts +0 -75
- package/dist/providers/mcp-provider.js +0 -283
- package/dist/providers/timeout-wrapper.d.ts +0 -40
- package/dist/providers/timeout-wrapper.js +0 -100
- package/dist/sdk/tool-extension.d.ts +0 -181
- package/dist/sdk/tool-extension.js +0 -284
- package/dist/services/streaming/streaming-manager.d.ts +0 -29
- package/dist/services/streaming/streaming-manager.js +0 -245
- package/dist/services/types.d.ts +0 -156
- package/dist/services/types.js +0 -2
- package/dist/services/websocket/websocket-server.d.ts +0 -34
- package/dist/services/websocket/websocket-server.js +0 -306
- package/dist/utils/provider-validation.d.ts +0 -36
- package/dist/utils/provider-validation.js +0 -625
- package/dist/utils/providerUtils-fixed.d.ts +0 -8
- package/dist/utils/providerUtils-fixed.js +0 -94
- package/dist/utils/streaming-utils.d.ts +0 -79
- package/dist/utils/streaming-utils.js +0 -198
- package/dist/utils/timeout-manager.d.ts +0 -75
- package/dist/utils/timeout-manager.js +0 -244
|
@@ -1,331 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* NeuroLink External MCP Client
|
|
3
|
-
* Connects to external MCP servers via stdio transport following MCP specification
|
|
4
|
-
* Bridges external tools into NeuroLink's factory pattern ecosystem
|
|
5
|
-
*/
|
|
6
|
-
import { spawn, ChildProcess } from "child_process";
|
|
7
|
-
import { EventEmitter } from "events";
|
|
8
|
-
import { mcpLogger as logger } from "./logging.js";
|
|
9
|
-
/**
|
|
10
|
-
* External MCP Client for stdio transport
|
|
11
|
-
*/
|
|
12
|
-
export class ExternalMCPClient extends EventEmitter {
|
|
13
|
-
config;
|
|
14
|
-
process = null;
|
|
15
|
-
isConnected = false;
|
|
16
|
-
messageId = 0;
|
|
17
|
-
pendingRequests = new Map();
|
|
18
|
-
tools = new Map();
|
|
19
|
-
buffer = "";
|
|
20
|
-
constructor(config) {
|
|
21
|
-
super();
|
|
22
|
-
this.config = {
|
|
23
|
-
timeout: 30000,
|
|
24
|
-
retryAttempts: 3,
|
|
25
|
-
...config,
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Connect to the external MCP server
|
|
30
|
-
*/
|
|
31
|
-
async connect() {
|
|
32
|
-
if (this.isConnected) {
|
|
33
|
-
logger.debug(`[External MCP] Already connected to ${this.config.name}`);
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
try {
|
|
37
|
-
logger.info(`[External MCP] Connecting to ${this.config.name}...`);
|
|
38
|
-
// Spawn the MCP server process
|
|
39
|
-
this.process = spawn(this.config.command, this.config.args, {
|
|
40
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
41
|
-
env: { ...process.env, ...this.config.env },
|
|
42
|
-
});
|
|
43
|
-
// 🔧 FIX: Register for cleanup
|
|
44
|
-
process.once("beforeExit", () => this.disconnect());
|
|
45
|
-
process.once("SIGINT", () => this.disconnect());
|
|
46
|
-
process.once("SIGTERM", () => this.disconnect());
|
|
47
|
-
if (!this.process.stdout || !this.process.stdin || !this.process.stderr) {
|
|
48
|
-
throw new Error("Failed to create stdio pipes");
|
|
49
|
-
}
|
|
50
|
-
// Setup stdout handler for receiving messages
|
|
51
|
-
this.process.stdout.on("data", (data) => {
|
|
52
|
-
this.handleMessage(data.toString());
|
|
53
|
-
});
|
|
54
|
-
// Setup stderr handler for debugging
|
|
55
|
-
this.process.stderr.on("data", (data) => {
|
|
56
|
-
logger.debug(`[External MCP] ${this.config.name} stderr:`, data.toString().trim());
|
|
57
|
-
});
|
|
58
|
-
// Handle process exit
|
|
59
|
-
this.process.on("exit", (code, signal) => {
|
|
60
|
-
logger.warn(`[External MCP] ${this.config.name} process exited`, {
|
|
61
|
-
code,
|
|
62
|
-
signal,
|
|
63
|
-
});
|
|
64
|
-
this.isConnected = false;
|
|
65
|
-
this.emit("disconnected", { code, signal });
|
|
66
|
-
});
|
|
67
|
-
// Handle process errors
|
|
68
|
-
this.process.on("error", (error) => {
|
|
69
|
-
logger.error(`[External MCP] ${this.config.name} process error:`, error);
|
|
70
|
-
this.emit("error", error);
|
|
71
|
-
});
|
|
72
|
-
// Initialize MCP session
|
|
73
|
-
await this.initialize();
|
|
74
|
-
// Discover available tools
|
|
75
|
-
await this.discoverTools();
|
|
76
|
-
this.isConnected = true;
|
|
77
|
-
logger.info(`[External MCP] Connected to ${this.config.name} with ${this.tools.size} tools`);
|
|
78
|
-
this.emit("connected");
|
|
79
|
-
}
|
|
80
|
-
catch (error) {
|
|
81
|
-
logger.error(`[External MCP] Failed to connect to ${this.config.name}:`, error);
|
|
82
|
-
await this.disconnect();
|
|
83
|
-
throw error;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Initialize MCP session
|
|
88
|
-
*/
|
|
89
|
-
async initialize() {
|
|
90
|
-
const initResponse = await this.sendRequest("initialize", {
|
|
91
|
-
protocolVersion: "2024-11-05",
|
|
92
|
-
capabilities: {
|
|
93
|
-
tools: {},
|
|
94
|
-
},
|
|
95
|
-
clientInfo: {
|
|
96
|
-
name: "neurolink-mcp-client",
|
|
97
|
-
version: "1.0.0",
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
logger.debug(`[External MCP] ${this.config.name} initialized:`, initResponse);
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Discover available tools from the server
|
|
104
|
-
*/
|
|
105
|
-
async discoverTools() {
|
|
106
|
-
try {
|
|
107
|
-
const response = await this.sendRequest("tools/list", {});
|
|
108
|
-
const responseObj = response;
|
|
109
|
-
if (responseObj.tools && Array.isArray(responseObj.tools)) {
|
|
110
|
-
this.tools.clear();
|
|
111
|
-
for (const tool of responseObj.tools) {
|
|
112
|
-
const toolObj = tool;
|
|
113
|
-
this.tools.set(toolObj.name || "unknown", {
|
|
114
|
-
name: toolObj.name || "unknown",
|
|
115
|
-
description: toolObj.description || "",
|
|
116
|
-
inputSchema: toolObj.inputSchema,
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
logger.debug(`[External MCP] Discovered ${this.tools.size} tools from ${this.config.name}`);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
catch (error) {
|
|
123
|
-
logger.warn(`[External MCP] Failed to discover tools from ${this.config.name}:`, error);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Execute a tool on the external server
|
|
128
|
-
*/
|
|
129
|
-
async executeTool(toolName, params, context) {
|
|
130
|
-
if (!this.isConnected) {
|
|
131
|
-
throw new Error(`Not connected to MCP server: ${this.config.name}`);
|
|
132
|
-
}
|
|
133
|
-
const startTime = Date.now();
|
|
134
|
-
try {
|
|
135
|
-
logger.debug(`[External MCP] Executing tool ${toolName} on ${this.config.name}`);
|
|
136
|
-
const response = await this.sendRequest("tools/call", {
|
|
137
|
-
name: toolName,
|
|
138
|
-
arguments: params,
|
|
139
|
-
});
|
|
140
|
-
const executionTime = Date.now() - startTime;
|
|
141
|
-
// Transform MCP response to NeuroLink format
|
|
142
|
-
const responseObj = response;
|
|
143
|
-
const result = {
|
|
144
|
-
success: !responseObj.isError,
|
|
145
|
-
data: responseObj.text || responseObj.result || response,
|
|
146
|
-
metadata: {
|
|
147
|
-
toolName,
|
|
148
|
-
serverId: this.config.name,
|
|
149
|
-
serverTitle: this.config.name,
|
|
150
|
-
sessionId: context.sessionId,
|
|
151
|
-
timestamp: Date.now(),
|
|
152
|
-
executionTime,
|
|
153
|
-
},
|
|
154
|
-
};
|
|
155
|
-
if (responseObj.isError) {
|
|
156
|
-
const textArray = responseObj.text;
|
|
157
|
-
result.error = textArray?.[0]?.text || "Tool execution failed";
|
|
158
|
-
}
|
|
159
|
-
logger.debug(`[External MCP] Tool ${toolName} executed in ${executionTime}ms`);
|
|
160
|
-
return result;
|
|
161
|
-
}
|
|
162
|
-
catch (error) {
|
|
163
|
-
const executionTime = Date.now() - startTime;
|
|
164
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
165
|
-
logger.error(`[External MCP] Tool execution failed: ${toolName}`, error);
|
|
166
|
-
return {
|
|
167
|
-
success: false,
|
|
168
|
-
error: errorMessage,
|
|
169
|
-
metadata: {
|
|
170
|
-
toolName,
|
|
171
|
-
serverId: this.config.name,
|
|
172
|
-
serverTitle: this.config.name,
|
|
173
|
-
sessionId: context.sessionId,
|
|
174
|
-
timestamp: Date.now(),
|
|
175
|
-
executionTime,
|
|
176
|
-
},
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Get available tools as NeuroLink MCP tools
|
|
182
|
-
*/
|
|
183
|
-
getNeuroLinkTools() {
|
|
184
|
-
const neurolinkTools = {};
|
|
185
|
-
for (const [name, toolInfo] of this.tools) {
|
|
186
|
-
neurolinkTools[name] = {
|
|
187
|
-
name,
|
|
188
|
-
description: toolInfo.description || `External tool from ${this.config.name}`,
|
|
189
|
-
category: "external",
|
|
190
|
-
isImplemented: true,
|
|
191
|
-
execute: async (params, context) => {
|
|
192
|
-
return this.executeTool(name, params, context);
|
|
193
|
-
},
|
|
194
|
-
inputSchema: toolInfo.inputSchema,
|
|
195
|
-
metadata: {
|
|
196
|
-
serverId: this.config.name,
|
|
197
|
-
serverTitle: this.config.name,
|
|
198
|
-
external: true,
|
|
199
|
-
transport: "stdio",
|
|
200
|
-
},
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
return neurolinkTools;
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Send a request to the MCP server
|
|
207
|
-
*/
|
|
208
|
-
async sendRequest(method, params) {
|
|
209
|
-
return new Promise((resolve, reject) => {
|
|
210
|
-
if (!this.process?.stdin) {
|
|
211
|
-
reject(new Error("Process not available"));
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
const id = ++this.messageId;
|
|
215
|
-
const message = {
|
|
216
|
-
jsonrpc: "2.0",
|
|
217
|
-
id,
|
|
218
|
-
method,
|
|
219
|
-
params,
|
|
220
|
-
};
|
|
221
|
-
// Setup timeout
|
|
222
|
-
const timeout = setTimeout(() => {
|
|
223
|
-
this.pendingRequests.delete(id);
|
|
224
|
-
reject(new Error(`Request timeout: ${method}`));
|
|
225
|
-
}, this.config.timeout);
|
|
226
|
-
// Store request for response handling
|
|
227
|
-
this.pendingRequests.set(id, { resolve, reject, timeout });
|
|
228
|
-
// Send message
|
|
229
|
-
const messageStr = JSON.stringify(message) + "\n";
|
|
230
|
-
this.process.stdin.write(messageStr);
|
|
231
|
-
logger.debug(`[External MCP] Sent request ${id}: ${method}`);
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
/**
|
|
235
|
-
* Handle incoming messages from the server
|
|
236
|
-
*/
|
|
237
|
-
handleMessage(data) {
|
|
238
|
-
this.buffer += data;
|
|
239
|
-
let lineEnd;
|
|
240
|
-
while ((lineEnd = this.buffer.indexOf("\n")) !== -1) {
|
|
241
|
-
const line = this.buffer.slice(0, lineEnd);
|
|
242
|
-
this.buffer = this.buffer.slice(lineEnd + 1);
|
|
243
|
-
if (line.trim()) {
|
|
244
|
-
try {
|
|
245
|
-
const message = JSON.parse(line);
|
|
246
|
-
this.processMessage(message);
|
|
247
|
-
}
|
|
248
|
-
catch (error) {
|
|
249
|
-
logger.warn(`[External MCP] Failed to parse message from ${this.config.name}:`, line);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
/**
|
|
255
|
-
* Process a parsed MCP message
|
|
256
|
-
*/
|
|
257
|
-
processMessage(message) {
|
|
258
|
-
if (message.id !== undefined && this.pendingRequests.has(message.id)) {
|
|
259
|
-
// Response to our request
|
|
260
|
-
const pending = this.pendingRequests.get(message.id);
|
|
261
|
-
this.pendingRequests.delete(message.id);
|
|
262
|
-
clearTimeout(pending.timeout);
|
|
263
|
-
if (message.error) {
|
|
264
|
-
pending.reject(new Error(message.error.message));
|
|
265
|
-
}
|
|
266
|
-
else {
|
|
267
|
-
pending.resolve(message.result);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
else if (message.method) {
|
|
271
|
-
// Notification or request from server
|
|
272
|
-
logger.debug(`[External MCP] Received notification: ${message.method}`);
|
|
273
|
-
this.emit("notification", message);
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
/**
|
|
277
|
-
* Disconnect from the server
|
|
278
|
-
*/
|
|
279
|
-
async disconnect() {
|
|
280
|
-
if (!this.isConnected && !this.process) {
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
logger.info(`[External MCP] Disconnecting from ${this.config.name}`);
|
|
284
|
-
// Clear pending requests
|
|
285
|
-
for (const pending of this.pendingRequests.values()) {
|
|
286
|
-
clearTimeout(pending.timeout);
|
|
287
|
-
pending.reject(new Error("Connection closed"));
|
|
288
|
-
}
|
|
289
|
-
this.pendingRequests.clear();
|
|
290
|
-
// 🔧 FIX: Enhanced process cleanup
|
|
291
|
-
if (this.process) {
|
|
292
|
-
this.process.kill("SIGTERM");
|
|
293
|
-
// Force kill after timeout
|
|
294
|
-
setTimeout(() => {
|
|
295
|
-
if (this.process && !this.process.killed) {
|
|
296
|
-
this.process.kill("SIGKILL");
|
|
297
|
-
}
|
|
298
|
-
}, 1000); // Reduced from 5000ms to 1000ms
|
|
299
|
-
this.process = null;
|
|
300
|
-
}
|
|
301
|
-
this.isConnected = false;
|
|
302
|
-
this.tools.clear();
|
|
303
|
-
this.emit("disconnected");
|
|
304
|
-
}
|
|
305
|
-
/**
|
|
306
|
-
* Check if connected
|
|
307
|
-
*/
|
|
308
|
-
isConnectedToServer() {
|
|
309
|
-
return this.isConnected && this.process !== null;
|
|
310
|
-
}
|
|
311
|
-
/**
|
|
312
|
-
* Get server information
|
|
313
|
-
*/
|
|
314
|
-
getServerInfo() {
|
|
315
|
-
return {
|
|
316
|
-
name: this.config.name,
|
|
317
|
-
command: this.config.command,
|
|
318
|
-
args: this.config.args,
|
|
319
|
-
transport: this.config.transport,
|
|
320
|
-
isConnected: this.isConnected,
|
|
321
|
-
toolCount: this.tools.size,
|
|
322
|
-
tools: Array.from(this.tools.keys()),
|
|
323
|
-
};
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
/**
|
|
327
|
-
* Create an external MCP client
|
|
328
|
-
*/
|
|
329
|
-
export function createExternalMCPClient(config) {
|
|
330
|
-
return new ExternalMCPClient(config);
|
|
331
|
-
}
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* NeuroLink External MCP Manager
|
|
3
|
-
* Manages external MCP servers and bridges them into the NeuroLink factory ecosystem
|
|
4
|
-
* Reads .mcp-config.json and spawns external clients
|
|
5
|
-
*/
|
|
6
|
-
import { ExternalMCPClient } from "./external-client.js";
|
|
7
|
-
import type { NeuroLinkMCPServer, NeuroLinkExecutionContext, ToolResult } from "./factory.js";
|
|
8
|
-
import { MCPToolRegistry } from "./tool-registry.js";
|
|
9
|
-
/**
|
|
10
|
-
* External server connection info
|
|
11
|
-
*/
|
|
12
|
-
interface ExternalServerInfo {
|
|
13
|
-
name: string;
|
|
14
|
-
client: ExternalMCPClient | null;
|
|
15
|
-
server: NeuroLinkMCPServer | null;
|
|
16
|
-
status: "connecting" | "connected" | "disconnected" | "error";
|
|
17
|
-
lastError?: string;
|
|
18
|
-
toolCount: number;
|
|
19
|
-
retryCount: number;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* External MCP Manager
|
|
23
|
-
* Bridges external MCP servers into NeuroLink's factory pattern ecosystem
|
|
24
|
-
*/
|
|
25
|
-
export declare class ExternalMCPManager {
|
|
26
|
-
private servers;
|
|
27
|
-
private registry;
|
|
28
|
-
private configPath;
|
|
29
|
-
private config;
|
|
30
|
-
private isInitialized;
|
|
31
|
-
constructor(configPath?: string, registry?: MCPToolRegistry);
|
|
32
|
-
/**
|
|
33
|
-
* Initialize the external MCP manager
|
|
34
|
-
* Reads config and connects to all external servers
|
|
35
|
-
*/
|
|
36
|
-
initialize(): Promise<void>;
|
|
37
|
-
/**
|
|
38
|
-
* Load MCP configuration from file
|
|
39
|
-
*/
|
|
40
|
-
private loadConfig;
|
|
41
|
-
/**
|
|
42
|
-
* Connect to a specific external server
|
|
43
|
-
*/
|
|
44
|
-
connectToServer(serverName: string): Promise<ExternalServerInfo | null>;
|
|
45
|
-
/**
|
|
46
|
-
* Register tools from an external server with the NeuroLink registry
|
|
47
|
-
*/
|
|
48
|
-
private registerServerTools;
|
|
49
|
-
/**
|
|
50
|
-
* Get all connected external servers
|
|
51
|
-
*/
|
|
52
|
-
getConnectedServers(): ExternalServerInfo[];
|
|
53
|
-
/**
|
|
54
|
-
* Get server status
|
|
55
|
-
*/
|
|
56
|
-
getServerStatus(serverName: string): ExternalServerInfo | undefined;
|
|
57
|
-
/**
|
|
58
|
-
* Get all server statuses
|
|
59
|
-
*/
|
|
60
|
-
getAllServerStatuses(): Record<string, ExternalServerInfo>;
|
|
61
|
-
/**
|
|
62
|
-
* Execute a tool on any connected server
|
|
63
|
-
*/
|
|
64
|
-
executeTool(toolName: string, params: unknown, context: NeuroLinkExecutionContext): Promise<ToolResult>;
|
|
65
|
-
/**
|
|
66
|
-
* List all available tools from external servers
|
|
67
|
-
*/
|
|
68
|
-
listExternalTools(): Promise<import("./tool-registry.js").ToolInfo[]>;
|
|
69
|
-
/**
|
|
70
|
-
* Get registry instance
|
|
71
|
-
*/
|
|
72
|
-
getRegistry(): MCPToolRegistry;
|
|
73
|
-
/**
|
|
74
|
-
* Disconnect from a specific server
|
|
75
|
-
*/
|
|
76
|
-
disconnectServer(serverName: string): Promise<boolean>;
|
|
77
|
-
/**
|
|
78
|
-
* Disconnect from all servers
|
|
79
|
-
*/
|
|
80
|
-
disconnectAll(): Promise<void>;
|
|
81
|
-
/**
|
|
82
|
-
* Refresh connections - reload config and reconnect
|
|
83
|
-
*/
|
|
84
|
-
refresh(): Promise<void>;
|
|
85
|
-
/**
|
|
86
|
-
* Get comprehensive status
|
|
87
|
-
*/
|
|
88
|
-
getStatus(): {
|
|
89
|
-
isInitialized: boolean;
|
|
90
|
-
configPath: string;
|
|
91
|
-
totalServers: number;
|
|
92
|
-
connected: number;
|
|
93
|
-
connecting: number;
|
|
94
|
-
disconnected: number;
|
|
95
|
-
errors: number;
|
|
96
|
-
totalTools: number;
|
|
97
|
-
servers: Record<string, ExternalServerInfo>;
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Default external MCP manager instance
|
|
102
|
-
*/
|
|
103
|
-
export declare const defaultExternalMCPManager: ExternalMCPManager;
|
|
104
|
-
/**
|
|
105
|
-
* Initialize external MCP servers with default manager
|
|
106
|
-
*/
|
|
107
|
-
export declare function initializeExternalMCP(configPath?: string): Promise<void>;
|
|
108
|
-
/**
|
|
109
|
-
* Get the default external MCP manager
|
|
110
|
-
*/
|
|
111
|
-
export declare function getExternalMCPManager(): ExternalMCPManager;
|
|
112
|
-
export {};
|