@juspay/neurolink 1.9.0 → 1.11.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.
- package/CHANGELOG.md +41 -31
- package/README.md +17 -1
- package/dist/agent/direct-tools.d.ts +9 -9
- package/dist/cli/commands/agent-generate.d.ts +1 -2
- package/dist/cli/commands/agent-generate.js +5 -8
- package/dist/cli/commands/config.d.ts +2 -2
- package/dist/cli/commands/config.js +1 -1
- package/dist/cli/commands/mcp.js +91 -100
- package/dist/cli/commands/ollama.d.ts +2 -7
- package/dist/cli/commands/ollama.js +5 -8
- package/dist/cli/index.js +263 -258
- package/dist/core/factory.js +11 -12
- package/dist/index.d.ts +24 -1
- package/dist/index.js +36 -1
- package/dist/lib/agent/direct-tools.d.ts +9 -9
- package/dist/lib/core/factory.js +11 -12
- package/dist/lib/index.d.ts +24 -1
- package/dist/lib/index.js +36 -1
- package/dist/lib/mcp/adapters/plugin-bridge.d.ts +39 -0
- package/dist/lib/mcp/adapters/plugin-bridge.js +82 -0
- package/dist/lib/mcp/auto-discovery.d.ts +38 -96
- package/dist/lib/mcp/auto-discovery.js +100 -744
- package/dist/lib/mcp/client.js +4 -4
- package/dist/lib/mcp/context-manager.js +72 -1
- package/dist/lib/mcp/contracts/mcp-contract.d.ts +162 -0
- package/dist/lib/mcp/contracts/mcp-contract.js +58 -0
- package/dist/lib/mcp/core/plugin-manager.d.ts +45 -0
- package/dist/lib/mcp/core/plugin-manager.js +110 -0
- package/dist/lib/mcp/demo/plugin-demo.d.ts +20 -0
- package/dist/lib/mcp/demo/plugin-demo.js +116 -0
- package/dist/lib/mcp/ecosystem.d.ts +75 -0
- package/dist/lib/mcp/ecosystem.js +161 -0
- package/dist/lib/mcp/external-client.d.ts +88 -0
- package/dist/lib/mcp/external-client.js +323 -0
- package/dist/lib/mcp/external-manager.d.ts +112 -0
- package/dist/lib/mcp/external-manager.js +302 -0
- package/dist/lib/mcp/factory.d.ts +4 -4
- package/dist/lib/mcp/function-calling.js +59 -34
- package/dist/lib/mcp/index.d.ts +39 -184
- package/dist/lib/mcp/index.js +72 -150
- package/dist/lib/mcp/initialize.js +5 -5
- package/dist/lib/mcp/logging.d.ts +27 -60
- package/dist/lib/mcp/logging.js +77 -165
- package/dist/lib/mcp/neurolink-mcp-client.js +31 -3
- package/dist/lib/mcp/orchestrator.d.ts +1 -1
- package/dist/lib/mcp/orchestrator.js +13 -12
- package/dist/lib/mcp/plugin-manager.d.ts +98 -0
- package/dist/lib/mcp/plugin-manager.js +294 -0
- package/dist/lib/mcp/plugins/core/filesystem-mcp.d.ts +35 -0
- package/dist/lib/mcp/plugins/core/filesystem-mcp.js +139 -0
- package/dist/lib/mcp/plugins/filesystem-mcp.d.ts +36 -0
- package/dist/lib/mcp/plugins/filesystem-mcp.js +54 -0
- package/dist/lib/mcp/registry.d.ts +26 -167
- package/dist/lib/mcp/registry.js +31 -354
- package/dist/lib/mcp/security-manager.d.ts +85 -0
- package/dist/lib/mcp/security-manager.js +344 -0
- package/dist/lib/mcp/servers/ai-providers/ai-analysis-tools.js +1 -1
- package/dist/lib/mcp/servers/ai-providers/ai-core-server.js +1 -1
- package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
- package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.js +1 -1
- package/dist/lib/mcp/tool-integration.d.ts +4 -14
- package/dist/lib/mcp/tool-integration.js +43 -21
- package/dist/lib/mcp/tool-registry.d.ts +66 -0
- package/dist/lib/mcp/tool-registry.js +160 -0
- package/dist/lib/mcp/unified-mcp.d.ts +123 -0
- package/dist/lib/mcp/unified-mcp.js +246 -0
- package/dist/lib/mcp/unified-registry.d.ts +42 -229
- package/dist/lib/mcp/unified-registry.js +96 -1346
- package/dist/lib/neurolink.d.ts +3 -4
- package/dist/lib/neurolink.js +18 -19
- package/dist/lib/providers/agent-enhanced-provider.js +2 -2
- package/dist/lib/providers/amazonBedrock.js +2 -2
- package/dist/lib/providers/anthropic.js +3 -3
- package/dist/lib/providers/azureOpenAI.js +3 -3
- package/dist/lib/providers/function-calling-provider.js +34 -25
- package/dist/lib/providers/googleAIStudio.js +3 -3
- package/dist/lib/providers/googleVertexAI.js +2 -2
- package/dist/lib/providers/huggingFace.js +2 -2
- package/dist/lib/providers/mcp-provider.js +33 -5
- package/dist/lib/providers/mistralAI.js +2 -2
- package/dist/lib/providers/ollama.js +17 -2
- package/dist/lib/providers/openAI.js +2 -2
- package/dist/lib/utils/providerUtils-fixed.d.ts +8 -0
- package/dist/lib/utils/providerUtils-fixed.js +75 -0
- package/dist/lib/utils/providerUtils.d.ts +8 -1
- package/dist/lib/utils/providerUtils.js +10 -1
- package/dist/mcp/adapters/plugin-bridge.d.ts +39 -0
- package/dist/mcp/adapters/plugin-bridge.js +82 -0
- package/dist/mcp/auto-discovery.d.ts +38 -96
- package/dist/mcp/auto-discovery.js +100 -745
- package/dist/mcp/client.js +4 -4
- package/dist/mcp/context-manager.js +72 -1
- package/dist/mcp/contracts/mcp-contract.d.ts +162 -0
- package/dist/mcp/contracts/mcp-contract.js +58 -0
- package/dist/mcp/core/plugin-manager.d.ts +45 -0
- package/dist/mcp/core/plugin-manager.js +110 -0
- package/dist/mcp/demo/plugin-demo.d.ts +20 -0
- package/dist/mcp/demo/plugin-demo.js +116 -0
- package/dist/mcp/ecosystem.d.ts +75 -0
- package/dist/mcp/ecosystem.js +162 -0
- package/dist/mcp/external-client.d.ts +88 -0
- package/dist/mcp/external-client.js +323 -0
- package/dist/mcp/external-manager.d.ts +112 -0
- package/dist/mcp/external-manager.js +302 -0
- package/dist/mcp/factory.d.ts +4 -4
- package/dist/mcp/function-calling.js +59 -34
- package/dist/mcp/index.d.ts +39 -184
- package/dist/mcp/index.js +72 -150
- package/dist/mcp/initialize.js +5 -5
- package/dist/mcp/logging.d.ts +27 -60
- package/dist/mcp/logging.js +77 -165
- package/dist/mcp/neurolink-mcp-client.js +31 -3
- package/dist/mcp/orchestrator.d.ts +1 -1
- package/dist/mcp/orchestrator.js +13 -12
- package/dist/mcp/plugin-manager.d.ts +98 -0
- package/dist/mcp/plugin-manager.js +295 -0
- package/dist/mcp/plugins/core/filesystem-mcp.d.ts +35 -0
- package/dist/mcp/plugins/core/filesystem-mcp.js +139 -0
- package/dist/mcp/plugins/core/neurolink-mcp.json +17 -0
- package/dist/mcp/plugins/filesystem-mcp.d.ts +36 -0
- package/dist/mcp/plugins/filesystem-mcp.js +54 -0
- package/dist/mcp/registry.d.ts +26 -167
- package/dist/mcp/registry.js +31 -354
- package/dist/mcp/security-manager.d.ts +85 -0
- package/dist/mcp/security-manager.js +344 -0
- package/dist/mcp/servers/ai-providers/ai-analysis-tools.js +1 -1
- package/dist/mcp/servers/ai-providers/ai-core-server.js +1 -1
- package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
- package/dist/mcp/servers/ai-providers/ai-workflow-tools.js +1 -1
- package/dist/mcp/tool-integration.d.ts +4 -14
- package/dist/mcp/tool-integration.js +43 -21
- package/dist/mcp/tool-registry.d.ts +66 -0
- package/dist/mcp/tool-registry.js +160 -0
- package/dist/mcp/unified-mcp.d.ts +123 -0
- package/dist/mcp/unified-mcp.js +246 -0
- package/dist/mcp/unified-registry.d.ts +42 -229
- package/dist/mcp/unified-registry.js +96 -1345
- package/dist/neurolink.d.ts +3 -4
- package/dist/neurolink.js +18 -19
- package/dist/providers/agent-enhanced-provider.js +2 -2
- package/dist/providers/amazonBedrock.js +2 -2
- package/dist/providers/anthropic.js +3 -3
- package/dist/providers/azureOpenAI.js +3 -3
- package/dist/providers/function-calling-provider.js +34 -25
- package/dist/providers/googleAIStudio.js +3 -3
- package/dist/providers/googleVertexAI.js +2 -2
- package/dist/providers/huggingFace.js +2 -2
- package/dist/providers/mcp-provider.js +33 -5
- package/dist/providers/mistralAI.js +2 -2
- package/dist/providers/ollama.js +17 -2
- package/dist/providers/openAI.js +2 -2
- package/dist/utils/providerUtils-fixed.d.ts +8 -0
- package/dist/utils/providerUtils-fixed.js +75 -0
- package/dist/utils/providerUtils.d.ts +8 -1
- package/dist/utils/providerUtils.js +10 -1
- package/package.json +28 -20
package/dist/mcp/registry.d.ts
CHANGED
|
@@ -1,188 +1,47 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* Central registry for managing MCP servers and tools with execution capabilities
|
|
4
|
-
* Supports tool discovery, registration, and orchestrated execution
|
|
2
|
+
* MCP Registry - Plugin Registration and Management
|
|
5
3
|
*/
|
|
6
|
-
import type {
|
|
7
|
-
import { ContextManager } from "./context-manager.js";
|
|
4
|
+
import type { DiscoveredMCP } from "./contracts/mcp-contract.js";
|
|
8
5
|
/**
|
|
9
|
-
*
|
|
6
|
+
* Simple MCP registry for plugin management
|
|
10
7
|
*/
|
|
11
|
-
export
|
|
12
|
-
|
|
13
|
-
serverId: string;
|
|
14
|
-
serverTitle: string;
|
|
15
|
-
serverCategory?: string;
|
|
16
|
-
qualifiedName: string;
|
|
17
|
-
simpleName: string;
|
|
18
|
-
registeredAt: number;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Tool execution options
|
|
22
|
-
*/
|
|
23
|
-
export interface ToolExecutionOptions {
|
|
24
|
-
validateInput?: boolean;
|
|
25
|
-
validatePermissions?: boolean;
|
|
26
|
-
trackMetrics?: boolean;
|
|
27
|
-
timeoutMs?: number;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Tool search criteria
|
|
31
|
-
*/
|
|
32
|
-
export interface ToolSearchCriteria {
|
|
33
|
-
name?: string;
|
|
34
|
-
category?: string;
|
|
35
|
-
serverId?: string;
|
|
36
|
-
serverCategory?: string;
|
|
37
|
-
permissions?: string[];
|
|
38
|
-
implemented?: boolean;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Registry statistics
|
|
42
|
-
*/
|
|
43
|
-
export interface RegistryStats {
|
|
44
|
-
totalServers: number;
|
|
45
|
-
totalTools: number;
|
|
46
|
-
toolsByCategory: Record<string, number>;
|
|
47
|
-
serversByCategory: Record<string, number>;
|
|
48
|
-
executionCount: number;
|
|
49
|
-
averageExecutionTime: number;
|
|
50
|
-
errorRate: number;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Central MCP Tool Registry
|
|
54
|
-
* Manages all MCP servers and their tools with advanced execution capabilities
|
|
55
|
-
*/
|
|
56
|
-
export declare class MCPToolRegistry {
|
|
57
|
-
private servers;
|
|
58
|
-
private tools;
|
|
59
|
-
private contextManager;
|
|
60
|
-
private executionCount;
|
|
61
|
-
private totalExecutionTime;
|
|
62
|
-
private errorCount;
|
|
63
|
-
constructor(contextManager?: ContextManager);
|
|
64
|
-
/**
|
|
65
|
-
* Register an MCP server and all its tools
|
|
66
|
-
*
|
|
67
|
-
* @param server MCP server to register
|
|
68
|
-
* @throws Error if server ID already exists
|
|
69
|
-
*/
|
|
70
|
-
registerServer(server: NeuroLinkMCPServer): Promise<void>;
|
|
8
|
+
export declare class MCPRegistry {
|
|
9
|
+
private plugins;
|
|
71
10
|
/**
|
|
72
|
-
* Register a
|
|
73
|
-
*
|
|
74
|
-
* @param server Source server
|
|
75
|
-
* @param toolName Tool name
|
|
76
|
-
* @param tool Tool implementation
|
|
11
|
+
* Register a plugin
|
|
77
12
|
*/
|
|
78
|
-
|
|
13
|
+
register(plugin: DiscoveredMCP): void;
|
|
79
14
|
/**
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
* @param toolName Tool name (simple or qualified)
|
|
83
|
-
* @param params Tool parameters
|
|
84
|
-
* @param context Execution context
|
|
85
|
-
* @param options Execution options
|
|
86
|
-
* @returns Tool execution result
|
|
15
|
+
* Unregister a plugin
|
|
87
16
|
*/
|
|
88
|
-
|
|
17
|
+
unregister(name: string): boolean;
|
|
89
18
|
/**
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
* @param criteria Search criteria for filtering tools
|
|
93
|
-
* @returns Array of tool information
|
|
19
|
+
* Get a plugin
|
|
94
20
|
*/
|
|
95
|
-
|
|
96
|
-
name: string;
|
|
97
|
-
qualifiedName: string;
|
|
98
|
-
description: string;
|
|
99
|
-
server: string;
|
|
100
|
-
serverTitle: string;
|
|
101
|
-
category?: string;
|
|
102
|
-
serverCategory?: string;
|
|
103
|
-
permissions?: string[];
|
|
104
|
-
isImplemented?: boolean;
|
|
105
|
-
}[];
|
|
21
|
+
get(name: string): DiscoveredMCP | undefined;
|
|
106
22
|
/**
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
* @param toolName Tool name (simple or qualified)
|
|
110
|
-
* @returns Detailed tool information or undefined if not found
|
|
23
|
+
* List all plugins
|
|
111
24
|
*/
|
|
112
|
-
|
|
113
|
-
tool: NeuroLinkMCPTool;
|
|
114
|
-
server: NeuroLinkMCPServer;
|
|
115
|
-
registration: ToolRegistration;
|
|
116
|
-
} | undefined;
|
|
25
|
+
list(): DiscoveredMCP[];
|
|
117
26
|
/**
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
* @returns Comprehensive registry statistics
|
|
27
|
+
* Check if plugin exists
|
|
121
28
|
*/
|
|
122
|
-
|
|
29
|
+
has(name: string): boolean;
|
|
123
30
|
/**
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
* @param serverId Server ID to unregister
|
|
127
|
-
* @returns Whether server was found and removed
|
|
128
|
-
*/
|
|
129
|
-
unregisterServer(serverId: string): boolean;
|
|
130
|
-
/**
|
|
131
|
-
* Clear all servers and tools
|
|
31
|
+
* Clear all plugins
|
|
132
32
|
*/
|
|
133
33
|
clear(): void;
|
|
134
|
-
/**
|
|
135
|
-
* Create timeout promise wrapper
|
|
136
|
-
*
|
|
137
|
-
* @param promise Promise to wrap
|
|
138
|
-
* @param timeoutMs Timeout in milliseconds
|
|
139
|
-
* @param timeoutMessage Error message for timeout
|
|
140
|
-
* @returns Promise that rejects on timeout
|
|
141
|
-
*/
|
|
142
|
-
private createTimeoutPromise;
|
|
143
|
-
/**
|
|
144
|
-
* Update execution metrics
|
|
145
|
-
*
|
|
146
|
-
* @param executionTime Execution time in milliseconds
|
|
147
|
-
* @param success Whether execution was successful
|
|
148
|
-
*/
|
|
149
|
-
private updateExecutionMetrics;
|
|
150
34
|
}
|
|
151
35
|
/**
|
|
152
36
|
* Default registry instance
|
|
153
|
-
* Can be used across the application for consistent tool management
|
|
154
|
-
*/
|
|
155
|
-
export declare const defaultToolRegistry: MCPToolRegistry;
|
|
156
|
-
/**
|
|
157
|
-
* Utility function to register server with default registry
|
|
158
|
-
*
|
|
159
|
-
* @param server MCP server to register
|
|
160
37
|
*/
|
|
161
|
-
export declare
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
export declare function executeTool(toolName: string, params: any, context: NeuroLinkExecutionContext, options?: ToolExecutionOptions): Promise<ToolResult>;
|
|
172
|
-
/**
|
|
173
|
-
* Utility function to list tools with default registry
|
|
174
|
-
*
|
|
175
|
-
* @param criteria Search criteria
|
|
176
|
-
* @returns Array of tool information
|
|
177
|
-
*/
|
|
178
|
-
export declare function listTools(criteria?: ToolSearchCriteria): {
|
|
179
|
-
name: string;
|
|
180
|
-
qualifiedName: string;
|
|
181
|
-
description: string;
|
|
182
|
-
server: string;
|
|
183
|
-
serverTitle: string;
|
|
184
|
-
category?: string;
|
|
185
|
-
serverCategory?: string;
|
|
186
|
-
permissions?: string[];
|
|
187
|
-
isImplemented?: boolean;
|
|
188
|
-
}[];
|
|
38
|
+
export declare const mcpRegistry: MCPRegistry;
|
|
39
|
+
export type MCPToolRegistry = MCPRegistry;
|
|
40
|
+
export declare const defaultToolRegistry: MCPRegistry;
|
|
41
|
+
export { mcpRegistry as defaultMCPRegistry };
|
|
42
|
+
export interface ToolExecutionOptions {
|
|
43
|
+
preferredSource?: string;
|
|
44
|
+
fallbackEnabled?: boolean;
|
|
45
|
+
validateBeforeExecution?: boolean;
|
|
46
|
+
timeoutMs?: number;
|
|
47
|
+
}
|
package/dist/mcp/registry.js
CHANGED
|
@@ -1,382 +1,59 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* Central registry for managing MCP servers and tools with execution capabilities
|
|
4
|
-
* Supports tool discovery, registration, and orchestrated execution
|
|
2
|
+
* MCP Registry - Plugin Registration and Management
|
|
5
3
|
*/
|
|
6
|
-
import {
|
|
7
|
-
import { registryLogger, mcpLogger } from "./logging.js";
|
|
4
|
+
import { registryLogger } from "./logging.js";
|
|
8
5
|
/**
|
|
9
|
-
*
|
|
10
|
-
* Manages all MCP servers and their tools with advanced execution capabilities
|
|
6
|
+
* Simple MCP registry for plugin management
|
|
11
7
|
*/
|
|
12
|
-
export class
|
|
13
|
-
|
|
14
|
-
tools = new Map();
|
|
15
|
-
contextManager;
|
|
16
|
-
// Execution tracking
|
|
17
|
-
executionCount = 0;
|
|
18
|
-
totalExecutionTime = 0;
|
|
19
|
-
errorCount = 0;
|
|
20
|
-
constructor(contextManager) {
|
|
21
|
-
this.contextManager = contextManager || new ContextManager();
|
|
22
|
-
}
|
|
8
|
+
export class MCPRegistry {
|
|
9
|
+
plugins = new Map();
|
|
23
10
|
/**
|
|
24
|
-
* Register
|
|
25
|
-
*
|
|
26
|
-
* @param server MCP server to register
|
|
27
|
-
* @throws Error if server ID already exists
|
|
11
|
+
* Register a plugin
|
|
28
12
|
*/
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
mcpLogger.debug(`Server with ID '${server.id}' is already registered, skipping registration`);
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
// Register the server
|
|
36
|
-
this.servers.set(server.id, server);
|
|
37
|
-
// Register all tools from the server
|
|
38
|
-
for (const [toolName, tool] of Object.entries(server.tools)) {
|
|
39
|
-
await this.registerToolFromServer(server, toolName, tool);
|
|
40
|
-
}
|
|
41
|
-
registryLogger.debug(`Registered server '${server.id}' with ${Object.keys(server.tools).length} tools`);
|
|
13
|
+
register(plugin) {
|
|
14
|
+
this.plugins.set(plugin.metadata.name, plugin);
|
|
15
|
+
registryLogger.info(`Registered plugin: ${plugin.metadata.name}`);
|
|
42
16
|
}
|
|
43
17
|
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* @param server Source server
|
|
47
|
-
* @param toolName Tool name
|
|
48
|
-
* @param tool Tool implementation
|
|
18
|
+
* Unregister a plugin
|
|
49
19
|
*/
|
|
50
|
-
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
tool,
|
|
55
|
-
serverId: server.id,
|
|
56
|
-
serverTitle: server.title,
|
|
57
|
-
serverCategory: server.category,
|
|
58
|
-
qualifiedName,
|
|
59
|
-
simpleName,
|
|
60
|
-
registeredAt: Date.now(),
|
|
61
|
-
};
|
|
62
|
-
// Register with both qualified and simple names
|
|
63
|
-
this.tools.set(qualifiedName, registration);
|
|
64
|
-
// Only register simple name if it doesn't conflict
|
|
65
|
-
if (!this.tools.has(simpleName)) {
|
|
66
|
-
this.tools.set(simpleName, registration);
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
registryLogger.warn(`Tool name conflict: '${simpleName}' already exists, use qualified name '${qualifiedName}'`);
|
|
20
|
+
unregister(name) {
|
|
21
|
+
const removed = this.plugins.delete(name);
|
|
22
|
+
if (removed) {
|
|
23
|
+
registryLogger.info(`Unregistered plugin: ${name}`);
|
|
70
24
|
}
|
|
25
|
+
return removed;
|
|
71
26
|
}
|
|
72
27
|
/**
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* @param toolName Tool name (simple or qualified)
|
|
76
|
-
* @param params Tool parameters
|
|
77
|
-
* @param context Execution context
|
|
78
|
-
* @param options Execution options
|
|
79
|
-
* @returns Tool execution result
|
|
28
|
+
* Get a plugin
|
|
80
29
|
*/
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
const { validateInput = true, validatePermissions = true, trackMetrics = true, timeoutMs = 30000, } = options;
|
|
84
|
-
try {
|
|
85
|
-
// Find the tool
|
|
86
|
-
const registration = this.tools.get(toolName);
|
|
87
|
-
if (!registration) {
|
|
88
|
-
throw new Error(`Tool not found: ${toolName}`);
|
|
89
|
-
}
|
|
90
|
-
const { tool, serverId, serverTitle } = registration;
|
|
91
|
-
// Validate context
|
|
92
|
-
if (validatePermissions) {
|
|
93
|
-
const contextValidation = ContextValidator.validateContext(context);
|
|
94
|
-
if (!contextValidation.isValid) {
|
|
95
|
-
throw new Error(`Context validation failed: ${contextValidation.errors.join(", ")}`);
|
|
96
|
-
}
|
|
97
|
-
// Check tool permissions
|
|
98
|
-
if (tool.permissions &&
|
|
99
|
-
!ContextValidator.hasPermissions(context, tool.permissions)) {
|
|
100
|
-
throw new Error(`Insufficient permissions for tool '${toolName}'. Required: ${tool.permissions.join(", ")}`);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
// Validate input parameters if schema provided
|
|
104
|
-
if (validateInput && tool.inputSchema) {
|
|
105
|
-
try {
|
|
106
|
-
tool.inputSchema.parse(params);
|
|
107
|
-
}
|
|
108
|
-
catch (error) {
|
|
109
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
110
|
-
throw new Error(`Input validation failed for tool '${toolName}': ${errorMessage}`);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
// Add tool to execution chain
|
|
114
|
-
this.contextManager.addToToolChain(context, toolName);
|
|
115
|
-
// Execute tool with timeout
|
|
116
|
-
const executeWithTimeout = this.createTimeoutPromise(tool.execute(params, context), timeoutMs, `Tool '${toolName}' execution timeout`);
|
|
117
|
-
const result = await executeWithTimeout;
|
|
118
|
-
// Add execution metadata
|
|
119
|
-
const executionTime = Date.now() - startTime;
|
|
120
|
-
const enhancedResult = {
|
|
121
|
-
...result,
|
|
122
|
-
metadata: {
|
|
123
|
-
...result.metadata,
|
|
124
|
-
toolName,
|
|
125
|
-
serverId,
|
|
126
|
-
serverTitle,
|
|
127
|
-
sessionId: context.sessionId,
|
|
128
|
-
timestamp: Date.now(),
|
|
129
|
-
executionTime,
|
|
130
|
-
},
|
|
131
|
-
};
|
|
132
|
-
// Track metrics
|
|
133
|
-
if (trackMetrics) {
|
|
134
|
-
this.updateExecutionMetrics(executionTime, result.success);
|
|
135
|
-
}
|
|
136
|
-
// Validate output if schema provided
|
|
137
|
-
if (tool.outputSchema && result.success) {
|
|
138
|
-
try {
|
|
139
|
-
tool.outputSchema.parse(result.data);
|
|
140
|
-
}
|
|
141
|
-
catch (error) {
|
|
142
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
143
|
-
registryLogger.warn(`Output validation warning for tool '${toolName}': ${errorMessage}`);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
registryLogger.debug(`Executed tool '${toolName}' in ${executionTime}ms - ${result.success ? "SUCCESS" : "FAILED"}`);
|
|
147
|
-
return enhancedResult;
|
|
148
|
-
}
|
|
149
|
-
catch (error) {
|
|
150
|
-
const executionTime = Date.now() - startTime;
|
|
151
|
-
// Track error metrics
|
|
152
|
-
if (trackMetrics) {
|
|
153
|
-
this.updateExecutionMetrics(executionTime, false);
|
|
154
|
-
}
|
|
155
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
156
|
-
const errorResult = {
|
|
157
|
-
success: false,
|
|
158
|
-
error: errorMessage,
|
|
159
|
-
metadata: {
|
|
160
|
-
toolName,
|
|
161
|
-
sessionId: context.sessionId,
|
|
162
|
-
timestamp: Date.now(),
|
|
163
|
-
executionTime,
|
|
164
|
-
},
|
|
165
|
-
};
|
|
166
|
-
registryLogger.error(`Tool execution failed '${toolName}': ${errorMessage}`);
|
|
167
|
-
return errorResult;
|
|
168
|
-
}
|
|
30
|
+
get(name) {
|
|
31
|
+
return this.plugins.get(name);
|
|
169
32
|
}
|
|
170
33
|
/**
|
|
171
|
-
* List all
|
|
172
|
-
*
|
|
173
|
-
* @param criteria Search criteria for filtering tools
|
|
174
|
-
* @returns Array of tool information
|
|
34
|
+
* List all plugins
|
|
175
35
|
*/
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
// Get unique tools (prefer qualified names over simple names)
|
|
179
|
-
const uniqueTools = new Map();
|
|
180
|
-
for (const [name, registration] of this.tools) {
|
|
181
|
-
if (name.includes(".")) {
|
|
182
|
-
// Qualified name
|
|
183
|
-
uniqueTools.set(registration.qualifiedName, registration);
|
|
184
|
-
}
|
|
185
|
-
else if (!uniqueTools.has(registration.qualifiedName)) {
|
|
186
|
-
uniqueTools.set(registration.qualifiedName, registration);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
for (const registration of uniqueTools.values()) {
|
|
190
|
-
const { tool, serverId, serverTitle, serverCategory, qualifiedName, simpleName, } = registration;
|
|
191
|
-
// Apply filters
|
|
192
|
-
if (criteria.name &&
|
|
193
|
-
!simpleName.toLowerCase().includes(criteria.name.toLowerCase())) {
|
|
194
|
-
continue;
|
|
195
|
-
}
|
|
196
|
-
if (criteria.category && tool.category !== criteria.category) {
|
|
197
|
-
continue;
|
|
198
|
-
}
|
|
199
|
-
if (criteria.serverId && serverId !== criteria.serverId) {
|
|
200
|
-
continue;
|
|
201
|
-
}
|
|
202
|
-
if (criteria.serverCategory &&
|
|
203
|
-
serverCategory !== criteria.serverCategory) {
|
|
204
|
-
continue;
|
|
205
|
-
}
|
|
206
|
-
if (criteria.implemented !== undefined &&
|
|
207
|
-
tool.isImplemented !== criteria.implemented) {
|
|
208
|
-
continue;
|
|
209
|
-
}
|
|
210
|
-
if (criteria.permissions && criteria.permissions.length > 0) {
|
|
211
|
-
const toolPermissions = tool.permissions || [];
|
|
212
|
-
const hasAllPermissions = criteria.permissions.every((p) => toolPermissions.includes(p));
|
|
213
|
-
if (!hasAllPermissions) {
|
|
214
|
-
continue;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
tools.push({
|
|
218
|
-
name: simpleName,
|
|
219
|
-
qualifiedName,
|
|
220
|
-
description: tool.description,
|
|
221
|
-
server: serverId,
|
|
222
|
-
serverTitle,
|
|
223
|
-
category: tool.category,
|
|
224
|
-
serverCategory,
|
|
225
|
-
permissions: tool.permissions,
|
|
226
|
-
isImplemented: tool.isImplemented,
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
return tools.sort((a, b) => a.qualifiedName.localeCompare(b.qualifiedName));
|
|
36
|
+
list() {
|
|
37
|
+
return Array.from(this.plugins.values());
|
|
230
38
|
}
|
|
231
39
|
/**
|
|
232
|
-
*
|
|
233
|
-
*
|
|
234
|
-
* @param toolName Tool name (simple or qualified)
|
|
235
|
-
* @returns Detailed tool information or undefined if not found
|
|
40
|
+
* Check if plugin exists
|
|
236
41
|
*/
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
if (!registration) {
|
|
240
|
-
return undefined;
|
|
241
|
-
}
|
|
242
|
-
const server = this.servers.get(registration.serverId);
|
|
243
|
-
if (!server) {
|
|
244
|
-
return undefined;
|
|
245
|
-
}
|
|
246
|
-
return {
|
|
247
|
-
tool: registration.tool,
|
|
248
|
-
server,
|
|
249
|
-
registration,
|
|
250
|
-
};
|
|
42
|
+
has(name) {
|
|
43
|
+
return this.plugins.has(name);
|
|
251
44
|
}
|
|
252
45
|
/**
|
|
253
|
-
*
|
|
254
|
-
*
|
|
255
|
-
* @returns Comprehensive registry statistics
|
|
256
|
-
*/
|
|
257
|
-
getStats() {
|
|
258
|
-
const toolsByCategory = {};
|
|
259
|
-
const serversByCategory = {};
|
|
260
|
-
// Count tools by category
|
|
261
|
-
for (const registration of this.tools.values()) {
|
|
262
|
-
const category = registration.tool.category || "uncategorized";
|
|
263
|
-
toolsByCategory[category] = (toolsByCategory[category] || 0) + 1;
|
|
264
|
-
}
|
|
265
|
-
// Count servers by category
|
|
266
|
-
for (const server of this.servers.values()) {
|
|
267
|
-
const category = server.category || "uncategorized";
|
|
268
|
-
serversByCategory[category] = (serversByCategory[category] || 0) + 1;
|
|
269
|
-
}
|
|
270
|
-
return {
|
|
271
|
-
totalServers: this.servers.size,
|
|
272
|
-
totalTools: new Set(Array.from(this.tools.values()).map((r) => r.qualifiedName)).size,
|
|
273
|
-
toolsByCategory,
|
|
274
|
-
serversByCategory,
|
|
275
|
-
executionCount: this.executionCount,
|
|
276
|
-
averageExecutionTime: this.executionCount > 0
|
|
277
|
-
? this.totalExecutionTime / this.executionCount
|
|
278
|
-
: 0,
|
|
279
|
-
errorRate: this.executionCount > 0 ? this.errorCount / this.executionCount : 0,
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* Unregister a server and all its tools
|
|
284
|
-
*
|
|
285
|
-
* @param serverId Server ID to unregister
|
|
286
|
-
* @returns Whether server was found and removed
|
|
287
|
-
*/
|
|
288
|
-
unregisterServer(serverId) {
|
|
289
|
-
const server = this.servers.get(serverId);
|
|
290
|
-
if (!server) {
|
|
291
|
-
return false;
|
|
292
|
-
}
|
|
293
|
-
// Remove all tools from this server
|
|
294
|
-
const toolsToRemove = [];
|
|
295
|
-
for (const [name, registration] of this.tools) {
|
|
296
|
-
if (registration.serverId === serverId) {
|
|
297
|
-
toolsToRemove.push(name);
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
for (const toolName of toolsToRemove) {
|
|
301
|
-
this.tools.delete(toolName);
|
|
302
|
-
}
|
|
303
|
-
// Remove the server
|
|
304
|
-
this.servers.delete(serverId);
|
|
305
|
-
registryLogger.debug(`Unregistered server '${serverId}' and ${toolsToRemove.length} tools`);
|
|
306
|
-
return true;
|
|
307
|
-
}
|
|
308
|
-
/**
|
|
309
|
-
* Clear all servers and tools
|
|
46
|
+
* Clear all plugins
|
|
310
47
|
*/
|
|
311
48
|
clear() {
|
|
312
|
-
this.
|
|
313
|
-
|
|
314
|
-
this.executionCount = 0;
|
|
315
|
-
this.totalExecutionTime = 0;
|
|
316
|
-
this.errorCount = 0;
|
|
317
|
-
registryLogger.debug("Cleared all servers and tools");
|
|
318
|
-
}
|
|
319
|
-
/**
|
|
320
|
-
* Create timeout promise wrapper
|
|
321
|
-
*
|
|
322
|
-
* @param promise Promise to wrap
|
|
323
|
-
* @param timeoutMs Timeout in milliseconds
|
|
324
|
-
* @param timeoutMessage Error message for timeout
|
|
325
|
-
* @returns Promise that rejects on timeout
|
|
326
|
-
*/
|
|
327
|
-
createTimeoutPromise(promise, timeoutMs, timeoutMessage) {
|
|
328
|
-
return Promise.race([
|
|
329
|
-
promise,
|
|
330
|
-
new Promise((_, reject) => {
|
|
331
|
-
setTimeout(() => reject(new Error(timeoutMessage)), timeoutMs);
|
|
332
|
-
}),
|
|
333
|
-
]);
|
|
334
|
-
}
|
|
335
|
-
/**
|
|
336
|
-
* Update execution metrics
|
|
337
|
-
*
|
|
338
|
-
* @param executionTime Execution time in milliseconds
|
|
339
|
-
* @param success Whether execution was successful
|
|
340
|
-
*/
|
|
341
|
-
updateExecutionMetrics(executionTime, success) {
|
|
342
|
-
this.executionCount++;
|
|
343
|
-
this.totalExecutionTime += executionTime;
|
|
344
|
-
if (!success) {
|
|
345
|
-
this.errorCount++;
|
|
346
|
-
}
|
|
49
|
+
this.plugins.clear();
|
|
50
|
+
registryLogger.info("Registry cleared");
|
|
347
51
|
}
|
|
348
52
|
}
|
|
349
53
|
/**
|
|
350
54
|
* Default registry instance
|
|
351
|
-
* Can be used across the application for consistent tool management
|
|
352
55
|
*/
|
|
353
|
-
export const
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
* @param server MCP server to register
|
|
358
|
-
*/
|
|
359
|
-
export async function registerServer(server) {
|
|
360
|
-
return defaultToolRegistry.registerServer(server);
|
|
361
|
-
}
|
|
362
|
-
/**
|
|
363
|
-
* Utility function to execute tool with default registry
|
|
364
|
-
*
|
|
365
|
-
* @param toolName Tool name to execute
|
|
366
|
-
* @param params Tool parameters
|
|
367
|
-
* @param context Execution context
|
|
368
|
-
* @param options Execution options
|
|
369
|
-
* @returns Tool execution result
|
|
370
|
-
*/
|
|
371
|
-
export async function executeTool(toolName, params, context, options) {
|
|
372
|
-
return defaultToolRegistry.executeTool(toolName, params, context, options);
|
|
373
|
-
}
|
|
374
|
-
/**
|
|
375
|
-
* Utility function to list tools with default registry
|
|
376
|
-
*
|
|
377
|
-
* @param criteria Search criteria
|
|
378
|
-
* @returns Array of tool information
|
|
379
|
-
*/
|
|
380
|
-
export function listTools(criteria) {
|
|
381
|
-
return defaultToolRegistry.listTools(criteria);
|
|
382
|
-
}
|
|
56
|
+
export const mcpRegistry = new MCPRegistry();
|
|
57
|
+
export const defaultToolRegistry = mcpRegistry;
|
|
58
|
+
// Additional exports for compatibility
|
|
59
|
+
export { mcpRegistry as defaultMCPRegistry };
|