@juspay/neurolink 5.1.0 → 5.2.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 (166) hide show
  1. package/CHANGELOG.md +15 -9
  2. package/README.md +123 -126
  3. package/dist/agent/direct-tools.d.ts +6 -6
  4. package/dist/cli/commands/config.d.ts +3 -3
  5. package/dist/cli/commands/mcp.js +8 -7
  6. package/dist/cli/factories/command-factory.d.ts +4 -0
  7. package/dist/cli/factories/command-factory.js +57 -3
  8. package/dist/cli/index.js +87 -140
  9. package/dist/core/base-provider.d.ts +423 -0
  10. package/dist/core/base-provider.js +365 -0
  11. package/dist/core/constants.d.ts +1 -1
  12. package/dist/core/constants.js +1 -1
  13. package/dist/core/dynamic-models.d.ts +6 -6
  14. package/dist/core/evaluation.d.ts +19 -80
  15. package/dist/core/evaluation.js +185 -484
  16. package/dist/core/factory.d.ts +3 -3
  17. package/dist/core/factory.js +31 -91
  18. package/dist/core/service-registry.d.ts +47 -0
  19. package/dist/core/service-registry.js +112 -0
  20. package/dist/core/types.d.ts +8 -1
  21. package/dist/factories/compatibility-factory.js +1 -1
  22. package/dist/factories/provider-factory.d.ts +72 -0
  23. package/dist/factories/provider-factory.js +144 -0
  24. package/dist/factories/provider-registry.d.ts +38 -0
  25. package/dist/factories/provider-registry.js +107 -0
  26. package/dist/index.d.ts +4 -3
  27. package/dist/index.js +2 -4
  28. package/dist/lib/agent/direct-tools.d.ts +6 -6
  29. package/dist/lib/core/base-provider.d.ts +423 -0
  30. package/dist/lib/core/base-provider.js +365 -0
  31. package/dist/lib/core/constants.d.ts +1 -1
  32. package/dist/lib/core/constants.js +1 -1
  33. package/dist/lib/core/dynamic-models.d.ts +6 -6
  34. package/dist/lib/core/evaluation.d.ts +19 -80
  35. package/dist/lib/core/evaluation.js +185 -484
  36. package/dist/lib/core/factory.d.ts +3 -3
  37. package/dist/lib/core/factory.js +30 -91
  38. package/dist/lib/core/service-registry.d.ts +47 -0
  39. package/dist/lib/core/service-registry.js +112 -0
  40. package/dist/lib/core/types.d.ts +8 -1
  41. package/dist/lib/factories/compatibility-factory.js +1 -1
  42. package/dist/lib/factories/provider-factory.d.ts +72 -0
  43. package/dist/lib/factories/provider-factory.js +144 -0
  44. package/dist/lib/factories/provider-registry.d.ts +38 -0
  45. package/dist/lib/factories/provider-registry.js +107 -0
  46. package/dist/lib/index.d.ts +4 -3
  47. package/dist/lib/index.js +2 -4
  48. package/dist/lib/mcp/config.js +28 -3
  49. package/dist/lib/mcp/function-calling.js +1 -1
  50. package/dist/lib/mcp/initialize-tools.d.ts +1 -1
  51. package/dist/lib/mcp/initialize-tools.js +45 -1
  52. package/dist/lib/mcp/initialize.js +16 -6
  53. package/dist/lib/mcp/servers/agent/direct-tools-server.d.ts +8 -0
  54. package/dist/lib/mcp/servers/agent/direct-tools-server.js +109 -0
  55. package/dist/lib/mcp/servers/ai-providers/ai-core-server.js +3 -1
  56. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  57. package/dist/lib/mcp/unified-registry.d.ts +4 -0
  58. package/dist/lib/mcp/unified-registry.js +42 -9
  59. package/dist/lib/neurolink.d.ts +156 -117
  60. package/dist/lib/neurolink.js +619 -404
  61. package/dist/lib/providers/amazon-bedrock.d.ts +32 -0
  62. package/dist/lib/providers/amazon-bedrock.js +143 -0
  63. package/dist/lib/providers/analytics-helper.js +7 -4
  64. package/dist/lib/providers/anthropic-baseprovider.d.ts +23 -0
  65. package/dist/lib/providers/anthropic-baseprovider.js +114 -0
  66. package/dist/lib/providers/anthropic.d.ts +19 -43
  67. package/dist/lib/providers/anthropic.js +82 -306
  68. package/dist/lib/providers/azure-openai.d.ts +20 -0
  69. package/dist/lib/providers/azure-openai.js +89 -0
  70. package/dist/lib/providers/google-ai-studio.d.ts +23 -0
  71. package/dist/lib/providers/google-ai-studio.js +107 -0
  72. package/dist/lib/providers/google-vertex.d.ts +47 -0
  73. package/dist/lib/providers/google-vertex.js +205 -0
  74. package/dist/lib/providers/huggingFace.d.ts +32 -25
  75. package/dist/lib/providers/huggingFace.js +97 -431
  76. package/dist/lib/providers/index.d.ts +9 -9
  77. package/dist/lib/providers/index.js +9 -9
  78. package/dist/lib/providers/mcp-provider.js +4 -0
  79. package/dist/lib/providers/mistral.d.ts +42 -0
  80. package/dist/lib/providers/mistral.js +160 -0
  81. package/dist/lib/providers/ollama.d.ts +52 -36
  82. package/dist/lib/providers/ollama.js +297 -520
  83. package/dist/lib/providers/openAI.d.ts +19 -18
  84. package/dist/lib/providers/openAI.js +76 -275
  85. package/dist/lib/sdk/tool-extension.d.ts +181 -0
  86. package/dist/lib/sdk/tool-extension.js +283 -0
  87. package/dist/lib/sdk/tool-registration.d.ts +95 -0
  88. package/dist/lib/sdk/tool-registration.js +167 -0
  89. package/dist/lib/types/generate-types.d.ts +1 -0
  90. package/dist/lib/types/mcp-types.d.ts +116 -0
  91. package/dist/lib/types/mcp-types.js +5 -0
  92. package/dist/lib/types/stream-types.d.ts +30 -18
  93. package/dist/lib/types/universal-provider-options.d.ts +87 -0
  94. package/dist/lib/types/universal-provider-options.js +53 -0
  95. package/dist/mcp/config.js +28 -3
  96. package/dist/mcp/function-calling.js +1 -1
  97. package/dist/mcp/initialize-tools.d.ts +1 -1
  98. package/dist/mcp/initialize-tools.js +45 -1
  99. package/dist/mcp/initialize.js +16 -6
  100. package/dist/mcp/servers/agent/direct-tools-server.d.ts +8 -0
  101. package/dist/mcp/servers/agent/direct-tools-server.js +109 -0
  102. package/dist/mcp/servers/ai-providers/ai-core-server.js +3 -1
  103. package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  104. package/dist/mcp/unified-registry.d.ts +4 -0
  105. package/dist/mcp/unified-registry.js +42 -9
  106. package/dist/neurolink.d.ts +156 -117
  107. package/dist/neurolink.js +619 -404
  108. package/dist/providers/amazon-bedrock.d.ts +32 -0
  109. package/dist/providers/amazon-bedrock.js +143 -0
  110. package/dist/providers/analytics-helper.js +7 -4
  111. package/dist/providers/anthropic-baseprovider.d.ts +23 -0
  112. package/dist/providers/anthropic-baseprovider.js +114 -0
  113. package/dist/providers/anthropic.d.ts +19 -43
  114. package/dist/providers/anthropic.js +81 -305
  115. package/dist/providers/azure-openai.d.ts +20 -0
  116. package/dist/providers/azure-openai.js +89 -0
  117. package/dist/providers/google-ai-studio.d.ts +23 -0
  118. package/dist/providers/google-ai-studio.js +108 -0
  119. package/dist/providers/google-vertex.d.ts +47 -0
  120. package/dist/providers/google-vertex.js +205 -0
  121. package/dist/providers/huggingFace.d.ts +32 -25
  122. package/dist/providers/huggingFace.js +96 -430
  123. package/dist/providers/index.d.ts +9 -9
  124. package/dist/providers/index.js +9 -9
  125. package/dist/providers/mcp-provider.js +4 -0
  126. package/dist/providers/mistral.d.ts +42 -0
  127. package/dist/providers/mistral.js +160 -0
  128. package/dist/providers/ollama.d.ts +52 -36
  129. package/dist/providers/ollama.js +297 -519
  130. package/dist/providers/openAI.d.ts +19 -18
  131. package/dist/providers/openAI.js +76 -276
  132. package/dist/sdk/tool-extension.d.ts +181 -0
  133. package/dist/sdk/tool-extension.js +283 -0
  134. package/dist/sdk/tool-registration.d.ts +95 -0
  135. package/dist/sdk/tool-registration.js +168 -0
  136. package/dist/types/generate-types.d.ts +1 -0
  137. package/dist/types/mcp-types.d.ts +116 -0
  138. package/dist/types/mcp-types.js +5 -0
  139. package/dist/types/stream-types.d.ts +30 -18
  140. package/dist/types/universal-provider-options.d.ts +87 -0
  141. package/dist/types/universal-provider-options.js +53 -0
  142. package/package.json +15 -10
  143. package/dist/lib/providers/agent-enhanced-provider.d.ts +0 -93
  144. package/dist/lib/providers/agent-enhanced-provider.js +0 -605
  145. package/dist/lib/providers/amazonBedrock.d.ts +0 -28
  146. package/dist/lib/providers/amazonBedrock.js +0 -364
  147. package/dist/lib/providers/azureOpenAI.d.ts +0 -42
  148. package/dist/lib/providers/azureOpenAI.js +0 -347
  149. package/dist/lib/providers/googleAIStudio.d.ts +0 -42
  150. package/dist/lib/providers/googleAIStudio.js +0 -364
  151. package/dist/lib/providers/googleVertexAI.d.ts +0 -34
  152. package/dist/lib/providers/googleVertexAI.js +0 -547
  153. package/dist/lib/providers/mistralAI.d.ts +0 -37
  154. package/dist/lib/providers/mistralAI.js +0 -325
  155. package/dist/providers/agent-enhanced-provider.d.ts +0 -93
  156. package/dist/providers/agent-enhanced-provider.js +0 -606
  157. package/dist/providers/amazonBedrock.d.ts +0 -28
  158. package/dist/providers/amazonBedrock.js +0 -364
  159. package/dist/providers/azureOpenAI.d.ts +0 -42
  160. package/dist/providers/azureOpenAI.js +0 -348
  161. package/dist/providers/googleAIStudio.d.ts +0 -42
  162. package/dist/providers/googleAIStudio.js +0 -364
  163. package/dist/providers/googleVertexAI.d.ts +0 -34
  164. package/dist/providers/googleVertexAI.js +0 -547
  165. package/dist/providers/mistralAI.d.ts +0 -37
  166. package/dist/providers/mistralAI.js +0 -325
@@ -0,0 +1,283 @@
1
+ /**
2
+ * NeuroLink SDK Tool Extension System
3
+ * Allows developers to register custom tools that integrate with AI providers
4
+ */
5
+ import { z } from "zod";
6
+ import { tool as createAISDKTool } from "ai";
7
+ import { zodToJsonSchema } from "zod-to-json-schema";
8
+ import { logger } from "../utils/logger.js";
9
+ /**
10
+ * Converts a custom tool to Vercel AI SDK format
11
+ */
12
+ export function convertToAISDKTool(name, customTool) {
13
+ // Convert parameters to JSON schema if needed
14
+ let parametersSchema = {};
15
+ let zodSchema;
16
+ if (customTool.parameters) {
17
+ if ("parse" in customTool.parameters && "_def" in customTool.parameters) {
18
+ // It's a Zod schema
19
+ zodSchema = customTool.parameters;
20
+ parametersSchema = zodToJsonSchema(zodSchema);
21
+ }
22
+ else {
23
+ // It's already a JSON schema - convert to Zod
24
+ parametersSchema = customTool.parameters;
25
+ zodSchema = z.object({}).passthrough(); // Allow any properties
26
+ }
27
+ }
28
+ else {
29
+ zodSchema = z.object({});
30
+ }
31
+ return createAISDKTool({
32
+ description: customTool.description,
33
+ parameters: zodSchema,
34
+ execute: async (args) => {
35
+ try {
36
+ // Apply timeout if configured
37
+ if (customTool.config?.timeout) {
38
+ return await Promise.race([
39
+ customTool.execute(args),
40
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Tool ${name} timed out`)), customTool.config.timeout)),
41
+ ]);
42
+ }
43
+ return await customTool.execute(args);
44
+ }
45
+ catch (error) {
46
+ logger.error(`Tool ${name} execution failed:`, error);
47
+ throw error;
48
+ }
49
+ },
50
+ });
51
+ }
52
+ /**
53
+ * Tool registry for managing custom tools
54
+ */
55
+ export class ToolRegistry {
56
+ tools = new Map();
57
+ middleware = [];
58
+ permissions = {};
59
+ rateLimits = new Map();
60
+ /**
61
+ * Simple rate limiting check with automatic cleanup
62
+ */
63
+ checkRateLimit(name, rateLimit) {
64
+ const now = Date.now();
65
+ // Clean up expired entries to prevent memory leaks
66
+ for (const [key, limit] of this.rateLimits.entries()) {
67
+ if (limit.resetTime <= now) {
68
+ this.rateLimits.delete(key);
69
+ }
70
+ }
71
+ const limit = this.rateLimits.get(name);
72
+ if (limit && limit.resetTime > now) {
73
+ if (limit.count >= rateLimit.requests) {
74
+ throw new Error(`Tool ${name} rate limit exceeded`);
75
+ }
76
+ limit.count++;
77
+ }
78
+ else {
79
+ this.rateLimits.set(name, {
80
+ count: 1,
81
+ resetTime: now + rateLimit.window,
82
+ });
83
+ }
84
+ }
85
+ /**
86
+ * Register a custom tool
87
+ */
88
+ register(name, tool) {
89
+ if (this.tools.has(name)) {
90
+ logger.warn(`Tool ${name} already registered, overwriting`);
91
+ }
92
+ this.tools.set(name, tool);
93
+ logger.info(`Registered custom tool: ${name}`);
94
+ }
95
+ /**
96
+ * Register multiple tools at once
97
+ */
98
+ registerMany(tools) {
99
+ Object.entries(tools).forEach(([name, tool]) => {
100
+ this.register(name, tool);
101
+ });
102
+ }
103
+ /**
104
+ * Unregister a tool
105
+ */
106
+ unregister(name) {
107
+ const result = this.tools.delete(name);
108
+ if (result) {
109
+ logger.info(`Unregistered tool: ${name}`);
110
+ }
111
+ return result;
112
+ }
113
+ /**
114
+ * Get a tool by name
115
+ */
116
+ get(name) {
117
+ return this.tools.get(name);
118
+ }
119
+ /**
120
+ * Get all registered tools
121
+ */
122
+ getAll() {
123
+ return new Map(this.tools);
124
+ }
125
+ /**
126
+ * Convert all tools to AI SDK format
127
+ */
128
+ toAISDKTools() {
129
+ const aiTools = {};
130
+ for (const [name, tool] of this.tools) {
131
+ if (this.isToolAllowed(name)) {
132
+ aiTools[name] = convertToAISDKTool(name, tool);
133
+ }
134
+ }
135
+ return aiTools;
136
+ }
137
+ /**
138
+ * Add middleware
139
+ */
140
+ use(middleware) {
141
+ this.middleware.push(middleware);
142
+ }
143
+ /**
144
+ * Set permissions
145
+ */
146
+ setPermissions(permissions) {
147
+ this.permissions = permissions;
148
+ }
149
+ /**
150
+ * Check if a tool is allowed
151
+ */
152
+ isToolAllowed(name) {
153
+ // Check denylist first
154
+ if (this.permissions.denylist?.includes(name)) {
155
+ return false;
156
+ }
157
+ // Check allowlist if specified
158
+ if (this.permissions.allowlist &&
159
+ !this.permissions.allowlist.includes(name)) {
160
+ return false;
161
+ }
162
+ return true;
163
+ }
164
+ /**
165
+ * Execute a tool with middleware
166
+ */
167
+ async execute(name, args, context) {
168
+ const tool = this.tools.get(name);
169
+ if (!tool) {
170
+ throw new Error(`Tool ${name} not found`);
171
+ }
172
+ // Check permissions
173
+ if (!this.isToolAllowed(name)) {
174
+ throw new Error(`Tool ${name} is not allowed`);
175
+ }
176
+ // Check custom validator
177
+ if (this.permissions.customValidator) {
178
+ const allowed = await this.permissions.customValidator(name, args);
179
+ if (!allowed) {
180
+ throw new Error(`Tool ${name} execution denied by custom validator`);
181
+ }
182
+ }
183
+ // Check rate limit
184
+ if (tool.config?.rateLimit) {
185
+ this.checkRateLimit(name, tool.config.rateLimit);
186
+ }
187
+ // Build middleware chain
188
+ let index = 0;
189
+ const next = async () => {
190
+ if (index < this.middleware.length) {
191
+ const middleware = this.middleware[index++];
192
+ return middleware(name, args, next, context);
193
+ }
194
+ else {
195
+ // Execute the actual tool
196
+ return tool.execute(args, context);
197
+ }
198
+ };
199
+ return next();
200
+ }
201
+ }
202
+ /**
203
+ * Create a simple tool helper
204
+ */
205
+ export function createTool(config) {
206
+ return config;
207
+ }
208
+ /**
209
+ * Create an async tool helper
210
+ */
211
+ export function createAsyncTool(config) {
212
+ return config;
213
+ }
214
+ /**
215
+ * Create a batch tool that processes multiple items
216
+ */
217
+ export function createBatchTool(config) {
218
+ return {
219
+ ...config,
220
+ execute: async ({ items }, context) => {
221
+ const batchSize = config.batchSize || 10;
222
+ const results = [];
223
+ for (let i = 0; i < items.length; i += batchSize) {
224
+ const batch = items.slice(i, i + batchSize);
225
+ const batchResults = await Promise.all(batch.map((item) => config.processItem(item, context)));
226
+ results.push(...batchResults);
227
+ }
228
+ return results;
229
+ },
230
+ };
231
+ }
232
+ /**
233
+ * Tool testing utilities
234
+ */
235
+ export const TestUtils = {
236
+ /**
237
+ * Create a mock tool context
238
+ */
239
+ mockContext(overrides) {
240
+ return {
241
+ callTool: async (name, args) => {
242
+ logger.debug(`Mock tool call: ${name}`, args);
243
+ return {};
244
+ },
245
+ session: {
246
+ id: "test-session",
247
+ userId: "test-user",
248
+ provider: "test-provider",
249
+ model: "test-model",
250
+ },
251
+ logger,
252
+ ...overrides,
253
+ };
254
+ },
255
+ /**
256
+ * Test a tool with mock data
257
+ */
258
+ async testTool(tool, testCases) {
259
+ const context = TestUtils.mockContext();
260
+ const results = [];
261
+ for (const testCase of testCases) {
262
+ try {
263
+ const result = await tool.execute(testCase.input, context);
264
+ results.push({
265
+ input: testCase.input,
266
+ output: result,
267
+ success: true,
268
+ matches: testCase.expected
269
+ ? JSON.stringify(result) === JSON.stringify(testCase.expected)
270
+ : undefined,
271
+ });
272
+ }
273
+ catch (error) {
274
+ results.push({
275
+ input: testCase.input,
276
+ error: error instanceof Error ? error.message : String(error),
277
+ success: false,
278
+ });
279
+ }
280
+ }
281
+ return results;
282
+ },
283
+ };
@@ -0,0 +1,95 @@
1
+ /**
2
+ * NeuroLink SDK Tool Registration API
3
+ * Simple interface for developers to register custom tools
4
+ */
5
+ import { z } from "zod";
6
+ import type { Tool } from "ai";
7
+ import { logger } from "../utils/logger.js";
8
+ import type { InMemoryMCPServerConfig, InMemoryToolInfo } from "../types/mcp-types.js";
9
+ /**
10
+ * Context provided to tools during execution
11
+ */
12
+ export interface ToolContext {
13
+ /**
14
+ * Current session ID
15
+ */
16
+ sessionId: string;
17
+ /**
18
+ * User ID if available
19
+ */
20
+ userId?: string;
21
+ /**
22
+ * AI provider being used
23
+ */
24
+ provider?: string;
25
+ /**
26
+ * Model being used
27
+ */
28
+ model?: string;
29
+ /**
30
+ * Call another tool
31
+ */
32
+ callTool?: (name: string, args: any) => Promise<any>;
33
+ /**
34
+ * Logger instance
35
+ */
36
+ logger: typeof logger;
37
+ }
38
+ /**
39
+ * Simple tool interface for SDK users
40
+ */
41
+ export interface SimpleTool {
42
+ /**
43
+ * Tool description that helps AI understand when to use it
44
+ */
45
+ description: string;
46
+ /**
47
+ * Parameters schema using Zod (optional)
48
+ */
49
+ parameters?: z.ZodSchema;
50
+ /**
51
+ * Tool execution function
52
+ */
53
+ execute: (args: any, context?: ToolContext) => Promise<any> | any;
54
+ /**
55
+ * Optional metadata
56
+ */
57
+ metadata?: {
58
+ category?: string;
59
+ version?: string;
60
+ author?: string;
61
+ [key: string]: any;
62
+ };
63
+ }
64
+ /**
65
+ * Converts a SimpleTool to Vercel AI SDK format
66
+ */
67
+ export declare function convertToAISDKTool(name: string, simpleTool: SimpleTool): Tool;
68
+ /**
69
+ * Converts a SimpleTool to MCP tool format
70
+ */
71
+ export declare function convertToMCPTool(simpleTool: SimpleTool): InMemoryToolInfo;
72
+ /**
73
+ * Creates an in-memory MCP server configuration from a set of tools
74
+ */
75
+ export declare function createMCPServerFromTools(serverId: string, tools: Record<string, SimpleTool>, metadata?: {
76
+ title?: string;
77
+ description?: string;
78
+ category?: string;
79
+ [key: string]: any;
80
+ }): InMemoryMCPServerConfig;
81
+ /**
82
+ * Helper to create a tool with type safety
83
+ */
84
+ export declare function createTool<TParams = any>(config: SimpleTool): SimpleTool;
85
+ /**
86
+ * Helper to create a tool with typed parameters
87
+ */
88
+ export declare function createTypedTool<TParams extends z.ZodSchema>(config: Omit<SimpleTool, "execute"> & {
89
+ parameters: TParams;
90
+ execute: (args: z.infer<TParams>, context?: ToolContext) => Promise<any> | any;
91
+ }): SimpleTool;
92
+ /**
93
+ * Validate tool configuration with detailed error messages
94
+ */
95
+ export declare function validateTool(name: string, tool: SimpleTool): void;
@@ -0,0 +1,168 @@
1
+ /**
2
+ * NeuroLink SDK Tool Registration API
3
+ * Simple interface for developers to register custom tools
4
+ */
5
+ import { z } from "zod";
6
+ import { tool as createAISDKTool } from "ai";
7
+ import { zodToJsonSchema } from "zod-to-json-schema";
8
+ import { logger } from "../utils/logger.js";
9
+ /**
10
+ * Configuration constants for tool validation
11
+ */
12
+ const envValue = parseInt(process.env.NEUROLINK_TOOL_DESCRIPTION_MAX_LENGTH || "200", 10);
13
+ const DEFAULT_DESCRIPTION_MAX_LENGTH = Number.isInteger(envValue) && envValue > 0 ? envValue : 200;
14
+ /**
15
+ * Converts a SimpleTool to Vercel AI SDK format
16
+ */
17
+ export function convertToAISDKTool(name, simpleTool) {
18
+ return createAISDKTool({
19
+ description: simpleTool.description,
20
+ parameters: simpleTool.parameters || z.object({}),
21
+ execute: async (args) => {
22
+ try {
23
+ // Create a minimal context for standalone execution
24
+ const context = {
25
+ sessionId: `tool-${name}-${Date.now()}`,
26
+ logger,
27
+ };
28
+ const result = await simpleTool.execute(args, context);
29
+ return result;
30
+ }
31
+ catch (error) {
32
+ logger.error(`Tool ${name} execution failed:`, error);
33
+ throw error;
34
+ }
35
+ },
36
+ });
37
+ }
38
+ /**
39
+ * Converts a SimpleTool to MCP tool format
40
+ */
41
+ export function convertToMCPTool(simpleTool) {
42
+ return {
43
+ description: simpleTool.description,
44
+ execute: async (params) => {
45
+ try {
46
+ const result = await simpleTool.execute(params);
47
+ return {
48
+ success: true,
49
+ data: result,
50
+ };
51
+ }
52
+ catch (error) {
53
+ const errorMessage = error instanceof Error ? error.message : String(error);
54
+ logger.error("MCP tool execution failed:", error);
55
+ return {
56
+ success: false,
57
+ error: errorMessage,
58
+ };
59
+ }
60
+ },
61
+ inputSchema: simpleTool.parameters,
62
+ isImplemented: true,
63
+ metadata: simpleTool.metadata,
64
+ };
65
+ }
66
+ /**
67
+ * Creates an in-memory MCP server configuration from a set of tools
68
+ */
69
+ export function createMCPServerFromTools(serverId, tools, metadata) {
70
+ const mcpTools = {};
71
+ for (const [name, tool] of Object.entries(tools)) {
72
+ mcpTools[name] = convertToMCPTool(tool);
73
+ }
74
+ return {
75
+ server: {
76
+ title: metadata?.title || serverId,
77
+ description: metadata?.description,
78
+ tools: mcpTools,
79
+ },
80
+ category: metadata?.category,
81
+ metadata: metadata || {},
82
+ };
83
+ }
84
+ /**
85
+ * Helper to create a tool with type safety
86
+ */
87
+ export function createTool(config) {
88
+ return config;
89
+ }
90
+ /**
91
+ * Helper to create a tool with typed parameters
92
+ */
93
+ export function createTypedTool(config) {
94
+ return config;
95
+ }
96
+ /**
97
+ * Validate tool description length
98
+ */
99
+ function validateDescriptionLength(name, description) {
100
+ const maxDescriptionLength = Number.isInteger(DEFAULT_DESCRIPTION_MAX_LENGTH) &&
101
+ DEFAULT_DESCRIPTION_MAX_LENGTH > 0
102
+ ? DEFAULT_DESCRIPTION_MAX_LENGTH
103
+ : 200;
104
+ if (description.length > maxDescriptionLength) {
105
+ throw new Error(`Tool '${name}' description should be concise (max ${maxDescriptionLength} characters). ` +
106
+ `Current length: ${description.length}. ` +
107
+ `Consider shortening: "${description.substring(0, 50)}..."`);
108
+ }
109
+ }
110
+ /**
111
+ * Validate tool configuration with detailed error messages
112
+ */
113
+ export function validateTool(name, tool) {
114
+ // Validate tool name
115
+ if (!name || typeof name !== "string" || name.trim() === "") {
116
+ throw new Error(`Invalid tool name: must be a non-empty string. Received: ${name}`);
117
+ }
118
+ // Validate tool name format (alphanumeric, hyphens, underscores only)
119
+ const validNamePattern = /^[a-zA-Z0-9_-]+$/;
120
+ if (!validNamePattern.test(name)) {
121
+ throw new Error(`Invalid tool name format: '${name}'. Tool names must contain only alphanumeric characters, hyphens, and underscores. ` +
122
+ `Examples: 'calculate-tax', 'get_weather', 'sendEmail123'`);
123
+ }
124
+ // Validate tool object
125
+ if (!tool || typeof tool !== "object") {
126
+ throw new Error(`Tool '${name}' must be an object with description and execute properties. Received: ${typeof tool}`);
127
+ }
128
+ // Validate description
129
+ if (!tool.description ||
130
+ typeof tool.description !== "string" ||
131
+ tool.description.trim() === "") {
132
+ throw new Error(`Tool '${name}' must have a non-empty description string. ` +
133
+ `Example: { description: "Calculates mathematical expressions", execute: async (params) => {...} }`);
134
+ }
135
+ // Validate execute function with signature guidance
136
+ if (typeof tool.execute !== "function") {
137
+ throw new Error(`Tool '${name}' must have an execute function. ` +
138
+ `Expected signature: async (params?: any) => Promise<any>. ` +
139
+ `Received: ${typeof tool.execute}. ` +
140
+ `Example: { execute: async (params) => { return { success: true, data: result }; } }`);
141
+ }
142
+ // Validate parameters schema if provided - support both Zod and custom schemas
143
+ if (tool.parameters) {
144
+ if (typeof tool.parameters !== "object") {
145
+ throw new Error(`Tool '${name}' parameters must be an object. ` +
146
+ `Received: ${typeof tool.parameters}`);
147
+ }
148
+ // Check for common schema validation methods (Zod uses 'parse', others might use 'validate')
149
+ const params = tool.parameters;
150
+ const hasValidationMethod = typeof params.parse === "function" ||
151
+ typeof params.validate === "function" ||
152
+ "_def" in params; // Zod schemas have _def property
153
+ if (!hasValidationMethod) {
154
+ const errorMessage = typeof params.parse === "function" || "_def" in params
155
+ ? `Tool '${name}' has a Zod-like schema but validation failed. Ensure it's a valid Zod schema: z.object({ ... })`
156
+ : typeof params.validate === "function"
157
+ ? `Tool '${name}' has a validate method but it may not be callable. Ensure: { parameters: { validate: (data) => { ... } } }`
158
+ : `Tool '${name}' parameters must be a schema object with validation. ` +
159
+ `Supported formats:\n` +
160
+ `• Zod schema: { parameters: z.object({ value: z.string() }) }\n` +
161
+ `• Custom schema: { parameters: { validate: (data) => { ... } } }\n` +
162
+ `• Custom schema: { parameters: { parse: (data) => { ... } } }`;
163
+ throw new Error(errorMessage);
164
+ }
165
+ }
166
+ // Validate description length for better UX
167
+ validateDescriptionLength(name, tool.description);
168
+ }
@@ -53,6 +53,7 @@ export interface GenerateResult {
53
53
  toolName: string;
54
54
  args: Record<string, any>;
55
55
  }>;
56
+ toolResults?: any[];
56
57
  toolsUsed?: string[];
57
58
  toolExecutions?: Array<{
58
59
  name: string;
@@ -0,0 +1,116 @@
1
+ /**
2
+ * MCP Types for In-Memory Server Support
3
+ * Enables Lighthouse and other integrations to register tools directly
4
+ */
5
+ /**
6
+ * In-memory MCP server configuration
7
+ */
8
+ export interface InMemoryMCPServerConfig {
9
+ /**
10
+ * The actual server instance with tools
11
+ */
12
+ server: {
13
+ /**
14
+ * Server title for display
15
+ */
16
+ title?: string;
17
+ /**
18
+ * Map of tool name to tool implementation
19
+ */
20
+ tools: Map<string, InMemoryToolInfo> | Record<string, InMemoryToolInfo>;
21
+ /**
22
+ * Optional server description
23
+ */
24
+ description?: string;
25
+ };
26
+ /**
27
+ * Category for grouping tools
28
+ */
29
+ category?: string;
30
+ /**
31
+ * Metadata about the server
32
+ */
33
+ metadata?: {
34
+ provider?: string;
35
+ version?: string;
36
+ author?: string;
37
+ [key: string]: any;
38
+ };
39
+ }
40
+ /**
41
+ * In-memory tool information
42
+ */
43
+ export interface InMemoryToolInfo {
44
+ /**
45
+ * Tool description
46
+ */
47
+ description: string;
48
+ /**
49
+ * Tool execution function
50
+ */
51
+ execute: (params: any) => Promise<InMemoryToolResult> | InMemoryToolResult;
52
+ /**
53
+ * Input parameter schema (Zod or JSON Schema)
54
+ */
55
+ inputSchema?: any;
56
+ /**
57
+ * Whether the tool is implemented (default: true)
58
+ */
59
+ isImplemented?: boolean;
60
+ /**
61
+ * Optional metadata
62
+ */
63
+ metadata?: Record<string, any>;
64
+ }
65
+ /**
66
+ * Result from in-memory tool execution
67
+ */
68
+ export interface InMemoryToolResult {
69
+ /**
70
+ * Whether execution was successful
71
+ */
72
+ success: boolean;
73
+ /**
74
+ * Result data if successful
75
+ */
76
+ data?: any;
77
+ /**
78
+ * Error message if failed
79
+ */
80
+ error?: string;
81
+ /**
82
+ * Optional metadata about execution
83
+ */
84
+ metadata?: {
85
+ executionTime?: number;
86
+ toolName?: string;
87
+ serverId?: string;
88
+ [key: string]: any;
89
+ };
90
+ }
91
+ /**
92
+ * Unified MCP Registry interface
93
+ */
94
+ export interface UnifiedMCPRegistry {
95
+ /**
96
+ * Register an in-memory server
97
+ */
98
+ registerInMemoryServer(serverId: string, config: InMemoryMCPServerConfig): Promise<void>;
99
+ /**
100
+ * Get all available tools
101
+ */
102
+ getAllTools(): Promise<Array<{
103
+ name: string;
104
+ serverId: string;
105
+ description: string;
106
+ isExternal: boolean;
107
+ }>>;
108
+ /**
109
+ * Execute a tool
110
+ */
111
+ executeTool(toolName: string, params: any, context: any): Promise<any>;
112
+ /**
113
+ * Check if connected to a server
114
+ */
115
+ isConnected(serverId: string): boolean;
116
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * MCP Types for In-Memory Server Support
3
+ * Enables Lighthouse and other integrations to register tools directly
4
+ */
5
+ export {};