From fc37907348692bf46ff60286354677a59bfa98f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Romuald=20Cz=C5=82onkowski?= <56956555+czlonkowski@users.noreply.github.com> Date: Thu, 20 Nov 2025 19:19:08 +0100 Subject: [PATCH] fix: resolve empty settings validation error in workflow updates (#431) (#432) --- CHANGELOG.md | 37 +++++++++++ data/nodes.db | Bin 70729728 -> 70729728 bytes package.json | 2 +- src/services/n8n-validation.ts | 26 +++++--- src/services/workflow-diff-engine.ts | 10 ++- src/types/n8n-api.ts | 1 + tests/unit/services/n8n-validation.test.ts | 69 +++++++++++++++++++-- 7 files changed, 130 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fc19ae..8315e72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,43 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [2.22.21] - 2025-11-20 + +### 🐛 Bug Fixes + +**Fix Empty Settings Object Validation Error (#431)** + +Fixed critical bug where `n8n_update_partial_workflow` tool failed with "request/body must NOT have additional properties" error when workflows had no settings or only non-whitelisted settings properties. + +#### Root Cause +- `cleanWorkflowForUpdate()` in `src/services/n8n-validation.ts` was sending empty `settings: {}` objects to the n8n API +- n8n API rejects empty settings objects as "additional properties" violation +- Issue occurred when: + - Workflow had no settings property + - Workflow had only non-whitelisted settings (e.g., only `callerPolicy`) + +#### Changes +- **Primary Fix**: Modified `cleanWorkflowForUpdate()` to delete `settings` property when empty after filtering + - Instead of sending `settings: {}`, the property is now omitted entirely + - Added safeguards in lines 193-199 and 201-204 +- **Secondary Fix**: Enhanced `applyUpdateSettings()` in `workflow-diff-engine.ts` to prevent creating empty settings objects + - Only creates/updates settings if operation provides actual properties +- **Test Updates**: Fixed 3 incorrect tests that expected empty settings objects + - Updated to expect settings property to be omitted instead + - Added 2 new comprehensive tests for edge cases + +#### Testing +- All 75 unit tests in `n8n-validation.test.ts` passing +- New tests cover: + - Workflows with no settings → omits property + - Workflows with only non-whitelisted settings → omits property + - Workflows with mixed settings → keeps only whitelisted properties + +**Related Issues**: #431, #248 (n8n API design limitation) +**Related n8n Issue**: n8n-io/n8n#19587 (closed as NOT_PLANNED - MCP server issue) + +Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en + ## [2.22.20] - 2025-11-19 ### 🔄 Dependencies diff --git a/data/nodes.db b/data/nodes.db index 736d392afc2c0e93c30ccc64d3f1821ef96b0da1..fe92ce1fa7746932619029e0561f3eeadc2790f9 100644 GIT binary patch delta 91259 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 delta 44674 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𖝪Qe6YW@-)1{tTFX+)dwK^fa4uz|6+bPL7E4nt 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 IX}J7<0P_))7ytkO diff --git a/package.json b/package.json index 37d177b..26a2dd3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "n8n-mcp", - "version": "2.22.20", + "version": "2.22.21", "description": "Integration between n8n workflow automation and Model Context Protocol (MCP)", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/src/services/n8n-validation.ts b/src/services/n8n-validation.ts index 439a017..c839fdd 100644 --- a/src/services/n8n-validation.ts +++ b/src/services/n8n-validation.ts @@ -103,7 +103,8 @@ export function cleanWorkflowForCreate(workflow: Partial): Partial { // Remove fields that cause API errors pinData, tags, + description, // Issue #431: n8n returns this field but rejects it in updates // Remove additional fields that n8n API doesn't accept isArchived, usedCredentials, @@ -155,16 +157,17 @@ export function cleanWorkflowForUpdate(workflow: Workflow): Partial { // // PROBLEM: // - Some versions reject updates with settings properties (community forum reports) - // - Cloud versions REQUIRE settings property to be present (n8n.estyl.team) // - Properties like callerPolicy cause "additional properties" errors + // - Empty settings objects {} cause "additional properties" validation errors (Issue #431) // // SOLUTION: // - Filter settings to only include whitelisted properties (OpenAPI spec) - // - If no settings provided, use empty object {} for safety - // - Empty object satisfies "required property" validation (cloud API) + // - If no settings after filtering, omit the property entirely (n8n API rejects empty objects) + // - Omitting the property prevents "additional properties" validation errors // - Whitelisted properties prevent "additional properties" errors // // References: + // - Issue #431: Empty settings validation error // - https://community.n8n.io/t/api-workflow-update-endpoint-doesnt-support-setting-callerpolicy/161916 // - OpenAPI spec: workflowSettings schema // - Tested on n8n.estyl.team (cloud) and localhost (self-hosted) @@ -189,10 +192,19 @@ export function cleanWorkflowForUpdate(workflow: Workflow): Partial { filteredSettings[key] = (cleanedWorkflow.settings as any)[key]; } } - cleanedWorkflow.settings = filteredSettings; + + // n8n API requires settings to be present but rejects empty settings objects. + // If no valid properties remain after filtering, include minimal default settings. + if (Object.keys(filteredSettings).length > 0) { + cleanedWorkflow.settings = filteredSettings; + } else { + // Provide minimal valid settings (executionOrder v1 is the modern default) + cleanedWorkflow.settings = { executionOrder: 'v1' as const }; + } } else { - // No settings provided - use empty object for safety - cleanedWorkflow.settings = {}; + // No settings provided - include minimal default settings + // n8n API requires settings in workflow updates (v1 is the modern default) + cleanedWorkflow.settings = { executionOrder: 'v1' as const }; } return cleanedWorkflow; diff --git a/src/services/workflow-diff-engine.ts b/src/services/workflow-diff-engine.ts index 9b78e95..3538dd8 100644 --- a/src/services/workflow-diff-engine.ts +++ b/src/services/workflow-diff-engine.ts @@ -861,10 +861,14 @@ export class WorkflowDiffEngine { // Metadata operation appliers private applyUpdateSettings(workflow: Workflow, operation: UpdateSettingsOperation): void { - if (!workflow.settings) { - workflow.settings = {}; + // Only create/update settings if operation provides actual properties + // This prevents creating empty settings objects that would be rejected by n8n API + if (operation.settings && Object.keys(operation.settings).length > 0) { + if (!workflow.settings) { + workflow.settings = {}; + } + Object.assign(workflow.settings, operation.settings); } - Object.assign(workflow.settings, operation.settings); } private applyUpdateName(workflow: Workflow, operation: UpdateNameOperation): void { diff --git a/src/types/n8n-api.ts b/src/types/n8n-api.ts index 6b9d30b..be54d28 100644 --- a/src/types/n8n-api.ts +++ b/src/types/n8n-api.ts @@ -56,6 +56,7 @@ export interface WorkflowSettings { export interface Workflow { id?: string; name: string; + description?: string; // Returned by GET but must be excluded from PUT/PATCH (n8n API limitation, Issue #431) nodes: WorkflowNode[]; connections: WorkflowConnection; active?: boolean; // Optional for creation as it's read-only diff --git a/tests/unit/services/n8n-validation.test.ts b/tests/unit/services/n8n-validation.test.ts index 1d5e9e5..045c26e 100644 --- a/tests/unit/services/n8n-validation.test.ts +++ b/tests/unit/services/n8n-validation.test.ts @@ -367,7 +367,23 @@ describe('n8n-validation', () => { expect(cleaned.name).toBe('Test Workflow'); }); - it('should add empty settings object for cloud API compatibility', () => { + it('should exclude description field for n8n API compatibility (Issue #431)', () => { + const workflow = { + name: 'Test Workflow', + description: 'This is a test workflow description', + nodes: [], + connections: {}, + versionId: 'v123', + } as any; + + const cleaned = cleanWorkflowForUpdate(workflow); + + expect(cleaned).not.toHaveProperty('description'); + expect(cleaned).not.toHaveProperty('versionId'); + expect(cleaned.name).toBe('Test Workflow'); + }); + + it('should provide minimal default settings when no settings provided (Issue #431)', () => { const workflow = { name: 'Test Workflow', nodes: [], @@ -375,7 +391,8 @@ describe('n8n-validation', () => { } as any; const cleaned = cleanWorkflowForUpdate(workflow); - expect(cleaned.settings).toEqual({}); + // n8n API requires settings to be present, so we provide minimal defaults (v1 is modern default) + expect(cleaned.settings).toEqual({ executionOrder: 'v1' }); }); it('should filter settings to safe properties to prevent API errors (Issue #248 - final fix)', () => { @@ -467,7 +484,50 @@ describe('n8n-validation', () => { } as any; const cleaned = cleanWorkflowForUpdate(workflow); - expect(cleaned.settings).toEqual({}); + // n8n API requires settings, so we provide minimal defaults (v1 is modern default) + expect(cleaned.settings).toEqual({ executionOrder: 'v1' }); + }); + + it('should provide minimal settings when only non-whitelisted properties exist (Issue #431)', () => { + const workflow = { + name: 'Test Workflow', + nodes: [], + connections: {}, + settings: { + callerPolicy: 'workflowsFromSameOwner' as const, // Filtered out + timeSavedPerExecution: 5, // Filtered out (UI-only) + someOtherProperty: 'value', // Filtered out + }, + } as any; + + const cleaned = cleanWorkflowForUpdate(workflow); + // All properties were filtered out, but n8n API requires settings + // so we provide minimal defaults (v1 is modern default) to avoid both + // "additional properties" and "required property" API errors + expect(cleaned.settings).toEqual({ executionOrder: 'v1' }); + }); + + it('should preserve whitelisted settings when mixed with non-whitelisted (Issue #431)', () => { + const workflow = { + name: 'Test Workflow', + nodes: [], + connections: {}, + settings: { + executionOrder: 'v1' as const, // Whitelisted + callerPolicy: 'workflowsFromSameOwner' as const, // Filtered out + timezone: 'America/New_York', // Whitelisted + someOtherProperty: 'value', // Filtered out + }, + } as any; + + const cleaned = cleanWorkflowForUpdate(workflow); + // Should keep only whitelisted properties + expect(cleaned.settings).toEqual({ + executionOrder: 'v1', + timezone: 'America/New_York' + }); + expect(cleaned.settings).not.toHaveProperty('callerPolicy'); + expect(cleaned.settings).not.toHaveProperty('someOtherProperty'); }); }); }); @@ -1346,7 +1406,8 @@ describe('n8n-validation', () => { expect(forUpdate).not.toHaveProperty('active'); expect(forUpdate).not.toHaveProperty('tags'); expect(forUpdate).not.toHaveProperty('meta'); - expect(forUpdate.settings).toEqual({}); // Settings replaced with empty object for API compatibility + // n8n API requires settings in updates, so minimal defaults (v1) are provided (Issue #431) + expect(forUpdate.settings).toEqual({ executionOrder: 'v1' }); expect(validateWorkflowStructure(forUpdate)).toEqual([]); }); });