n8n-nodes-mcp-local 0.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 (36) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +118 -0
  3. package/dist/credentials/McpServerApi.credentials.d.ts +14 -0
  4. package/dist/credentials/McpServerApi.credentials.d.ts.map +1 -0
  5. package/dist/credentials/McpServerApi.credentials.js +38 -0
  6. package/dist/credentials/McpServerApi.credentials.js.map +1 -0
  7. package/dist/credentials/index.d.ts +2 -0
  8. package/dist/credentials/index.d.ts.map +1 -0
  9. package/dist/credentials/index.js +6 -0
  10. package/dist/credentials/index.js.map +1 -0
  11. package/dist/index.d.ts +3 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +21 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/nodes/McpToolsProvider/McpToolsProvider.node.d.ts +26 -0
  16. package/dist/nodes/McpToolsProvider/McpToolsProvider.node.d.ts.map +1 -0
  17. package/dist/nodes/McpToolsProvider/McpToolsProvider.node.js +536 -0
  18. package/dist/nodes/McpToolsProvider/McpToolsProvider.node.js.map +1 -0
  19. package/dist/nodes/McpToolsProvider/mcp.svg +7 -0
  20. package/dist/types.d.ts +71 -0
  21. package/dist/types.d.ts.map +1 -0
  22. package/dist/types.js +8 -0
  23. package/dist/types.js.map +1 -0
  24. package/dist/utils/index.d.ts +2 -0
  25. package/dist/utils/index.d.ts.map +1 -0
  26. package/dist/utils/index.js +18 -0
  27. package/dist/utils/index.js.map +1 -0
  28. package/dist/utils/schemaConverter.d.ts +83 -0
  29. package/dist/utils/schemaConverter.d.ts.map +1 -0
  30. package/dist/utils/schemaConverter.js +203 -0
  31. package/dist/utils/schemaConverter.js.map +1 -0
  32. package/dist/utils/toolsCache.d.ts +57 -0
  33. package/dist/utils/toolsCache.d.ts.map +1 -0
  34. package/dist/utils/toolsCache.js +262 -0
  35. package/dist/utils/toolsCache.js.map +1 -0
  36. package/package.json +80 -0
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./schemaConverter.js"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * JSON Schema to Zod Converter
3
+ *
4
+ * Converts MCP Tool Input Schemas (JSON Schema) to Zod schemas
5
+ * for use with LangChain DynamicStructuredTool.
6
+ *
7
+ * @module schemaConverter
8
+ */
9
+ import { z, ZodTypeAny } from 'zod';
10
+ /**
11
+ * JSON Schema type definition for MCP tool input schemas.
12
+ * Supports common JSON Schema properties used by MCP servers.
13
+ */
14
+ export interface JsonSchema {
15
+ /** The data type (string, number, integer, boolean, array, object, null) */
16
+ type?: string;
17
+ /** Properties for object types */
18
+ properties?: Record<string, JsonSchema>;
19
+ /** Array of required property names */
20
+ required?: string[];
21
+ /** Schema for array items */
22
+ items?: JsonSchema;
23
+ /** Allowed enum values */
24
+ enum?: string[];
25
+ /** Human-readable description */
26
+ description?: string;
27
+ /** Default value */
28
+ default?: unknown;
29
+ /** Minimum value for numbers */
30
+ minimum?: number;
31
+ /** Maximum value for numbers */
32
+ maximum?: number;
33
+ /** Minimum string length */
34
+ minLength?: number;
35
+ /** Maximum string length */
36
+ maxLength?: number;
37
+ /** Regex pattern for strings */
38
+ pattern?: string;
39
+ /** String format (email, uri, uuid, etc.) */
40
+ format?: string;
41
+ /** Union type: exactly one schema must match */
42
+ oneOf?: JsonSchema[];
43
+ /** Union type: at least one schema must match */
44
+ anyOf?: JsonSchema[];
45
+ /** Intersection type: all schemas must match */
46
+ allOf?: JsonSchema[];
47
+ }
48
+ /**
49
+ * Creates a Zod schema from a JSON Schema definition.
50
+ *
51
+ * This function converts MCP tool input schemas to Zod schemas
52
+ * for validation with LangChain DynamicStructuredTool.
53
+ *
54
+ * @param schema - The JSON Schema object from MCP tool definition
55
+ * @returns Zod object schema for validation
56
+ *
57
+ * @example
58
+ * const zodSchema = createToolSchema({
59
+ * type: 'object',
60
+ * properties: {
61
+ * name: { type: 'string', description: 'User name' },
62
+ * age: { type: 'integer', minimum: 0 }
63
+ * },
64
+ * required: ['name']
65
+ * });
66
+ */
67
+ export declare function createToolSchema(schema: JsonSchema | Record<string, unknown> | undefined): z.ZodObject<Record<string, ZodTypeAny>>;
68
+ /**
69
+ * Sanitizes a tool name for LangChain compatibility.
70
+ *
71
+ * LangChain requires tool names to match the pattern: ^[a-zA-Z0-9_-]+$
72
+ * This function replaces any invalid characters with underscores.
73
+ *
74
+ * @param name - The original tool name from the MCP server
75
+ * @param prefix - Optional prefix to add to the tool name
76
+ * @returns Sanitized tool name safe for LangChain
77
+ *
78
+ * @example
79
+ * sanitizeToolName('get-user.data') // Returns 'get-user_data'
80
+ * sanitizeToolName('create', 'mcp_') // Returns 'mcp_create'
81
+ */
82
+ export declare function sanitizeToolName(name: string, prefix?: string): string;
83
+ //# sourceMappingURL=schemaConverter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaConverter.d.ts","sourceRoot":"","sources":["../../src/utils/schemaConverter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAEpC;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,6BAA6B;IAC7B,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,0BAA0B;IAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,iDAAiD;IACjD,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,gDAAgD;IAChD,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CA+BlI;AAoJD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAGtE"}
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ /**
3
+ * JSON Schema to Zod Converter
4
+ *
5
+ * Converts MCP Tool Input Schemas (JSON Schema) to Zod schemas
6
+ * for use with LangChain DynamicStructuredTool.
7
+ *
8
+ * @module schemaConverter
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.createToolSchema = createToolSchema;
12
+ exports.sanitizeToolName = sanitizeToolName;
13
+ const zod_1 = require("zod");
14
+ /**
15
+ * Creates a Zod schema from a JSON Schema definition.
16
+ *
17
+ * This function converts MCP tool input schemas to Zod schemas
18
+ * for validation with LangChain DynamicStructuredTool.
19
+ *
20
+ * @param schema - The JSON Schema object from MCP tool definition
21
+ * @returns Zod object schema for validation
22
+ *
23
+ * @example
24
+ * const zodSchema = createToolSchema({
25
+ * type: 'object',
26
+ * properties: {
27
+ * name: { type: 'string', description: 'User name' },
28
+ * age: { type: 'integer', minimum: 0 }
29
+ * },
30
+ * required: ['name']
31
+ * });
32
+ */
33
+ function createToolSchema(schema) {
34
+ if (!schema || !schema.properties) {
35
+ return zod_1.z.object({}).passthrough();
36
+ }
37
+ const jsonSchema = schema;
38
+ const shape = {};
39
+ const required = Array.isArray(jsonSchema.required) ? jsonSchema.required : [];
40
+ for (const [key, prop] of Object.entries(jsonSchema.properties)) {
41
+ let zodType = jsonSchemaTypeToZod(prop);
42
+ // Description hinzufügen
43
+ if (prop.description) {
44
+ zodType = zodType.describe(prop.description);
45
+ }
46
+ // Optional machen wenn nicht required
47
+ if (!required.includes(key)) {
48
+ zodType = zodType.optional();
49
+ }
50
+ // Default-Wert setzen
51
+ if (prop.default !== undefined) {
52
+ zodType = zodType.default(prop.default);
53
+ }
54
+ shape[key] = zodType;
55
+ }
56
+ return zod_1.z.object(shape);
57
+ }
58
+ /**
59
+ * Konvertiert einen einzelnen JSON Schema Typ zu Zod
60
+ */
61
+ function jsonSchemaTypeToZod(schema) {
62
+ // Handle union types (oneOf, anyOf)
63
+ if (schema.oneOf || schema.anyOf) {
64
+ const schemas = schema.oneOf || schema.anyOf || [];
65
+ if (schemas.length === 0)
66
+ return zod_1.z.any();
67
+ if (schemas.length === 1)
68
+ return jsonSchemaTypeToZod(schemas[0]);
69
+ const zodSchemas = schemas.map(s => jsonSchemaTypeToZod(s));
70
+ return zod_1.z.union([zodSchemas[0], zodSchemas[1], ...zodSchemas.slice(2)]);
71
+ }
72
+ // Handle allOf (intersection)
73
+ if (schema.allOf) {
74
+ // Vereinfacht: Merge alle properties
75
+ const mergedProps = {};
76
+ const mergedRequired = [];
77
+ for (const s of schema.allOf) {
78
+ if (s.properties) {
79
+ Object.assign(mergedProps, s.properties);
80
+ }
81
+ if (s.required) {
82
+ mergedRequired.push(...s.required);
83
+ }
84
+ }
85
+ return createToolSchema({
86
+ type: 'object',
87
+ properties: mergedProps,
88
+ required: [...new Set(mergedRequired)],
89
+ });
90
+ }
91
+ switch (schema.type) {
92
+ case 'string':
93
+ return createStringSchema(schema);
94
+ case 'number':
95
+ case 'integer':
96
+ return createNumberSchema(schema);
97
+ case 'boolean':
98
+ return zod_1.z.boolean();
99
+ case 'array':
100
+ return createArraySchema(schema);
101
+ case 'object':
102
+ if (schema.properties) {
103
+ return createToolSchema(schema);
104
+ }
105
+ return zod_1.z.record(zod_1.z.any());
106
+ case 'null':
107
+ return zod_1.z.null();
108
+ default:
109
+ // Kein Type angegeben - versuche aus anderen Hinweisen abzuleiten
110
+ if (schema.properties) {
111
+ return createToolSchema(schema);
112
+ }
113
+ if (schema.enum) {
114
+ return zod_1.z.enum(schema.enum);
115
+ }
116
+ return zod_1.z.any();
117
+ }
118
+ }
119
+ /**
120
+ * Erstellt ein String Zod Schema mit Validierungen
121
+ */
122
+ function createStringSchema(schema) {
123
+ // Enum
124
+ if (schema.enum && schema.enum.length > 0) {
125
+ return zod_1.z.enum(schema.enum);
126
+ }
127
+ let zodString = zod_1.z.string();
128
+ // Length constraints
129
+ if (schema.minLength !== undefined) {
130
+ zodString = zodString.min(schema.minLength);
131
+ }
132
+ if (schema.maxLength !== undefined) {
133
+ zodString = zodString.max(schema.maxLength);
134
+ }
135
+ // Pattern
136
+ if (schema.pattern) {
137
+ try {
138
+ zodString = zodString.regex(new RegExp(schema.pattern));
139
+ }
140
+ catch {
141
+ // Invalid regex, ignorieren
142
+ }
143
+ }
144
+ // Format - nur einfache Validierungen, komplexe überspringen
145
+ if (schema.format) {
146
+ switch (schema.format) {
147
+ case 'email':
148
+ zodString = zodString.email();
149
+ break;
150
+ case 'uri':
151
+ case 'url':
152
+ zodString = zodString.url();
153
+ break;
154
+ case 'uuid':
155
+ zodString = zodString.uuid();
156
+ break;
157
+ // date/date-time: Keine spezielle Validierung, normaler String reicht
158
+ // Andere Formate ignorieren
159
+ }
160
+ }
161
+ return zodString;
162
+ }
163
+ /**
164
+ * Erstellt ein Number Zod Schema mit Validierungen
165
+ */
166
+ function createNumberSchema(schema) {
167
+ let zodNumber = schema.type === 'integer' ? zod_1.z.number().int() : zod_1.z.number();
168
+ if (schema.minimum !== undefined) {
169
+ zodNumber = zodNumber.min(schema.minimum);
170
+ }
171
+ if (schema.maximum !== undefined) {
172
+ zodNumber = zodNumber.max(schema.maximum);
173
+ }
174
+ return zodNumber;
175
+ }
176
+ /**
177
+ * Erstellt ein Array Zod Schema
178
+ */
179
+ function createArraySchema(schema) {
180
+ if (schema.items) {
181
+ return zod_1.z.array(jsonSchemaTypeToZod(schema.items));
182
+ }
183
+ return zod_1.z.array(zod_1.z.any());
184
+ }
185
+ /**
186
+ * Sanitizes a tool name for LangChain compatibility.
187
+ *
188
+ * LangChain requires tool names to match the pattern: ^[a-zA-Z0-9_-]+$
189
+ * This function replaces any invalid characters with underscores.
190
+ *
191
+ * @param name - The original tool name from the MCP server
192
+ * @param prefix - Optional prefix to add to the tool name
193
+ * @returns Sanitized tool name safe for LangChain
194
+ *
195
+ * @example
196
+ * sanitizeToolName('get-user.data') // Returns 'get-user_data'
197
+ * sanitizeToolName('create', 'mcp_') // Returns 'mcp_create'
198
+ */
199
+ function sanitizeToolName(name, prefix) {
200
+ const prefixed = prefix ? `${prefix}${name}` : name;
201
+ return prefixed.replace(/[^a-zA-Z0-9_-]/g, '_');
202
+ }
203
+ //# sourceMappingURL=schemaConverter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaConverter.js","sourceRoot":"","sources":["../../src/utils/schemaConverter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * MCP Tools Cache
3
+ *
4
+ * File-based caching for MCP tool listings.
5
+ * Tools are cached after credential test to enable instant dropdown loading.
6
+ */
7
+ export interface McpToolInfo {
8
+ name: string;
9
+ description: string;
10
+ inputSchema: unknown;
11
+ }
12
+ export interface CachedTools {
13
+ mcpPackage: string;
14
+ envVarsHash: string;
15
+ tools: McpToolInfo[];
16
+ timestamp: number;
17
+ }
18
+ /**
19
+ * Get cached tools if available and not expired
20
+ */
21
+ export declare function getCachedTools(mcpPackage: string, envVars?: string): McpToolInfo[] | null;
22
+ /**
23
+ * Save tools to cache
24
+ */
25
+ export declare function setCachedTools(mcpPackage: string, envVars: string | undefined, tools: McpToolInfo[]): void;
26
+ /**
27
+ * Clear cache for specific MCP package
28
+ */
29
+ export declare function clearCache(mcpPackage: string, envVars?: string): void;
30
+ /**
31
+ * Clear all cached tools
32
+ */
33
+ export declare function clearAllCache(): void;
34
+ /**
35
+ * Parse environment variables string into object
36
+ */
37
+ export declare function parseEnvVars(envString: string | undefined): Record<string, string>;
38
+ /**
39
+ * Fetch tools from MCP server and cache them
40
+ * Used by credential test and as fallback for dropdown loading
41
+ */
42
+ export declare function fetchAndCacheTools(mcpPackage: string, envVars?: string): Promise<McpToolInfo[]>;
43
+ /**
44
+ * Get tools - from cache if available, otherwise fetch and cache
45
+ */
46
+ export declare function getTools(mcpPackage: string, envVars?: string): Promise<McpToolInfo[]>;
47
+ /**
48
+ * Filter tools based on selection mode
49
+ */
50
+ export declare function filterTools<T extends {
51
+ name: string;
52
+ }>(tools: T[], options: {
53
+ mode: string;
54
+ includeTools: string[];
55
+ excludeTools: string[];
56
+ }): T[];
57
+ //# sourceMappingURL=toolsCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolsCache.d.ts","sourceRoot":"","sources":["../../src/utils/toolsCache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkBH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AA2BD;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,IAAI,CA2BzF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI,CAkB1G;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CASrE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAapC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAalF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAuDrG;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAS3F;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACpD,KAAK,EAAE,CAAC,EAAE,EACV,OAAO,EAAE;IACP,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,GACA,CAAC,EAAE,CAoBL"}
@@ -0,0 +1,262 @@
1
+ "use strict";
2
+ /**
3
+ * MCP Tools Cache
4
+ *
5
+ * File-based caching for MCP tool listings.
6
+ * Tools are cached after credential test to enable instant dropdown loading.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.getCachedTools = getCachedTools;
43
+ exports.setCachedTools = setCachedTools;
44
+ exports.clearCache = clearCache;
45
+ exports.clearAllCache = clearAllCache;
46
+ exports.parseEnvVars = parseEnvVars;
47
+ exports.fetchAndCacheTools = fetchAndCacheTools;
48
+ exports.getTools = getTools;
49
+ exports.filterTools = filterTools;
50
+ const fs = __importStar(require("fs"));
51
+ const path = __importStar(require("path"));
52
+ const crypto = __importStar(require("crypto"));
53
+ const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
54
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/client/stdio.js");
55
+ // Cache directory - uses n8n's data directory
56
+ const CACHE_DIR = path.join(process.env.N8N_USER_FOLDER || '/home/node/.n8n', 'mcp-tools-cache');
57
+ // Cache TTL: 24 hours (tools rarely change)
58
+ const CACHE_TTL = 24 * 60 * 60 * 1000;
59
+ // Connection timeout for MCP server
60
+ const CONNECTION_TIMEOUT = 30000;
61
+ /**
62
+ * Generate cache key from MCP package name and env vars
63
+ */
64
+ function getCacheKey(mcpPackage, envVars) {
65
+ const data = `${mcpPackage}:${envVars || ''}`;
66
+ return crypto.createHash('md5').update(data).digest('hex');
67
+ }
68
+ /**
69
+ * Get cache file path for given parameters
70
+ */
71
+ function getCachePath(mcpPackage, envVars) {
72
+ const key = getCacheKey(mcpPackage, envVars);
73
+ return path.join(CACHE_DIR, `${key}.json`);
74
+ }
75
+ /**
76
+ * Ensure cache directory exists
77
+ */
78
+ function ensureCacheDir() {
79
+ if (!fs.existsSync(CACHE_DIR)) {
80
+ fs.mkdirSync(CACHE_DIR, { recursive: true });
81
+ }
82
+ }
83
+ /**
84
+ * Get cached tools if available and not expired
85
+ */
86
+ function getCachedTools(mcpPackage, envVars) {
87
+ try {
88
+ const cachePath = getCachePath(mcpPackage, envVars);
89
+ if (!fs.existsSync(cachePath)) {
90
+ return null;
91
+ }
92
+ const data = fs.readFileSync(cachePath, 'utf-8');
93
+ const cached = JSON.parse(data);
94
+ // Check TTL
95
+ const age = Date.now() - cached.timestamp;
96
+ if (age > CACHE_TTL) {
97
+ // Cache expired, delete it
98
+ try {
99
+ fs.unlinkSync(cachePath);
100
+ }
101
+ catch {
102
+ // Ignore deletion errors
103
+ }
104
+ return null;
105
+ }
106
+ return cached.tools;
107
+ }
108
+ catch {
109
+ return null;
110
+ }
111
+ }
112
+ /**
113
+ * Save tools to cache
114
+ */
115
+ function setCachedTools(mcpPackage, envVars, tools) {
116
+ try {
117
+ ensureCacheDir();
118
+ const cachePath = getCachePath(mcpPackage, envVars);
119
+ const envVarsHash = crypto.createHash('md5').update(envVars || '').digest('hex');
120
+ const cached = {
121
+ mcpPackage,
122
+ envVarsHash,
123
+ tools,
124
+ timestamp: Date.now(),
125
+ };
126
+ fs.writeFileSync(cachePath, JSON.stringify(cached, null, 2));
127
+ }
128
+ catch {
129
+ // Ignore cache write errors - caching is optional
130
+ }
131
+ }
132
+ /**
133
+ * Clear cache for specific MCP package
134
+ */
135
+ function clearCache(mcpPackage, envVars) {
136
+ try {
137
+ const cachePath = getCachePath(mcpPackage, envVars);
138
+ if (fs.existsSync(cachePath)) {
139
+ fs.unlinkSync(cachePath);
140
+ }
141
+ }
142
+ catch {
143
+ // Ignore deletion errors
144
+ }
145
+ }
146
+ /**
147
+ * Clear all cached tools
148
+ */
149
+ function clearAllCache() {
150
+ try {
151
+ if (fs.existsSync(CACHE_DIR)) {
152
+ const files = fs.readdirSync(CACHE_DIR);
153
+ for (const file of files) {
154
+ if (file.endsWith('.json')) {
155
+ fs.unlinkSync(path.join(CACHE_DIR, file));
156
+ }
157
+ }
158
+ }
159
+ }
160
+ catch {
161
+ // Ignore errors
162
+ }
163
+ }
164
+ /**
165
+ * Parse environment variables string into object
166
+ */
167
+ function parseEnvVars(envString) {
168
+ const env = { ...process.env };
169
+ if (envString) {
170
+ for (const pair of envString.split(',')) {
171
+ const [key, ...valueParts] = pair.split('=');
172
+ if (key && key.trim()) {
173
+ env[key.trim()] = valueParts.join('=').trim();
174
+ }
175
+ }
176
+ }
177
+ return env;
178
+ }
179
+ /**
180
+ * Fetch tools from MCP server and cache them
181
+ * Used by credential test and as fallback for dropdown loading
182
+ */
183
+ async function fetchAndCacheTools(mcpPackage, envVars) {
184
+ const command = 'npx';
185
+ const args = ['-y', mcpPackage];
186
+ const env = parseEnvVars(envVars);
187
+ let transport;
188
+ try {
189
+ transport = new stdio_js_1.StdioClientTransport({
190
+ command,
191
+ args,
192
+ env,
193
+ });
194
+ }
195
+ catch (error) {
196
+ throw new Error(`Failed to create STDIO transport: ${error.message}`);
197
+ }
198
+ const client = new index_js_1.Client({ name: 'n8n-mcp-tools-cache', version: '1.0.0' }, { capabilities: {} });
199
+ try {
200
+ // Connect with timeout
201
+ await Promise.race([
202
+ client.connect(transport),
203
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Connection timeout after ${CONNECTION_TIMEOUT}ms`)), CONNECTION_TIMEOUT)),
204
+ ]);
205
+ // List tools
206
+ const { tools: mcpTools } = await client.listTools();
207
+ if (!mcpTools || mcpTools.length === 0) {
208
+ throw new Error('MCP Server returned no tools');
209
+ }
210
+ // Map to our format
211
+ const tools = mcpTools.map((tool) => ({
212
+ name: tool.name,
213
+ description: tool.description || `MCP Tool: ${tool.name}`,
214
+ inputSchema: tool.inputSchema,
215
+ }));
216
+ // Cache the tools
217
+ setCachedTools(mcpPackage, envVars, tools);
218
+ return tools;
219
+ }
220
+ finally {
221
+ try {
222
+ await client.close();
223
+ }
224
+ catch {
225
+ // Ignore close errors
226
+ }
227
+ }
228
+ }
229
+ /**
230
+ * Get tools - from cache if available, otherwise fetch and cache
231
+ */
232
+ async function getTools(mcpPackage, envVars) {
233
+ // Try cache first
234
+ const cached = getCachedTools(mcpPackage, envVars);
235
+ if (cached) {
236
+ return cached;
237
+ }
238
+ // Fallback: fetch and cache
239
+ return fetchAndCacheTools(mcpPackage, envVars);
240
+ }
241
+ /**
242
+ * Filter tools based on selection mode
243
+ */
244
+ function filterTools(tools, options) {
245
+ const { mode, includeTools, excludeTools } = options;
246
+ switch (mode) {
247
+ case 'selected':
248
+ if (!includeTools || includeTools.length === 0) {
249
+ return tools; // No selection means all
250
+ }
251
+ return tools.filter((t) => includeTools.includes(t.name));
252
+ case 'except':
253
+ if (!excludeTools || excludeTools.length === 0) {
254
+ return tools; // No exclusion means all
255
+ }
256
+ return tools.filter((t) => !excludeTools.includes(t.name));
257
+ case 'all':
258
+ default:
259
+ return tools;
260
+ }
261
+ }
262
+ //# sourceMappingURL=toolsCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolsCache.js","sourceRoot":"","sources":["../../src/utils/toolsCache.ts"],"names":[],"mappings":"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"}