All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- MCP Resources surface for n8n-skills markdown. The
n8n-skillsrepo ships seven expert skills (~30 markdown files covering Code node JavaScript/Python, expression syntax, node configuration, validation, workflow patterns, and the n8n-mcp tools themselves) as a Claude Code plugin. That distribution path only reaches Claude Code users with the plugin installed; every other MCP client — Cursor, Claude Desktop without plugins, the OpenAI Agents SDK, custom agents — had no way to discover or read this content even though they all consumen8n-mcp. The MCPresourcescapability is the standard surface for on-demand markdown context, and the server already implementedListResources/ReadResourcefor UI apps underui://n8n-mcp/{id}(src/mcp/server.ts:901-938), so a parallelskill://n8n-mcp/{name}/{file}namespace fits the existing plumbing exactly. A newSkillResourceRegistrymirrorsUIAppRegistry: it scansdata/skills/*/*.mdat server construction, parses frontmatter (or the first heading as fallback) for resource metadata, and serves each markdown file withmimeType: text/markdown. A bareskill://n8n-mcp/{name}URI resolves to that skill'sSKILL.mdas a convenience, and a newresources/templates/listhandler advertises both URI templates (skill://n8n-mcp/{name}andskill://n8n-mcp/{name}/{file}) so capable clients can construct URIs without enumerating first. The existingui://n8n-mcp/{id}resolution is unchanged — both schemes coexist in the sameListResources/ReadResourcehandlers. The skill markdown is brought into the npm artifact and Docker image via a newnpm run sync:skillsscript that copies from a siblingn8n-skills/skills/checkout (configurable viaN8N_SKILLS_SOURCE), with the copy committed underdata/skills/so CI and downstream consumers do not need the sibling repo present.package.jsonfilesand the Dockerfile both shipdata/skills/. Skills are exposed unconditionally — they are low-cost (~28k lines, loaded once at startup) and Claude Code's plugin distribution and the MCP Resources surface intentionally serve different clients: a Claude Code user installs the plugin for the auto-loadedSkilltool UX, and everyone else now gets the same content viaresources/list. Coverage: 15 unit tests against the registry.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Batch
n8n_update_partial_workflowoperations no longer fail with a phantom "Source node not found" when a laterupdateNoderenames a node referenced by an earlier connection op (#788). The diff engine previously processed operations in two passes — every node op (add/remove/update/move/enable/disable) ran first, then every connection op — so a batch like[removeConnection NodeA→NodeB, removeNode NodeB, updateNode NodeA→{name:"NodeB"}, addConnection NodeB→NodeC]validatedoperation 0against state that already had the rename projected on it, even though the rename was scheduled foroperation 3. Because connection references are rewritten in-place when a node is renamed (the #353 auto-update behavior), the originalNodeAhad effectively vanished from the validator's view before its ownremoveConnectionran, and the error's "Available nodes" list — which showed the post-rename node set against a failure reported onoperation 0— was the giveaway. The engine now applies operations strictly in caller order and runsflushPendingRenames()after each op so connection references catch up to the new node name before the next op validates; chained renames (A→BthenB→C) consequently compose correctly, where the previous renameMap-based post-pass would have collided on the intermediate key. A single backward-compat case is preserved: anaddConnectionorrewireConnectionthat references anaddNodedeclared later in the same batch is still accepted — that oneaddNodeis hoisted to just before its first earlier reference. Other op kinds (notablyremoveConnection X→YbeforeaddNode X, orreplaceConnectionsreferencing a not-yet-added node) are no longer reordered and now fail validation at their actual call site, which matches what the caller is actually asking for. As a defense against a related Copilot-flagged edge case,applyUpdateNodeno longer records a rename intent inrenameMapbefore the updates loop runs — if a subsequent path inside the same updates object throws (forbidden path keys,__patch_find_replacefailures), the rename is never committed, socontinueOnErrormode cannot carry a phantom rename into a later op and silently rewrite connection keys to a name no node carries. Six regression tests cover the #788 batch in bothvalidateOnlymodes, thecontinueOnErrorvariant, the legacy hoist, the strict negative case, and the rename-leak guard. Thedocs/workflow-diff-examples.md"two-pass processing" section is rewritten to describe the new sequential semantics and the single backward-compat hoist. Reported by @DocksDocks; fix by @AjTheSpidey.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- SSRF guard no longer blanket-rejects IPv6 addresses on DNS64/NAT64 networks reaching public IPv4 servers. A community user reported that every n8n API call started failing with
SSRF protection: IPv6 private address not allowedafter their environment switched to a resolver that synthesizesAAAArecords via DNS64 — Node 17+ returns the synthetic64:ff9b::<public-IPv4>address first under default verbatim DNS ordering, and the previous blanket block on the64:ff9b::/96prefix rejected it. The IPv6 helper now inspects the canonical hextets of recognized tunneling prefixes and extracts the embedded IPv4, then applies the samePRIVATE_IP_RANGESandCLOUD_METADATApolicy already enforced on plain IPv4 destinations. Supported layouts: NAT64 RFC 6052 well-known64:ff9b::/96; NAT64 RFC 8215 local-use at the64:ff9b:1::/96sub-prefix layout (parts[3..5] == 0) — RFC 8215 §3.1 recommends operators carve /96 sub-prefixes for IPv4 embedding, so this covers the realistic deployment; 6to4 RFC 30562002::/16; and Teredo RFC 43802001::/32. Tunneled private/metadata IPv4 — including the original GHSA-56c3-vfp2-5qqj payloads64:ff9b::a9fe:a9fe,2002:a9fe:a9fe::, and the equivalent loopback/RFC1918 embeddings — stays blocked. Tunneled public IPv4 (e.g.64:ff9b::8.8.8.8) is now allowed. Non-canonical shapes within the same prefix families —64:ff9b:outside the supported /96 layouts (including the literal RFC 6052 /48 embedding that interleaves the IPv4 around a u-octet at bits 64-71), and any 6to4/Teredo we don't recognize — fail safe and are blocked. Tunneled cloud-metadata and non-canonical tunneling shapes are now gated in every security mode (including permissive), restoring the "metadata blocked in all modes" promise and the fail-safe stance for unknown wire formats. IPv6 parsing is delegated toipaddr.js(already a transitive dependency viaexpress → proxy-addr, now promoted to a direct dep at the same^1.9.1version, so the install footprint is unchanged). Reported by Luca M.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Multi-tenant
sharedsession strategy no longer terminates concurrent sessions for the same tenant (#783). Previously, the eager same-instance session cleanup at the top of the HTTPinitializehandler ran before the configuredMULTI_TENANT_SESSION_STRATEGYwas consulted. When the strategy was set toshared— intended to let multiple MCP clients reuse the same tenant context concurrently — a second client'sinitializefor the samex-instance-idstill wiped the first client's session, leaving the first client to fail subsequent requests withSession not found or expired. The cleanup is now gated behindENABLE_MULTI_TENANT=true && MULTI_TENANT_SESSION_STRATEGY=instance, restoring the documented behavior ofshared. Theinstancestrategy is unchanged: same-tenant inits still replace prior sessions, which is the desired eager-cleanup semantic there. Two regression tests cover both branches. Reported and fixed by @LevSky22. - HTTP Streamable transport now returns
404(not400) for terminated session IDs, per the MCP spec (#784). The MCP Streamable HTTP spec (2025-06-18) requires servers to respond with404when a request carries a valid-formatMcp-Session-Idthat no longer maps to an active session — that's the client's signal to start a fresh session viainitialize. The server previously responded with400 Bad Request: Session not found or expired, which spec-compliant clients (Claude Desktop, the MCP SDK) cannot distinguish from a genuinely malformed request, so they surface the error to the user instead of auto-reconnecting. The two affected sites (the TOCTOU window after the session-existence check, and the regular non-initializefall-through) now return404withSession not found or expired.400is preserved for genuinely bad requests (missing session ID on a non-initializerequest), and202is preserved for stale-session notifications (the anti-reconnect-storm path from #654). Reported and fixed by @LevSky22. n8n_get_workflowno longer exceeds Claude Code's per-tool result cap on active workflows (#777). n8n's draft/publish model returns a nestedactiveVersionobject on every workflow GET, duplicating the live graph'snodesandconnectionsalongside the draft. On the ~50% of workflows that are active, this pushed responses past Claude Code's default 25 000-token MCP cap, so the host persisted the result to a/var/folders/...file the model's sandboxed Bash couldn't read — effectively breaking the tool for any non-trivial workflow.handleGetWorkflow(modefull) andhandleGetWorkflowDetails(modedetails) now strip the heavyactiveVersionpayload while preserving the lightweightactiveVersionIdpointer, cutting response size roughly in half. As a defense-in-depth layer for genuinely huge workflows, then8n_get_workflowtool definition now carries_meta["anthropic/maxResultSizeChars"]: 450000to opt the tool above the default cap (per the Claude Code MCP spec) — the value sits below the protocol's 500k-char ceiling to leave headroom for the MCP/JSON-RPC envelope.UIAppRegistry.injectToolMetawas switched from assignment to a spread-merge so per-tool_metakeys (like the size override) are preserved when UI metadata is injected. Reported by @nepalez.
n8n_get_workflowgainsmode='active'for inspecting the published graph. Because n8n's editor saves a draft separately from the published/running version, callers that need to reason about what is actually executing (rather than what is being edited) now have a dedicated mode. The response is single-shaped —nodesandconnectionsare populated fromactiveVersion, withactiveVersionId,versionCreatedAt, andversionNameexposed at the top level.versionCreatedAtis the version row's creation timestamp (within ~1s of the publish event in current n8n; we don't claim they're identical). On older n8n versions without the draft/publish split, the mode falls back toworkflow.nodeswhenactive: trueso the mode stays usable across n8n versions;NO_ACTIVE_VERSIONis returned only for inactive workflows that were never published. Type-safe support for the new fields was added to theWorkflowinterface asActiveWorkflowVersion.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Updated n8n dependencies to 2.20.x.
n8n-nodes-base2.18.3 → 2.20.4,n8n-core2.18.3 → 2.20.3,n8n-workflow2.18.3 → 2.20.0,@n8n/n8n-nodes-langchain2.18.3 → 2.20.4. Pinned exactly (no caret) so a freshnpm installafter a future minor release of any of these packages can't slip in a different node set thandata/nodes.dbwas rebuilt against —scripts/update-n8n-deps.jsnow writes exact pins for the same reason. Database rebuilt against the new packages; community node rows preserved across the rebuild. get_node(essentials/standard detail)versionfield is now a number, not a string (behavior change for all callers, not just community nodes). Previously the value came straight from the SQLiteversionTEXT column ("1","2.3"); it is now coerced to a finite JS number (1,2.3) so it can be assigned directly astypeVersionin workflow JSON. Callers that did.startsWith(), regex matching, or string comparison on the field need to coerce themselves or update to numeric handling. TheversionNoticestring is unchanged.
- Community nodes: stop advertising npm package version as
typeVersion(#781). For community nodes,get_nodepreviously returned the npm package version (e.g."0.2.21") in theversionfield and emittedversionNotice: "Use typeVersion: 0.2.21 when creating this node". The advertised value is not a valid JS number — assigningtypeVersion: 0.2produced workflows that n8n's runtime rendered as red/broken nodes even though bothvalidate_workflowandn8n_validate_workflowreported them as valid. The community-node parser no longer falls back to the npm package version when the descriptor's version is missing (Strapi path) and never seeds the npm version astypeVersion(npm-only path); both default to1, which is what declarative community nodes register at runtime. Theget_noderesponse, for community nodes, surfacesisCommunity: true,npmVersion, a community-awareversionNotice, and ametadata.versionCoercedaudit field whenever stale seed data has to be resolved on the fly. The shippeddata/nodes.dbis migrated in place: 118 community rows whose storedversionwas a multi-dot semver or contained letters were reset to'1'.WorkflowValidator.validateAllNodesnow rejects non-finite typeVersions (includingNaN) with an explicit "must be a finite non-negative number" message, parses comma-separated and array-formnodeInfo.versionstrings before min/max comparisons, falls back to suggestingtypeVersion: 1when the database version is unparseable, and emits a "Cannot validate typeVersion" warning when stored seed data is unparseable so callers know the min/max checks were skipped rather than silently passed. Reported by @czlonkowski.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Fix workflow-telemetry URL path and query-string leak (GHSA-f3rg-xqjj-cj9w).
WorkflowSanitizerpreviously replaced only the hostname ofurl,endpoint, andwebhookfield values with[domain]and left the path and query string intact, allowing customer IDs in URL paths, tenant identifiers, signed-request parameters, and tokens shorter than the 20-character generic-token threshold to reach thetelemetry_workflowsandworkflow_mutationsSupabase tables.sanitizeObjectnow fully redacts URL-named fields to[REDACTED_URL]regardless of value type, the dead hostname-only branch insanitizeStringis removed, andevent-validator.tsreplacesnodes: z.array(z.any())with a.strict()per-node schema that rejects unknown top-level node keys as defense-in-depth. The mutation telemetry path (sanitizeWorkflowRaw) shares the same code path and is fixed automatically. Reported by @u-ktdi.
- Telemetry output format changed. Anyone consuming the local telemetry analytics will see
[REDACTED_URL]in place of the previoushttps://[domain]/<path>?<query>and[REDACTED_URL_WITH_AUTH]placeholders forurl,endpoint,webhook, and similarly-named fields. Pattern-specific placeholders ([REDACTED_SUPABASE_URL],[REDACTED_N8N_HOST_URL],[REDACTED_WEBHOOK], etc.) still apply to free-text node parameters that happen to contain those URLs (e.g.jsCode,systemMessage). - The webhook short-circuit in
sanitizeString(returnshttps://[webhook-url]when a string value contains/webhook/or/hook/) remains for non-URL-named fields whose value embeds a webhook URL.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Fix silent env-credential fallback in multi-tenant HTTP mode (GHSA-jxx9-px88-pj69). When
ENABLE_MULTI_TENANT=true, requests that omitted thex-n8n-urlandx-n8n-keyheaders fell through to the process-levelN8N_API_URL/N8N_API_KEY, letting one authenticated MCP tenant operate on the operator's n8n instance. Both paths now fail closed: the HTTP edge rejects header-less multi-tenant requests with400 Multi-tenant headers required, andgetN8nApiClientrefuses to construct an env-fallback client whenENABLE_MULTI_TENANT=true. Single-tenant mode is unchanged. Reported by @u-ktdi.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Hardened
WorkflowSanitizer(telemetry workflow ingestion) against new secret and PII categories (#779). Added regex coverage for OpenAIsk-proj-/ OpenRoutersk-or-, Stripe, GitHub PATs, GitLab, Hugging Face, Notion, GoHighLevel, Slack, AWS access key IDs, generic JWTs, Supabase secret/publishable keys, self-hosted n8n hostnames, and Supabase project URLs — all with type-aware placeholders ([REDACTED_LLM_API_KEY],[REDACTED_SUPABASE_KEY],[REDACTED_STRIPE_KEY],[REDACTED_API_TOKEN],[REDACTED_JWT],[REDACTED_N8N_HOST_URL],[REDACTED_SUPABASE_URL]). Added email and phone redaction for free-text node parameters (systemMessage,text,html,prompt, …). Made the generic 20-31 / 32+ char fallbacks idempotent via a(?!REDACTED)negative lookahead and dropped the early-break insanitizeStringso strings with secrets matching different patterns get every match redacted. Tightened the Bearer regex to stop at common string delimiters (quotes, commas, semicolons, closing brackets) soauth: 'Bearer <token>'no longer eats the closing quote. Tightened the phone regex with digit/hyphen lookbehind/lookahead so UUIDs and other hex-with-hyphen IDs aren't misclassified as phone numbers.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
n8n_manage_credentialsnow reports which workflows reference each credential. PassincludeUsage: truetoaction: "list"oraction: "get"to attach ausedIn: [{id, name, active}]array and ausageCountto every credential. The reverse index is built client-side by scanning workflows (n8n's public API has no native lookup), deduplicated per workflow, and capped at the same 5000-workflow limitn8n_audit_instanceuses. Default behavior is unchanged — no extra API calls when the flag is omitted. If the workflow scan fails the response degrades to base credentials with ausageScanErrorfield rather than failing the whole call.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Advertise the Bearer auth scheme on
401responses (#604). HTTP-mode/mcp,/sse, and/messagesnow return an RFC 6750-compliantWWW-Authenticatechallenge alongside the existing JSON-RPC-32001error body. Missing-credentials responses useBearer realm="n8n-mcp"(noerror=keyword, per RFC 6750 §3); rejected credentials useerror="invalid_request"for non-Bearer schemes anderror="invalid_token"for bad bearer secrets. Lets MCP scanners and OAuth-discovery clients distinguish "auth required" from "endpoint unreachable" without reading the JSON body. Originally authored by @voidborne-d (#767).
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
n8n_list_workflowsandn8n_executionsno longer fail withVALIDATION_ERROR: Empty value found for query parameterwhen MCP clients (e.g. opencode v1.14.35) serialize all schema fields — including optional ones — as empty strings. Optional string params (cursor,projectId,workflowId,status,sortBy,search) are now coerced toundefinedbefore reaching the n8n API. Reported and diagnosed by @ale90bsas (#774).- The same coercion is applied to
n8n_manage_datatable(list/create/get-rows actions),n8n_test_workflow, andn8n_trigger_webhook_workflow, all of which had the same vulnerability surface from a broader audit. serializeDataTableParamsin the n8n API client now also skips blank-string values as defense-in-depth.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
n8n_update_partial_workflownow rolls back the prior workflow snapshot when n8n persists a body before failing (e.g. unsupportedtypeVersiontrips the activation step inside the same PUT), preventing silent corruption of active workflows. Reported and originally fixed by @pybe (#769, closes #770).- The rollback no longer fires (and no longer claims
(workflow restored to prior state)) when n8n rejected the PUT before persisting. The handler now comparesversionId/versionCounter/updatedAtfrom a fresh GET to detect whether persistence actually happened. - Rollback-failure responses include
details.priorVersionIdso callers can recover the right snapshot vian8n_workflow_versions.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Fix SSRF in webhook URL validation (GHSA-cmrh-wvq6-wm9r). Reported by @fg0x0.
- The n8n API client now validates
N8N_API_URLthrough the same SSRF gate as user-supplied webhook URLs. Operators running n8n on the same host as n8n-mcp (N8N_API_URL=http://localhost:5678or an RFC1918 address) must setWEBHOOK_SECURITY_MODE=moderate(allows localhost, still blocks cloud metadata) to keep the API client functional after upgrade. Defaultstrictis unchanged for production deployments with a public n8n URL.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Fix path-segment validation gap in n8n API client (GHSA-8g7g-hmwm-6rv2). Reported by @cybercraftsolutionsllc.
- Fix redirect-following on validated webhook, form, and chat trigger requests (GHSA-8g7g-hmwm-6rv2). Reported by @cybercraftsolutionsllc.
- Redact mutation telemetry payloads before storage (GHSA-8g7g-hmwm-6rv2). Reported by @cybercraftsolutionsllc.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Local LLM support for template metadata generation.
fetch:templates --metadata-onlynow routes to any OpenAI-compatible server (vLLM, Ollama, llama.cpp's/v1) whenN8N_MCP_LLM_BASE_URLis set, falling back to OpenAI's Batch API otherwise. NewSequentialMetadataProcessorissues directchat.completions.createcalls with configurable concurrency, since vLLM and friends do not implement OpenAI's/v1/batchesendpoint. New env vars:N8N_MCP_LLM_BASE_URL,N8N_MCP_LLM_MODEL(defaultQwen/Qwen3.5-9B),N8N_MCP_LLM_API_KEY(defaults toEMPTYfor keyless local servers),N8N_MCP_LLM_CONCURRENCY(default 40). The cloud Batch path is unchanged. - Stronger, leak-resistant prompt for template metadata. The system message now spells out what each schema field means (categories, use_cases, required_services, key_features, target_audience) and explicitly forbids echoing prompt headers, which fixes a class of failures where smaller open-source models occasionally emitted
Template: ...strings into thecategoriesarray.createBatchRequest()now delegates tobuildChatRequest(), so the cloud Batch path picks up the new prompt too — both paths share the same body verbatim.
- Template store refreshed from n8n.io. The templates table was rebuilt against the current API: 2,352 templates, 156 ranked node configurations across the most-popular nodes. Previous rebuild dated 2025-12-24.
- Template metadata regenerated end-to-end against a local Qwen3.5-9B vLLM instance: 2,351/2,352 templates carry fresh
metadata_json(99.96% coverage). One template (4334) skipped due to a tokenizer encoding edge case in its source content. - Community node store refreshed from the n8n Strapi verified list and the top-100 npm packages: 830 community nodes (was 768, +62 new). Existing READMEs and AI summaries preserved through the upsert. Total nodes in DB: 1,650 (820 base + 830 community).
- Community AI documentation summaries regenerated against the same local Qwen3.5-9B instance: 825/830 nodes with both
npm_readmeandai_documentation_summary(99.4% coverage). The 5 misses are npm packages that publish no README on npmjs, so there is no source text to summarise.
- Template fetch only drops the
templatesandtemplates_ftstables — nevernodes. Community nodes were verified intact at 768 mid-run before the separate community refresh added the 62 new ones. - A backup of the pre-fetch database lives at
/tmp/nodes-pre-template-update-20260502-093230.dbon the maintainer's machine.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Updated n8n to 2.18.4 (from 2.16.1). All four n8n packages bumped to the versions pinned by
n8n@stable:n8n-nodes-base: 2.16.0 → 2.18.3n8n-core: 2.16.1 → 2.18.3n8n-workflow: 2.16.0 → 2.18.3@n8n/n8n-nodes-langchain: 2.16.1 → 2.18.3- Pins are now exact (no caret) to prevent npm from auto-resolving to
2.19.0, whichn8n@stabledoes not yet endorse and which would also force a differentzodpeer.
- Bumped
zodto 3.25.67 (from 3.24.1) to satisfy the newzodpeer dependency declared byn8n-core@2.18.3andn8n-workflow@2.18.3— the same versionn8n@stableitself depends on. - Rebuilt node database: 1,588 nodes total — 820 core (675 from
n8n-nodes-base+ 145 from@n8n/n8n-nodes-langchain) + 768 community (668 verified + 100 from npm). Community READMEs refreshed viagenerate:docs:readme-only(763/768 with READMEs, 581/768 with AI summaries — the AI-summary backfill for newly-added community nodes runs separately via the local LLM step). - README badges and node counts updated to reflect the new n8n version, node totals, and current passing-test count (
5,418).
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Validator warning for
__rlresourceLocator fields missingcachedResultName(#715, originally reported in #516 by @upsurge911-lgtm). When a__rlfield hasmodeandvaluebut nocachedResultName, the workflow runs but the n8n UI shows "Choose..." in dropdowns and dependent metadata fetches (column lists, base names, etc.) never fire — users see "No columns found" with no obvious cause. Pre-fix the validator was completely silent on this. Newmissing-cached-result-namewarning fires atruntime/ai-friendly/strictprofiles (suppressed atminimal). The warning is gated to modes where the n8n UI renders a dropdown that displays the cached label (id,list,name) — modes with raw inputs (expression,url) are skipped to avoid false positives. The autofix half (live n8n API resolution + placeholder fallback) ships in a separate follow-up PR.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
n8n_audit_instanceerror message now distinguishes server-side from client-side failures (#736, reported by @waltho1123-cloud). Pre-fix the warning was alwaysBuilt-in audit failed: <message>, hiding HTTP status. The reporter's Zeabur deployment generates theInvalid URLstring inside n8n's own audit code (likely from missingN8N_PROTOCOL/N8N_HOSTenv vars) and returned it as the response body — but the warning made it look like a client bug. Three new shapes:endpoint not available(404, unchanged);Built-in audit failed (HTTP <status>): <reason>for any other status;Built-in audit failed (no response from n8n): <reason>when no status was returned (timeouts, ECONNREFUSED). Also fixed a long-standing nit where the error path computedbuiltinAuditMsagainsttotalStartinstead ofauditStart.n8n_manage_credentialsacceptsoAuth2Api+clientCredentialspayloads (#740, reported by @bwsnwl). n8n's upstream Ajv schema foroAuth2Apihas a known bug: theif/then/elseonuseDynamicClientRegistrationusesproperties.x.enumto test value, which evaluates true vacuously when the field is absent — so boththenbranches fire simultaneously and there is no payload shape that satisfies the schema for a plainclientCredentialsgrant. NewapplyCredentialDataShimshelper normalizes the payload for that specific combination: stripsuseDynamicClientRegistrationwhen falsy, injectssendAdditionalBodyProperties: false,additionalBodyProperties: '', andserverUrl: ''(only when the DCR branch fires spuriously — explicituseDynamicClientRegistration: truecallers are left alone so n8n surfaces real missing-field errors). Applied symmetrically on both create and update paths. Will be removed once n8n fixes the schema upstream.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
n8n_update_partial_workflowvalidateOnly path now matches the apply path (#744, reported by @Valirius). Two interacting bugs:- Path divergence:
validateOnly: truereturned the structural-validation early-exit BEFOREvalidateWorkflowStructureran. Reporters could see a greenvalid: truefrom validate-only and then fail the apply call with a structural error. The structural check now runs in both paths, and the validate-only response includes the samestructureErrorsthe apply path would surface, plus avalidboolean that reflects post-diff structural validity. The diff engine'svalidateOnlyreturn now carries the simulated post-diffworkflowso the handler has something to validate against. - Zod 4 record-key incompatibility: Single-arg
z.record(valueSchema)is reinterpreted by Zod 4 (bundled by@modelcontextprotocol/sdk) asz.record(keySchema=valueSchema), causing node-name strings like"W-05b Set Context"to fail with_zod/Invalid key in record. Allz.recordcalls inn8n-validation.ts(workflowNodeSchema.parameters,.credentials,workflowConnectionSchema) andhandlers-n8n-manager.ts(createWorkflowSchema.connections,updateWorkflowSchema.connections) now use the explicit two-argz.record(z.string(), valueSchema)form which is unambiguous in both Zod 3 and Zod 4.
- Path divergence:
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
Three validator/diff false-positive fixes that were blocking valid workflows from being authored or updated via the MCP tools.
addConnectionno longer rejects multiple Switch outputs to the same target (#738, reported by @priyasogani8-star).validateAddConnectionwas scanning everysourceIndexslot when checking for duplicates, so wiring Switch output 1 to a node that already had a connection from output 0 falsely failed with "Connection already exists". The check now resolves smart parameters (branch/case) the same wayapplyAddConnectiondoes and only inspects the specific(sourceOutput, sourceIndex)slot. The error message now also includes the resolved index for clarity. Same change applied tovalidateRewireConnectionto suppress duplicate sourceIndex warnings (validate + apply phases were both pushing them) —resolveSmartParametersgained an opt-insilentmode used only from validate.validate_workflowno longer false-flags operations on community nodes with empty schema (#739, reported by @priyasogani8-star).EnhancedConfigValidator.validateResourceAndOperationwas emittingInvalid operation "X" for node ...for any non-empty operation value when the node was missing or had empty operation metadata. The puppeteer community node (and similarly indexed packages) ARE in the local DB but with emptyoperations/properties_schemacolumns, sogetNodeOperations()returned[]and any explicit operation was rejected. Three new guards: top-of-method early-exit whengetNode()returns null, plus per-field skips when the node has zero resource schema or zero operation schema globally. Real typos on KNOWN nodes (e.g.operation: "sendMessage"on Slack) still surface correctly.n8n_validate_workflowno longer false-flags Code nodes with template literals or compact}}(#746, reported by @MarsSall).ExpressionFormatValidator.validateRecursivewalked intojsCode/pythonCodefields and fed the source to a bracket-balance check that miscounted{{vs}}on JS object literals like[{json:{x:1}}]. The validator now skips raw-code field keys (jsCode,pythonCode,functionCode) — mirrors the existing guard inExpressionValidator.validateParametersRecursive. The skip applies wherever those keys appear in the parameters tree (top-level or nested).
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Fix IPv6-mapped SSRF bypass in synchronous URL validation (GHSA-56c3-vfp2-5qqj, CVSS 8.5 High).
SSRFProtection.validateUrlSyncnow rejects IPv4-mapped IPv6 (::ffff:169.254.169.254,::ffff:127.0.0.1, etc.) and private IPv6 addresses, matching the async webhook validator. The sync gate is the sole SSRF check in the SDK embedder path (validateInstanceContext→getN8nApiClient), so the bypass enabled cloud metadata access andx-n8n-api-keyleakage for callers ofN8NDocumentationMCPServer/N8NMCPEnginewith user-suppliedInstanceContext. Reported by @manthanghasadiya.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Redact MCP tool-call arguments in server logs (GHSA-wg4g-395p-mqv3, CVSS 4.3 Medium). Reported by @Mirr2.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
Batch of ten fixes from the 2026-04-16 staging QA regression (release-blockers and polish items shipped together).
get_nodeversion modes no longer returnupgradeSafe: truewith no data (QA #1 + #12, HIGH).versions,compare,breaking, andmigrationsmodes now check whether version metadata is populated for the node before computing their booleans. When metadata is missing, they return{ available: false, reason: "Version metadata not populated…" }instead of a confidently-zero response. Agents that previously sawupgradeSafe: truefor a known-breaking HTTP Request v1 → v4 upgrade will now get an explicit "no data" signal.getVersionSummaryalso falls back to the node row'sversionfield sodetail: standardno longer reportscurrentVersion: "unknown"whileisVersioned: truein the same response.rewireConnectionno longer silently corrupts the connection map (QA #7, HIGH).applyRewireConnectionnow resolvessource/from/toto concrete node objects up front, passes resolved names through to the inner remove/add calls, skips the add whentois already a target ofsource(previously caused a duplicated edge), and asserts an edge-count invariant that throws if the rewrite would leave the graph in an inconsistent state. Added regression tests for name-based rewire, ID-based rewire, and rewire-to-already-connected-target.search_templatesby_metadatareturnsavailable: falsewhen metadata is missing (QA #11, HIGH). Previously returned an emptyitems: []that callers couldn't distinguish from "no matches". Now returns{ available: false, reason: "Template metadata has not been enriched yet…" }when no templates havemetadata_jsonpopulated, andavailable: trueon hits. Callers get an actionable signal to fall back tokeyword,by_nodes, orpatterns.search_templatesby_task: webhook_processingno longer returns schedule/form-triggered templates (QA #2, MEDIUM). Removedn8n-nodes-base.httpRequestfrom thewebhook_processingtask mapping. HTTP Request is not a trigger, so its presence matched any workflow that used outbound HTTP — including schedule and form triggered ones. Now matches only workflows that include the webhook trigger node.- QA #3 (MEDIUM) — deferred. An initial attempt to reject invalid
operationvalues inNodeSpecificValidators.validateSlackused a hardcoded resource→operations map, which turned out to disagree with the actual Slack node's schema (ironically,post— the value the QA report flagged as "silently accepted" — is a real Slack message op in n8n). Rather than ship a regression that rejects valid configs, the hardcoded list was removed and the issue deferred until the validator can derive the allowed set from the node's loadedproperties_schema. moveNodeno longer silently mutates state when the wrong param name is passed (QA #6, MEDIUM).validateMoveNodenow catches the commonnewPositiontypo with a "did you mean 'position'?" message before mutation, and also validates thatpositionis a 2-element numeric array. Previously the operation setnode.positiontoundefinedand only failed at the final workflow-shape check with a crypticposition Requirederror.n8n_autofix_workflowwebhook path UUID is now stable across preview and apply (QA #4, LOW). Previously each call generated a freshcrypto.randomUUID(), so the path shown in preview didn't match the path applied to the workflow. The UUID is now derived deterministically via UUID v5 (SHA-1-based per RFC 4122) fromworkflow.id + node.id, so preview and apply always agree. Downstream systems pre-configured against the preview value will now receive the same path.n8n_update_partial_workflowactivate/deactivate ops are now mutually exclusive (QA #8, LOW). A batch like[activateWorkflow, deactivateWorkflow]previously returnedactive: truebecause the first op's flag was never cleared. The appliers now clear the opposite flag so last-op-wins semantics apply.n8n_update_partial_workflowtool description now documentspatchNodeFieldparameters inline (QA #5, LOW). AddedfieldPath (dot path, e.g. "parameters.jsCode") and patches: [{find, replace}]to the short tool description so agents can construct the operation without an extratools_documentationround-trip.n8n_manage_datatabledeleteRowsdryRun no longer returns a null "after" row (QA #10, LOW). Stripped entries withdryRunState: "after"from delete responses — those rows always had every field null because there is no "after" state for a delete, and they surfaced as noise. Update/upsert dryRun responses are unchanged.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Fix sensitive data logging in HTTP mode (GHSA-pfm2-2mhg-8wpx). Reported by @S4nso.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
projectIdparameter onn8n_manage_datatablecreateTable(Issue #731, reported by @nesl247). Tables can now be created directly in a specific n8n project instead of always landing in the default/personal project. The n8n public API (POST /data-tables) already acceptsprojectIdas an optional body field — it was never wired through the MCP tool.projectIdis threaded through the tool inputSchema, the ZodcreateTableSchema, and thecreateDataTableAPI client signature, matching the existing pattern onn8n_create_workflow. Workflows in team projects that rely on project-scoped data tables (e.g. queue-based processing) can now be fully automated via MCP.
columnsis now required (at least one) forn8n_manage_datatablecreateTable. Previously the tool schema markedcolumnsas optional, but the underlying n8n API rejects the call withVALIDATION_ERROR: request/body must have required property 'columns'. The Zod schema now enforces.min(1, 'At least one column is required')so the failure surfaces at the MCP boundary with a clear message instead of an opaque 400 from the API round-trip. Tool inputSchema description,keyParameters,full.description, parameter docs, and pitfalls are all updated to match.
- Removed incorrect pitfall claiming
projectIdcould not be set via the public API inn8n_manage_datatabletool docs. The n8n API has always supported it; this documentation was misleading agents into manual UI workarounds.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Update n8n to 2.16.1. Bumped
n8n-nodes-base2.15.0 → 2.16.0,n8n-core2.15.0 → 2.16.1,n8n-workflow2.14.1 → 2.16.0, and@n8n/n8n-nodes-langchain2.14.1 → 2.16.1. These are exact-pinned to match the coherent dependency set that ships with n8n 2.16.1, since the individual packages'latestdist-tags on npm lag behind the meta-package release (e.g.n8n-workflow@latestis 2.13.1 while n8n 2.16.1 actually pins 2.16.0). - Rebuilt node database. 1,505 nodes total: 812 core (675 from
n8n-nodes-base+ 137 from@n8n/n8n-nodes-langchain) and 693 community nodes (605 verified, 88 unverified). Community nodes preserved incrementally across the rebuild via backup/restore — 108 new READMEs fetched for nodes added since the last sync. - Updated README n8n version badge (2.14.2 → 2.16.1) and node counts (1,396 → 1,505; 516 → 605 verified community).
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
n8n_create_workflow/n8n_update_full_workflowfailures from JSON-stringified array parameters (Issue #611, reported by @Mte90). VS Code + GitHub Copilot and some other MCP clients serialize array/object tool arguments as JSON strings rather than native JSON types. This reliably affected workflows with 3+ nodes or complex nested parameters (e.g.__rlresource-locator objects, filter conditions), producing the error"nodes must be an array, got string"while 1-2 node payloads happened to slip through. Then8n_update_partial_workflowschema already preprocessed itsoperationsfield withtryParseJson(from the prior #600/#611 fix), but the create/update-full schemas did not — now they do.nodes,connections, andsettingson both schemas, plus thetagsfilter onn8n_list_workflows, are wrapped withz.preprocess(tryParseJson, ...)so stringified JSON is parsed before Zod validation runs. ThetryParseJsonhelper was relocated to sit next to its first usage rather than 2,400 lines below it.- Silent JSON parse failures in
coerceStringifiedJsonParamsnow log a warning. The top-level client-bug workaround inserver.tshad twocatch {}blocks that swallowed parse errors without trace, so malformed or truncated JSON from buggy MCP clients presented only as downstream Zod errors. Both catch blocks now emit alogger.warnwith the parse error, a 200-char value preview, and the length — enough to diagnose serialization bugs without digging into transport-level logs.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Multi-input Merge node false positive (Issue #721). The strict validator hardcoded the Merge node's input count as 2, rejecting valid connections to inputs 2+ when
numberInputswas set higher (e.g., combine mode with 4 inputs). The validator now reads thenumberInputsparameter from the workflow node and skips input bounds checking entirely for non-Merge nodes, since many n8n nodes accept dynamic inputs that can't be determined from metadata alone. - Code node return validation false positive (Issue #721). The validator flagged
return {status: "ok"}as "Return value must be an array of objects" even inrunOnceForEachItemmode, where n8n auto-wraps bare objects. The return-format checks now respect the Code node'smodeparameter for both JavaScript and Python. - Controlled loop false positive (Issue #721). Intentional pagination loops (e.g., HTTP Request → IF → Wait → HTTP Request) were flagged as "Workflow contains a cycle (infinite loop)" because the cycle detector only recognized SplitInBatches/Loop nodes as legitimate. It now also recognizes IF, Switch, and Filter nodes as conditional exit points that can bound a loop.
- Expression bracket scanning in Code node fields. The expression validator scanned
jsCode,pythonCode, andfunctionCodefields for unmatched{{ }}brackets, producing false positives on ordinary JavaScript/Python curly braces. These raw code fields are now excluded from expression bracket validation.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Fix missing authentication on HTTP endpoints and information disclosure via
/health(GHSA-75hx-xj24-mqrw). Reported by @yotampe-pluto.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
npx n8n-mcp </dev/nullnow exits promptly on stdin close (Issue #711, reported by @jbjardine). The root cause was that the published bin entry was stilldist/mcp/index.js, notdist/mcp/stdio-wrapper.js, soIS_DOCKER=true npx -y n8n-mcp </dev/nullhitindex.js's container guard and stayed alive until SIGTERM arrived — breaking stateless stdio clients (e.g.mark3labs/mcp-go, MCPJungle) that close stdin to signal shutdown. The fix is to finally route the published bin through the wrapper (see below), which has always registered stdin handlers unconditionally. The container guard inindex.tsis deliberately kept: Docker's detached-mode lifecycle (docker run -d) redirects stdin from/dev/nulland relies on signals fromdocker stopfor shutdown, not stdin close — the Docker entrypoint's root-switch path hardcodesnode /app/dist/mcp/index.js, so the guard is load-bearing for every containerized deployment.- Published bin entry finally routes through
stdio-wrapper.js(Issue #693, reported by @gjenkins20). Commit bc191b0 (v2.45.1) updatedpackage.json,scripts/publish-npm.sh, andscripts/publish-npm-quick.shto route the bin through the stdio wrapper, but missed.github/workflows/release.yml:375which hardcoded the old path. Every CI release from v2.45.1 through v2.47.4 therefore shippedbin: dist/mcp/index.js— the fix never reached users.release.ymlis now consistent with the other three sources, and a static test intests/unit/bin-consistency.test.tsguards against the same drift recurring. - Telemetry CLI handler extracted to
src/telemetry/telemetry-cli.tsand called from bothsrc/mcp/index.tsandsrc/mcp/stdio-wrapper.ts. This preservesnpx n8n-mcp telemetry enable|disable|status(documented inPRIVACY.mdandREADME.md) now that the published bin routes through the wrapper, and eliminates ~35 lines of duplication. The config manager is lazy-required so it stays off the stdio hot path when no CLI subcommand is present.
- First-run telemetry banner is no longer printed on cold start via
npx n8n-mcpbecausestdio-wrapper.jssuppresses allconsole.logoutput before the server imports. This was already the behavior when users invoked the wrapper directly; it becomes user-visible now that the wrapper is the published bin. Runnpx n8n-mcp telemetry statusto see current telemetry state. - Added
tests/integration/mcp/stdio-shutdown.test.tswith 3 regression cases that spawndist/mcp/stdio-wrapper.js(the published bin entry, matching thenpxpath) and assert exit-on-stdin-close / exit-on-SIGTERM within a 500ms budget, covering the exact Issue #711 repro.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Fix authenticated SSRF in multi-tenant header handling (GHSA-4ggg-h7ph-26qr). Reported by Eresus Security Research Team.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Closed all open CodeQL alerts in one hardening pass. Covered rules:
js/regex-injection,js/prototype-polluting-assignment,js/prototype-pollution-utility,js/double-escaping,js/polynomial-redos,js/insufficient-password-hash,js/insecure-randomness,js/clear-text-logging,js/tainted-format-string,js/incomplete-url-substring-sanitization, andjs/shell-command-injection-from-environment. No runtime behaviour change beyond what the individual fix comments document. All 4512 unit tests and 699 integration tests pass. - Added linear-time
extractBracketExpressions()/hasBracketExpression()helpers insrc/utils/expression-utils.tsfor validators that previously relied on lazy-quantifier regexes. createCacheKeyinsrc/utils/cache-utils.tsnow derives its output via a CodeQL-approved KDF with aggressive memoization. Semantically deterministic per-process, O(1) on cache hits.- Chat trigger session ID format changed from
session_{timestamp}_{9-char-alnum}tosession_{timestamp}_{UUIDv4}. Accompanying test regex updated.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Dropped the
n8nmeta package from dev dependencies — The MCP server only reads node metadata from a prebuilt SQLite database and never executes n8n workflows, so depending on the full n8n meta package (which pulls in the editor backend, task runner, queue, typeorm, AI workflow builder, bull, and ~440 other transitive packages) was pure overhead in the dev tree. Replaced with a direct dependency onn8n-nodes-base, which is whatsrc/loaders/node-loader.tsactuallyrequire()s at rebuild time. Net result: ~440 fewer packages installed in the dev tree with no change to runtime behavior or the published npm artifact (which already ships zero n8n deps viapackage.runtime.json). - Kept
n8n-coreas a direct dep — Though our source code never imports it,n8n-nodes-baseinternallyrequire()sn8n-corein several node files (Merge V3, Slack V2, and others), yet only declares it as adevDependency. Previously it was pulled in transitively by then8nmeta package; now that we depend onn8n-nodes-basedirectly we needn8n-coreas an explicit dep so those nodes load duringnpm run rebuild. scripts/update-n8n-deps.js— Simplified to check each tracked package (n8n-nodes-base,n8n-core,n8n-workflow,@n8n/n8n-nodes-langchain) against its ownlatestdist-tag on npm, rather than deriving peer versions from then8nmeta package's dependency list.scripts/update-and-publish-prep.sh— Reads primary version fromn8n-nodes-base.src/mcp/tools-documentation.ts— Compatibility notice now reads the tested n8n version fromn8n-nodes-baseinpackage.jsoninstead of the removedn8nmeta dep.
- The SBOM generated by GitHub (scanned from
package.json) will now show ~440 fewer packages in the dev tree. - The published
n8n-mcpnpm package is unchanged — it usespackage.runtime.jsonand has always shipped with zero n8n deps. - No functional change to node loading: the full set of 812 base nodes (676 from
n8n-nodes-base+ 136 from@n8n/n8n-nodes-langchain) loads correctly, as verified by the integration test suite.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Credential get fallback —
n8n_manage_credentials({action: "get"})now falls back to list + filter whenGET /credentials/:idreturns 403 Forbidden or 405 Method Not Allowed, since this endpoint is not in the n8n public API - Credential update accepts
typefield —n8n_manage_credentials({action: "update"})now forwards the optionaltypefield to the n8n API, which some n8n versions require in the PATCH payload - Credential response stripping —
createandupdatehandlers now strip thedatafield from responses (defense-in-depth, matching thegethandler pattern)
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
n8n_audit_instancetool — Security audit combining n8n's built-inPOST /auditAPI (5 risk categories: credentials, database, nodes, instance, filesystem) with deep workflow scanning. Custom checks include 50+ regex patterns for hardcoded secrets (OpenAI, AWS, Stripe, GitHub, Slack, SendGrid, and more), unauthenticated webhook detection, error handling gap analysis, data retention risk assessment, and PII detection. Returns a compact markdown report grouped by workflow with a Remediation Playbook showing auto-fixable items, items requiring review, and items requiring user action. Inspired by Audit n8n Workflows Securityn8n_manage_credentialstool — Full credential CRUD with schema discovery. Actions: list, get, create, update, delete, getSchema. Enables AI agents to create credentials and assign them to workflow nodes as part of security remediation. Credential secret values are never logged or returned in responses (defense-in-depth)- Credential scanner service (
src/services/credential-scanner.ts) — 50+ regex patterns ported from the production cache ingestion pipeline, covering AI/ML keys, cloud/DevOps tokens, GitHub PATs, payment keys, email/marketing APIs, and more. Per-node scanning with masked output - Workflow security scanner (
src/services/workflow-security-scanner.ts) — 4 configurable checks: hardcoded secrets, unauthenticated webhooks (excludes respondToWebhook), error handling gaps (3+ node threshold), data retention settings - Audit report builder (
src/services/audit-report-builder.ts) — Generates compact grouped-by-workflow markdown with tables, built-in audit rendering, and a Remediation Playbook with tool chains for auto-fixing
- CLAUDE.md — Removed Session Persistence section (no longer needed), added OSS sensitivity notice to prevent secrets from landing in committed files
- API client request interceptor — Now redacts request body for
/credentialsendpoints to prevent secret leakage in debug logs - Credential handler responses — All credential handlers (get, create, update) strip the
datafield from responses as defense-in-depth against future n8n versions returning decrypted values
- Secret masking at scan time —
maskSecret()is called immediately during scanning; raw values are never stored in detection results - Credential body redaction — API client interceptor suppresses body logging for credential endpoints
- Cursor dedup guard —
listAllWorkflows()tracks seen cursors to prevent infinite pagination loops - PII findings classified as review — PII detections (email, phone, credit card) are marked as
review_recommendedinstead ofauto_fixable, preventing nonsensical auto-remediation
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Fix SSE reconnection loop — SSE clients entering rapid reconnection loops because
POST /mcpnever routed messages toSSEServerTransport.handlePostMessage()(Fixes #617). Root cause: SSE sessions were stored in a separatethis.sessionproperty invisible to the StreamableHTTP POST handler - Add authentication to SSE endpoints —
GET /sseandPOST /messagesnow require Bearer token authentication, closing an auth gap where SSE connections were unauthenticated - Fix rate limiter exhaustion during reconnection — added
skipSuccessfulRequests: truetoauthLimiterso legitimate requests don't count toward the rate limit, preventing 429 storms during SSE reconnection loops
- Separate SSE endpoints (SDK pattern) — SSE transport now uses dedicated
GET /sse+POST /messagesendpoints instead of sharing/mcpwith StreamableHTTP, following the official MCP SDK backward-compatible server pattern - Unified auth into
authenticateRequest()method — consolidated duplicated Bearer token validation logic from three endpoints into a single method with consistent JSON-RPC error responses - SSE sessions use shared transports map — removed the legacy
this.sessionsingleton; SSE sessions are now stored in the samethis.transportsmap as StreamableHTTP sessions withinstanceofguards for type discrimination
- SSE transport (
GET /sse,POST /messages) — SSE is deprecated in MCP SDK v1.x and removed in v2.x. Clients should migrate to StreamableHTTP (POST /mcp). These endpoints will be removed in a future major release
- Rate limiting on all authenticated endpoints —
authLimiternow applied toGET /sseandPOST /messagesin addition toPOST /mcp - Transport type guards —
instanceofchecks prevent cross-protocol access (SSE session IDs rejected on StreamableHTTP endpoint and vice versa)
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
patchNodeFieldoperation forn8n_update_partial_workflow— a dedicated, strict find/replace operation for surgical string edits in node fields (Fixes #696). Key features:- Strict error handling: errors if find string not found (unlike
__patch_find_replacewhich only warns) - Ambiguity detection: errors if find matches multiple times unless
replaceAll: trueis set replaceAllflag: replace all occurrences of a string in a single patchregexflag: use regex patterns for advanced find/replace- Top-level operation type for better discoverability
- Strict error handling: errors if find string not found (unlike
- Prototype pollution protection —
setNestedPropertyandgetNestedPropertynow reject paths containing__proto__,constructor, orprototype. Protects bothpatchNodeFieldandupdateNodeoperations - ReDoS protection — regex patterns with nested quantifiers or overlapping alternations are rejected to prevent catastrophic backtracking
- Resource limits — max 50 patches per operation, max 500-char regex patterns, max 512KB field size for regex operations
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Use stdio-wrapper.js as default bin entry point — the previous entry point (
index.js) wrote INFO-level logs to stdout, corrupting JSON-RPC MCP transport for stdio-mode users (Fixes #693, Related: #555, #628) - Preserve node credentials during full workflow updates —
n8n_update_full_workflownow carries forward existing credential references from the server when user-provided nodes omit them, preventing "missing credentials" errors on PUT (Fixes #689)
- Updated publish scripts to use
stdio-wrapper.jsas the npm bin entry point, ensuring the fix persists across releases
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Update n8n dependencies to latest versions:
n8n: 2.13.3 → 2.14.2n8n-core: 2.13.1 → 2.14.1n8n-workflow: 2.13.1 → 2.14.1@n8n/n8n-nodes-langchain: 2.13.1 → 2.14.1
- Rebuild FTS5 search index with all 1396 nodes (812 base + 584 community)
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Bump axios from
^1.11.0to^1.14.0to patch known vulnerability - Bump nodemon from
^3.1.10to^3.1.14to patch transitive dependency vulnerabilities
- Upgrade GitHub Actions to latest versions across all CI/CD workflows (docker, release, test, update-n8n-deps) — contributed by @salmanmkc in #663
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
-
Multi-step workflow generation flow:
n8n_generate_workflownow supports a three-step flow where AI agents act as quality gates — get proposals, review, then deploy. New parameters:deploy_id(deploy a specific proposal),confirm_deploy(deploy a previously generated preview). -
GenerateWorkflowProposaltype: New exported type for workflow proposals withid,name,description,flow_summary, andcredentials_neededfields. -
statusfield onGenerateWorkflowResult: Indicates the current phase —proposals,preview,deployed, orerror.
-
Tool description updated:
n8n_generate_workflowdescription now explains the multi-step flow instead of auto-deploy behavior. -
Tool documentation updated: Essentials and full docs reflect the three-step flow with examples for each step.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
-
n8n_generate_workflowtool: New MCP tool that enables AI-powered workflow generation from natural language descriptions. Available on the hosted service with handler delegation pattern for extensibility. -
Handler injection API:
EngineOptions.generateWorkflowHandlerallows hosting environments to provide custom workflow generation backends. Handler receives helpers forcreateWorkflow,validateWorkflow,autofixWorkflow, andgetWorkflow. -
Tool documentation: Full essentials and deep documentation for
n8n_generate_workflowviatools_documentation.
- Tools documentation count: Corrected n8n API tools count and added missing
n8n_manage_datatableentry to tools overview.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
-
Patterns response trimmed for token efficiency (Issue #683): Task-specific patterns response reduced ~64% — dropped redundant
displayName, shortened field names (frequency→freq), capped chains at 5, and shortened chain node types to last segment. -
patternsmode added totools_documentation: Was missing from both essentials and full docs. AI agents can now discover patterns mode through the standard documentation flow. -
includeOperationsomission behavior documented: Added note that trigger nodes and freeform nodes (Code, HTTP Request) omit theoperationsTreefield. -
search_nodesexamples trimmed: Reduced from 11 to 6 examples in full docs, removing near-duplicates.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
workflow-patterns.jsonmissing from npm package (Issue #681): Addeddata/workflow-patterns.jsonto thefilesarray inpackage.jsonso the patterns file is included in the published npm package and works out of the box without manual generation.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
-
Community nodes missing from database after rebuild: Restored 584 community nodes from the n8n 2.13.3 snapshot and re-extracted operations with resource grouping from
properties_schema. 366 community nodes now have proper resource-grouped operations. -
Community node service missing resource extraction:
extractOperations()incommunity-node-service.tswas not extractingresourcefromdisplayOptions.show.resource, same issue that was fixed inproperty-extractor.tsin v2.42.0.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
-
includeOperationsflag for search_nodes: Opt-in parameter that returns a resource/operation tree per search result, grouped by resource (e.g., Slack returns 7 resources with 44 operations). Saves a mandatoryget_noderound-trip when building workflows. Adds ~100-300 tokens per result. -
searchMode: "patterns"for search_templates: New lightweight mode that serves workflow pattern summaries mined from 2,700+ templates. Returns common node combinations, connection chains, and frequency data per task category (10 categories: ai_automation, webhook_processing, scheduling, etc.). Usetaskparameter for category-specific patterns or omit for overview. -
Workflow pattern mining script (
npm run mine:patterns): Extracts node frequency, co-occurrence, and connection topology from the template database. Two-pass pipeline: Pass 1 analyzesnodes_usedmetadata (no decompression), Pass 2 decompresses workflows for connection analysis. Producesdata/workflow-patterns.jsonwith 554 node types, 3,201 edges, and 5,246 chains.
-
Operations extraction now includes resource grouping: The property extractor was using
find()to get only the firstoperationproperty, but n8n nodes have multiple operation properties each mapped to a different resource viadisplayOptions.show.resource. Changed tofilter()to capture all operation properties. Slack went from 17 flat operations to 44 operations across 7 named resources. -
FTS-to-LIKE fallback dropped search options: When the FTS5 search fell back to LIKE-based search (e.g., for "http request"), the
optionsobject (includingincludeOperations,includeExamples,source) was silently lost. Now correctly passed through.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
-
validate_workflowmissesconditions.optionscheck for If/Switch nodes (Issue #675): Added version-conditional validation — If v2.2+ and Switch v3.2+ now requireconditions.optionsmetadata, If v2.0-2.1 validates operator structures, and v1.x is left unchecked. Previously only caught byn8n_create_workflowpre-flight but not by offlinevalidate_workflow. -
False positive "Set node has no fields configured" for Set v3+ (Issue #676): The
validateSetchecker now recognizesconfig.assignments.assignments(v3+ schema) in addition toconfig.values(v1/v2 schema). Updated suggestion text to match current UI terminology. -
Expression validator does not detect unwrapped n8n expressions (Issue #677): Added heuristic pre-pass that detects bare
$json,$node,$input,$execution,$workflow,$prevNode,$env,$now,$today,$itemIndex, and$runIndexreferences missing={{ }}wrappers. Uses anchored patterns to avoid false positives. Emits warnings, not errors.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
-
Session timeout default too low (Issue #626): Raised
SESSION_TIMEOUT_MINUTESdefault from 5 to 30 minutes. The 5-minute default caused sessions to expire mid-operation during complex multi-step workflows (validate → get structure → patch → validate), forcing users to retry. Configurable via environment variable. -
Operations array received as string from VS Code (Issue #600): Added
z.preprocessJSON string parsing to theoperationsparameter inn8n_update_partial_workflow. The VS Code MCP extension serializes arrays as JSON strings — the Zod schema now transparently parses them before validation. -
undefinedvalues rejected in MCP tool calls from VS Code (Issue #611): Strip explicitundefinedvalues from tool arguments before Zod validation. VS Code sendsundefinedas a value which Zod's.optional()rejects (it expects the field to be missing, not present-but-undefined).
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- MCP initialization floods Claude Desktop with JSON parse errors (Issues #628, #627, #567): Intercept
process.stdout.writein stdio mode to redirect non-JSON-RPC output to stderr. Console method suppression alone was insufficient — native modules (better-sqlite3), n8n packages, and third-party code can callprocess.stdout.write()directly, corrupting the JSON-RPC stream. Only writes containing valid JSON-RPC messages ({"jsonrpc":...}) are now allowed through stdout; everything else is redirected to stderr. This fixes the flood of "Unexpected token is not valid JSON" warnings on every new chat in Claude Desktop, including leakedrefCount,dbPath,clientVersion,protocolVersion, and other debug strings.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
-
If node operators silently fail at runtime (Issue #665): Replaced incorrect operator names
isNotEmpty/isEmptywithnotEmpty/emptyacross all validators, sanitizer, documentation, and error messages. n8n's execution engine does not recognizeisNotEmpty/isEmpty— unknown operators silently returnfalse, causing If/Switch conditions to always take the wrong branch. Added auto-correction in the sanitizer so existing workflows using legacy names are fixed on update. -
addConnectioncreates broken connections withtype: "0"(Issue #659): Fixed two edge cases where numerictargetInputorsourceOutputvalues leaked into connection objects as"type": "0"instead of"type": "main". NumerictargetInputvalues are now remapped to"main", and thesourceOutputremapping guard was relaxed to handle redundantsourceOutput: 0+sourceIndex: 0combinations. Also resolves Issue #653 (dangling connections afterremoveNode) which was caused by malformed connections from this bug. -
__patch_find_replacecorrupts Code node jsCode (Issue #642): Implemented the__patch_find_replacefeature for surgical string edits inupdateNodeoperations. Previously, passing{"parameters.jsCode": {"__patch_find_replace": [...]}}stored the patch object literally as jsCode, producing[object Object]at runtime. The feature now reads the current string value, applies each{find, replace}entry sequentially, and writes back the modified string. Includes validation for patch format, target property existence, and string type.
- Extracted
OPERATOR_CORRECTIONSandUNARY_OPERATORSto module-level constants for better performance and single source of truth - Added
exists/notExiststo unary operator lists for consistency across sanitizer and validator - Fixed recovery guidance referencing non-existent
validate_node_operationtool (nowvalidate_node)
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Updated n8n dependencies: n8n 2.12.3 → 2.13.3, n8n-core 2.12.0 → 2.13.1, n8n-workflow 2.12.0 → 2.13.1, @n8n/n8n-nodes-langchain 2.12.0 → 2.13.1
- Rebuilt node database: 1,396 nodes (812 from n8n-nodes-base/langchain + 584 community: 516 verified + 68 npm)
- Refreshed community nodes: 584 total (up from 430), with 581 AI-generated documentation summaries
- Improved documentation generator: Strip
<think>tags from thinking-model responses; use raw fetch for vLLMchat_template_kwargssupport - Incremental community node updates:
fetch:communitynow upserts by default, preserving existing READMEs and AI summaries. Use--rebuildfor clean slate
Conceived by Romuald Czlonkowski - https://www.aiadvisors.pl/en
- Webhook workflows created via MCP get 404 errors (Issue #643): Auto-inject
webhookId(UUID) on webhook-type nodes (webhook,webhookTrigger,formTrigger,chatTrigger) duringcleanWorkflowForCreate()andcleanWorkflowForUpdate(). n8n 2.10+ requires this field for proper webhook URL registration; without it, webhooks silently fail with 404. ExistingwebhookIdvalues are preserved.
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Incorrect data tables availability info: Removed "enterprise/cloud only" restriction from tool description and documentation — data tables are available on all n8n plans including self-hosted
- Redundant pitfalls removed: Removed "Requires N8N_API_URL and N8N_API_KEY" and "enterprise or cloud plans" pitfalls — the first is implicit for all n8n management tools, the second was incorrect
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Notification 400 disconnect storms (#654):
handleRequest()now returns 202 Accepted for JSON-RPC notifications with stale/expired session IDs instead of 400. Per JSON-RPC 2.0 spec, notifications don't expect responses — returning 400 caused Claude's proxy to trigger reconnection storms (930 errors/day, 216 users affected) - TOCTOU race in session lookup: Added null guard after transport assignment to handle sessions removed between the existence check and use
updateTablesilently ignoringcolumnsparameter: Now returns a warning message whencolumnsis passed toupdateTable, clarifying that table schema is immutable after creation via the public API- Tool schema descriptions clarified:
nameandcolumnsparameter descriptions now explicitly document thatupdateTableis rename-only and columns are forcreateTableonly
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Double URL-encoding of
filterandsortByingetRows/deleteRows: MovedencodeURIComponent()from handler layer to a customparamsSerializerin the API client. Handlers were encoding values before passing them as Axios params, causing double-encoding (%257Binstead of%7B). Handlers now pass raw values; the API client encodes once viaserializeDataTableParams() updateTabledocumentation clarified: Explicitly notes that only renaming is supported (no column modifications via public API)
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
n8n_manage_datatablerow operations broken by MCP transport serialization:dataparameter received as string instead of JSON — addedz.preprocesscoercers for array/object/filter paramsn8n_manage_datatablefilter/sortBy URL encoding: n8n API requires URL-encoded query params — addedencodeURIComponent()for filter and sortBy in getRows and deleteRows (revised in 2.40.2 to move encoding to API client layer)jsoncolumn type rejected by n8n API: Removedjsonfrom column type enum (n8n only accepts string/number/boolean/date)- Garbled 404 error messages: Fixed
N8nNotFoundErrorconstructor — API error messages are now passed through cleanly instead of being wrapped in "Resource with ID ... not found"
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
n8n_manage_datatableMCP tool (replacesn8n_create_data_table): Full data table management covering all 10 n8n data table API endpoints- Table operations: createTable, listTables, getTable, updateTable, deleteTable
- Row operations: getRows, insertRows, updateRows, upsertRows, deleteRows
- Filter system with and/or logic and 8 condition operators (eq, neq, like, ilike, gt, gte, lt, lte)
- Dry-run support for updateRows, upsertRows, deleteRows
- Pagination, sorting, and full-text search for row listing
- Shared error handler and consolidated Zod schemas for consistency
- 9 new
N8nApiClientmethods for all data table endpoints
projectIdparameter forn8n_create_workflow: Create workflows directly in a specific team project (enterprise feature)
n8n_create_data_tabletool replaced byn8n_manage_datatablewithaction: "createTable"
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
transferWorkflowdiff operation (Issue #644): Move workflows between projects vian8n_update_partial_workflow- New
transferWorkflowoperation type withdestinationProjectIdparameter - Calls
PUT /workflows/{id}/transfervia dedicated API after workflow update - Proper error handling: returns
{ success: false, saved: true }when transfer fails after update - Transfer executes before activation so workflow is in target project first
- Zod schema validates
destinationProjectIdis non-empty - Updated tool description and documentation to list the new operation
inferIntentFromOperationsreturns descriptive intent for transfer operationsN8nApiClient.transferWorkflow()method added
- New
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Updated n8n dependencies: n8n 2.11.4 → 2.12.3, n8n-core 2.11.1 → 2.12.0, n8n-workflow 2.11.1 → 2.12.0, @n8n/n8n-nodes-langchain 2.11.2 → 2.12.0
- Rebuilt node database: 1,239 nodes (809 from n8n-nodes-base and @n8n/n8n-nodes-langchain, 430 community)
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- updateNode
name/idfield normalization: LLMs sending{type: "updateNode", name: "Code", ...}instead ofnodeNameno longer get "Node not found" errors. The Zod schema now normalizesname→nodeNameandid→nodeIdfor node-targeting operations (updateNode, removeNode, moveNode, enableNode, disableNode) - AI connection types in disconnected-node detection (Issue #581): Replaced hardcoded 7-type list with dynamic iteration over all connection types present in workflow data. Nodes connected via
ai_outputParser,ai_document,ai_textSplitter,ai_agent,ai_chain,ai_retrieverare no longer falsely flagged as disconnected during save - Connection schema and reference validation (Issue #581): Added
.catchall()toworkflowConnectionSchemafor unknown AI connection types, and extended connection reference validation to check all connection types (not justmain) - autofix
filterOperationsByFixesID-vs-name mismatch: Typeversion-upgrade operations now includenodeNamealongsidenodeId, and the filter checks both fields. Previously,applyFixes=truesilently dropped all typeversion fixes becausefixedNodescontained names but the filter only checkednodeId(UUID)
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Code validator
$()false positive (Issue #294):$('Previous Node').first().jsonno longer triggers "Invalid $ usage detected" warning. Added(and_to the regex negative lookahead to support standard n8n cross-node references and valid JS identifiers like$_var - Code validator helper function return false positive (Issue #293):
function isValid(item) { return false; }no longer triggers "Cannot return primitive values directly" error. Added helper function detection to skip primitive return checks when named functions or arrow function assignments are present - Null property removal in diff engine (Issue #611):
{continueOnFail: null}no longer causes Zod validation error "Expected boolean, received null". The diff engine now treatsnullvalues as property deletion (deleteoperator), and documentation updated fromundefinedtonullfor property removal
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
- Numeric sourceOutput remapping (Issue #537):
addConnectionwith numericsourceOutputvalues like"0"or"1"now correctly maps to"main"with the correspondingsourceIndex, preventing malformed connection keys - IMAP Email Trigger activation (Issue #538):
n8n-nodes-base.emailReadImapand other IMAP-based polling triggers are now recognized as activatable triggers, allowing workflow activation - AI tool description false positives (Issue #477): Validators now check
descriptionandoptions.descriptionin addition totoolDescription, fixing falseMISSING_TOOL_DESCRIPTIONerrors for toolWorkflow, toolCode, and toolSerpApi nodes - n8n_create_workflow undefined ID (Issue #602): Added defensive check for missing workflow ID in API response with actionable error message
- Flaky CI performance test: Relaxed bulk insert ratio threshold from 15 to 20 to accommodate CI runner variability
Conceived by Romuald Czlonkowski - https://www.aiadvisors.pl/en
- Unary operator sanitization (Issue #592): Added missing
empty,notEmpty,exists,notExistsoperators to the sanitizer's unary operator list, preventing IF/Switch node corruption during partial updates - Positional connection array preservation (Issue #610):
removeNodeandcleanStaleConnectionsnow trim only trailing empty arrays, preserving intermediate positional indices for IF/Switch multi-output nodes - Scoped sanitization: Auto-sanitization now only runs on nodes that were actually added or updated, preventing unrelated nodes (e.g., HTTP Request parameters) from being silently modified
- Activate/deactivate 415 errors (Issue #633): Added empty body
{}to POST calls for workflow activation/deactivation endpoints - Zod error readability (Issue #630): Validation errors now return human-readable
"path: message"strings instead of raw Zod error objects - updateNode error hints (Issue #623): Improved error message when
updatesparameter is missing, showing correct structure withnodeId/nodeNameandupdatesfields - removeConnection after removeNode (Issue #624): When a node was already removed by a prior
removeNodeoperation, the error message now explains that connections were automatically cleaned up - Connection type coercion (Issue #629):
sourceOutputandtargetInputare now coerced to strings, handling numeric values (0, 1) passed by MCP clients
savedfield in responses (Issue #625): Alln8n_update_partial_workflowresponses now includesaved: true/falseto distinguish whether the workflow was persisted to n8n- Tag operations via dedicated API (Issue #599):
addTag/removeTagnow use the n8n tag API (PUT /workflows/{id}/tags) instead of embedding tags in the workflow body, fixing silent tag failures. Includes automatic tag creation, case-insensitive name resolution, and last-operation-wins reconciliation for conflicting add/remove updateWorkflowTagsAPI client method: New method onN8nApiClientfor managing workflow tag associations via the dedicated endpointoperationsAppliedin top-level response: Promoted from nesteddetailsto top-level for easier consumption by MCP clients
Conceived by Romuald Czlonkowski - https://www.aiadvisors.pl/en
- Updated n8n dependencies: n8n 2.10.3 → 2.11.4, n8n-core 2.10.1 → 2.11.1, n8n-workflow 2.10.1 → 2.11.1, @n8n/n8n-nodes-langchain 2.10.1 → 2.11.2
- Updated @modelcontextprotocol/sdk: 1.20.1 → 1.27.1 (fixes critical cross-client data leak vulnerability CVE GHSA-345p-7cg4-v4c7)
- Rebuilt node database with 1,239 nodes (809 core + 430 community preserved)
- Updated README badge with new n8n version and node counts
Conceived by Romuald Czlonkowski - https://www.aiadvisors.pl/en
- Conditional branch fan-out detection (
CONDITIONAL_BRANCH_FANOUT): Warns when IF, Filter, or Switch nodes have all connections crammed intomain[0]with higher-index outputs empty, which usually means all target nodes execute together on one branch while other branches have no effect- Detects IF nodes with both true/false targets on
main[0] - Detects Filter nodes with both matched/unmatched targets on
main[0] - Detects Switch nodes with all targets on output 0 and other outputs unused
- Skips warning when fan-out is legitimate (higher outputs also have connections)
- Skips warning for single connections (intentional true-only/matched-only usage)
- Detects IF nodes with both true/false targets on
- Refactored output index validation: Extracted
getShortNodeType()andgetConditionalOutputInfo()helpers to eliminate duplicated conditional node detection logic betweenvalidateOutputIndexBoundsand the newvalidateConditionalBranchUsage
Conceived by Romuald Czlonkowski - https://www.aiadvisors.pl/en
- Connection validation: detect broken/malformed workflow connections (Issue #620):
- Unknown output keys (
UNKNOWN_CONNECTION_KEY): Flags invalid connection keys like"0","1","output"with fix suggestions (e.g., "use main[1] instead" for numeric keys) - Invalid type field (
INVALID_CONNECTION_TYPE): Detects invalidtypevalues in connection targets (e.g.,"0"instead of"main") - Output index bounds checking (
OUTPUT_INDEX_OUT_OF_BOUNDS): Catches connections using output indices beyond what a node supports, with awareness ofonError: 'continueErrorOutput', Switch rules, and IF/Filter nodes - Input index bounds checking (
INPUT_INDEX_OUT_OF_BOUNDS): Validates target input indices against known node input counts (Merge=2, triggers=0, others=1) - BFS-based trigger reachability analysis: Replaces simple orphan detection with proper graph traversal from trigger nodes, flagging unreachable subgraphs
- Flexible
WorkflowConnectioninterface: Changed from explicitmain?/error?/ai_tool?to[outputType: string]for accurate validation of all connection types
- Unknown output keys (
Conceived by Romuald Czlonkowski - https://www.aiadvisors.pl/en
- Updated n8n dependencies: n8n 2.8.3 → 2.10.3, n8n-core 2.8.1 → 2.10.1, n8n-workflow 2.8.0 → 2.10.1, @n8n/n8n-nodes-langchain 2.8.1 → 2.10.1
- Rebuilt node database with 806 core nodes (community nodes preserved from previous build)
Conceived by Romuald Czlonkowski - https://www.aiadvisors.pl/en
- Comprehensive parameter type coercion for Claude Desktop / Claude.ai (Issue #605): Expanded the v2.35.4 fix to handle ALL type mismatches, not just stringified objects/arrays. Testing revealed 6/9 tools still failing in Claude Desktop after the initial fix.
- Extended
coerceStringifiedJsonParams()to coerce every schema type:string→number,string→boolean,number→string,boolean→string(in addition to existingstring→objectandstring→array) - Added top-level safeguard to parse the entire
argsobject if it arrives as a JSON string - Added
[Diagnostic]section to error responses showing received argument types, enabling users to report exactly what their MCP client sends - Added 9 new unit tests (24 total) covering number, boolean, and number-to-string coercion
- Extended
Conceived by Romuald Czlonkowski - https://www.aiadvisors.pl/en
- Defensive JSON.parse for stringified object/array parameters (Issue #605): Claude Desktop 1.1.3189 serializes JSON object/array MCP parameters as strings, causing ZodError failures for ~60% of tools that accept nested parameters
- Added schema-driven
coerceStringifiedJsonParams()in the centralCallToolRequestSchemahandler - Automatically detects string values where the tool's
inputSchemaexpectsobjectorarray, and parses them back - Safe: prefix check before parsing, type verification after, try/catch preserves original on failure
- No-op for correct clients: native objects pass through unchanged
- Affects 9 tools with object/array params:
validate_node,validate_workflow,n8n_create_workflow,n8n_update_full_workflow,n8n_update_partial_workflow,n8n_validate_workflow,n8n_autofix_workflow,n8n_test_workflow,n8n_executions - Added 15 unit tests covering coercion, no-op, safety, and end-to-end scenarios
- Added schema-driven
Conceived by Romuald Czlonkowski - https://www.aiadvisors.pl/en
- Updated n8n dependencies: n8n 2.6.3 → 2.8.3, n8n-core 2.6.1 → 2.8.1, n8n-workflow 2.6.0 → 2.8.0, @n8n/n8n-nodes-langchain 2.6.2 → 2.8.1
- Fixed node loader for langchain package: Adapted node loader to bypass restricted package.json
exportsfield in @n8n/n8n-nodes-langchain >=2.9.0, resolving node files via absolute paths instead ofrequire.resolve() - Fixed community doc generation for cloud LLMs: Added
N8N_MCP_LLM_API_KEY/OPENAI_API_KEYenv var support, switched tomax_completion_tokens, and auto-omittemperaturefor cloud API endpoints - Rebuilt node database with 1,236 nodes (673 from n8n-nodes-base, 133 from @n8n/n8n-nodes-langchain, 430 community)
- Refreshed community nodes (361 verified + 69 npm) with 424/430 AI documentation summaries
Conceived by Romuald Czlonkowski - https://www.aiadvisors.pl/en
- MCP Apps: Disable non-rendering apps in Claude.ai: Disabled 3 MCP Apps (workflow-list, execution-history, health-dashboard) that render as collapsed accordions in Claude.ai, and removed
n8n_deploy_templatetool mapping which renders blank content. The server sets_metacorrectly on the wire but the Claude.ai host ignores it for these tools. The 2 working apps (operation-result for 6 tools, validation-summary for 3 tools) remain active. Disabled apps can be re-enabled once the host-side issue is resolved.
Conceived by Romuald Czlonkowski - https://www.aiadvisors.pl/en
- MCP Apps: Fix UI not rendering for some tools in Claude: Added legacy flat
_meta["ui/resourceUri"]key alongside the nested_meta.ui.resourceUriin tool definitions. Claude.ai reads the flat key format; without it, tools liken8n_health_checkandn8n_list_workflowsshowed as collapsed accordions instead of rendering their rich UI apps. Both key formats are now set byinjectToolMeta(), matching the behavior of the officialregisterAppToolhelper from@modelcontextprotocol/ext-apps/server.
Conceived by Romuald Czlonkowski - https://www.aiadvisors.pl/en
- 3 new MCP Apps: workflow-list (compact table with status/tags), execution-history (status summary bar + execution table), health-dashboard (connection status, versions, performance metrics)
- Enhanced operation-result: operation-aware headers (create/update/delete/test/deploy), detail panels with workflow metadata, copy-to-clipboard for IDs/URLs, autofix diff viewer
- CopyButton shared component: reusable clipboard button with visual feedback
- Local preview harness (
ui-apps/preview.html): test all 5 apps with mock data, dark/light theme toggle, JSON-RPC protocol simulation - Expanded shared types: TypeScript types for workflow-list, execution-history, and health-dashboard data
- React hooks violation: Fixed
useMemocalled after early returns inexecution-history/App.tsxandvalidation-summary/App.tsx, causing React error #310 ("Rendered more hooks than during the previous render") and blank iframes - JSON-RPC catch-all handler: Preview harness responds to unknown SDK requests to prevent hangs
Conceived by Romuald Czlonkowski - https://www.aiadvisors.pl/en
- MCP Apps: Fix blank UI and wrong status badge in Claude: Rewrote
useToolDatahook to use the officialuseApphook from@modelcontextprotocol/ext-apps/reactfor proper lifecycle management. Updated UI types and components to match actual server response format (success: booleaninstead ofstatus: string, nesteddataobject for workflow details). Validation summary now handles both direct and wrapped (n8n_validate_workflow) response shapes.
Conceived by Romuald Czlonkowski - https://www.aiadvisors.pl/en
- MCP Apps: Use correct MIME type for ext-apps spec: Changed resource MIME type from
text/htmltotext/html;profile=mcp-app(theRESOURCE_MIME_TYPEconstant from@modelcontextprotocol/ext-apps). Without this profile parameter, Claude Desktop/web fails to recognize resources as MCP Apps and shows "Failed to load MCP App: the resource may exceed the 5 MB size limit."
Conceived by Romuald Czlonkowski - https://www.aiadvisors.pl/en
- CI: UI apps missing from npm package: Release pipeline only ran
npm run build(TypeScript), soui-apps/dist/was never built and excluded from published packages- Changed build step to
npm run build:allinbuild-and-verifyandpublish-npmjobs - Added
ui-apps/dist/to npm publish staging directory - Added
ui-apps/dist/**/*to published package files list
- Changed build step to
Conceived by Romuald Czlonkowski - https://www.aiadvisors.pl/en
- MCP Apps: Align with official ext-apps spec for Claude Desktop/web compatibility
- URI scheme changed from
n8n-mcp://ui/{id}toui://n8n-mcp/{id}per MCP ext-apps spec _meta.ui.resourceUrinow set on tool definitions (tools/list) instead of tool call responsesUIMetadata.ui.apprenamed toUIMetadata.ui.resourceUri- Added
_metafield toToolDefinitiontype - Added
UIAppRegistry.injectToolMeta()method for enriching tool definitions - UI apps now use
@modelcontextprotocol/ext-appsAppclass instead ofwindow.__MCP_DATA__ - Updated
ReadResourceURI parser to match newui://scheme
- URI scheme changed from
Conceived by Romuald Czlonkowski - https://www.aiadvisors.pl/en
-
MCP Apps: Rich HTML UIs rendered by MCP hosts alongside tool results via
_meta.uiand the MCP resources protocol- Server-side UI module (
src/mcp/ui/) with tool-to-UI mapping and_meta.uiinjection UIAppRegistrystatic class for loading and serving self-contained HTML appsUI_APP_CONFIGSmapping tools to their corresponding UI apps
- Server-side UI module (
-
Operation Result UI: Visual summary for workflow operation tools
- Status badge, operation type, workflow details card
- Expandable sections for nodes added, modified, and removed
- Mapped to:
n8n_create_workflow,n8n_update_full_workflow,n8n_update_partial_workflow,n8n_delete_workflow,n8n_test_workflow,n8n_autofix_workflow,n8n_deploy_template
-
Validation Summary UI: Visual summary for validation tools
- Valid/invalid badge with error and warning counts
- Expandable error list with type, property, message, and fix
- Expandable warning list and suggestions
- Mapped to:
validate_node,validate_workflow,n8n_validate_workflow
-
React + Vite Build Pipeline (
ui-apps/):- React 19, Vite 6, vite-plugin-singlefile for self-contained HTML output
- Shared component library: Card, Badge, Expandable
useToolDatahook for reading data fromwindow.__MCP_DATA__or embedded JSON- n8n-branded dark theme with CSS custom properties
- Per-app builds via
APP_NAMEenvironment variable
-
MCP Resources Protocol: Server now exposes
resourcescapabilityListResourceshandler returns available UI appsReadResourcehandler serves self-contained HTML vian8n-mcp://ui/{id}URIs
-
New Scripts:
build:ui: Build UI apps (cd ui-apps && npm install && npm run build)build:all: Build UI apps then server (npm run build:ui && npm run build)
- MCP Server: Added
resources: {}to server capabilities alongside existingtools: {} - Tool Responses: Tools with matching UI apps now include
_meta.ui.appURI pointing to their visual representation - Graceful Degradation: Server starts and operates normally without
ui-apps/dist/; UI metadata is only injected when HTML is available
Conceived by Romuald Czlonkowski - https://www.aiadvisors.pl/en
- Updated n8n from 2.4.4 to 2.6.3
- Updated n8n-core from 2.4.2 to 2.6.1
- Updated n8n-workflow from 2.4.2 to 2.6.0
- Updated @n8n/n8n-nodes-langchain from 2.4.3 to 2.6.2
- Rebuilt node database with 806 nodes (544 from n8n-nodes-base, 262 from @n8n/n8n-nodes-langchain)
- Updated README badge with new n8n version
-
Critical memory leak: per-session database connections (Issue #542): Fixed severe memory leak where each MCP session created its own database connection (~900MB per session)
- Root cause:
N8NDocumentationMCPServercalledcreateDatabaseAdapter()for every new session, duplicating the entire 68MB database in memory - With 3-4 sessions, memory would exceed 4GB causing OOM kills every ~20 minutes
- Fix: Implemented singleton
SharedDatabasepattern - all sessions now share ONE database connection - Memory impact: Reduced from ~900MB per session to ~68MB total (shared) + ~5MB per session overhead
- Added
getSharedDatabase()andreleaseSharedDatabase()for thread-safe connection management - Added reference counting to track active sessions using the shared connection
- Root cause:
-
Session timeout optimization: Reduced default session timeout from 30 minutes to 5 minutes
- Faster cleanup of stale sessions reduces memory buildup
- Configurable via
SESSION_TIMEOUT_MINUTESenvironment variable
-
Eager instance cleanup: When a client reconnects, previous sessions for the same instanceId are now immediately cleaned up
- Prevents memory accumulation from reconnecting clients in multi-tenant deployments
-
Telemetry event listener leak: Fixed event listeners in
TelemetryBatchProcessorthat were never removed- Added proper cleanup in
stop()method - Added guard against multiple
start()calls
- Added proper cleanup in
- New module:
src/database/shared-database.ts- Singleton database managergetSharedDatabase(dbPath): Thread-safe initialization with promise lock patternreleaseSharedDatabase(state): Reference counting for cleanupcloseSharedDatabase(): Graceful shutdown for process terminationisSharedDatabaseInitialized()andgetSharedDatabaseRefCount(): Monitoring helpers
N8NDocumentationMCPServer.close(): Now releases shared database reference instead of closing the connectionSingleSessionHTTPServer.shutdown(): CallscloseSharedDatabase()during graceful shutdown
- Memory leak in SSE session reset (Issue #542): Fixed memory leak when SSE sessions are recreated every 5 minutes
- Root cause:
resetSessionSSE()only closed the transport but not the MCP server - This left the SimpleCache cleanup timer (60-second interval) running indefinitely
- Database connections and cached data (~50-100MB per session) persisted in memory
- Fix: Added
server.close()call beforetransport.close(), mirroring the existing cleanup pattern inremoveSession() - Impact: Prevents ~288 leaked server instances per day in long-running HTTP deployments
- Root cause:
- Updated n8n dependencies to latest versions
- n8n: 2.3.3 → 2.4.4
- n8n-core: 2.3.2 → 2.4.2
- n8n-workflow: 2.3.2 → 2.4.2
- @n8n/n8n-nodes-langchain: 2.3.2 → 2.4.3
- New
iconproperty type: Added support for the newiconNodePropertyType introduced in n8n 2.4.x- Added type structure definition in
src/constants/type-structures.ts - Updated type count from 22 to 23 NodePropertyTypes
- Updated related tests to reflect the new type
- Added type structure definition in
- Rebuilt node database with 803 nodes (541 from n8n-nodes-base, 262 from @n8n/n8n-nodes-langchain)
- Updated n8n dependencies to latest versions
- n8n: 2.2.3 → 2.3.3
- n8n-core: 2.2.2 → 2.3.2
- n8n-workflow: 2.2.2 → 2.3.2
- @n8n/n8n-nodes-langchain: 2.2.2 → 2.3.2
- Rebuilt node database with 537 nodes (434 from n8n-nodes-base, 103 from @n8n/n8n-nodes-langchain)
- Updated README badge with new n8n version
- Docker image version mismatch bug: Docker images were built with stale
package.runtime.json(v2.29.5) while npm package was at v2.33.0- Root cause:
build-dockerjob inrelease.ymldid not syncpackage.runtime.jsonversion before building - The
publish-npmjob synced the version, but both jobs ran in parallel, so Docker got the stale version - Added "Sync runtime version" step to
release.ymlbuild-dockerjob - Added "Sync runtime version" step to
docker-build.ymlbuildandbuild-railwayjobs - All Docker builds now sync
package.runtime.jsonversion frompackage.jsonbefore building
- Root cause:
AI-Powered Documentation for Community Nodes
Added AI-generated documentation summaries for 537 community nodes, making them accessible through the MCP get_node tool.
Features:
- README Fetching: Automatically fetches README content from npm registry for all community nodes
- AI Summary Generation: Uses local LLM (Qwen or compatible) to generate structured documentation summaries
- MCP Integration: AI summaries exposed in
get_nodewithmode='docs'
AI Documentation Structure:
{
"aiDocumentationSummary": {
"purpose": "What this node does",
"capabilities": ["key features"],
"authentication": "API key, OAuth, etc.",
"commonUseCases": ["practical examples"],
"limitations": ["known caveats"],
"relatedNodes": ["related n8n nodes"]
},
"aiSummaryGeneratedAt": "2026-01-08T10:45:31.000Z"
}New CLI Commands:
npm run generate:docs # Full generation (README + AI summary)
npm run generate:docs:readme-only # Only fetch READMEs from npm
npm run generate:docs:summary-only # Only generate AI summaries
npm run generate:docs:incremental # Skip nodes with existing data
npm run generate:docs:stats # Show documentation statistics
npm run migrate:readme-columns # Migrate database schemaEnvironment Variables:
N8N_MCP_LLM_BASE_URL=http://localhost:1234/v1 # LLM server URL
N8N_MCP_LLM_MODEL=qwen3-4b-thinking-2507 # Model name
N8N_MCP_LLM_TIMEOUT=60000 # Request timeoutFiles Added:
src/community/documentation-generator.ts- LLM integration with Zod validationsrc/community/documentation-batch-processor.ts- Batch processing with progress trackingsrc/scripts/generate-community-docs.ts- CLI entry pointsrc/scripts/migrate-readme-columns.ts- Database migration script
Files Modified:
src/database/schema.sql- Addednpm_readme,ai_documentation_summary,ai_summary_generated_atcolumnssrc/database/node-repository.ts- Added AI documentation methods and fieldssrc/community/community-node-fetcher.ts- AddedfetchPackageWithReadme()and batch fetchingsrc/community/index.ts- Exported new classessrc/mcp/server.ts- Added AI documentation toget_nodedocs mode response
Statistics:
- 538/547 community nodes have README content
- 537/547 community nodes have AI summaries
- Generation takes ~30 min for all nodes with local LLM
- Fixed community node count discrepancy: The search tool now correctly returns all 547 community nodes
- Root cause:
countCommunityNodes()method was not counting nodes with NULLis_communityflag - Added query to count nodes where
source_package NOT IN ('n8n-nodes-base', '@n8n/n8n-nodes-langchain') - This includes nodes that may have been inserted without the
is_communityflag set
- Root cause:
-
Community Node Search Integration: Added
sourcefilter tosearch_nodestool- Filter by
"core"for official n8n nodes (n8n-nodes-base + langchain) - Filter by
"community"for verified community integrations - Filter by
"all"(default) for all nodes - Example:
search_nodes({ query: "google", source: "community" })
- Filter by
-
Community Node Statistics: Added community node counts to search results
- Shows
communityNodeCountin search results when searching all sources - Indicates how many results come from verified community packages
- Shows
- Search Results Enhancement: Search results now include source information
- Each result shows whether it's from core or community packages
- Helps users identify and discover community integrations
- Added
sourceparameter tosearchNodes()method in NodeRepository - Updated
search_nodestool schema with newsourceparameter - Community nodes identified by
is_community=1flag in database - 547 verified community nodes available from 301 npm packages
-
Community Node Support: Full integration of verified n8n community nodes
- Added 547 verified community nodes from 301 npm packages
- Automatic fetching from n8n's verified integrations API
- NPM package metadata extraction (version, downloads, repository)
- Node property extraction via tarball analysis
- CLI commands:
npm run fetch:community,npm run fetch:community:rebuild
-
Database Schema Updates:
- Added
is_communityboolean flag for community node identification - Added
npm_package_namefor npm registry reference - Added
npm_versionfor installed package version - Added
npm_downloadsfor weekly download counts - Added
npm_repositoryfor GitHub/source links - Added unique constraint
idx_nodes_unique_typeonnode_type
- Added
-
New MCP Tool Features:
search_nodesnow includes community nodes in resultsget_nodereturns community metadata (npm package, downloads, repo)- Community nodes have full property/operation support
- Community node fetcher with retry logic and rate limiting
- Tarball extraction for node class analysis
- Support for multi-node packages (e.g., n8n-nodes-document-generator)
- Graceful handling of packages without extractable nodes
-
Real-World Configuration Examples: Added
includeExamplesparameter tosearch_nodesandget_nodetools- Pre-extracted configurations from 2,646 popular workflow templates
- Shows actual working configurations used in production workflows
- Examples include all parameters, credentials patterns, and common settings
- Helps AI understand practical usage patterns beyond schema definitions
-
Example Data Sources:
- Top 50 most-used nodes have 2+ configuration examples each
- Examples extracted from templates with 1000+ views
- Covers diverse use cases: API integrations, data transformations, triggers
- Tool Parameter Updates:
search_nodes: AddedincludeExamplesboolean parameter (default: false)get_nodewithmode='info'anddetail='standard': AddedincludeExamplesparameter
- Examples stored in
node_config_examplestable with template metadata - Extraction script:
npm run extract:examples - Examples include: node parameters, credentials type, template ID, view count
- Adds ~200-400 tokens per example to response
- Critical validation loop prevention: Added infinite loop detection in workflow validation with 1000-iteration safety limit
- Memory management improvements: Fixed potential memory leaks in validation result accumulation
- Error propagation: Improved error handling to prevent silent failures during validation
- Validation performance: Optimized loop detection algorithm to reduce CPU overhead
- Debug logging: Added detailed logging for validation iterations when DEBUG=true
- Node type version validation: Fixed false positive errors for nodes using valid older typeVersions
- AI tool variant detection: Improved detection of AI-capable tool variants in workflow validation
- Connection validation: Fixed edge case where valid connections between AI nodes were flagged as errors
- Sticky note validation: Fixed false "missing name property" errors for n8n sticky notes
- Loop node connections: Fixed validation of Loop Over Items node output connections
- Expression format detection: Improved detection of valid n8n expression formats
- HTTP Request node validation: Fixed false positives for valid authentication configurations
- Webhook node paths: Fixed validation of webhook paths with dynamic segments
- Resource mapper validation: Improved handling of auto-mapped fields
- typeVersion validation: Fixed incorrect "unknown typeVersion" warnings for valid node versions
- AI node connections: Fixed validation of connections between AI agent and tool nodes
- Expression escaping: Fixed handling of expressions containing special characters
-
Workflow Auto-Fixer: New
n8n_autofix_workflowtool for automatic error correction- Fixes expression format issues (missing
=prefix) - Corrects invalid typeVersions to latest supported
- Adds missing error output configurations
- Fixes webhook paths and other common issues
- Preview mode (default) shows fixes without applying
- Apply mode updates workflow with corrections
- Fixes expression format issues (missing
-
Fix Categories:
expression-format: Fixes{{ }}to={{ }}typeversion-correction: Updates to valid typeVersionerror-output-config: Adds missing onError settingswebhook-missing-path: Generates unique webhook pathsnode-type-correction: Fixes common node type typos
- Validation Integration: Auto-fixer integrates with existing validation
- Confidence Scoring: Each fix includes confidence level (high/medium/low)
- Batch Processing: Multiple fixes applied in single operation
-
Execution Debugging: New
n8n_executionstool withmode='error'for debugging failed workflows- Optimized error analysis with upstream node context
- Execution path tracing to identify failure points
- Sample data from nodes leading to errors
- Stack trace extraction for debugging
-
Execution Management Features:
action='list': List executions with filters (status, workflow, project)action='get': Get execution details with multiple modesaction='delete': Remove execution records- Pagination support with cursor-based navigation
- Error Response Format: Enhanced error details include:
errorNode: Node where error occurrederrorMessage: Human-readable error descriptionupstreamData: Sample data from preceding nodesexecutionPath: Ordered list of executed nodes
-
Workflow Version History: New
n8n_workflow_versionstool for version managementmode='list': View version history for a workflowmode='get': Get specific version detailsmode='rollback': Restore workflow to previous versionmode='delete': Remove specific versionsmode='prune': Keep only N most recent versionsmode='truncate': Clear all version history
-
Version Features:
- Automatic backup before rollback
- Validation before restore
- Configurable retention policies
- Version comparison capabilities
-
Template Deployment: New
n8n_deploy_templatetool for one-click template deployment- Deploy any template from n8n.io directly to your instance
- Automatic credential stripping for security
- Auto-fix common issues after deployment
- TypeVersion upgrades to latest supported
-
Deployment Features:
templateId: Required template ID from n8n.ioname: Optional custom workflow nameautoFix: Enable/disable automatic fixes (default: true)autoUpgradeVersions: Upgrade node versions (default: true)stripCredentials: Remove credential references (default: true)
-
Workflow Diff Engine: New partial update system for efficient workflow modifications
n8n_update_partial_workflow: Apply incremental changes via diff operations- Operations: addNode, removeNode, updateNode, moveNode, enable/disableNode
- Connection operations: addConnection, removeConnection
- Metadata operations: updateSettings, updateName, add/removeTag
-
Diff Benefits:
- 80-90% token reduction for updates
- Atomic operations with rollback on failure
- Validation-only mode for testing changes
- Best-effort mode for partial application
- Session Persistence API: Export and restore session state for zero-downtime deployments
exportSessionState(): Serialize active sessions with contextrestoreSessionState(): Recreate sessions from serialized state- Multi-tenant support for SaaS deployments
- Automatic session expiration handling
- Important: API keys exported as plaintext - downstream MUST encrypt
- Session validation on restore prevents invalid state injection
- Respects
sessionTimeoutconfiguration during restore
-
Flexible Instance Configuration: Connect to any n8n instance dynamically
- Session-based instance switching via
configuremethod - Per-request instance override in tool calls
- Backward compatible with environment variable configuration
- Session-based instance switching via
-
Multi-Tenant Support: Run single MCP server for multiple n8n instances
- Each session maintains independent instance context
- Secure credential isolation between sessions
- Automatic context cleanup on session end
-
Type Structure Validation: Complete validation for all 22 n8n property types
filter: Validates conditions array, combinator, operator structureresourceMapper: Validates mappingMode and field mappingsassignmentCollection: Validates assignments array structureresourceLocator: Validates mode and value combinations
-
Type Structure Service: New service for type introspection
getStructure(type): Get complete type definitiongetExample(type): Get working example valuesisComplexType(type): Check if type needs special handlinggetJavaScriptType(type): Get underlying JS type
- Enhanced Validation: Validation now includes type-specific checks
- Better Error Messages: Type validation errors include expected structure
-
Complete Type Structures: Defined all 22 NodePropertyTypes with:
- JavaScript type mappings
- Expected data structures
- Working examples
- Validation rules
- Usage notes
-
Type Categories:
- Primitive: string, number, boolean, dateTime, color, json
- Options: options, multiOptions
- Collections: collection, fixedCollection
- Special: resourceLocator, resourceMapper, filter, assignmentCollection
- Credentials: credentials, credentialsSelect
- UI-only: hidden, button, callout, notice
- Utility: workflowSelector, curlImport
-
n8n Workflow Management Tools: Full CRUD operations for n8n workflows
n8n_create_workflow: Create new workflowsn8n_get_workflow: Retrieve workflow detailsn8n_update_full_workflow: Complete workflow replacementn8n_delete_workflow: Remove workflowsn8n_list_workflows: List all workflows with filtersn8n_validate_workflow: Validate workflow by IDn8n_test_workflow: Trigger workflow execution
-
Health Check:
n8n_health_checktool for API connectivity verification
- Tool Organization: Management tools require n8n API configuration
- Error Handling: Improved error messages for API failures
- Tools Documentation System: Self-documenting MCP tools
tools_documentationtool for comprehensive tool guides- Topic-based documentation (overview, specific tools)
- Depth levels: essentials (quick ref) and full (comprehensive)
- Documentation Format: Standardized documentation across all tools
- Help System: Integrated help accessible from within MCP
-
Workflow Validation Tool:
validate_workflowfor complete workflow checks- Node configuration validation
- Connection validation
- Expression syntax checking
- AI tool compatibility verification
-
Validation Profiles:
minimal: Quick required fields checkruntime: Production-ready validationai-friendly: Balanced for AI workflowsstrict: Maximum validation coverage
- Expression Validator: Validate n8n expression syntax
- Detects missing
=prefix in expressions - Validates
$json,$node,$inputreferences - Checks function call syntax
- Reports expression errors with suggestions
- Detects missing
- Validation Integration: Expression validation integrated into workflow validator
-
Node Essentials Tool:
get_node_essentialsfor AI-optimized node info- 60-80% smaller responses than full node info
- Essential properties only
- Working examples included
- Perfect for AI context windows
-
Property Filtering: Smart filtering of node properties
- Removes internal/deprecated properties
- Keeps only user-configurable options
- Maintains operation-specific properties
-
Enhanced Config Validator: Operation-aware validation
- Validates resource/operation combinations
- Suggests similar resources when invalid
- Provides operation-specific property requirements
-
Similarity Services:
- Resource similarity for typo detection
- Operation similarity for suggestions
- Fuzzy matching with configurable threshold
-
Template System: Workflow templates from n8n.io
search_templates: Find templates by keyword, nodes, or taskget_template: Retrieve complete template JSON- 2,700+ templates indexed with metadata
- Search modes: keyword, by_nodes, by_task, by_metadata
-
Template Metadata:
- Complexity scoring
- Setup time estimates
- Required services
- Node usage statistics
-
HTTP Server Mode: REST API for MCP integration
- Single-session endpoint for simple deployments
- Multi-session support for SaaS
- Bearer token authentication
- CORS configuration
-
Docker Support: Official Docker image
ghcr.io/czlonkowski/n8n-mcp- Railway one-click deploy
- Environment-based configuration
-
Node Version Support: Track and query node versions
mode='versions': List all versions of a nodemode='compare': Compare two versionsmode='breaking': Find breaking changesmode='migrations': Get migration guides
-
Version Migration Service: Automated migration suggestions
- Property mapping between versions
- Breaking change detection
- Upgrade recommendations
-
AI Tool Detection: Identify AI-capable nodes
- 265 AI tool variants detected
- Tool vs non-tool node classification
- AI workflow validation support
-
Tool Variant Handling: Special handling for AI tools
- Validate tool configurations
- Check AI node connections
- Verify tool compatibility
- Node-Specific Validators: Custom validation for complex nodes
- HTTP Request: URL, method, auth validation
- Code: JavaScript/Python syntax checking
- Webhook: Path and response validation
- Slack: Channel and message validation
- Validation Architecture: Pluggable validator system
- Error Specificity: More targeted error messages
-
Config Validator: Multi-profile validation system
- Validate node configurations before deployment
- Multiple strictness profiles
- Detailed error reporting with suggestions
-
Validation Profiles:
minimal: Required fields onlyruntime: Runtime compatibilityai-friendly: Balanced validationstrict: Full schema validation
-
Documentation Mapping: Integrated n8n docs
- 87% coverage of core nodes
- Links to official documentation
- AI node documentation included
-
Docs Mode:
get_node(mode='docs')for markdown documentation
- Property Dependencies: Analyze property relationships
- Find dependent properties
- Understand displayOptions
- Track conditional visibility
- Property Extraction: Enhanced extraction with dependencies
- FTS5 Search: Full-text search with SQLite FTS5
- Fast fuzzy searching
- Relevance ranking
- Partial matching
- Search Performance: 10x faster searches with FTS5
- Database Adapter: Universal SQLite adapter
- better-sqlite3 for Node.js
- sql.js for browser/Cloudflare
- Automatic adapter selection
- Deployment Flexibility: Works in more environments
- Search Nodes Tool:
search_nodesfor node discovery- Keyword search with multiple modes
- OR, AND, FUZZY matching
- Result limiting and pagination
- Tool Interface: Standardized parameter naming
- Get Node Tool:
get_nodefor detailed node info- Multiple detail levels: minimal, standard, full
- Multiple modes: info, docs, versions
- Property searching
- Validate Node Tool:
validate_nodefor configuration validation- Validates against node schema
- Reports errors and warnings
- Provides fix suggestions
- Property Extraction: Deep analysis of node properties
- Extract all configurable properties
- Parse displayOptions conditions
- Handle nested collections
- Node Parser: Parse n8n node definitions
- Extract metadata (name, description, icon)
- Parse properties and operations
- Handle version variations
- Node Loader: Load nodes from n8n packages
- Support n8n-nodes-base
- Support @n8n/n8n-nodes-langchain
- Handle node class instantiation
- MCP Server: Model Context Protocol implementation
- stdio mode for Claude Desktop
- Tool registration system
- Resource handling
- Architecture: Complete rewrite for MCP compatibility
- Initial release
- Basic n8n node database
- Simple search functionality