@juspay/neurolink 3.0.1 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/CHANGELOG.md +66 -6
  2. package/README.md +318 -27
  3. package/dist/agent/direct-tools.d.ts +6 -6
  4. package/dist/chat/client-utils.d.ts +92 -0
  5. package/dist/chat/client-utils.js +298 -0
  6. package/dist/chat/index.d.ts +27 -0
  7. package/dist/chat/index.js +41 -0
  8. package/dist/chat/session-storage.d.ts +77 -0
  9. package/dist/chat/session-storage.js +233 -0
  10. package/dist/chat/session.d.ts +95 -0
  11. package/dist/chat/session.js +257 -0
  12. package/dist/chat/sse-handler.d.ts +49 -0
  13. package/dist/chat/sse-handler.js +266 -0
  14. package/dist/chat/types.d.ts +73 -0
  15. package/dist/chat/types.js +5 -0
  16. package/dist/chat/websocket-chat-handler.d.ts +36 -0
  17. package/dist/chat/websocket-chat-handler.js +262 -0
  18. package/dist/cli/commands/config.js +12 -12
  19. package/dist/cli/commands/mcp.js +3 -4
  20. package/dist/cli/index.d.ts +0 -7
  21. package/dist/cli/index.js +247 -28
  22. package/dist/config/configManager.d.ts +60 -0
  23. package/dist/config/configManager.js +300 -0
  24. package/dist/config/types.d.ts +136 -0
  25. package/dist/config/types.js +43 -0
  26. package/dist/core/analytics.d.ts +23 -0
  27. package/dist/core/analytics.js +131 -0
  28. package/dist/core/constants.d.ts +41 -0
  29. package/dist/core/constants.js +50 -0
  30. package/dist/core/defaults.d.ts +18 -0
  31. package/dist/core/defaults.js +29 -0
  32. package/dist/core/evaluation-config.d.ts +29 -0
  33. package/dist/core/evaluation-config.js +144 -0
  34. package/dist/core/evaluation-providers.d.ts +30 -0
  35. package/dist/core/evaluation-providers.js +187 -0
  36. package/dist/core/evaluation.d.ts +117 -0
  37. package/dist/core/evaluation.js +528 -0
  38. package/dist/core/factory.js +33 -25
  39. package/dist/core/types.d.ts +165 -6
  40. package/dist/core/types.js +3 -4
  41. package/dist/index.d.ts +9 -4
  42. package/dist/index.js +25 -4
  43. package/dist/lib/agent/direct-tools.d.ts +6 -6
  44. package/dist/lib/chat/client-utils.d.ts +92 -0
  45. package/dist/lib/chat/client-utils.js +298 -0
  46. package/dist/lib/chat/index.d.ts +27 -0
  47. package/dist/lib/chat/index.js +41 -0
  48. package/dist/lib/chat/session-storage.d.ts +77 -0
  49. package/dist/lib/chat/session-storage.js +233 -0
  50. package/dist/lib/chat/session.d.ts +95 -0
  51. package/dist/lib/chat/session.js +257 -0
  52. package/dist/lib/chat/sse-handler.d.ts +49 -0
  53. package/dist/lib/chat/sse-handler.js +266 -0
  54. package/dist/lib/chat/types.d.ts +73 -0
  55. package/dist/lib/chat/types.js +5 -0
  56. package/dist/lib/chat/websocket-chat-handler.d.ts +36 -0
  57. package/dist/lib/chat/websocket-chat-handler.js +262 -0
  58. package/dist/lib/config/configManager.d.ts +60 -0
  59. package/dist/lib/config/configManager.js +300 -0
  60. package/dist/lib/config/types.d.ts +136 -0
  61. package/dist/lib/config/types.js +43 -0
  62. package/dist/lib/core/analytics.d.ts +23 -0
  63. package/dist/lib/core/analytics.js +131 -0
  64. package/dist/lib/core/constants.d.ts +41 -0
  65. package/dist/lib/core/constants.js +50 -0
  66. package/dist/lib/core/defaults.d.ts +18 -0
  67. package/dist/lib/core/defaults.js +29 -0
  68. package/dist/lib/core/evaluation-config.d.ts +29 -0
  69. package/dist/lib/core/evaluation-config.js +144 -0
  70. package/dist/lib/core/evaluation-providers.d.ts +30 -0
  71. package/dist/lib/core/evaluation-providers.js +187 -0
  72. package/dist/lib/core/evaluation.d.ts +117 -0
  73. package/dist/lib/core/evaluation.js +528 -0
  74. package/dist/lib/core/factory.js +33 -26
  75. package/dist/lib/core/types.d.ts +165 -6
  76. package/dist/lib/core/types.js +3 -4
  77. package/dist/lib/index.d.ts +9 -4
  78. package/dist/lib/index.js +25 -4
  79. package/dist/lib/mcp/contracts/mcpContract.d.ts +118 -0
  80. package/dist/lib/mcp/contracts/mcpContract.js +5 -0
  81. package/dist/lib/mcp/dynamic-chain-executor.d.ts +201 -0
  82. package/dist/lib/mcp/dynamic-chain-executor.js +489 -0
  83. package/dist/lib/mcp/dynamic-orchestrator.d.ts +109 -0
  84. package/dist/lib/mcp/dynamic-orchestrator.js +351 -0
  85. package/dist/lib/mcp/error-manager.d.ts +254 -0
  86. package/dist/lib/mcp/error-manager.js +501 -0
  87. package/dist/lib/mcp/error-recovery.d.ts +158 -0
  88. package/dist/lib/mcp/error-recovery.js +405 -0
  89. package/dist/lib/mcp/function-calling.js +11 -3
  90. package/dist/lib/mcp/health-monitor.d.ts +256 -0
  91. package/dist/lib/mcp/health-monitor.js +621 -0
  92. package/dist/lib/mcp/logging.js +5 -0
  93. package/dist/lib/mcp/neurolink-mcp-client.js +2 -1
  94. package/dist/lib/mcp/orchestrator.d.ts +136 -5
  95. package/dist/lib/mcp/orchestrator.js +332 -16
  96. package/dist/lib/mcp/registry.d.ts +71 -16
  97. package/dist/lib/mcp/registry.js +104 -6
  98. package/dist/lib/mcp/semaphore-manager.d.ts +137 -0
  99. package/dist/lib/mcp/semaphore-manager.js +329 -0
  100. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  101. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.js +5 -4
  102. package/dist/lib/mcp/session-manager.d.ts +186 -0
  103. package/dist/lib/mcp/session-manager.js +400 -0
  104. package/dist/lib/mcp/session-persistence.d.ts +93 -0
  105. package/dist/lib/mcp/session-persistence.js +298 -0
  106. package/dist/lib/mcp/tool-integration.js +1 -1
  107. package/dist/lib/mcp/tool-registry.d.ts +55 -34
  108. package/dist/lib/mcp/tool-registry.js +111 -97
  109. package/dist/lib/mcp/transport-manager.d.ts +153 -0
  110. package/dist/lib/mcp/transport-manager.js +330 -0
  111. package/dist/lib/mcp/unified-mcp.js +6 -1
  112. package/dist/lib/mcp/unified-registry.d.ts +54 -5
  113. package/dist/lib/mcp/unified-registry.js +139 -6
  114. package/dist/lib/neurolink.d.ts +101 -0
  115. package/dist/lib/neurolink.js +147 -1
  116. package/dist/lib/providers/agent-enhanced-provider.d.ts +11 -2
  117. package/dist/lib/providers/agent-enhanced-provider.js +86 -15
  118. package/dist/lib/providers/amazonBedrock.d.ts +9 -1
  119. package/dist/lib/providers/amazonBedrock.js +26 -2
  120. package/dist/lib/providers/analytics-helper.d.ts +53 -0
  121. package/dist/lib/providers/analytics-helper.js +151 -0
  122. package/dist/lib/providers/anthropic.d.ts +11 -1
  123. package/dist/lib/providers/anthropic.js +29 -4
  124. package/dist/lib/providers/azureOpenAI.d.ts +3 -1
  125. package/dist/lib/providers/azureOpenAI.js +28 -4
  126. package/dist/lib/providers/function-calling-provider.d.ts +9 -1
  127. package/dist/lib/providers/function-calling-provider.js +14 -1
  128. package/dist/lib/providers/googleAIStudio.d.ts +15 -1
  129. package/dist/lib/providers/googleAIStudio.js +32 -2
  130. package/dist/lib/providers/googleVertexAI.d.ts +9 -1
  131. package/dist/lib/providers/googleVertexAI.js +31 -2
  132. package/dist/lib/providers/huggingFace.d.ts +3 -1
  133. package/dist/lib/providers/huggingFace.js +26 -3
  134. package/dist/lib/providers/mcp-provider.d.ts +9 -1
  135. package/dist/lib/providers/mcp-provider.js +12 -0
  136. package/dist/lib/providers/mistralAI.d.ts +3 -1
  137. package/dist/lib/providers/mistralAI.js +25 -2
  138. package/dist/lib/providers/ollama.d.ts +3 -1
  139. package/dist/lib/providers/ollama.js +27 -4
  140. package/dist/lib/providers/openAI.d.ts +15 -1
  141. package/dist/lib/providers/openAI.js +32 -2
  142. package/dist/lib/proxy/proxy-fetch.js +8 -7
  143. package/dist/lib/services/streaming/streaming-manager.d.ts +29 -0
  144. package/dist/lib/services/streaming/streaming-manager.js +244 -0
  145. package/dist/lib/services/types.d.ts +155 -0
  146. package/dist/lib/services/types.js +2 -0
  147. package/dist/lib/services/websocket/websocket-server.d.ts +34 -0
  148. package/dist/lib/services/websocket/websocket-server.js +304 -0
  149. package/dist/lib/telemetry/index.d.ts +15 -0
  150. package/dist/lib/telemetry/index.js +22 -0
  151. package/dist/lib/telemetry/telemetry-service.d.ts +47 -0
  152. package/dist/lib/telemetry/telemetry-service.js +259 -0
  153. package/dist/lib/utils/streaming-utils.d.ts +67 -0
  154. package/dist/lib/utils/streaming-utils.js +201 -0
  155. package/dist/mcp/contracts/mcpContract.d.ts +118 -0
  156. package/dist/mcp/contracts/mcpContract.js +5 -0
  157. package/dist/mcp/dynamic-chain-executor.d.ts +201 -0
  158. package/dist/mcp/dynamic-chain-executor.js +489 -0
  159. package/dist/mcp/dynamic-orchestrator.d.ts +109 -0
  160. package/dist/mcp/dynamic-orchestrator.js +351 -0
  161. package/dist/mcp/error-manager.d.ts +254 -0
  162. package/dist/mcp/error-manager.js +501 -0
  163. package/dist/mcp/error-recovery.d.ts +158 -0
  164. package/dist/mcp/error-recovery.js +405 -0
  165. package/dist/mcp/function-calling.js +11 -3
  166. package/dist/mcp/health-monitor.d.ts +256 -0
  167. package/dist/mcp/health-monitor.js +621 -0
  168. package/dist/mcp/logging.js +5 -0
  169. package/dist/mcp/neurolink-mcp-client.js +2 -1
  170. package/dist/mcp/orchestrator.d.ts +136 -5
  171. package/dist/mcp/orchestrator.js +332 -16
  172. package/dist/mcp/plugins/core/neurolink-mcp.json +15 -15
  173. package/dist/mcp/registry.d.ts +71 -16
  174. package/dist/mcp/registry.js +104 -6
  175. package/dist/mcp/semaphore-manager.d.ts +137 -0
  176. package/dist/mcp/semaphore-manager.js +329 -0
  177. package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  178. package/dist/mcp/servers/ai-providers/ai-workflow-tools.js +5 -4
  179. package/dist/mcp/session-manager.d.ts +186 -0
  180. package/dist/mcp/session-manager.js +400 -0
  181. package/dist/mcp/session-persistence.d.ts +93 -0
  182. package/dist/mcp/session-persistence.js +299 -0
  183. package/dist/mcp/tool-integration.js +1 -1
  184. package/dist/mcp/tool-registry.d.ts +55 -34
  185. package/dist/mcp/tool-registry.js +111 -97
  186. package/dist/mcp/transport-manager.d.ts +153 -0
  187. package/dist/mcp/transport-manager.js +331 -0
  188. package/dist/mcp/unified-mcp.js +6 -1
  189. package/dist/mcp/unified-registry.d.ts +54 -5
  190. package/dist/mcp/unified-registry.js +139 -6
  191. package/dist/neurolink.d.ts +101 -0
  192. package/dist/neurolink.js +147 -1
  193. package/dist/providers/agent-enhanced-provider.d.ts +11 -2
  194. package/dist/providers/agent-enhanced-provider.js +86 -15
  195. package/dist/providers/amazonBedrock.d.ts +9 -1
  196. package/dist/providers/amazonBedrock.js +26 -2
  197. package/dist/providers/analytics-helper.d.ts +53 -0
  198. package/dist/providers/analytics-helper.js +151 -0
  199. package/dist/providers/anthropic.d.ts +11 -1
  200. package/dist/providers/anthropic.js +29 -4
  201. package/dist/providers/azureOpenAI.d.ts +3 -1
  202. package/dist/providers/azureOpenAI.js +29 -4
  203. package/dist/providers/function-calling-provider.d.ts +9 -1
  204. package/dist/providers/function-calling-provider.js +14 -1
  205. package/dist/providers/googleAIStudio.d.ts +15 -1
  206. package/dist/providers/googleAIStudio.js +32 -2
  207. package/dist/providers/googleVertexAI.d.ts +9 -1
  208. package/dist/providers/googleVertexAI.js +31 -2
  209. package/dist/providers/huggingFace.d.ts +3 -1
  210. package/dist/providers/huggingFace.js +26 -3
  211. package/dist/providers/mcp-provider.d.ts +9 -1
  212. package/dist/providers/mcp-provider.js +12 -0
  213. package/dist/providers/mistralAI.d.ts +3 -1
  214. package/dist/providers/mistralAI.js +25 -2
  215. package/dist/providers/ollama.d.ts +3 -1
  216. package/dist/providers/ollama.js +27 -4
  217. package/dist/providers/openAI.d.ts +15 -1
  218. package/dist/providers/openAI.js +33 -2
  219. package/dist/proxy/proxy-fetch.js +8 -7
  220. package/dist/services/streaming/streaming-manager.d.ts +29 -0
  221. package/dist/services/streaming/streaming-manager.js +244 -0
  222. package/dist/services/types.d.ts +155 -0
  223. package/dist/services/types.js +2 -0
  224. package/dist/services/websocket/websocket-server.d.ts +34 -0
  225. package/dist/services/websocket/websocket-server.js +304 -0
  226. package/dist/telemetry/index.d.ts +15 -0
  227. package/dist/telemetry/index.js +22 -0
  228. package/dist/telemetry/telemetry-service.d.ts +47 -0
  229. package/dist/telemetry/telemetry-service.js +261 -0
  230. package/dist/utils/streaming-utils.d.ts +67 -0
  231. package/dist/utils/streaming-utils.js +201 -0
  232. package/package.json +245 -228
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Transport Manager for MCP connections
3
+ * Supports stdio, SSE, and HTTP transports with reconnection logic
4
+ */
5
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
6
+ import { z } from "zod";
7
+ import { ErrorManager } from "./error-manager.js";
8
+ export declare const TransportConfigSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
9
+ type: z.ZodLiteral<"stdio">;
10
+ command: z.ZodString;
11
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
12
+ cwd: z.ZodOptional<z.ZodString>;
13
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
14
+ }, "strip", z.ZodTypeAny, {
15
+ type: "stdio";
16
+ command: string;
17
+ args?: string[] | undefined;
18
+ cwd?: string | undefined;
19
+ env?: Record<string, string> | undefined;
20
+ }, {
21
+ type: "stdio";
22
+ command: string;
23
+ args?: string[] | undefined;
24
+ cwd?: string | undefined;
25
+ env?: Record<string, string> | undefined;
26
+ }>, z.ZodObject<{
27
+ type: z.ZodLiteral<"sse">;
28
+ url: z.ZodString;
29
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
30
+ timeout: z.ZodDefault<z.ZodNumber>;
31
+ maxRetryTime: z.ZodDefault<z.ZodNumber>;
32
+ withCredentials: z.ZodDefault<z.ZodBoolean>;
33
+ }, "strip", z.ZodTypeAny, {
34
+ type: "sse";
35
+ timeout: number;
36
+ url: string;
37
+ maxRetryTime: number;
38
+ withCredentials: boolean;
39
+ headers?: Record<string, string> | undefined;
40
+ }, {
41
+ type: "sse";
42
+ url: string;
43
+ timeout?: number | undefined;
44
+ headers?: Record<string, string> | undefined;
45
+ maxRetryTime?: number | undefined;
46
+ withCredentials?: boolean | undefined;
47
+ }>, z.ZodObject<{
48
+ type: z.ZodLiteral<"http">;
49
+ url: z.ZodString;
50
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
51
+ timeout: z.ZodDefault<z.ZodNumber>;
52
+ }, "strip", z.ZodTypeAny, {
53
+ type: "http";
54
+ timeout: number;
55
+ url: string;
56
+ headers?: Record<string, string> | undefined;
57
+ }, {
58
+ type: "http";
59
+ url: string;
60
+ timeout?: number | undefined;
61
+ headers?: Record<string, string> | undefined;
62
+ }>]>;
63
+ export type TransportConfig = z.infer<typeof TransportConfigSchema>;
64
+ export interface TransportStatus {
65
+ connected: boolean;
66
+ type: "stdio" | "sse" | "http";
67
+ lastConnected?: Date;
68
+ lastError?: Error;
69
+ reconnectAttempts: number;
70
+ }
71
+ export interface TransportManagerOptions {
72
+ autoReconnect?: boolean;
73
+ maxReconnectAttempts?: number;
74
+ reconnectDelay?: number;
75
+ healthCheckInterval?: number;
76
+ jitterEnabled?: boolean;
77
+ maxJitter?: number;
78
+ }
79
+ /**
80
+ * Manages MCP transport connections with automatic reconnection and health monitoring
81
+ */
82
+ export declare class TransportManager {
83
+ private errorManager;
84
+ private options;
85
+ private client?;
86
+ private config?;
87
+ private status;
88
+ private reconnectTimer?;
89
+ private healthCheckTimer?;
90
+ private reconnectPromise?;
91
+ constructor(errorManager: ErrorManager, options?: TransportManagerOptions);
92
+ /**
93
+ * Connect to MCP server using specified transport
94
+ */
95
+ connect(config: TransportConfig): Promise<Client>;
96
+ /**
97
+ * Create transport based on configuration
98
+ */
99
+ createTransport(config: TransportConfig): Promise<any>;
100
+ /**
101
+ * Create stdio transport
102
+ */
103
+ private createStdioTransport;
104
+ /**
105
+ * Create SSE transport with reconnection support
106
+ */
107
+ private createSSETransport;
108
+ /**
109
+ * Create HTTP transport
110
+ */
111
+ private createHTTPTransport;
112
+ /**
113
+ * Set up health monitoring
114
+ */
115
+ private setupHealthMonitoring;
116
+ /**
117
+ * Handle connection errors
118
+ */
119
+ private handleConnectionError;
120
+ /**
121
+ * Schedule reconnection attempt
122
+ */
123
+ private scheduleReconnect;
124
+ /**
125
+ * Calculate reconnect delay with exponential backoff
126
+ */
127
+ private calculateReconnectDelay;
128
+ /**
129
+ * Reconnect to server
130
+ */
131
+ reconnect(): Promise<void>;
132
+ private _reconnect;
133
+ /**
134
+ * Disconnect from server
135
+ */
136
+ disconnect(): Promise<void>;
137
+ /**
138
+ * Get current transport status
139
+ */
140
+ getStatus(): TransportStatus;
141
+ /**
142
+ * Get connected client
143
+ */
144
+ getClient(): Client | undefined;
145
+ /**
146
+ * Check if connected
147
+ */
148
+ isConnected(): boolean;
149
+ /**
150
+ * Reset reconnection attempts
151
+ */
152
+ resetReconnectAttempts(): void;
153
+ }
@@ -0,0 +1,330 @@
1
+ /**
2
+ * Transport Manager for MCP connections
3
+ * Supports stdio, SSE, and HTTP transports with reconnection logic
4
+ */
5
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
6
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
7
+ import { z } from "zod";
8
+ import { ErrorCategory, ErrorSeverity } from "./error-manager.js";
9
+ // Transport configuration schemas
10
+ export const TransportConfigSchema = z.discriminatedUnion("type", [
11
+ z.object({
12
+ type: z.literal("stdio"),
13
+ command: z.string(),
14
+ args: z.array(z.string()).optional(),
15
+ cwd: z.string().optional(),
16
+ env: z.record(z.string()).optional(),
17
+ }),
18
+ z.object({
19
+ type: z.literal("sse"),
20
+ url: z.string().url(),
21
+ headers: z.record(z.string()).optional(),
22
+ timeout: z.number().min(5).default(30),
23
+ maxRetryTime: z.number().default(5000),
24
+ withCredentials: z.boolean().default(false),
25
+ }),
26
+ z.object({
27
+ type: z.literal("http"),
28
+ url: z.string().url(),
29
+ headers: z.record(z.string()).optional(),
30
+ timeout: z.number().min(5).default(30),
31
+ }),
32
+ ]);
33
+ /**
34
+ * Manages MCP transport connections with automatic reconnection and health monitoring
35
+ */
36
+ export class TransportManager {
37
+ errorManager;
38
+ options;
39
+ client;
40
+ config;
41
+ status;
42
+ reconnectTimer;
43
+ healthCheckTimer;
44
+ reconnectPromise;
45
+ constructor(errorManager, options = {}) {
46
+ this.errorManager = errorManager;
47
+ this.options = options;
48
+ // Initialize default options
49
+ this.options = {
50
+ jitterEnabled: true,
51
+ maxJitter: 1000,
52
+ ...this.options,
53
+ };
54
+ this.status = {
55
+ connected: false,
56
+ type: "stdio",
57
+ reconnectAttempts: 0,
58
+ };
59
+ // Apply defaults
60
+ this.options = {
61
+ autoReconnect: true,
62
+ maxReconnectAttempts: 5,
63
+ reconnectDelay: 1000,
64
+ healthCheckInterval: 30000,
65
+ ...options,
66
+ };
67
+ }
68
+ /**
69
+ * Connect to MCP server using specified transport
70
+ */
71
+ async connect(config) {
72
+ try {
73
+ // Validate configuration
74
+ const validatedConfig = TransportConfigSchema.parse(config);
75
+ this.config = validatedConfig;
76
+ this.status.type = validatedConfig.type;
77
+ // Disconnect existing client if any
78
+ if (this.client) {
79
+ await this.disconnect();
80
+ }
81
+ // Create transport based on type
82
+ const transport = await this.createTransport(validatedConfig);
83
+ // Create MCP client
84
+ this.client = new Client({
85
+ name: "neurolink-mcp-client",
86
+ version: "1.0.0",
87
+ }, {
88
+ capabilities: {},
89
+ });
90
+ // Connect client
91
+ await this.client.connect(transport);
92
+ // Update status
93
+ this.status.connected = true;
94
+ this.status.lastConnected = new Date();
95
+ this.status.reconnectAttempts = 0;
96
+ // Set up health monitoring if enabled
97
+ if (this.options.healthCheckInterval &&
98
+ this.options.healthCheckInterval > 0) {
99
+ this.setupHealthMonitoring();
100
+ }
101
+ return this.client;
102
+ }
103
+ catch (error) {
104
+ this.handleConnectionError(error);
105
+ throw error;
106
+ }
107
+ }
108
+ /**
109
+ * Create transport based on configuration
110
+ */
111
+ async createTransport(config) {
112
+ switch (config.type) {
113
+ case "stdio":
114
+ return this.createStdioTransport(config);
115
+ case "sse":
116
+ return this.createSSETransport(config);
117
+ case "http":
118
+ return this.createHTTPTransport(config);
119
+ default:
120
+ throw new Error(`Unsupported transport type: ${config.type}`);
121
+ }
122
+ }
123
+ /**
124
+ * Create stdio transport
125
+ */
126
+ createStdioTransport(config) {
127
+ // Filter out undefined values from process.env
128
+ const envWithoutUndefined = Object.fromEntries(Object.entries(process.env).filter(([_, value]) => value !== undefined));
129
+ // StdioClientTransport handles process creation internally
130
+ return new StdioClientTransport({
131
+ command: config.command,
132
+ args: config.args ?? [],
133
+ env: { ...envWithoutUndefined, ...config.env },
134
+ cwd: config.cwd,
135
+ });
136
+ }
137
+ /**
138
+ * Create SSE transport with reconnection support
139
+ */
140
+ async createSSETransport(config) {
141
+ // Dynamically import SSE transport
142
+ const { SSEClientTransport } = await import("@modelcontextprotocol/sdk/client/sse.js");
143
+ // Use ReconnectingEventSource for reliability
144
+ const ReconnectingEventSource = await import("reconnecting-eventsource").then((m) => m.default);
145
+ return new SSEClientTransport(new URL(config.url), {
146
+ requestInit: {
147
+ headers: config.headers,
148
+ ...(config.timeout && { timeout: config.timeout }),
149
+ },
150
+ eventSourceInit: {
151
+ eventSource: ReconnectingEventSource,
152
+ max_retry_time: config.maxRetryTime,
153
+ withCredentials: config.withCredentials,
154
+ },
155
+ });
156
+ }
157
+ /**
158
+ * Create HTTP transport
159
+ */
160
+ async createHTTPTransport(config) {
161
+ // Dynamically import HTTP transport
162
+ const httpModule = await import("@modelcontextprotocol/sdk/client/streamableHttp.js");
163
+ const HTTPClientTransport = httpModule.default || httpModule.HTTPClientTransport;
164
+ return new HTTPClientTransport(new URL(config.url), {
165
+ requestInit: {
166
+ headers: config.headers,
167
+ timeout: config.timeout * 1000, // Convert seconds to milliseconds
168
+ },
169
+ });
170
+ }
171
+ /**
172
+ * Set up health monitoring
173
+ */
174
+ setupHealthMonitoring() {
175
+ if (!this.client) {
176
+ return;
177
+ }
178
+ // Clear any existing health check timer
179
+ if (this.healthCheckTimer) {
180
+ clearInterval(this.healthCheckTimer);
181
+ }
182
+ // Set up periodic health checks
183
+ this.healthCheckTimer = setInterval(async () => {
184
+ if (!this.client) {
185
+ return;
186
+ }
187
+ try {
188
+ // Simple health check - list tools
189
+ await this.client.request({ method: "tools/list" }, z.object({ tools: z.array(z.any()) }));
190
+ }
191
+ catch (error) {
192
+ // Health check failed, trigger reconnection if enabled
193
+ if (this.options.autoReconnect && this.config) {
194
+ this.handleConnectionError(error);
195
+ }
196
+ }
197
+ }, this.options.healthCheckInterval);
198
+ }
199
+ /**
200
+ * Handle connection errors
201
+ */
202
+ handleConnectionError(error) {
203
+ const err = error instanceof Error ? error : new Error(String(error));
204
+ this.status.connected = false;
205
+ this.status.lastError = err;
206
+ // Record error
207
+ this.errorManager.recordError(err, {
208
+ category: ErrorCategory.CONNECTION_ERROR,
209
+ severity: ErrorSeverity.HIGH,
210
+ toolName: "transport-manager",
211
+ parameters: {
212
+ transport: this.status.type,
213
+ reconnectAttempts: this.status.reconnectAttempts,
214
+ },
215
+ });
216
+ // Attempt reconnection if enabled
217
+ if (this.options.autoReconnect &&
218
+ this.status.reconnectAttempts < this.options.maxReconnectAttempts) {
219
+ // Schedule reconnection attempt
220
+ this.scheduleReconnect();
221
+ }
222
+ }
223
+ /**
224
+ * Schedule reconnection attempt
225
+ */
226
+ scheduleReconnect() {
227
+ if (this.reconnectTimer) {
228
+ clearTimeout(this.reconnectTimer);
229
+ }
230
+ // Increment attempts BEFORE calculating delay (uses updated attempt count)
231
+ this.status.reconnectAttempts++;
232
+ const delay = this.calculateReconnectDelay();
233
+ this.reconnectTimer = setTimeout(() => {
234
+ this.reconnect().catch((error) => {
235
+ console.error("Reconnection failed:", error);
236
+ });
237
+ }, delay);
238
+ }
239
+ /**
240
+ * Calculate reconnect delay with exponential backoff
241
+ */
242
+ calculateReconnectDelay() {
243
+ const baseDelay = this.options.reconnectDelay || 1000;
244
+ const maxDelay = 30000; // 30 seconds max
245
+ const delay = Math.min(baseDelay * Math.pow(2, this.status.reconnectAttempts), maxDelay);
246
+ // Add configurable jitter to prevent thundering herd
247
+ if (this.options.jitterEnabled === true) {
248
+ const maxJitter = this.options.maxJitter || 1000;
249
+ return delay + Math.random() * maxJitter;
250
+ }
251
+ return delay;
252
+ }
253
+ /**
254
+ * Reconnect to server
255
+ */
256
+ async reconnect() {
257
+ // Prevent concurrent reconnection attempts
258
+ if (this.reconnectPromise) {
259
+ return this.reconnectPromise;
260
+ }
261
+ this.reconnectPromise = this._reconnect();
262
+ try {
263
+ await this.reconnectPromise;
264
+ }
265
+ finally {
266
+ this.reconnectPromise = undefined;
267
+ }
268
+ }
269
+ async _reconnect() {
270
+ if (!this.config) {
271
+ throw new Error("No configuration available for reconnection");
272
+ }
273
+ try {
274
+ await this.connect(this.config);
275
+ console.log(`Reconnected successfully after ${this.status.reconnectAttempts} attempts`);
276
+ }
277
+ catch (error) {
278
+ if (this.status.reconnectAttempts >= this.options.maxReconnectAttempts) {
279
+ throw new Error(`Max reconnection attempts (${this.options.maxReconnectAttempts}) reached`);
280
+ }
281
+ throw error;
282
+ }
283
+ }
284
+ /**
285
+ * Disconnect from server
286
+ */
287
+ async disconnect() {
288
+ // Clear reconnection timer
289
+ if (this.reconnectTimer) {
290
+ clearTimeout(this.reconnectTimer);
291
+ this.reconnectTimer = undefined;
292
+ }
293
+ // Stop health monitoring
294
+ if (this.healthCheckTimer) {
295
+ clearInterval(this.healthCheckTimer);
296
+ this.healthCheckTimer = undefined;
297
+ }
298
+ // Close client connection
299
+ if (this.client) {
300
+ await this.client.close();
301
+ this.client = undefined;
302
+ }
303
+ // Update status
304
+ this.status.connected = false;
305
+ }
306
+ /**
307
+ * Get current transport status
308
+ */
309
+ getStatus() {
310
+ return { ...this.status };
311
+ }
312
+ /**
313
+ * Get connected client
314
+ */
315
+ getClient() {
316
+ return this.client;
317
+ }
318
+ /**
319
+ * Check if connected
320
+ */
321
+ isConnected() {
322
+ return this.status.connected && this.client !== undefined;
323
+ }
324
+ /**
325
+ * Reset reconnection attempts
326
+ */
327
+ resetReconnectAttempts() {
328
+ this.status.reconnectAttempts = 0;
329
+ }
330
+ }
@@ -139,6 +139,11 @@ export class UnifiedMCPSystem {
139
139
  const registryStats = await this.registry.getStats();
140
140
  const externalStatus = this.externalManager.getStatus();
141
141
  const internalToolCount = this.internalServers.reduce((sum, server) => sum + Object.keys(server.tools).length, 0);
142
+ // Calculate total tools from registry
143
+ const registryToolCount = this.registry.getToolCount
144
+ ? this.registry.getToolCount()
145
+ : 0;
146
+ const totalTools = internalToolCount + externalStatus.totalTools + registryToolCount;
142
147
  return {
143
148
  isInitialized: this.isInitialized,
144
149
  internalServers: {
@@ -150,7 +155,7 @@ export class UnifiedMCPSystem {
150
155
  connected: externalStatus.connected,
151
156
  tools: externalStatus.totalTools,
152
157
  },
153
- totalTools: registryStats.totalTools,
158
+ totalTools,
154
159
  registryStats,
155
160
  };
156
161
  }
@@ -3,15 +3,21 @@
3
3
  */
4
4
  import type { DiscoveredMCP, ExecutionContext } from "./contracts/mcp-contract.js";
5
5
  import type { DiscoveryOptions } from "./auto-discovery.js";
6
- import { MCPToolRegistry, type ToolInfo, type ToolExecutionResult } from "./tool-registry.js";
6
+ import { MCPToolRegistry, type ToolInfo } from "./tool-registry.js";
7
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
8
+ import { ErrorManager } from "./error-manager.js";
7
9
  /**
8
10
  * Unified registry combining multiple sources
9
11
  */
10
12
  export declare class UnifiedMCPRegistry extends MCPToolRegistry {
13
+ private errorManager;
11
14
  private autoDiscoveryEnabled;
12
15
  private autoDiscoveredServers;
13
16
  private manualServers;
14
17
  private availableServers;
18
+ private transportManager;
19
+ private activeConnections;
20
+ constructor(errorManager?: ErrorManager);
15
21
  /**
16
22
  * Initialize with auto-discovery
17
23
  */
@@ -47,7 +53,7 @@ export declare class UnifiedMCPRegistry extends MCPToolRegistry {
47
53
  /**
48
54
  * Execute a tool through the registry
49
55
  */
50
- executeTool(toolName: string, args: any, context: ExecutionContext): Promise<ToolExecutionResult>;
56
+ executeTool<T = unknown>(toolName: string, args?: unknown, context?: ExecutionContext): Promise<T>;
51
57
  /**
52
58
  * Lazily activate a server by ID
53
59
  */
@@ -57,9 +63,17 @@ export declare class UnifiedMCPRegistry extends MCPToolRegistry {
57
63
  */
58
64
  registerManualServer(id: string, server: any): void;
59
65
  /**
60
- * Get registry statistics
66
+ * Get registry statistics (override parent method)
61
67
  */
62
- getStats(): Promise<{
68
+ getStats(): Record<string, {
69
+ count: number;
70
+ averageTime: number;
71
+ totalTime: number;
72
+ }>;
73
+ /**
74
+ * Get detailed registry statistics
75
+ */
76
+ getDetailedStats(): Promise<{
63
77
  total: number;
64
78
  bySource: Record<string, number>;
65
79
  byType: Record<string, number>;
@@ -72,9 +86,44 @@ export declare class UnifiedMCPRegistry extends MCPToolRegistry {
72
86
  tools?: number;
73
87
  }>;
74
88
  /**
75
- * Clear all registries
89
+ * Add external MCP server programmatically
90
+ *
91
+ * @param serverId - Unique server identifier
92
+ * @param config - Server configuration (stdio, sse, or http)
93
+ */
94
+ addExternalServer(serverId: string, config: {
95
+ type: "stdio" | "sse" | "http";
96
+ command?: string;
97
+ args?: string[];
98
+ env?: Record<string, string>;
99
+ cwd?: string;
100
+ url?: string;
101
+ headers?: Record<string, string>;
102
+ timeout?: number;
103
+ }): Promise<void>;
104
+ /**
105
+ * Get active connection for a server
106
+ */
107
+ getConnection(serverId: string): Client | undefined;
108
+ /**
109
+ * Check if server is actively connected
110
+ */
111
+ isConnected(serverId: string): boolean;
112
+ /**
113
+ * Clear all registries and active connections (synchronous, preserves base API contract)
114
+ */
115
+ /**
116
+ * Clear registries without closing connections (internal use)
117
+ */
118
+ private clearRegistriesOnly;
119
+ /**
120
+ * Clear all registries and initiate async connection cleanup
76
121
  */
77
122
  clear(): void;
123
+ /**
124
+ * Clear all registries and close active connections asynchronously
125
+ */
126
+ clearAsync(): Promise<void>;
78
127
  }
79
128
  /**
80
129
  * Default unified registry instance