You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* fix: resolve AI-tool validation follow-ups (czlonkowski#953, czlonkowski#954, czlonkowski#955, czlonkowski#956)
Four fixes to AI-tool validation, filed as follow-up issues from the czlonkowski#952
review:
- validate_workflow no longer rejects vector-store nodes wired to an AI
Agent in retrieve-as-tool mode (czlonkowski#953). The database stores each node's
raw outputs expression, so validateAIToolSource now recognises an
output that exists only for particular parameter values by scanning
that expression for ai_tool, instead of maintaining a list of the
nodes that declare one. Covers all vector stores in 2.31.3, including
vectorStoreInMemory, which the issue's 12-node list missed. When the
expression gates the output on mode retrieve-as-tool and the node's
mode is a different literal (or unset), a AI_TOOL_MODE_MISMATCH
warning explains the fix instead of a false INVALID_AI_TOOL_SOURCE.
- Community AI-tool detection no longer infers capability from the node
name (czlonkowski#954). The substring test flagged any package containing "ai" -
901 of 1,455 community rows. Detection now accepts a declared
usableAsTool (any non-false value, matching the core parser's object-
form handling) or the codex AI category, which stays as a labelled
inference because community metadata often omits usableAsTool.
get_node reports the provenance in a new aiToolFlagSource field, and
list_ai_tools describes the flag honestly. Community data refreshed:
853 of 1,457 rows remain flagged, from declared or codex signals.
- The "Community node used as an AI tool" warning now means it (czlonkowski#955).
It keyed community status on package !== 'n8n-nodes-base', sweeping in
first-party @n8n/n8n-nodes-langchain, and it inspected the target of
the ai_tool connection - always the AI Agent itself - so every agent
workflow warned about "Community node AI Agent". The check now tests
the database's community flag on the connection's source (the tool
node), and get_node's requiresEnvironmentVariable follows the same
flag instead of !isAITool && package-name.
- The AI Agent systemMessage advisory reads options.systemMessage,
where the node actually stores it (czlonkowski#956). The old top-level read made
the "has no systemMessage" notice fire unconditionally and left the
too-short check unreachable; the top-level path is kept as a fallback.
Also removes getNodeAsToolInfo and getAIToolExamples: dead code (no
dispatch path reaches them) carrying the same package-name assumption.
Conceived by Romuald Członkowski - www.aiadvisors.pl/en
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* refactor: simplify the follow-up fixes after review pass
Named booleans for the community AI-tool detection, hoisted flags and an
extracted validateConditionalAIToolMode in the workflow validator, and a
flattened aiToolFlagSource derivation. No behavior change; suites pinned
by the previous commit still pass.
Conceived by Romuald Członkowski - www.aiadvisors.pl/en
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix: address review findings on the conditional ai_tool mode check
- mode: null now counts as unset rather than falling through the
staticness test unwarned - an exported workflow can carry the null.
- The warn-on-unset path no longer assumes the default mode: it reads
the expression's own ?? '<default>' fallback and stays silent when the
default is retrieve-as-tool or unidentifiable.
- The community-notice test also pins that no INVALID_AI_TOOL_SOURCE
error accompanies the notice for a declared-usableAsTool tool.
Conceived by Romuald Członkowski - www.aiadvisors.pl/en
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* chore: bump version to 2.66.2 and update changelog
Conceived by Romuald Członkowski - www.aiadvisors.pl/en
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix: address Copilot review comments
- The systemMessage too-short advisory skips expressions - their length
says nothing about the resolved prompt.
- The AI_TOOL_MODE_MISMATCH message keys "mode is not set" on the
computed isUnset rather than truthiness, so an empty-string mode is
reported as the value it is.
- list_ai_tools requirements.nodeProperty no longer claims every listed
node declares usableAsTool: true.
Conceived by Romuald Członkowski - www.aiadvisors.pl/en
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix: address Codex review findings
- A community tool the bundled database does not know keeps the env-var
notice, recognised by its package-qualified non-core type - the old
target-side check emitted it for that case by accident, the source-side
move had silently dropped it.
- aiToolFlagSource's community value is named for what it means:
declared-or-ai-category. Ingestion collapses the two signals into one
flag, and the label no longer implies otherwise.
- findConditionalAIToolExpression accepts a bare-string outputs value -
community ingestion stores nodeDesc.outputs verbatim, without the
array wrap core parsing applies.
- The permissive-scan trade-off is documented at the accept site, and
the stale ai_tool statistics test now wires the tool as the source.
Not adopted from the review: extending the scan to per-node output
semantics (Code node outputs config) - under-warning beats the false
error this replaced; and list_ai_tools is not dead code - the
mcp-tools-engine embedding API calls it.
Conceived by Romuald Członkowski - www.aiadvisors.pl/en
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix: scope the list_ai_tools env-var requirement to community nodes
Copilot re-review: requirements.environmentVariable read as a blanket
requirement; only community packages need it.
Conceived by Romuald Członkowski - www.aiadvisors.pl/en
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* test: give the conditional-outputs repo mock a getAllNodes stub
Copilot re-review: the unknown-node test satisfied the validator's
repository surface via a caught TypeError in NodeSimilarityService.
Conceived by Romuald Członkowski - www.aiadvisors.pl/en
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* refactor: extract pushCommunityToolUsageWarning
Copilot re-review: the warning payload was constructed in two branches
and could drift.
Conceived by Romuald Członkowski - www.aiadvisors.pl/en
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix: address Copilot round-six comments
- The findConditionalAIToolExpression JSDoc sits above the method it
documents again; the warning helper had landed between them.
- The ai_tool connection-statistics test uses a langchain tool as the
source and pins the absence of INVALID_AI_TOOL_SOURCE, keeping it a
pure positive-path test; the invalid-source case stays pinned in the
Tool Variant Validation suite.
Not adopted: trimming before the systemMessage expression check - n8n
treats only values starting exactly with '=' as expressions, so a
leading-whitespace variant reaches the model as literal text and the
too-short advisory firing on it is correct.
Conceived by Romuald Członkowski - www.aiadvisors.pl/en
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* docs: list all four accept paths in the validateAIToolSource JSDoc
Copilot re-review: the "valid sources" list predated the conditional
outputs and isAITool paths.
Conceived by Romuald Członkowski - www.aiadvisors.pl/en
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: CHANGELOG.md
+10Lines changed: 10 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
8
8
## [Unreleased]
9
9
10
+
## [2.66.2] - 2026-07-27
11
+
12
+
### Fixed
13
+
14
+
-**Vector stores in `retrieve-as-tool` mode validate as AI tools (#953).** n8n's vector-store nodes expose an `ai_tool` output only when `mode` is `retrieve-as-tool`, but `validate_workflow` resolved ai_tool sources against a fixed node list and rejected the connection with `INVALID_AI_TOOL_SOURCE`. The database stores each node's raw outputs expression, so the validator now recognises an output that exists only for particular parameter values by scanning that expression — covering every vector store in 2.31.3 without maintaining a list. When the node's `mode` is a different literal (or unset, so the default `retrieve` applies), a new `AI_TOOL_MODE_MISMATCH` warning names the parameter to change instead of a false error.
15
+
-**Community AI-tool detection no longer infers capability from the node name (#954).** Any package whose name contained the letters "ai" — `n8n-nodes-raia`, `@firefliesai/n8n-nodes-fireflies` — was flagged `is_ai_tool`, 901 of 1,455 community rows in total. Detection now requires a declared `usableAsTool` (any non-`false` value, matching the core parser's handling of the object form) or the package's codex AI category, which stays as a labelled inference because community metadata often omits `usableAsTool`. `get_node` reports the provenance in a new `aiToolFlagSource` field, and the community data was refreshed: 853 of 1,457 rows remain flagged, all from declared or codex signals.
16
+
-**The "Community node used as an AI tool" warning now describes a community node (#955).** It defined community as `package !== 'n8n-nodes-base'` — sweeping in first-party `@n8n/n8n-nodes-langchain` — and it inspected the target of the `ai_tool` connection, which is always the AI Agent, so essentially every agent workflow warned that "Community node \"AI Agent\"" needed `N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true`. The check now tests the database's community flag on the connection's source — the tool node — and `get_node`'s `requiresEnvironmentVariable` follows the same flag instead of the AI-tool flag and a package-name test. A community tool the bundled database does not know (a user-installed package) keeps the notice, recognised by its package-qualified type.
17
+
-**The AI Agent `systemMessage` advisory reads the parameter where n8n stores it (#956).** The check read `parameters.systemMessage`, but the node keeps it under `options`, so "has no systemMessage" fired on every agent regardless of configuration — and an agent following the advice by setting the top-level field saw the message persist. The too-short check, previously unreachable, now runs as intended. The top-level read is kept as a fallback.
18
+
- Removed `getNodeAsToolInfo` and `getAIToolExamples` from the MCP server: dead code with no dispatch path, carrying the same package-name assumption as #955.
[](https://railway.com/deploy/n8n-mcp?referralCode=n8n-mcp)
11
11
12
-
A Model Context Protocol (MCP) server that provides AI assistants with comprehensive access to n8n node documentation, properties, and operations. Deploy in minutes to give Claude and other AI assistants deep knowledge about n8n's 2,283 workflow automation nodes (828 core + 1,455 community).
12
+
A Model Context Protocol (MCP) server that provides AI assistants with comprehensive access to n8n node documentation, properties, and operations. Deploy in minutes to give Claude and other AI assistants deep knowledge about n8n's 2,285 workflow automation nodes (828 core + 1,457 community).
13
13
14
14
## Overview
15
15
16
16
n8n-MCP serves as a bridge between n8n's workflow automation platform and AI models, enabling them to understand and work with n8n nodes effectively. It provides structured access to:
environmentVariable: 'N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true (community nodes only; built-in tools need no environment variable)',
2887
+
nodeProperty: 'usableAsTool (declared; community nodes may instead carry the codex AI category)',
2872
2888
},
2873
2889
usage: {
2874
-
description: 'These nodes have the usableAsTool property set to true, making them optimized for AI agent usage.',
2890
+
description: 'These nodes are marked as AI tools. For built-in nodes this reflects a declared usableAsTool property; for community nodes it can also be inferred from the package\'s AI category, since community metadata often omits the property.',
2875
2891
note: 'ANY node in n8n can be used as an AI tool by connecting it to the ai_tool port of an AI Agent node.',
2876
2892
examples: [
2877
2893
'Regular nodes like Slack, Google Sheets, or HTTP Request can be used as tools',
@@ -3925,75 +3941,6 @@ Full documentation is being prepared. For now, use get_node_essentials for confi
0 commit comments