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.
- package/LICENSE +21 -0
- package/README.md +118 -0
- package/dist/credentials/McpServerApi.credentials.d.ts +14 -0
- package/dist/credentials/McpServerApi.credentials.d.ts.map +1 -0
- package/dist/credentials/McpServerApi.credentials.js +38 -0
- package/dist/credentials/McpServerApi.credentials.js.map +1 -0
- package/dist/credentials/index.d.ts +2 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +6 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/nodes/McpToolsProvider/McpToolsProvider.node.d.ts +26 -0
- package/dist/nodes/McpToolsProvider/McpToolsProvider.node.d.ts.map +1 -0
- package/dist/nodes/McpToolsProvider/McpToolsProvider.node.js +536 -0
- package/dist/nodes/McpToolsProvider/McpToolsProvider.node.js.map +1 -0
- package/dist/nodes/McpToolsProvider/mcp.svg +7 -0
- package/dist/types.d.ts +71 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +18 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/schemaConverter.d.ts +83 -0
- package/dist/utils/schemaConverter.d.ts.map +1 -0
- package/dist/utils/schemaConverter.js +203 -0
- package/dist/utils/schemaConverter.js.map +1 -0
- package/dist/utils/toolsCache.d.ts +57 -0
- package/dist/utils/toolsCache.d.ts.map +1 -0
- package/dist/utils/toolsCache.js +262 -0
- package/dist/utils/toolsCache.js.map +1 -0
- 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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"}
|