From bac4936c6d4b1c5675a893f18ba3ffcd2e58dc08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Romuald=20Cz=C5=82onkowski?= <56956555+czlonkowski@users.noreply.github.com> Date: Wed, 26 Nov 2025 20:17:34 +0100 Subject: [PATCH] fix: add n8n 1.121 availableInMCP and callerPolicy settings support (v2.26.4) (#445) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: add n8n 1.121 availableInMCP and callerPolicy settings support (v2.26.4) n8n 1.121 introduced a new workflow setting `availableInMCP` (boolean) that controls whether a workflow is "Available in MCP". The sanitization whitelist was missing this field, causing it to be silently stripped during workflow updates. Changes: - Added `availableInMCP` to Zod schema in workflowSettingsSchema - Added `availableInMCP` and `callerPolicy` to safeSettingsProperties whitelist - Both settings are now preserved during workflow updates - Settings can be toggled via updateSettings operation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Conceived by Romuald Członkowski - www.aiadvisors.pl/en * test: update tests for callerPolicy and availableInMCP whitelist changes Updated 5 tests in n8n-validation.test.ts that expected callerPolicy to be filtered out. Since callerPolicy and availableInMCP are now whitelisted (n8n 1.121+), the tests now verify these settings are preserved during workflow updates. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --------- Co-authored-by: Claude --- CHANGELOG.md | 12 +++++++ data/nodes.db | Bin 70729728 -> 70729728 bytes package.json | 2 +- package.runtime.json | 2 +- src/services/n8n-validation.ts | 5 ++- tests/unit/services/n8n-validation.test.ts | 38 +++++++++++---------- 6 files changed, 38 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97950d6..fcde21d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [2.26.4] - 2025-11-26 + +### 🔧 Fixed + +- **n8n 1.121 Compatibility**: Added support for new workflow settings introduced in n8n 1.121 + - Added `availableInMCP` (boolean) to settings whitelist - controls "Available in MCP" toggle + - Added `callerPolicy` to settings whitelist - was already in schema but missing from sanitization + - Both settings are now preserved during workflow updates instead of being silently stripped + - Settings can be toggled via `updateSettings` operation: `{type: "updateSettings", settings: {availableInMCP: true}}` + +**Conceived by Romuald Członkowski - [AiAdvisors](https://www.aiadvisors.pl/en)** + ## [2.26.3] - 2025-11-26 ### 🔧 Fixed diff --git a/data/nodes.db b/data/nodes.db index bcf1ed84302263bd2f5c736bb961814946ddcde8..873ca10e0e75eb3d2d67ff62119089b5153f9076 100644 GIT binary patch delta 10833 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 G%Krj1n=AVO delta 12133 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 D1eJj& diff --git a/package.json b/package.json index 14e992a..c12e667 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "n8n-mcp", - "version": "2.26.3", + "version": "2.26.4", "description": "Integration between n8n workflow automation and Model Context Protocol (MCP)", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/package.runtime.json b/package.runtime.json index 84c02f3..c8714fa 100644 --- a/package.runtime.json +++ b/package.runtime.json @@ -1,6 +1,6 @@ { "name": "n8n-mcp-runtime", - "version": "2.26.3", + "version": "2.26.4", "description": "n8n MCP Server Runtime Dependencies Only", "private": true, "dependencies": { diff --git a/src/services/n8n-validation.ts b/src/services/n8n-validation.ts index c839fdd..3371fde 100644 --- a/src/services/n8n-validation.ts +++ b/src/services/n8n-validation.ts @@ -62,6 +62,7 @@ export const workflowSettingsSchema = z.object({ executionTimeout: z.number().optional(), errorWorkflow: z.string().optional(), callerPolicy: z.enum(['any', 'workflowsFromSameOwner', 'workflowsFromAList']).optional(), + availableInMCP: z.boolean().optional(), }); // Default settings for workflow creation @@ -181,7 +182,9 @@ export function cleanWorkflowForUpdate(workflow: Workflow): Partial { 'executionTimeout', 'errorWorkflow', 'timezone', - 'executionOrder' + 'executionOrder', + 'callerPolicy', + 'availableInMCP', ]; if (cleanedWorkflow.settings && typeof cleanedWorkflow.settings === 'object') { diff --git a/tests/unit/services/n8n-validation.test.ts b/tests/unit/services/n8n-validation.test.ts index 045c26e..0211818 100644 --- a/tests/unit/services/n8n-validation.test.ts +++ b/tests/unit/services/n8n-validation.test.ts @@ -403,45 +403,47 @@ describe('n8n-validation', () => { settings: { executionOrder: 'v1' as const, saveDataSuccessExecution: 'none' as const, - callerPolicy: 'workflowsFromSameOwner' as const, // Filtered out (not in OpenAPI spec) + callerPolicy: 'workflowsFromSameOwner' as const, // Now whitelisted (n8n 1.121+) timeSavedPerExecution: 5, // Filtered out (UI-only property) }, } as any; const cleaned = cleanWorkflowForUpdate(workflow); - // Unsafe properties filtered out, safe properties kept + // Unsafe properties filtered out, safe properties kept (callerPolicy now whitelisted) expect(cleaned.settings).toEqual({ executionOrder: 'v1', - saveDataSuccessExecution: 'none' + saveDataSuccessExecution: 'none', + callerPolicy: 'workflowsFromSameOwner' }); - expect(cleaned.settings).not.toHaveProperty('callerPolicy'); expect(cleaned.settings).not.toHaveProperty('timeSavedPerExecution'); }); - it('should filter out callerPolicy (Issue #248 - API limitation)', () => { + it('should preserve callerPolicy and availableInMCP (n8n 1.121+ settings)', () => { const workflow = { name: 'Test Workflow', nodes: [], connections: {}, settings: { executionOrder: 'v1' as const, - callerPolicy: 'workflowsFromSameOwner' as const, // Filtered out + callerPolicy: 'workflowsFromSameOwner' as const, // Now whitelisted + availableInMCP: true, // New in n8n 1.121 errorWorkflow: 'N2O2nZy3aUiBRGFN', }, } as any; const cleaned = cleanWorkflowForUpdate(workflow); - // callerPolicy filtered out (causes API errors), safe properties kept + // callerPolicy and availableInMCP now whitelisted (n8n 1.121+) expect(cleaned.settings).toEqual({ executionOrder: 'v1', + callerPolicy: 'workflowsFromSameOwner', + availableInMCP: true, errorWorkflow: 'N2O2nZy3aUiBRGFN' }); - expect(cleaned.settings).not.toHaveProperty('callerPolicy'); }); - it('should filter all settings properties correctly (Issue #248 - API design)', () => { + it('should preserve all whitelisted settings properties including callerPolicy (Issue #248 - updated for n8n 1.121)', () => { const workflow = { name: 'Test Workflow', nodes: [], @@ -455,14 +457,14 @@ describe('n8n-validation', () => { saveExecutionProgress: false, executionTimeout: 300, errorWorkflow: 'error-workflow-id', - callerPolicy: 'workflowsFromAList' as const, // Filtered out (not in OpenAPI spec) + callerPolicy: 'workflowsFromAList' as const, // Now whitelisted (n8n 1.121+) + availableInMCP: false, // New in n8n 1.121 }, } as any; const cleaned = cleanWorkflowForUpdate(workflow); - // Safe properties kept, unsafe properties filtered out - // See: https://community.n8n.io/t/api-workflow-update-endpoint-doesnt-support-setting-callerpolicy/161916 + // All whitelisted properties kept including callerPolicy and availableInMCP expect(cleaned.settings).toEqual({ executionOrder: 'v0', timezone: 'UTC', @@ -471,9 +473,10 @@ describe('n8n-validation', () => { saveManualExecutions: false, saveExecutionProgress: false, executionTimeout: 300, - errorWorkflow: 'error-workflow-id' + errorWorkflow: 'error-workflow-id', + callerPolicy: 'workflowsFromAList', + availableInMCP: false }); - expect(cleaned.settings).not.toHaveProperty('callerPolicy'); }); it('should handle workflows without settings gracefully', () => { @@ -494,7 +497,6 @@ describe('n8n-validation', () => { nodes: [], connections: {}, settings: { - callerPolicy: 'workflowsFromSameOwner' as const, // Filtered out timeSavedPerExecution: 5, // Filtered out (UI-only) someOtherProperty: 'value', // Filtered out }, @@ -514,19 +516,19 @@ describe('n8n-validation', () => { connections: {}, settings: { executionOrder: 'v1' as const, // Whitelisted - callerPolicy: 'workflowsFromSameOwner' as const, // Filtered out + callerPolicy: 'workflowsFromSameOwner' as const, // Now whitelisted (n8n 1.121+) timezone: 'America/New_York', // Whitelisted someOtherProperty: 'value', // Filtered out }, } as any; const cleaned = cleanWorkflowForUpdate(workflow); - // Should keep only whitelisted properties + // Should keep only whitelisted properties (callerPolicy now whitelisted) expect(cleaned.settings).toEqual({ executionOrder: 'v1', + callerPolicy: 'workflowsFromSameOwner', timezone: 'America/New_York' }); - expect(cleaned.settings).not.toHaveProperty('callerPolicy'); expect(cleaned.settings).not.toHaveProperty('someOtherProperty'); }); });