n8n-io/n8n · error · NodeOperationError

No tool inputs found

Error message

No tool inputs found

What it means

Thrown by the ToolExecutor node when getInputConnectionData for AiTool returns a falsy value or a non-array. The node iterates over connected tools to find the one named toolName; if there is nothing iterable to loop over, it cannot proceed.

Solutions

  1. Connect at least one Tool or Toolkit node to the ToolExecutor's AiTool input.
  2. Verify connected tool nodes execute and return a valid tool instance.
  3. Ensure the connection type is AiTool (not AiLanguageModel or other).

Example fix

// before: ToolExecutor has toolName set but no tool connected
// after: connect the desired Tool/Toolkit node to the AiTool input
Defensive patterns

Strategy: validation

Validate before calling

const toolInputs = await getInputConnectionData(NodeConnectionTypes.AiTool, 0);
if (!Array.isArray(toolInputs) || toolInputs.length === 0) {
  throw new Error('Connect at least one Tool/Toolkit');
}

Type guard

function hasToolInputs(t): t is unknown[] { return Array.isArray(t) && t.length > 0; }

Prevention

When it happens

Trigger: After `const toolInputs = await this.getInputConnectionData(NodeConnectionTypes.AiTool, 0)`, the check `if (!toolInputs || !Array.isArray(toolInputs))` throws. Fires when no tool/toolkit is connected to the AiTool input, or the connection resolves to a non-array.

Common situations: ToolExecutor node with no tool connected; a connected tool node that failed to supply data; wrong connection type attached; the tool sub-graph upstream errored.

Related errors


AI-assisted analysis of n8n-io/n8n@5ac6606e81 (2026-08-12). Data as JSON: /api/errors/46fa29332b17ad94. Report an issue: GitHub.

Appendix: source

Thrown at packages/@n8n/nodes-langchain/nodes/ToolExecutor/ToolExecutor.node.ts:111

			throw new NodeOperationError(
				this.getNode(),
				`Failed to parse query: ${(error as Error).message}`,
			);
		}

		const getQueryData = (name: string) => {
			// node names in query may have underscores in place of spaces, use it for accessing the query data.
			return (get(parsedQuery, name, null) ?? get(parsedQuery, name.replaceAll(' ', '_'), null)) as
				| Record<string, unknown>
				| string
				| null;
		};

		const resultData: INodeExecutionData[] = [];
		const toolInputs = await this.getInputConnectionData(NodeConnectionTypes.AiTool, 0);

		if (!toolInputs || !Array.isArray(toolInputs)) {
			throw new NodeOperationError(this.getNode(), 'No tool inputs found');
		}

		try {
			for (const tool of toolInputs) {
				// Handle toolkits
				if (tool && typeof (tool as Toolkit).getTools === 'function') {
					const toolsInToolkit = (tool as Toolkit).getTools();
					for (const toolkitTool of toolsInToolkit) {
						if (!(toolkitTool instanceof Tool || toolkitTool instanceof StructuredTool)) {
							continue;
						}

						if (toolName === toolkitTool.name) {
							if (hasGatedToolNodeName(toolkitTool.metadata) && node) {
								const toolInput: { toolParameters: unknown } = {
									toolParameters: getQueryData(toolName) ?? {},
								};
								const hitlInput = getQueryData(node);

View on GitHub (pinned to 5ac6606e81)