@juspay/neurolink 1.6.0 → 1.10.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 (182) hide show
  1. package/CHANGELOG.md +200 -7
  2. package/README.md +101 -18
  3. package/dist/agent/direct-tools.d.ts +1203 -0
  4. package/dist/agent/direct-tools.js +387 -0
  5. package/dist/cli/commands/agent-generate.d.ts +2 -0
  6. package/dist/cli/commands/agent-generate.js +70 -0
  7. package/dist/cli/commands/config.d.ts +6 -6
  8. package/dist/cli/commands/config.js +326 -273
  9. package/dist/cli/commands/mcp.d.ts +2 -1
  10. package/dist/cli/commands/mcp.js +874 -146
  11. package/dist/cli/commands/ollama.d.ts +1 -1
  12. package/dist/cli/commands/ollama.js +153 -143
  13. package/dist/cli/index.js +687 -325
  14. package/dist/cli/utils/complete-setup.d.ts +19 -0
  15. package/dist/cli/utils/complete-setup.js +81 -0
  16. package/dist/cli/utils/env-manager.d.ts +44 -0
  17. package/dist/cli/utils/env-manager.js +226 -0
  18. package/dist/cli/utils/interactive-setup.d.ts +48 -0
  19. package/dist/cli/utils/interactive-setup.js +302 -0
  20. package/dist/core/dynamic-models.d.ts +208 -0
  21. package/dist/core/dynamic-models.js +250 -0
  22. package/dist/core/factory.d.ts +13 -6
  23. package/dist/core/factory.js +177 -62
  24. package/dist/core/types.d.ts +4 -2
  25. package/dist/core/types.js +4 -4
  26. package/dist/index.d.ts +16 -16
  27. package/dist/index.js +16 -16
  28. package/dist/lib/agent/direct-tools.d.ts +1203 -0
  29. package/dist/lib/agent/direct-tools.js +387 -0
  30. package/dist/lib/core/dynamic-models.d.ts +208 -0
  31. package/dist/lib/core/dynamic-models.js +250 -0
  32. package/dist/lib/core/factory.d.ts +13 -6
  33. package/dist/lib/core/factory.js +177 -62
  34. package/dist/lib/core/types.d.ts +4 -2
  35. package/dist/lib/core/types.js +4 -4
  36. package/dist/lib/index.d.ts +16 -16
  37. package/dist/lib/index.js +16 -16
  38. package/dist/lib/mcp/auto-discovery.d.ts +120 -0
  39. package/dist/lib/mcp/auto-discovery.js +793 -0
  40. package/dist/lib/mcp/client.d.ts +66 -0
  41. package/dist/lib/mcp/client.js +245 -0
  42. package/dist/lib/mcp/config.d.ts +31 -0
  43. package/dist/lib/mcp/config.js +74 -0
  44. package/dist/lib/mcp/context-manager.d.ts +4 -4
  45. package/dist/lib/mcp/context-manager.js +24 -18
  46. package/dist/lib/mcp/factory.d.ts +28 -11
  47. package/dist/lib/mcp/factory.js +36 -29
  48. package/dist/lib/mcp/function-calling.d.ts +51 -0
  49. package/dist/lib/mcp/function-calling.js +510 -0
  50. package/dist/lib/mcp/index.d.ts +190 -0
  51. package/dist/lib/mcp/index.js +156 -0
  52. package/dist/lib/mcp/initialize-tools.d.ts +28 -0
  53. package/dist/lib/mcp/initialize-tools.js +209 -0
  54. package/dist/lib/mcp/initialize.d.ts +17 -0
  55. package/dist/lib/mcp/initialize.js +51 -0
  56. package/dist/lib/mcp/logging.d.ts +71 -0
  57. package/dist/lib/mcp/logging.js +183 -0
  58. package/dist/lib/mcp/manager.d.ts +67 -0
  59. package/dist/lib/mcp/manager.js +176 -0
  60. package/dist/lib/mcp/neurolink-mcp-client.d.ts +96 -0
  61. package/dist/lib/mcp/neurolink-mcp-client.js +417 -0
  62. package/dist/lib/mcp/orchestrator.d.ts +3 -3
  63. package/dist/lib/mcp/orchestrator.js +46 -43
  64. package/dist/lib/mcp/registry.d.ts +12 -4
  65. package/dist/lib/mcp/registry.js +64 -37
  66. package/dist/lib/mcp/servers/ai-providers/ai-analysis-tools.d.ts +1 -1
  67. package/dist/lib/mcp/servers/ai-providers/ai-analysis-tools.js +204 -65
  68. package/dist/lib/mcp/servers/ai-providers/ai-core-server.js +142 -102
  69. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.d.ts +6 -6
  70. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.js +197 -142
  71. package/dist/lib/mcp/servers/utilities/utility-server.d.ts +8 -0
  72. package/dist/lib/mcp/servers/utilities/utility-server.js +326 -0
  73. package/dist/lib/mcp/tool-integration.d.ts +67 -0
  74. package/dist/lib/mcp/tool-integration.js +179 -0
  75. package/dist/lib/mcp/unified-registry.d.ts +269 -0
  76. package/dist/lib/mcp/unified-registry.js +1411 -0
  77. package/dist/lib/neurolink.d.ts +68 -6
  78. package/dist/lib/neurolink.js +304 -42
  79. package/dist/lib/providers/agent-enhanced-provider.d.ts +59 -0
  80. package/dist/lib/providers/agent-enhanced-provider.js +242 -0
  81. package/dist/lib/providers/amazonBedrock.d.ts +3 -3
  82. package/dist/lib/providers/amazonBedrock.js +54 -50
  83. package/dist/lib/providers/anthropic.d.ts +2 -2
  84. package/dist/lib/providers/anthropic.js +92 -84
  85. package/dist/lib/providers/azureOpenAI.d.ts +2 -2
  86. package/dist/lib/providers/azureOpenAI.js +97 -86
  87. package/dist/lib/providers/function-calling-provider.d.ts +70 -0
  88. package/dist/lib/providers/function-calling-provider.js +359 -0
  89. package/dist/lib/providers/googleAIStudio.d.ts +10 -5
  90. package/dist/lib/providers/googleAIStudio.js +60 -38
  91. package/dist/lib/providers/googleVertexAI.d.ts +3 -3
  92. package/dist/lib/providers/googleVertexAI.js +96 -86
  93. package/dist/lib/providers/huggingFace.d.ts +3 -3
  94. package/dist/lib/providers/huggingFace.js +70 -63
  95. package/dist/lib/providers/index.d.ts +11 -11
  96. package/dist/lib/providers/index.js +18 -18
  97. package/dist/lib/providers/mcp-provider.d.ts +62 -0
  98. package/dist/lib/providers/mcp-provider.js +183 -0
  99. package/dist/lib/providers/mistralAI.d.ts +3 -3
  100. package/dist/lib/providers/mistralAI.js +42 -36
  101. package/dist/lib/providers/ollama.d.ts +4 -4
  102. package/dist/lib/providers/ollama.js +128 -98
  103. package/dist/lib/providers/openAI.d.ts +7 -3
  104. package/dist/lib/providers/openAI.js +45 -33
  105. package/dist/lib/utils/logger.js +2 -2
  106. package/dist/lib/utils/providerUtils-fixed.d.ts +8 -0
  107. package/dist/lib/utils/providerUtils-fixed.js +75 -0
  108. package/dist/lib/utils/providerUtils.d.ts +8 -1
  109. package/dist/lib/utils/providerUtils.js +63 -32
  110. package/dist/mcp/auto-discovery.d.ts +120 -0
  111. package/dist/mcp/auto-discovery.js +794 -0
  112. package/dist/mcp/client.d.ts +66 -0
  113. package/dist/mcp/client.js +245 -0
  114. package/dist/mcp/config.d.ts +31 -0
  115. package/dist/mcp/config.js +74 -0
  116. package/dist/mcp/context-manager.d.ts +4 -4
  117. package/dist/mcp/context-manager.js +24 -18
  118. package/dist/mcp/factory.d.ts +28 -11
  119. package/dist/mcp/factory.js +36 -29
  120. package/dist/mcp/function-calling.d.ts +51 -0
  121. package/dist/mcp/function-calling.js +510 -0
  122. package/dist/mcp/index.d.ts +190 -0
  123. package/dist/mcp/index.js +156 -0
  124. package/dist/mcp/initialize-tools.d.ts +28 -0
  125. package/dist/mcp/initialize-tools.js +210 -0
  126. package/dist/mcp/initialize.d.ts +17 -0
  127. package/dist/mcp/initialize.js +51 -0
  128. package/dist/mcp/logging.d.ts +71 -0
  129. package/dist/mcp/logging.js +183 -0
  130. package/dist/mcp/manager.d.ts +67 -0
  131. package/dist/mcp/manager.js +176 -0
  132. package/dist/mcp/neurolink-mcp-client.d.ts +96 -0
  133. package/dist/mcp/neurolink-mcp-client.js +417 -0
  134. package/dist/mcp/orchestrator.d.ts +3 -3
  135. package/dist/mcp/orchestrator.js +46 -43
  136. package/dist/mcp/registry.d.ts +12 -4
  137. package/dist/mcp/registry.js +64 -37
  138. package/dist/mcp/servers/ai-providers/ai-analysis-tools.d.ts +1 -1
  139. package/dist/mcp/servers/ai-providers/ai-analysis-tools.js +204 -65
  140. package/dist/mcp/servers/ai-providers/ai-core-server.js +142 -102
  141. package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +6 -6
  142. package/dist/mcp/servers/ai-providers/ai-workflow-tools.js +197 -142
  143. package/dist/mcp/servers/utilities/utility-server.d.ts +8 -0
  144. package/dist/mcp/servers/utilities/utility-server.js +326 -0
  145. package/dist/mcp/tool-integration.d.ts +67 -0
  146. package/dist/mcp/tool-integration.js +179 -0
  147. package/dist/mcp/unified-registry.d.ts +269 -0
  148. package/dist/mcp/unified-registry.js +1411 -0
  149. package/dist/neurolink.d.ts +68 -6
  150. package/dist/neurolink.js +304 -42
  151. package/dist/providers/agent-enhanced-provider.d.ts +59 -0
  152. package/dist/providers/agent-enhanced-provider.js +242 -0
  153. package/dist/providers/amazonBedrock.d.ts +3 -3
  154. package/dist/providers/amazonBedrock.js +54 -50
  155. package/dist/providers/anthropic.d.ts +2 -2
  156. package/dist/providers/anthropic.js +92 -84
  157. package/dist/providers/azureOpenAI.d.ts +2 -2
  158. package/dist/providers/azureOpenAI.js +97 -86
  159. package/dist/providers/function-calling-provider.d.ts +70 -0
  160. package/dist/providers/function-calling-provider.js +359 -0
  161. package/dist/providers/googleAIStudio.d.ts +10 -5
  162. package/dist/providers/googleAIStudio.js +60 -38
  163. package/dist/providers/googleVertexAI.d.ts +3 -3
  164. package/dist/providers/googleVertexAI.js +96 -86
  165. package/dist/providers/huggingFace.d.ts +3 -3
  166. package/dist/providers/huggingFace.js +70 -63
  167. package/dist/providers/index.d.ts +11 -11
  168. package/dist/providers/index.js +18 -18
  169. package/dist/providers/mcp-provider.d.ts +62 -0
  170. package/dist/providers/mcp-provider.js +183 -0
  171. package/dist/providers/mistralAI.d.ts +3 -3
  172. package/dist/providers/mistralAI.js +42 -36
  173. package/dist/providers/ollama.d.ts +4 -4
  174. package/dist/providers/ollama.js +128 -98
  175. package/dist/providers/openAI.d.ts +7 -3
  176. package/dist/providers/openAI.js +45 -33
  177. package/dist/utils/logger.js +2 -2
  178. package/dist/utils/providerUtils-fixed.d.ts +8 -0
  179. package/dist/utils/providerUtils-fixed.js +75 -0
  180. package/dist/utils/providerUtils.d.ts +8 -1
  181. package/dist/utils/providerUtils.js +63 -32
  182. package/package.json +182 -160
@@ -3,8 +3,8 @@
3
3
  * Central registry for managing MCP servers and tools with execution capabilities
4
4
  * Supports tool discovery, registration, and orchestrated execution
5
5
  */
6
- import type { NeuroLinkMCPServer, NeuroLinkMCPTool, NeuroLinkExecutionContext, ToolResult } from './factory.js';
7
- import { ContextManager } from './context-manager.js';
6
+ import type { NeuroLinkMCPServer, NeuroLinkMCPTool, NeuroLinkExecutionContext, ToolResult } from "./factory.js";
7
+ import { ContextManager } from "./context-manager.js";
8
8
  /**
9
9
  * Tool registration information
10
10
  */
@@ -149,8 +149,16 @@ export declare class MCPToolRegistry {
149
149
  private updateExecutionMetrics;
150
150
  }
151
151
  /**
152
- * Default registry instance
153
- * Can be used across the application for consistent tool management
152
+ * Get the default singleton instance of the MCPToolRegistry.
153
+ * This function ensures that the registry is only instantiated once.
154
+ * Using a function getter helps prevent circular dependency issues during module initialization.
155
+ *
156
+ * @returns The singleton MCPToolRegistry instance.
157
+ */
158
+ export declare function getDefaultToolRegistry(): MCPToolRegistry;
159
+ /**
160
+ * @deprecated The direct export `defaultToolRegistry` is deprecated and will be removed.
161
+ * Please use `getDefaultToolRegistry()` instead to avoid circular dependency issues.
154
162
  */
155
163
  export declare const defaultToolRegistry: MCPToolRegistry;
156
164
  /**
@@ -3,7 +3,8 @@
3
3
  * Central registry for managing MCP servers and tools with execution capabilities
4
4
  * Supports tool discovery, registration, and orchestrated execution
5
5
  */
6
- import { ContextManager, ContextValidator } from './context-manager.js';
6
+ import { ContextManager, ContextValidator } from "./context-manager.js";
7
+ import { registryLogger, mcpLogger } from "./logging.js";
7
8
  /**
8
9
  * Central MCP Tool Registry
9
10
  * Manages all MCP servers and their tools with advanced execution capabilities
@@ -26,9 +27,10 @@ export class MCPToolRegistry {
26
27
  * @throws Error if server ID already exists
27
28
  */
28
29
  async registerServer(server) {
29
- // Check for duplicate server ID
30
+ // Check for duplicate server ID - if already registered, skip silently
30
31
  if (this.servers.has(server.id)) {
31
- throw new Error(`Server with ID '${server.id}' is already registered`);
32
+ mcpLogger.debug(`Server with ID '${server.id}' is already registered, skipping registration`);
33
+ return;
32
34
  }
33
35
  // Register the server
34
36
  this.servers.set(server.id, server);
@@ -36,7 +38,7 @@ export class MCPToolRegistry {
36
38
  for (const [toolName, tool] of Object.entries(server.tools)) {
37
39
  await this.registerToolFromServer(server, toolName, tool);
38
40
  }
39
- console.log(`[MCPRegistry] Registered server '${server.id}' with ${Object.keys(server.tools).length} tools`);
41
+ registryLogger.debug(`Registered server '${server.id}' with ${Object.keys(server.tools).length} tools`);
40
42
  }
41
43
  /**
42
44
  * Register a single tool from a server
@@ -55,7 +57,7 @@ export class MCPToolRegistry {
55
57
  serverCategory: server.category,
56
58
  qualifiedName,
57
59
  simpleName,
58
- registeredAt: Date.now()
60
+ registeredAt: Date.now(),
59
61
  };
60
62
  // Register with both qualified and simple names
61
63
  this.tools.set(qualifiedName, registration);
@@ -64,7 +66,7 @@ export class MCPToolRegistry {
64
66
  this.tools.set(simpleName, registration);
65
67
  }
66
68
  else {
67
- console.warn(`[MCPRegistry] Tool name conflict: '${simpleName}' already exists, use qualified name '${qualifiedName}'`);
69
+ registryLogger.warn(`Tool name conflict: '${simpleName}' already exists, use qualified name '${qualifiedName}'`);
68
70
  }
69
71
  }
70
72
  /**
@@ -78,7 +80,7 @@ export class MCPToolRegistry {
78
80
  */
79
81
  async executeTool(toolName, params, context, options = {}) {
80
82
  const startTime = Date.now();
81
- const { validateInput = true, validatePermissions = true, trackMetrics = true, timeoutMs = 30000 } = options;
83
+ const { validateInput = true, validatePermissions = true, trackMetrics = true, timeoutMs = 30000, } = options;
82
84
  try {
83
85
  // Find the tool
84
86
  const registration = this.tools.get(toolName);
@@ -90,11 +92,12 @@ export class MCPToolRegistry {
90
92
  if (validatePermissions) {
91
93
  const contextValidation = ContextValidator.validateContext(context);
92
94
  if (!contextValidation.isValid) {
93
- throw new Error(`Context validation failed: ${contextValidation.errors.join(', ')}`);
95
+ throw new Error(`Context validation failed: ${contextValidation.errors.join(", ")}`);
94
96
  }
95
97
  // Check tool permissions
96
- if (tool.permissions && !ContextValidator.hasPermissions(context, tool.permissions)) {
97
- throw new Error(`Insufficient permissions for tool '${toolName}'. Required: ${tool.permissions.join(', ')}`);
98
+ if (tool.permissions &&
99
+ !ContextValidator.hasPermissions(context, tool.permissions)) {
100
+ throw new Error(`Insufficient permissions for tool '${toolName}'. Required: ${tool.permissions.join(", ")}`);
98
101
  }
99
102
  }
100
103
  // Validate input parameters if schema provided
@@ -123,8 +126,8 @@ export class MCPToolRegistry {
123
126
  serverTitle,
124
127
  sessionId: context.sessionId,
125
128
  timestamp: Date.now(),
126
- executionTime
127
- }
129
+ executionTime,
130
+ },
128
131
  };
129
132
  // Track metrics
130
133
  if (trackMetrics) {
@@ -137,10 +140,10 @@ export class MCPToolRegistry {
137
140
  }
138
141
  catch (error) {
139
142
  const errorMessage = error instanceof Error ? error.message : String(error);
140
- console.warn(`[MCPRegistry] Output validation warning for tool '${toolName}': ${errorMessage}`);
143
+ registryLogger.warn(`Output validation warning for tool '${toolName}': ${errorMessage}`);
141
144
  }
142
145
  }
143
- console.log(`[MCPRegistry] Executed tool '${toolName}' in ${executionTime}ms - ${result.success ? 'SUCCESS' : 'FAILED'}`);
146
+ registryLogger.debug(`Executed tool '${toolName}' in ${executionTime}ms - ${result.success ? "SUCCESS" : "FAILED"}`);
144
147
  return enhancedResult;
145
148
  }
146
149
  catch (error) {
@@ -157,10 +160,10 @@ export class MCPToolRegistry {
157
160
  toolName,
158
161
  sessionId: context.sessionId,
159
162
  timestamp: Date.now(),
160
- executionTime
161
- }
163
+ executionTime,
164
+ },
162
165
  };
163
- console.error(`[MCPRegistry] Tool execution failed '${toolName}': ${errorMessage}`);
166
+ registryLogger.error(`Tool execution failed '${toolName}': ${errorMessage}`);
164
167
  return errorResult;
165
168
  }
166
169
  }
@@ -175,7 +178,8 @@ export class MCPToolRegistry {
175
178
  // Get unique tools (prefer qualified names over simple names)
176
179
  const uniqueTools = new Map();
177
180
  for (const [name, registration] of this.tools) {
178
- if (name.includes('.')) { // Qualified name
181
+ if (name.includes(".")) {
182
+ // Qualified name
179
183
  uniqueTools.set(registration.qualifiedName, registration);
180
184
  }
181
185
  else if (!uniqueTools.has(registration.qualifiedName)) {
@@ -183,9 +187,10 @@ export class MCPToolRegistry {
183
187
  }
184
188
  }
185
189
  for (const registration of uniqueTools.values()) {
186
- const { tool, serverId, serverTitle, serverCategory, qualifiedName, simpleName } = registration;
190
+ const { tool, serverId, serverTitle, serverCategory, qualifiedName, simpleName, } = registration;
187
191
  // Apply filters
188
- if (criteria.name && !simpleName.toLowerCase().includes(criteria.name.toLowerCase())) {
192
+ if (criteria.name &&
193
+ !simpleName.toLowerCase().includes(criteria.name.toLowerCase())) {
189
194
  continue;
190
195
  }
191
196
  if (criteria.category && tool.category !== criteria.category) {
@@ -194,15 +199,17 @@ export class MCPToolRegistry {
194
199
  if (criteria.serverId && serverId !== criteria.serverId) {
195
200
  continue;
196
201
  }
197
- if (criteria.serverCategory && serverCategory !== criteria.serverCategory) {
202
+ if (criteria.serverCategory &&
203
+ serverCategory !== criteria.serverCategory) {
198
204
  continue;
199
205
  }
200
- if (criteria.implemented !== undefined && tool.isImplemented !== criteria.implemented) {
206
+ if (criteria.implemented !== undefined &&
207
+ tool.isImplemented !== criteria.implemented) {
201
208
  continue;
202
209
  }
203
210
  if (criteria.permissions && criteria.permissions.length > 0) {
204
211
  const toolPermissions = tool.permissions || [];
205
- const hasAllPermissions = criteria.permissions.every(p => toolPermissions.includes(p));
212
+ const hasAllPermissions = criteria.permissions.every((p) => toolPermissions.includes(p));
206
213
  if (!hasAllPermissions) {
207
214
  continue;
208
215
  }
@@ -216,7 +223,7 @@ export class MCPToolRegistry {
216
223
  category: tool.category,
217
224
  serverCategory,
218
225
  permissions: tool.permissions,
219
- isImplemented: tool.isImplemented
226
+ isImplemented: tool.isImplemented,
220
227
  });
221
228
  }
222
229
  return tools.sort((a, b) => a.qualifiedName.localeCompare(b.qualifiedName));
@@ -239,7 +246,7 @@ export class MCPToolRegistry {
239
246
  return {
240
247
  tool: registration.tool,
241
248
  server,
242
- registration
249
+ registration,
243
250
  };
244
251
  }
245
252
  /**
@@ -252,22 +259,24 @@ export class MCPToolRegistry {
252
259
  const serversByCategory = {};
253
260
  // Count tools by category
254
261
  for (const registration of this.tools.values()) {
255
- const category = registration.tool.category || 'uncategorized';
262
+ const category = registration.tool.category || "uncategorized";
256
263
  toolsByCategory[category] = (toolsByCategory[category] || 0) + 1;
257
264
  }
258
265
  // Count servers by category
259
266
  for (const server of this.servers.values()) {
260
- const category = server.category || 'uncategorized';
267
+ const category = server.category || "uncategorized";
261
268
  serversByCategory[category] = (serversByCategory[category] || 0) + 1;
262
269
  }
263
270
  return {
264
271
  totalServers: this.servers.size,
265
- totalTools: new Set(Array.from(this.tools.values()).map(r => r.qualifiedName)).size,
272
+ totalTools: new Set(Array.from(this.tools.values()).map((r) => r.qualifiedName)).size,
266
273
  toolsByCategory,
267
274
  serversByCategory,
268
275
  executionCount: this.executionCount,
269
- averageExecutionTime: this.executionCount > 0 ? this.totalExecutionTime / this.executionCount : 0,
270
- errorRate: this.executionCount > 0 ? this.errorCount / this.executionCount : 0
276
+ averageExecutionTime: this.executionCount > 0
277
+ ? this.totalExecutionTime / this.executionCount
278
+ : 0,
279
+ errorRate: this.executionCount > 0 ? this.errorCount / this.executionCount : 0,
271
280
  };
272
281
  }
273
282
  /**
@@ -293,7 +302,7 @@ export class MCPToolRegistry {
293
302
  }
294
303
  // Remove the server
295
304
  this.servers.delete(serverId);
296
- console.log(`[MCPRegistry] Unregistered server '${serverId}' and ${toolsToRemove.length} tools`);
305
+ registryLogger.debug(`Unregistered server '${serverId}' and ${toolsToRemove.length} tools`);
297
306
  return true;
298
307
  }
299
308
  /**
@@ -305,7 +314,7 @@ export class MCPToolRegistry {
305
314
  this.executionCount = 0;
306
315
  this.totalExecutionTime = 0;
307
316
  this.errorCount = 0;
308
- console.log('[MCPRegistry] Cleared all servers and tools');
317
+ registryLogger.debug("Cleared all servers and tools");
309
318
  }
310
319
  /**
311
320
  * Create timeout promise wrapper
@@ -320,7 +329,7 @@ export class MCPToolRegistry {
320
329
  promise,
321
330
  new Promise((_, reject) => {
322
331
  setTimeout(() => reject(new Error(timeoutMessage)), timeoutMs);
323
- })
332
+ }),
324
333
  ]);
325
334
  }
326
335
  /**
@@ -341,14 +350,32 @@ export class MCPToolRegistry {
341
350
  * Default registry instance
342
351
  * Can be used across the application for consistent tool management
343
352
  */
344
- export const defaultToolRegistry = new MCPToolRegistry();
353
+ let defaultRegistryInstance = null;
354
+ /**
355
+ * Get the default singleton instance of the MCPToolRegistry.
356
+ * This function ensures that the registry is only instantiated once.
357
+ * Using a function getter helps prevent circular dependency issues during module initialization.
358
+ *
359
+ * @returns The singleton MCPToolRegistry instance.
360
+ */
361
+ export function getDefaultToolRegistry() {
362
+ if (!defaultRegistryInstance) {
363
+ defaultRegistryInstance = new MCPToolRegistry();
364
+ }
365
+ return defaultRegistryInstance;
366
+ }
367
+ /**
368
+ * @deprecated The direct export `defaultToolRegistry` is deprecated and will be removed.
369
+ * Please use `getDefaultToolRegistry()` instead to avoid circular dependency issues.
370
+ */
371
+ export const defaultToolRegistry = getDefaultToolRegistry();
345
372
  /**
346
373
  * Utility function to register server with default registry
347
374
  *
348
375
  * @param server MCP server to register
349
376
  */
350
377
  export async function registerServer(server) {
351
- return defaultToolRegistry.registerServer(server);
378
+ return getDefaultToolRegistry().registerServer(server);
352
379
  }
353
380
  /**
354
381
  * Utility function to execute tool with default registry
@@ -360,7 +387,7 @@ export async function registerServer(server) {
360
387
  * @returns Tool execution result
361
388
  */
362
389
  export async function executeTool(toolName, params, context, options) {
363
- return defaultToolRegistry.executeTool(toolName, params, context, options);
390
+ return getDefaultToolRegistry().executeTool(toolName, params, context, options);
364
391
  }
365
392
  /**
366
393
  * Utility function to list tools with default registry
@@ -369,5 +396,5 @@ export async function executeTool(toolName, params, context, options) {
369
396
  * @returns Array of tool information
370
397
  */
371
398
  export function listTools(criteria) {
372
- return defaultToolRegistry.listTools(criteria);
399
+ return getDefaultToolRegistry().listTools(criteria);
373
400
  }
@@ -3,7 +3,7 @@
3
3
  * AI-focused MCP tools for usage analysis, performance benchmarking, and parameter optimization
4
4
  * Tools: analyze-ai-usage, benchmark-provider-performance, optimize-prompt-parameters
5
5
  */
6
- import type { NeuroLinkMCPTool } from '../../factory.js';
6
+ import type { NeuroLinkMCPTool } from "../../factory.js";
7
7
  /**
8
8
  * AI Usage Analysis Tool
9
9
  * Analyzes AI usage patterns, token consumption, and cost optimization opportunities