n8n-mcp 2.10.2 → 2.10.4
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/README.md +7 -7
- package/data/nodes.db +0 -0
- package/dist/database/node-repository.d.ts.map +1 -1
- package/dist/database/node-repository.js +10 -5
- package/dist/database/node-repository.js.map +1 -1
- package/dist/mappers/docs-mapper.d.ts +1 -0
- package/dist/mappers/docs-mapper.d.ts.map +1 -1
- package/dist/mappers/docs-mapper.js +48 -1
- package/dist/mappers/docs-mapper.js.map +1 -1
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +129 -12
- package/dist/mcp/server.js.map +1 -1
- package/dist/parsers/node-parser.d.ts +4 -0
- package/dist/parsers/node-parser.d.ts.map +1 -1
- package/dist/parsers/node-parser.js +43 -1
- package/dist/parsers/node-parser.js.map +1 -1
- package/dist/services/enhanced-config-validator.d.ts.map +1 -1
- package/dist/services/enhanced-config-validator.js +18 -0
- package/dist/services/enhanced-config-validator.js.map +1 -1
- package/dist/services/workflow-validator.d.ts +5 -0
- package/dist/services/workflow-validator.d.ts.map +1 -1
- package/dist/services/workflow-validator.js +182 -21
- package/dist/services/workflow-validator.js.map +1 -1
- package/dist/utils/validation-schemas.d.ts +32 -0
- package/dist/utils/validation-schemas.d.ts.map +1 -0
- package/dist/utils/validation-schemas.js +219 -0
- package/dist/utils/validation-schemas.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://opensource.org/licenses/MIT)
|
|
4
4
|
[](https://github.com/czlonkowski/n8n-mcp)
|
|
5
|
-
[](https://github.com/czlonkowski/n8n-mcp)
|
|
6
6
|
[](https://www.npmjs.com/package/n8n-mcp)
|
|
7
7
|
[](https://codecov.io/gh/czlonkowski/n8n-mcp)
|
|
8
|
-
[](https://github.com/czlonkowski/n8n-mcp/actions)
|
|
9
|
+
[](https://github.com/n8n-io/n8n)
|
|
10
10
|
[](https://github.com/czlonkowski/n8n-mcp/pkgs/container/n8n-mcp)
|
|
11
11
|
[](https://railway.com/deploy/n8n-mcp?referralCode=n8n-mcp)
|
|
12
12
|
|
|
@@ -16,7 +16,7 @@ A Model Context Protocol (MCP) server that provides AI assistants with comprehen
|
|
|
16
16
|
|
|
17
17
|
n8n-MCP serves as a bridge between n8n's workflow automation platform and AI models, enabling them to understand and work with n8n nodes effectively. It provides structured access to:
|
|
18
18
|
|
|
19
|
-
- 📚 **
|
|
19
|
+
- 📚 **535 n8n nodes** from both n8n-nodes-base and @n8n/n8n-nodes-langchain
|
|
20
20
|
- 🔧 **Node properties** - 99% coverage with detailed schemas
|
|
21
21
|
- ⚡ **Node operations** - 63.6% coverage of available actions
|
|
22
22
|
- 📄 **Documentation** - 90% coverage from official n8n docs (including AI nodes)
|
|
@@ -663,10 +663,10 @@ npm run dev:http # HTTP dev mode
|
|
|
663
663
|
|
|
664
664
|
## 📊 Metrics & Coverage
|
|
665
665
|
|
|
666
|
-
Current database coverage (n8n v1.
|
|
666
|
+
Current database coverage (n8n v1.106.3):
|
|
667
667
|
|
|
668
|
-
- ✅ **
|
|
669
|
-
- ✅ **
|
|
668
|
+
- ✅ **535/535** nodes loaded (100%)
|
|
669
|
+
- ✅ **528** nodes with properties (98.7%)
|
|
670
670
|
- ✅ **470** nodes with documentation (88%)
|
|
671
671
|
- ✅ **267** AI-capable tools detected
|
|
672
672
|
- ✅ **AI Agent & LangChain nodes** fully documented
|
package/data/nodes.db
CHANGED
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-repository.d.ts","sourceRoot":"","sources":["../../src/database/node-repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE1E,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAkB;gBAEhB,WAAW,EAAE,eAAe,GAAG,oBAAoB;IAW/D,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"node-repository.d.ts","sourceRoot":"","sources":["../../src/database/node-repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE1E,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAkB;gBAEhB,WAAW,EAAE,eAAe,GAAG,oBAAoB;IAW/D,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAmChC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG;IA+B9B,UAAU,IAAI,GAAG,EAAE;IAgBnB,OAAO,CAAC,aAAa;IASrB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAIlC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG;IAIpC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,EAAE;IAS3C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,IAAI,GAAG,KAAK,GAAG,OAAc,EAAE,KAAK,GAAE,MAAW,GAAG,GAAG,EAAE;IAwC1F,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,GAAG,EAAE;IAUlC,YAAY,IAAI,MAAM;IAKtB,cAAc,IAAI,GAAG,EAAE;IAIvB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,EAAE;IAS7C,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,GAAE,MAAW,GAAG,GAAG,EAAE;IAmCrF,OAAO,CAAC,YAAY;CAqBrB"}
|
|
@@ -16,10 +16,11 @@ class NodeRepository {
|
|
|
16
16
|
node_type, package_name, display_name, description,
|
|
17
17
|
category, development_style, is_ai_tool, is_trigger,
|
|
18
18
|
is_webhook, is_versioned, version, documentation,
|
|
19
|
-
properties_schema, operations, credentials_required
|
|
20
|
-
|
|
19
|
+
properties_schema, operations, credentials_required,
|
|
20
|
+
outputs, output_names
|
|
21
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
21
22
|
`);
|
|
22
|
-
stmt.run(node.nodeType, node.packageName, node.displayName, node.description, node.category, node.style, node.isAITool ? 1 : 0, node.isTrigger ? 1 : 0, node.isWebhook ? 1 : 0, node.isVersioned ? 1 : 0, node.version, node.documentation || null, JSON.stringify(node.properties, null, 2), JSON.stringify(node.operations, null, 2), JSON.stringify(node.credentials, null, 2));
|
|
23
|
+
stmt.run(node.nodeType, node.packageName, node.displayName, node.description, node.category, node.style, node.isAITool ? 1 : 0, node.isTrigger ? 1 : 0, node.isWebhook ? 1 : 0, node.isVersioned ? 1 : 0, node.version, node.documentation || null, JSON.stringify(node.properties, null, 2), JSON.stringify(node.operations, null, 2), JSON.stringify(node.credentials, null, 2), node.outputs ? JSON.stringify(node.outputs, null, 2) : null, node.outputNames ? JSON.stringify(node.outputNames, null, 2) : null);
|
|
23
24
|
}
|
|
24
25
|
getNode(nodeType) {
|
|
25
26
|
const row = this.db.prepare(`
|
|
@@ -42,7 +43,9 @@ class NodeRepository {
|
|
|
42
43
|
properties: this.safeJsonParse(row.properties_schema, []),
|
|
43
44
|
operations: this.safeJsonParse(row.operations, []),
|
|
44
45
|
credentials: this.safeJsonParse(row.credentials_required, []),
|
|
45
|
-
hasDocumentation: !!row.documentation
|
|
46
|
+
hasDocumentation: !!row.documentation,
|
|
47
|
+
outputs: row.outputs ? this.safeJsonParse(row.outputs, null) : null,
|
|
48
|
+
outputNames: row.output_names ? this.safeJsonParse(row.output_names, null) : null
|
|
46
49
|
};
|
|
47
50
|
}
|
|
48
51
|
getAITools() {
|
|
@@ -179,7 +182,9 @@ class NodeRepository {
|
|
|
179
182
|
properties: this.safeJsonParse(row.properties_schema, []),
|
|
180
183
|
operations: this.safeJsonParse(row.operations, []),
|
|
181
184
|
credentials: this.safeJsonParse(row.credentials_required, []),
|
|
182
|
-
hasDocumentation: !!row.documentation
|
|
185
|
+
hasDocumentation: !!row.documentation,
|
|
186
|
+
outputs: row.outputs ? this.safeJsonParse(row.outputs, null) : null,
|
|
187
|
+
outputNames: row.output_names ? this.safeJsonParse(row.output_names, null) : null
|
|
183
188
|
};
|
|
184
189
|
}
|
|
185
190
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-repository.js","sourceRoot":"","sources":["../../src/database/node-repository.ts"],"names":[],"mappings":";;;AAIA,MAAa,cAAc;IAGzB,YAAY,WAAmD;QAC7D,IAAI,IAAI,IAAI,WAAW,EAAE,CAAC;YACxB,IAAI,CAAC,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,EAAE,GAAG,WAAW,CAAC;QACxB,CAAC;IACH,CAAC;IAKD,QAAQ,CAAC,IAAgB;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC
|
|
1
|
+
{"version":3,"file":"node-repository.js","sourceRoot":"","sources":["../../src/database/node-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs-mapper.d.ts","sourceRoot":"","sources":["../../src/mappers/docs-mapper.ts"],"names":[],"mappings":"AAGA,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAwC;IAGxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAU1B;IAEI,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"docs-mapper.d.ts","sourceRoot":"","sources":["../../src/mappers/docs-mapper.ts"],"names":[],"mappings":"AAGA,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAwC;IAGxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAU1B;IAEI,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAkDlE,OAAO,CAAC,4BAA4B;CAmDrC"}
|
|
@@ -43,8 +43,9 @@ class DocsMapper {
|
|
|
43
43
|
for (const relativePath of possiblePaths) {
|
|
44
44
|
try {
|
|
45
45
|
const fullPath = path_1.default.join(this.docsPath, relativePath);
|
|
46
|
-
|
|
46
|
+
let content = await fs_1.promises.readFile(fullPath, 'utf-8');
|
|
47
47
|
console.log(` ✓ Found docs at: ${relativePath}`);
|
|
48
|
+
content = this.enhanceLoopNodeDocumentation(nodeType, content);
|
|
48
49
|
return content;
|
|
49
50
|
}
|
|
50
51
|
catch (error) {
|
|
@@ -54,6 +55,52 @@ class DocsMapper {
|
|
|
54
55
|
console.log(` ✗ No docs found for ${nodeName}`);
|
|
55
56
|
return null;
|
|
56
57
|
}
|
|
58
|
+
enhanceLoopNodeDocumentation(nodeType, content) {
|
|
59
|
+
if (nodeType.includes('splitInBatches')) {
|
|
60
|
+
const outputGuidance = `
|
|
61
|
+
|
|
62
|
+
## CRITICAL OUTPUT CONNECTION INFORMATION
|
|
63
|
+
|
|
64
|
+
**⚠️ OUTPUT INDICES ARE COUNTERINTUITIVE ⚠️**
|
|
65
|
+
|
|
66
|
+
The SplitInBatches node has TWO outputs with specific indices:
|
|
67
|
+
- **Output 0 (index 0) = "done"**: Receives final processed data when loop completes
|
|
68
|
+
- **Output 1 (index 1) = "loop"**: Receives current batch data during iteration
|
|
69
|
+
|
|
70
|
+
### Correct Connection Pattern:
|
|
71
|
+
1. Connect nodes that PROCESS items inside the loop to **Output 1 ("loop")**
|
|
72
|
+
2. Connect nodes that run AFTER the loop completes to **Output 0 ("done")**
|
|
73
|
+
3. The last processing node in the loop must connect back to the SplitInBatches node
|
|
74
|
+
|
|
75
|
+
### Common Mistake:
|
|
76
|
+
AI assistants often connect these backwards because the logical flow (loop first, then done) doesn't match the technical indices (done=0, loop=1).
|
|
77
|
+
|
|
78
|
+
`;
|
|
79
|
+
const insertPoint = content.indexOf('## When to use');
|
|
80
|
+
if (insertPoint > -1) {
|
|
81
|
+
content = content.slice(0, insertPoint) + outputGuidance + content.slice(insertPoint);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
content = outputGuidance + '\n' + content;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (nodeType.includes('.if')) {
|
|
88
|
+
const outputGuidance = `
|
|
89
|
+
|
|
90
|
+
## Output Connection Information
|
|
91
|
+
|
|
92
|
+
The IF node has TWO outputs:
|
|
93
|
+
- **Output 0 (index 0) = "true"**: Items that match the condition
|
|
94
|
+
- **Output 1 (index 1) = "false"**: Items that do not match the condition
|
|
95
|
+
|
|
96
|
+
`;
|
|
97
|
+
const insertPoint = content.indexOf('## Node parameters');
|
|
98
|
+
if (insertPoint > -1) {
|
|
99
|
+
content = content.slice(0, insertPoint) + outputGuidance + content.slice(insertPoint);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return content;
|
|
103
|
+
}
|
|
57
104
|
}
|
|
58
105
|
exports.DocsMapper = DocsMapper;
|
|
59
106
|
//# sourceMappingURL=docs-mapper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docs-mapper.js","sourceRoot":"","sources":["../../src/mappers/docs-mapper.ts"],"names":[],"mappings":";;;;;;AAAA,2BAAoC;AACpC,gDAAwB;AAExB,MAAa,UAAU;IAAvB;QACU,aAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;QAGvC,gBAAW,GAA2B;YACrD,aAAa,EAAE,aAAa;YAC5B,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,SAAS;YACpB,kBAAkB,EAAE,kBAAkB;YAEtC,4BAA4B,EAAE,aAAa;YAC3C,qBAAqB,EAAE,MAAM;YAC7B,wBAAwB,EAAE,SAAS;YACnC,iCAAiC,EAAE,kBAAkB;SACtD,CAAC;
|
|
1
|
+
{"version":3,"file":"docs-mapper.js","sourceRoot":"","sources":["../../src/mappers/docs-mapper.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/server.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export declare class N8NDocumentationMCPServer {
|
|
|
13
13
|
private setupHandlers;
|
|
14
14
|
private sanitizeValidationResult;
|
|
15
15
|
private validateToolParams;
|
|
16
|
+
private validateToolParamsBasic;
|
|
16
17
|
private validateExtractedArgs;
|
|
17
18
|
private listNodes;
|
|
18
19
|
private getNodeInfo;
|
|
@@ -36,6 +37,7 @@ export declare class N8NDocumentationMCPServer {
|
|
|
36
37
|
private validateNodeConfig;
|
|
37
38
|
private getPropertyDependencies;
|
|
38
39
|
private getNodeAsToolInfo;
|
|
40
|
+
private getOutputDescriptions;
|
|
39
41
|
private getCommonAIToolUseCases;
|
|
40
42
|
private getAIToolExamples;
|
|
41
43
|
private validateNodeMinimal;
|
package/dist/mcp/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAuDA,qBAAa,yBAAyB;IACpC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,EAAE,CAAgC;IAC1C,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,UAAU,CAAa;;YA4DjB,kBAAkB;YAkBlB,wBAAwB;YAgBxB,iBAAiB;IAO/B,OAAO,CAAC,aAAa;IA0NrB,OAAO,CAAC,wBAAwB;IAoFhC,OAAO,CAAC,kBAAkB;IAoE1B,OAAO,CAAC,uBAAuB;IAiB/B,OAAO,CAAC,qBAAqB;YAsQf,SAAS;YA2DT,WAAW;YAiEX,WAAW;YAsCX,cAAc;YAiId,gBAAgB;IAqD9B,OAAO,CAAC,mBAAmB;IAwE3B,OAAO,CAAC,eAAe;YAsBT,eAAe;IAqE7B,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,uBAAuB;IA0D/B,OAAO,CAAC,iBAAiB;YAqFX,WAAW;YAgCX,oBAAoB;YAyEpB,qBAAqB;YAuCrB,iBAAiB;YA+EjB,oBAAoB;YAsDpB,cAAc;IAqC5B,OAAO,CAAC,gBAAgB;YAiBV,SAAS;YA6CT,kBAAkB;YA+DlB,uBAAuB;YAsDvB,iBAAiB;IAqE/B,OAAO,CAAC,qBAAqB;IA8C7B,OAAO,CAAC,uBAAuB;IAwD/B,OAAO,CAAC,iBAAiB;YAoDX,mBAAmB;YAkGnB,qBAAqB;IAS7B,OAAO,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;YAS9B,iBAAiB;YAqBjB,WAAW;YAmBX,eAAe;YAqBf,mBAAmB;IAuBjC,OAAO,CAAC,kBAAkB;YAiBZ,gBAAgB;YA6GhB,2BAA2B;YAiE3B,2BAA2B;IAyEnC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BpB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAuBhC"}
|
package/dist/mcp/server.js
CHANGED
|
@@ -62,6 +62,7 @@ const handlers_workflow_diff_1 = require("./handlers-workflow-diff");
|
|
|
62
62
|
const tools_documentation_1 = require("./tools-documentation");
|
|
63
63
|
const version_1 = require("../utils/version");
|
|
64
64
|
const node_utils_1 = require("../utils/node-utils");
|
|
65
|
+
const validation_schemas_1 = require("../utils/validation-schemas");
|
|
65
66
|
const protocol_version_1 = require("../utils/protocol-version");
|
|
66
67
|
class N8NDocumentationMCPServer {
|
|
67
68
|
constructor() {
|
|
@@ -379,7 +380,62 @@ class N8NDocumentationMCPServer {
|
|
|
379
380
|
}
|
|
380
381
|
return JSON.parse(JSON.stringify(sanitized));
|
|
381
382
|
}
|
|
382
|
-
validateToolParams(toolName, args,
|
|
383
|
+
validateToolParams(toolName, args, legacyRequiredParams) {
|
|
384
|
+
try {
|
|
385
|
+
let validationResult;
|
|
386
|
+
switch (toolName) {
|
|
387
|
+
case 'validate_node_operation':
|
|
388
|
+
validationResult = validation_schemas_1.ToolValidation.validateNodeOperation(args);
|
|
389
|
+
break;
|
|
390
|
+
case 'validate_node_minimal':
|
|
391
|
+
validationResult = validation_schemas_1.ToolValidation.validateNodeMinimal(args);
|
|
392
|
+
break;
|
|
393
|
+
case 'validate_workflow':
|
|
394
|
+
case 'validate_workflow_connections':
|
|
395
|
+
case 'validate_workflow_expressions':
|
|
396
|
+
validationResult = validation_schemas_1.ToolValidation.validateWorkflow(args);
|
|
397
|
+
break;
|
|
398
|
+
case 'search_nodes':
|
|
399
|
+
validationResult = validation_schemas_1.ToolValidation.validateSearchNodes(args);
|
|
400
|
+
break;
|
|
401
|
+
case 'list_node_templates':
|
|
402
|
+
validationResult = validation_schemas_1.ToolValidation.validateListNodeTemplates(args);
|
|
403
|
+
break;
|
|
404
|
+
case 'n8n_create_workflow':
|
|
405
|
+
validationResult = validation_schemas_1.ToolValidation.validateCreateWorkflow(args);
|
|
406
|
+
break;
|
|
407
|
+
case 'n8n_get_workflow':
|
|
408
|
+
case 'n8n_get_workflow_details':
|
|
409
|
+
case 'n8n_get_workflow_structure':
|
|
410
|
+
case 'n8n_get_workflow_minimal':
|
|
411
|
+
case 'n8n_update_full_workflow':
|
|
412
|
+
case 'n8n_delete_workflow':
|
|
413
|
+
case 'n8n_validate_workflow':
|
|
414
|
+
case 'n8n_get_execution':
|
|
415
|
+
case 'n8n_delete_execution':
|
|
416
|
+
validationResult = validation_schemas_1.ToolValidation.validateWorkflowId(args);
|
|
417
|
+
break;
|
|
418
|
+
default:
|
|
419
|
+
return this.validateToolParamsBasic(toolName, args, legacyRequiredParams || []);
|
|
420
|
+
}
|
|
421
|
+
if (!validationResult.valid) {
|
|
422
|
+
const errorMessage = validation_schemas_1.Validator.formatErrors(validationResult, toolName);
|
|
423
|
+
logger_1.logger.error(`Parameter validation failed for ${toolName}:`, errorMessage);
|
|
424
|
+
throw new validation_schemas_1.ValidationError(errorMessage);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
catch (error) {
|
|
428
|
+
if (error instanceof validation_schemas_1.ValidationError) {
|
|
429
|
+
throw error;
|
|
430
|
+
}
|
|
431
|
+
logger_1.logger.error(`Validation system error for ${toolName}:`, error);
|
|
432
|
+
const errorMessage = error instanceof Error
|
|
433
|
+
? `Internal validation error: ${error.message}`
|
|
434
|
+
: `Internal validation error while processing ${toolName}`;
|
|
435
|
+
throw new Error(errorMessage);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
validateToolParamsBasic(toolName, args, requiredParams) {
|
|
383
439
|
const missing = [];
|
|
384
440
|
for (const param of requiredParams) {
|
|
385
441
|
if (!(param in args) || args[param] === undefined || args[param] === null) {
|
|
@@ -500,12 +556,17 @@ class N8NDocumentationMCPServer {
|
|
|
500
556
|
fix: 'Provide config as an object with node properties'
|
|
501
557
|
}],
|
|
502
558
|
warnings: [],
|
|
503
|
-
suggestions: [
|
|
559
|
+
suggestions: [
|
|
560
|
+
'🔧 RECOVERY: Invalid config detected. Fix with:',
|
|
561
|
+
' • Ensure config is an object: { "resource": "...", "operation": "..." }',
|
|
562
|
+
' • Use get_node_essentials to see required fields for this node type',
|
|
563
|
+
' • Check if the node type is correct before configuring it'
|
|
564
|
+
],
|
|
504
565
|
summary: {
|
|
505
566
|
hasErrors: true,
|
|
506
567
|
errorCount: 1,
|
|
507
568
|
warningCount: 0,
|
|
508
|
-
suggestionCount:
|
|
569
|
+
suggestionCount: 3
|
|
509
570
|
}
|
|
510
571
|
};
|
|
511
572
|
}
|
|
@@ -518,7 +579,10 @@ class N8NDocumentationMCPServer {
|
|
|
518
579
|
nodeType: args.nodeType || 'unknown',
|
|
519
580
|
displayName: 'Unknown Node',
|
|
520
581
|
valid: false,
|
|
521
|
-
missingRequiredFields: [
|
|
582
|
+
missingRequiredFields: [
|
|
583
|
+
'Invalid config format - expected object',
|
|
584
|
+
'🔧 RECOVERY: Use format { "resource": "...", "operation": "..." } or {} for empty config'
|
|
585
|
+
]
|
|
522
586
|
};
|
|
523
587
|
}
|
|
524
588
|
return this.validateNodeMinimal(args.nodeType, args.config);
|
|
@@ -683,10 +747,23 @@ class N8NDocumentationMCPServer {
|
|
|
683
747
|
'N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true' :
|
|
684
748
|
null
|
|
685
749
|
};
|
|
750
|
+
let outputs = undefined;
|
|
751
|
+
if (node.outputNames && node.outputNames.length > 0) {
|
|
752
|
+
outputs = node.outputNames.map((name, index) => {
|
|
753
|
+
const descriptions = this.getOutputDescriptions(node.nodeType, name, index);
|
|
754
|
+
return {
|
|
755
|
+
index,
|
|
756
|
+
name,
|
|
757
|
+
description: descriptions.description,
|
|
758
|
+
connectionGuidance: descriptions.connectionGuidance
|
|
759
|
+
};
|
|
760
|
+
});
|
|
761
|
+
}
|
|
686
762
|
return {
|
|
687
763
|
...node,
|
|
688
764
|
workflowNodeType: (0, node_utils_1.getWorkflowNodeType)(node.package, node.nodeType),
|
|
689
|
-
aiToolCapabilities
|
|
765
|
+
aiToolCapabilities,
|
|
766
|
+
outputs
|
|
690
767
|
};
|
|
691
768
|
}
|
|
692
769
|
async searchNodes(query, limit = 20, options) {
|
|
@@ -1513,6 +1590,46 @@ Full documentation is being prepared. For now, use get_node_essentials for confi
|
|
|
1513
1590
|
aiToolCapabilities
|
|
1514
1591
|
};
|
|
1515
1592
|
}
|
|
1593
|
+
getOutputDescriptions(nodeType, outputName, index) {
|
|
1594
|
+
if (nodeType === 'nodes-base.splitInBatches') {
|
|
1595
|
+
if (outputName === 'done' && index === 0) {
|
|
1596
|
+
return {
|
|
1597
|
+
description: 'Final processed data after all iterations complete',
|
|
1598
|
+
connectionGuidance: 'Connect to nodes that should run AFTER the loop completes'
|
|
1599
|
+
};
|
|
1600
|
+
}
|
|
1601
|
+
else if (outputName === 'loop' && index === 1) {
|
|
1602
|
+
return {
|
|
1603
|
+
description: 'Current batch data for this iteration',
|
|
1604
|
+
connectionGuidance: 'Connect to nodes that process items INSIDE the loop (and connect their output back to this node)'
|
|
1605
|
+
};
|
|
1606
|
+
}
|
|
1607
|
+
}
|
|
1608
|
+
if (nodeType === 'nodes-base.if') {
|
|
1609
|
+
if (outputName === 'true' && index === 0) {
|
|
1610
|
+
return {
|
|
1611
|
+
description: 'Items that match the condition',
|
|
1612
|
+
connectionGuidance: 'Connect to nodes that handle the TRUE case'
|
|
1613
|
+
};
|
|
1614
|
+
}
|
|
1615
|
+
else if (outputName === 'false' && index === 1) {
|
|
1616
|
+
return {
|
|
1617
|
+
description: 'Items that do not match the condition',
|
|
1618
|
+
connectionGuidance: 'Connect to nodes that handle the FALSE case'
|
|
1619
|
+
};
|
|
1620
|
+
}
|
|
1621
|
+
}
|
|
1622
|
+
if (nodeType === 'nodes-base.switch') {
|
|
1623
|
+
return {
|
|
1624
|
+
description: `Output ${index}: ${outputName || 'Route ' + index}`,
|
|
1625
|
+
connectionGuidance: `Connect to nodes for the "${outputName || 'route ' + index}" case`
|
|
1626
|
+
};
|
|
1627
|
+
}
|
|
1628
|
+
return {
|
|
1629
|
+
description: outputName || `Output ${index}`,
|
|
1630
|
+
connectionGuidance: `Connect to downstream nodes`
|
|
1631
|
+
};
|
|
1632
|
+
}
|
|
1516
1633
|
getCommonAIToolUseCases(nodeType) {
|
|
1517
1634
|
const useCaseMap = {
|
|
1518
1635
|
'nodes-base.slack': [
|
|
@@ -1635,10 +1752,10 @@ Full documentation is being prepared. For now, use get_node_essentials for confi
|
|
|
1635
1752
|
}
|
|
1636
1753
|
const properties = node.properties || [];
|
|
1637
1754
|
const operationContext = {
|
|
1638
|
-
resource: config
|
|
1639
|
-
operation: config
|
|
1640
|
-
action: config
|
|
1641
|
-
mode: config
|
|
1755
|
+
resource: config?.resource,
|
|
1756
|
+
operation: config?.operation,
|
|
1757
|
+
action: config?.action,
|
|
1758
|
+
mode: config?.mode
|
|
1642
1759
|
};
|
|
1643
1760
|
const missingFields = [];
|
|
1644
1761
|
for (const prop of properties) {
|
|
@@ -1648,7 +1765,7 @@ Full documentation is being prepared. For now, use get_node_essentials for confi
|
|
|
1648
1765
|
let isVisible = true;
|
|
1649
1766
|
if (prop.displayOptions.show) {
|
|
1650
1767
|
for (const [key, values] of Object.entries(prop.displayOptions.show)) {
|
|
1651
|
-
const configValue = config[key];
|
|
1768
|
+
const configValue = config?.[key];
|
|
1652
1769
|
const expectedValues = Array.isArray(values) ? values : [values];
|
|
1653
1770
|
if (!expectedValues.includes(configValue)) {
|
|
1654
1771
|
isVisible = false;
|
|
@@ -1658,7 +1775,7 @@ Full documentation is being prepared. For now, use get_node_essentials for confi
|
|
|
1658
1775
|
}
|
|
1659
1776
|
if (isVisible && prop.displayOptions.hide) {
|
|
1660
1777
|
for (const [key, values] of Object.entries(prop.displayOptions.hide)) {
|
|
1661
|
-
const configValue = config[key];
|
|
1778
|
+
const configValue = config?.[key];
|
|
1662
1779
|
const expectedValues = Array.isArray(values) ? values : [values];
|
|
1663
1780
|
if (expectedValues.includes(configValue)) {
|
|
1664
1781
|
isVisible = false;
|
|
@@ -1669,7 +1786,7 @@ Full documentation is being prepared. For now, use get_node_essentials for confi
|
|
|
1669
1786
|
if (!isVisible)
|
|
1670
1787
|
continue;
|
|
1671
1788
|
}
|
|
1672
|
-
if (!(prop.name in config)) {
|
|
1789
|
+
if (!config || !(prop.name in config)) {
|
|
1673
1790
|
missingFields.push(prop.displayName || prop.name);
|
|
1674
1791
|
}
|
|
1675
1792
|
}
|