n8n-mcp 2.77.0 → 2.78.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/data/nodes.db +0 -0
- package/dist/database/node-repository.d.ts +3 -18
- package/dist/database/node-repository.d.ts.map +1 -1
- package/dist/database/node-repository.js +66 -79
- package/dist/database/node-repository.js.map +1 -1
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +92 -40
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tool-docs/configuration/get-node.js +3 -3
- package/dist/mcp/tool-docs/configuration/get-node.js.map +1 -1
- package/dist/parsers/node-parser.d.ts +17 -0
- package/dist/parsers/node-parser.d.ts.map +1 -1
- package/dist/parsers/node-parser.js +59 -0
- package/dist/parsers/node-parser.js.map +1 -1
- package/dist/parsers/property-extractor.d.ts +5 -0
- package/dist/parsers/property-extractor.d.ts.map +1 -1
- package/dist/parsers/property-extractor.js +9 -0
- package/dist/parsers/property-extractor.js.map +1 -1
- package/dist/parsers/version-display-gate.d.ts +3 -0
- package/dist/parsers/version-display-gate.d.ts.map +1 -0
- package/dist/parsers/version-display-gate.js +60 -0
- package/dist/parsers/version-display-gate.js.map +1 -0
- package/dist/scripts/rebuild.js +40 -5
- package/dist/scripts/rebuild.js.map +1 -1
- package/dist/services/breaking-change-detector.d.ts +2 -0
- package/dist/services/breaking-change-detector.d.ts.map +1 -1
- package/dist/services/breaking-change-detector.js +50 -19
- package/dist/services/breaking-change-detector.js.map +1 -1
- package/dist/services/breaking-changes-registry.d.ts.map +1 -1
- package/dist/services/breaking-changes-registry.js +3 -8
- package/dist/services/breaking-changes-registry.js.map +1 -1
- package/dist/services/node-version-service.d.ts.map +1 -1
- package/dist/services/node-version-service.js +3 -2
- package/dist/services/node-version-service.js.map +1 -1
- package/dist/services/workflow-auto-fixer.d.ts.map +1 -1
- package/dist/services/workflow-auto-fixer.js +6 -0
- package/dist/services/workflow-auto-fixer.js.map +1 -1
- package/dist/telemetry/config-manager.d.ts.map +1 -1
- package/dist/telemetry/config-manager.js +44 -39
- package/dist/telemetry/config-manager.js.map +1 -1
- package/dist/telemetry/telemetry-cli.js +2 -2
- package/package.json +1 -1
package/dist/mcp/server.js
CHANGED
|
@@ -76,6 +76,8 @@ const node_type_normalizer_1 = require("../utils/node-type-normalizer");
|
|
|
76
76
|
const typeversion_1 = require("../utils/typeversion");
|
|
77
77
|
const validation_schemas_1 = require("../utils/validation-schemas");
|
|
78
78
|
const protocol_version_1 = require("../utils/protocol-version");
|
|
79
|
+
const breaking_change_detector_1 = require("../services/breaking-change-detector");
|
|
80
|
+
const node_parser_1 = require("../parsers/node-parser");
|
|
79
81
|
const telemetry_1 = require("../telemetry");
|
|
80
82
|
const startup_checkpoints_1 = require("../telemetry/startup-checkpoints");
|
|
81
83
|
const STDIO_MAX_BUFFER_SIZE = Math.max(1024 * 1024, parseInt(process.env.N8N_MCP_STDIO_MAX_BUFFER_SIZE || '', 10) || 64 * 1024 * 1024);
|
|
@@ -86,6 +88,7 @@ class N8NDocumentationMCPServer {
|
|
|
86
88
|
constructor(instanceContext, earlyLogger, options) {
|
|
87
89
|
this.db = null;
|
|
88
90
|
this.repository = null;
|
|
91
|
+
this.breakingChangeDetector = null;
|
|
89
92
|
this.templateService = null;
|
|
90
93
|
this.cache = new simple_cache_1.SimpleCache();
|
|
91
94
|
this.clientInfo = null;
|
|
@@ -2530,28 +2533,75 @@ Full documentation is being prepared. For now, use get_node_essentials for confi
|
|
|
2530
2533
|
...extra
|
|
2531
2534
|
};
|
|
2532
2535
|
}
|
|
2533
|
-
getVersionHistory(nodeType) {
|
|
2536
|
+
async getVersionHistory(nodeType) {
|
|
2534
2537
|
if (!this.repository.hasVersionMetadata(nodeType)) {
|
|
2538
|
+
const node = this.repository.getNode(nodeType);
|
|
2539
|
+
if (node && node.isVersioned === false && node.version) {
|
|
2540
|
+
return {
|
|
2541
|
+
nodeType,
|
|
2542
|
+
available: true,
|
|
2543
|
+
totalVersions: 1,
|
|
2544
|
+
versions: [{
|
|
2545
|
+
version: String(node.version),
|
|
2546
|
+
isCurrent: true,
|
|
2547
|
+
hasBreakingChanges: false,
|
|
2548
|
+
breakingChangesCount: 0,
|
|
2549
|
+
deprecatedProperties: [],
|
|
2550
|
+
addedProperties: []
|
|
2551
|
+
}]
|
|
2552
|
+
};
|
|
2553
|
+
}
|
|
2535
2554
|
return this.versionMetadataUnavailable(nodeType, { totalVersions: 0, versions: [] });
|
|
2536
2555
|
}
|
|
2537
2556
|
const versions = this.repository.getNodeVersions(nodeType);
|
|
2538
|
-
|
|
2539
|
-
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
-
|
|
2557
|
+
const entries = [];
|
|
2558
|
+
for (let i = 0; i < versions.length; i++) {
|
|
2559
|
+
const v = versions[i];
|
|
2560
|
+
const previous = versions[i + 1];
|
|
2561
|
+
const breakingCount = previous
|
|
2562
|
+
? (await this.analyzeVersionUpgrade(nodeType, previous.version, v.version))
|
|
2563
|
+
.changes.filter(c => c.isBreaking).length
|
|
2564
|
+
: 0;
|
|
2565
|
+
entries.push({
|
|
2543
2566
|
version: v.version,
|
|
2544
2567
|
isCurrent: v.isCurrentMax,
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
hasBreakingChanges: (v.breakingChanges || []).length > 0,
|
|
2548
|
-
breakingChangesCount: (v.breakingChanges || []).length,
|
|
2568
|
+
hasBreakingChanges: breakingCount > 0,
|
|
2569
|
+
breakingChangesCount: breakingCount,
|
|
2549
2570
|
deprecatedProperties: v.deprecatedProperties || [],
|
|
2550
2571
|
addedProperties: v.addedProperties || []
|
|
2551
|
-
})
|
|
2572
|
+
});
|
|
2573
|
+
}
|
|
2574
|
+
return {
|
|
2575
|
+
nodeType,
|
|
2576
|
+
available: true,
|
|
2577
|
+
totalVersions: entries.length,
|
|
2578
|
+
versions: entries
|
|
2552
2579
|
};
|
|
2553
2580
|
}
|
|
2554
|
-
|
|
2581
|
+
async analyzeVersionUpgrade(nodeType, fromVersion, toVersion) {
|
|
2582
|
+
const from = (0, node_parser_1.normalizeNodeVersion)(fromVersion);
|
|
2583
|
+
const to = (0, node_parser_1.normalizeNodeVersion)(toVersion ?? this.defaultTargetVersion(nodeType, from));
|
|
2584
|
+
for (const version of [from, to]) {
|
|
2585
|
+
if (!this.repository.getNodeVersion(nodeType, version)) {
|
|
2586
|
+
const known = this.repository.getNodeVersions(nodeType).map(v => v.version).join(', ');
|
|
2587
|
+
throw new Error(`get_node: version "${version}" is not a recorded version of ${nodeType} (recorded: ${known})`);
|
|
2588
|
+
}
|
|
2589
|
+
}
|
|
2590
|
+
this.breakingChangeDetector ?? (this.breakingChangeDetector = new breaking_change_detector_1.BreakingChangeDetector(this.repository));
|
|
2591
|
+
return this.breakingChangeDetector.analyzeVersionUpgrade(node_type_normalizer_1.NodeTypeNormalizer.toWorkflowFormat(nodeType), from, to);
|
|
2592
|
+
}
|
|
2593
|
+
defaultTargetVersion(nodeType, fromVersion) {
|
|
2594
|
+
const current = this.repository.getLatestNodeVersion(nodeType)?.version
|
|
2595
|
+
?? this.repository.getNode(nodeType)?.version;
|
|
2596
|
+
if (!current) {
|
|
2597
|
+
throw new Error('No target version available');
|
|
2598
|
+
}
|
|
2599
|
+
if (Number(fromVersion) <= Number(current))
|
|
2600
|
+
return current;
|
|
2601
|
+
const newest = this.repository.getNodeVersions(nodeType)[0]?.version;
|
|
2602
|
+
return newest ?? current;
|
|
2603
|
+
}
|
|
2604
|
+
async compareVersions(nodeType, fromVersion, toVersion) {
|
|
2555
2605
|
if (!this.repository.hasVersionMetadata(nodeType)) {
|
|
2556
2606
|
return this.versionMetadataUnavailable(nodeType, {
|
|
2557
2607
|
fromVersion,
|
|
@@ -2560,20 +2610,15 @@ Full documentation is being prepared. For now, use get_node_essentials for confi
|
|
|
2560
2610
|
changes: []
|
|
2561
2611
|
});
|
|
2562
2612
|
}
|
|
2563
|
-
const
|
|
2564
|
-
const targetVersion = toVersion || latest?.version;
|
|
2565
|
-
if (!targetVersion) {
|
|
2566
|
-
throw new Error('No target version available');
|
|
2567
|
-
}
|
|
2568
|
-
const changes = this.repository.getPropertyChanges(nodeType, fromVersion, targetVersion);
|
|
2613
|
+
const analysis = await this.analyzeVersionUpgrade(nodeType, fromVersion, toVersion);
|
|
2569
2614
|
return {
|
|
2570
2615
|
nodeType,
|
|
2571
2616
|
available: true,
|
|
2572
|
-
fromVersion,
|
|
2573
|
-
toVersion:
|
|
2574
|
-
totalChanges: changes.length,
|
|
2575
|
-
breakingChanges: changes.filter(c => c.isBreaking).length,
|
|
2576
|
-
changes: changes.map(c => ({
|
|
2617
|
+
fromVersion: analysis.fromVersion,
|
|
2618
|
+
toVersion: analysis.toVersion,
|
|
2619
|
+
totalChanges: analysis.changes.length,
|
|
2620
|
+
breakingChanges: analysis.changes.filter(c => c.isBreaking).length,
|
|
2621
|
+
changes: analysis.changes.map(c => ({
|
|
2577
2622
|
property: c.propertyName,
|
|
2578
2623
|
changeType: c.changeType,
|
|
2579
2624
|
isBreaking: c.isBreaking,
|
|
@@ -2581,11 +2626,12 @@ Full documentation is being prepared. For now, use get_node_essentials for confi
|
|
|
2581
2626
|
oldValue: c.oldValue,
|
|
2582
2627
|
newValue: c.newValue,
|
|
2583
2628
|
migrationHint: c.migrationHint,
|
|
2584
|
-
autoMigratable: c.autoMigratable
|
|
2629
|
+
autoMigratable: c.autoMigratable,
|
|
2630
|
+
source: c.source
|
|
2585
2631
|
}))
|
|
2586
2632
|
};
|
|
2587
2633
|
}
|
|
2588
|
-
getBreakingChanges(nodeType, fromVersion, toVersion) {
|
|
2634
|
+
async getBreakingChanges(nodeType, fromVersion, toVersion) {
|
|
2589
2635
|
if (!this.repository.hasVersionMetadata(nodeType)) {
|
|
2590
2636
|
return this.versionMetadataUnavailable(nodeType, {
|
|
2591
2637
|
fromVersion,
|
|
@@ -2594,27 +2640,30 @@ Full documentation is being prepared. For now, use get_node_essentials for confi
|
|
|
2594
2640
|
changes: []
|
|
2595
2641
|
});
|
|
2596
2642
|
}
|
|
2597
|
-
const
|
|
2643
|
+
const analysis = await this.analyzeVersionUpgrade(nodeType, fromVersion, toVersion);
|
|
2644
|
+
const breakingChanges = analysis.changes.filter(c => c.isBreaking);
|
|
2598
2645
|
return {
|
|
2599
2646
|
nodeType,
|
|
2600
2647
|
available: true,
|
|
2601
|
-
fromVersion,
|
|
2602
|
-
toVersion: toVersion
|
|
2648
|
+
fromVersion: analysis.fromVersion,
|
|
2649
|
+
toVersion: analysis.toVersion,
|
|
2603
2650
|
totalBreakingChanges: breakingChanges.length,
|
|
2604
2651
|
changes: breakingChanges.map(c => ({
|
|
2605
|
-
fromVersion: c.fromVersion,
|
|
2606
|
-
toVersion: c.toVersion,
|
|
2652
|
+
fromVersion: c.fromVersion ?? analysis.fromVersion,
|
|
2653
|
+
toVersion: c.toVersion ?? analysis.toVersion,
|
|
2607
2654
|
property: c.propertyName,
|
|
2608
2655
|
changeType: c.changeType,
|
|
2609
2656
|
severity: c.severity,
|
|
2610
2657
|
migrationHint: c.migrationHint,
|
|
2611
2658
|
oldValue: c.oldValue,
|
|
2612
|
-
newValue: c.newValue
|
|
2659
|
+
newValue: c.newValue,
|
|
2660
|
+
source: c.source
|
|
2613
2661
|
})),
|
|
2614
|
-
upgradeSafe: breakingChanges.length === 0
|
|
2662
|
+
upgradeSafe: breakingChanges.length === 0,
|
|
2663
|
+
recommendations: analysis.recommendations
|
|
2615
2664
|
};
|
|
2616
2665
|
}
|
|
2617
|
-
getMigrations(nodeType, fromVersion, toVersion) {
|
|
2666
|
+
async getMigrations(nodeType, fromVersion, toVersion) {
|
|
2618
2667
|
if (!this.repository.hasVersionMetadata(nodeType)) {
|
|
2619
2668
|
return this.versionMetadataUnavailable(nodeType, {
|
|
2620
2669
|
fromVersion,
|
|
@@ -2624,22 +2673,25 @@ Full documentation is being prepared. For now, use get_node_essentials for confi
|
|
|
2624
2673
|
migrations: []
|
|
2625
2674
|
});
|
|
2626
2675
|
}
|
|
2627
|
-
const
|
|
2628
|
-
const
|
|
2676
|
+
const analysis = await this.analyzeVersionUpgrade(nodeType, fromVersion, toVersion);
|
|
2677
|
+
const migrations = analysis.changes.filter(c => c.autoMigratable && c.migrationStrategy);
|
|
2678
|
+
const noActionRequired = analysis.changes.filter(c => c.autoMigratable && !c.migrationStrategy).length;
|
|
2629
2679
|
return {
|
|
2630
2680
|
nodeType,
|
|
2631
2681
|
available: true,
|
|
2632
|
-
fromVersion,
|
|
2633
|
-
toVersion,
|
|
2682
|
+
fromVersion: analysis.fromVersion,
|
|
2683
|
+
toVersion: analysis.toVersion,
|
|
2634
2684
|
autoMigratableChanges: migrations.length,
|
|
2635
|
-
|
|
2685
|
+
noActionRequired,
|
|
2686
|
+
totalChanges: analysis.changes.length,
|
|
2636
2687
|
migrations: migrations.map(m => ({
|
|
2637
2688
|
property: m.propertyName,
|
|
2638
2689
|
changeType: m.changeType,
|
|
2639
2690
|
migrationStrategy: m.migrationStrategy,
|
|
2640
|
-
severity: m.severity
|
|
2691
|
+
severity: m.severity,
|
|
2692
|
+
source: m.source
|
|
2641
2693
|
})),
|
|
2642
|
-
requiresManualMigration:
|
|
2694
|
+
requiresManualMigration: analysis.manualRequiredCount > 0
|
|
2643
2695
|
};
|
|
2644
2696
|
}
|
|
2645
2697
|
enrichPropertyWithTypeInfo(property) {
|