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.
Files changed (43) hide show
  1. package/data/nodes.db +0 -0
  2. package/dist/database/node-repository.d.ts +3 -18
  3. package/dist/database/node-repository.d.ts.map +1 -1
  4. package/dist/database/node-repository.js +66 -79
  5. package/dist/database/node-repository.js.map +1 -1
  6. package/dist/mcp/server.d.ts +3 -0
  7. package/dist/mcp/server.d.ts.map +1 -1
  8. package/dist/mcp/server.js +92 -40
  9. package/dist/mcp/server.js.map +1 -1
  10. package/dist/mcp/tool-docs/configuration/get-node.js +3 -3
  11. package/dist/mcp/tool-docs/configuration/get-node.js.map +1 -1
  12. package/dist/parsers/node-parser.d.ts +17 -0
  13. package/dist/parsers/node-parser.d.ts.map +1 -1
  14. package/dist/parsers/node-parser.js +59 -0
  15. package/dist/parsers/node-parser.js.map +1 -1
  16. package/dist/parsers/property-extractor.d.ts +5 -0
  17. package/dist/parsers/property-extractor.d.ts.map +1 -1
  18. package/dist/parsers/property-extractor.js +9 -0
  19. package/dist/parsers/property-extractor.js.map +1 -1
  20. package/dist/parsers/version-display-gate.d.ts +3 -0
  21. package/dist/parsers/version-display-gate.d.ts.map +1 -0
  22. package/dist/parsers/version-display-gate.js +60 -0
  23. package/dist/parsers/version-display-gate.js.map +1 -0
  24. package/dist/scripts/rebuild.js +40 -5
  25. package/dist/scripts/rebuild.js.map +1 -1
  26. package/dist/services/breaking-change-detector.d.ts +2 -0
  27. package/dist/services/breaking-change-detector.d.ts.map +1 -1
  28. package/dist/services/breaking-change-detector.js +50 -19
  29. package/dist/services/breaking-change-detector.js.map +1 -1
  30. package/dist/services/breaking-changes-registry.d.ts.map +1 -1
  31. package/dist/services/breaking-changes-registry.js +3 -8
  32. package/dist/services/breaking-changes-registry.js.map +1 -1
  33. package/dist/services/node-version-service.d.ts.map +1 -1
  34. package/dist/services/node-version-service.js +3 -2
  35. package/dist/services/node-version-service.js.map +1 -1
  36. package/dist/services/workflow-auto-fixer.d.ts.map +1 -1
  37. package/dist/services/workflow-auto-fixer.js +6 -0
  38. package/dist/services/workflow-auto-fixer.js.map +1 -1
  39. package/dist/telemetry/config-manager.d.ts.map +1 -1
  40. package/dist/telemetry/config-manager.js +44 -39
  41. package/dist/telemetry/config-manager.js.map +1 -1
  42. package/dist/telemetry/telemetry-cli.js +2 -2
  43. package/package.json +1 -1
@@ -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
- return {
2539
- nodeType,
2540
- available: true,
2541
- totalVersions: versions.length,
2542
- versions: versions.map(v => ({
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
- minimumN8nVersion: v.minimumN8nVersion,
2546
- releasedAt: v.releasedAt,
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
- compareVersions(nodeType, fromVersion, toVersion) {
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 latest = this.repository.getLatestNodeVersion(nodeType);
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: targetVersion,
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 breakingChanges = this.repository.getBreakingChanges(nodeType, fromVersion, toVersion);
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 || 'latest',
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 migrations = this.repository.getAutoMigratableChanges(nodeType, fromVersion, toVersion);
2628
- const allChanges = this.repository.getPropertyChanges(nodeType, fromVersion, toVersion);
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
- totalChanges: allChanges.length,
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: migrations.length < allChanges.length
2694
+ requiresManualMigration: analysis.manualRequiredCount > 0
2643
2695
  };
2644
2696
  }
2645
2697
  enrichPropertyWithTypeInfo(property) {