Files
n8n-mcp/docs/transactional-updates-example.md
czlonkowski 0aab176e7d feat(v2.7.0): add n8n_update_partial_workflow with transactional updates
BREAKING CHANGES:
- Renamed n8n_update_workflow to n8n_update_full_workflow for clarity

NEW FEATURES:
- Added n8n_update_partial_workflow tool for diff-based workflow editing
- Implemented WorkflowDiffEngine with 13 operation types
- Added transactional updates with two-pass processing
- Maximum 5 operations per request for reliability
- Operations can be in any order - engine handles dependencies
- Added validateOnly mode for testing changes before applying
- 80-90% token savings by only sending changes

IMPROVEMENTS:
- Enhanced tool description with comprehensive parameter documentation
- Added clear examples for simple and complex use cases
- Improved error messages and validation
- Added extensive test coverage for all operations

DOCUMENTATION:
- Added workflow-diff-examples.md with usage patterns
- Added transactional-updates-example.md showing before/after
- Updated README.md with v2.7.0 features
- Updated CLAUDE.md with latest changes

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-06-27 11:33:57 +02:00

3.2 KiB

Transactional Updates Example

This example demonstrates the new transactional update capabilities in v2.7.0.

Before (v2.6.x and earlier)

Previously, you had to carefully order operations to ensure nodes existed before connecting them:

{
  "id": "workflow-123",
  "operations": [
    // 1. First add all nodes
    { "type": "addNode", "node": { "name": "Process", "type": "n8n-nodes-base.set", ... }},
    { "type": "addNode", "node": { "name": "Notify", "type": "n8n-nodes-base.slack", ... }},
    
    // 2. Then add connections (would fail if done before nodes)
    { "type": "addConnection", "source": "Webhook", "target": "Process" },
    { "type": "addConnection", "source": "Process", "target": "Notify" }
  ]
}

After (v2.7.0+)

Now you can write operations in any order - the engine automatically handles dependencies:

{
  "id": "workflow-123",
  "operations": [
    // Connections can come first!
    { "type": "addConnection", "source": "Webhook", "target": "Process" },
    { "type": "addConnection", "source": "Process", "target": "Notify" },
    
    // Nodes added later - still works!
    { "type": "addNode", "node": { "name": "Process", "type": "n8n-nodes-base.set", "position": [400, 300] }},
    { "type": "addNode", "node": { "name": "Notify", "type": "n8n-nodes-base.slack", "position": [600, 300] }}
  ]
}

How It Works

  1. Two-Pass Processing:

    • Pass 1: All node operations (add, remove, update, move, enable, disable)
    • Pass 2: All other operations (connections, settings, metadata)
  2. Operation Limit: Maximum 5 operations per request keeps complexity manageable

  3. Atomic Updates: All operations succeed or all fail - no partial updates

Benefits for AI Agents

  • Intuitive: Write operations in the order that makes sense logically
  • Reliable: No need to track dependencies manually
  • Simple: Focus on what to change, not how to order changes
  • Safe: Built-in limits prevent overly complex operations

Complete Example

Here's a real-world example of adding error handling to a workflow:

{
  "id": "workflow-123",
  "operations": [
    // Define the flow first (makes logical sense)
    { 
      "type": "removeConnection", 
      "source": "HTTP Request", 
      "target": "Save to DB" 
    },
    { 
      "type": "addConnection", 
      "source": "HTTP Request", 
      "target": "Error Handler" 
    },
    { 
      "type": "addConnection", 
      "source": "Error Handler", 
      "target": "Send Alert" 
    },
    
    // Then add the nodes
    { 
      "type": "addNode", 
      "node": {
        "name": "Error Handler",
        "type": "n8n-nodes-base.if",
        "position": [500, 400],
        "parameters": {
          "conditions": {
            "boolean": [{
              "value1": "={{$json.error}}",
              "value2": true
            }]
          }
        }
      }
    },
    { 
      "type": "addNode", 
      "node": {
        "name": "Send Alert",
        "type": "n8n-nodes-base.emailSend",
        "position": [700, 400],
        "parameters": {
          "to": "alerts@company.com",
          "subject": "Workflow Error Alert"
        }
      }
    }
  ]
}

All operations will be processed correctly, even though connections reference nodes that don't exist yet!