{"record":{"id":"46fa29332b17ad94","repo":"n8n-io/n8n","slug":"no-tool-inputs-found","errorCode":null,"errorMessage":"No tool inputs found","messagePattern":"No tool inputs found","errorType":"exception","errorClass":"NodeOperationError","httpStatus":null,"severity":"error","filePath":"packages/@n8n/nodes-langchain/nodes/ToolExecutor/ToolExecutor.node.ts","lineNumber":111,"sourceCode":"\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.getNode(),\n\t\t\t\t`Failed to parse query: ${(error as Error).message}`,\n\t\t\t);\n\t\t}\n\n\t\tconst getQueryData = (name: string) => {\n\t\t\t// node names in query may have underscores in place of spaces, use it for accessing the query data.\n\t\t\treturn (get(parsedQuery, name, null) ?? get(parsedQuery, name.replaceAll(' ', '_'), null)) as\n\t\t\t\t| Record<string, unknown>\n\t\t\t\t| string\n\t\t\t\t| null;\n\t\t};\n\n\t\tconst resultData: INodeExecutionData[] = [];\n\t\tconst toolInputs = await this.getInputConnectionData(NodeConnectionTypes.AiTool, 0);\n\n\t\tif (!toolInputs || !Array.isArray(toolInputs)) {\n\t\t\tthrow new NodeOperationError(this.getNode(), 'No tool inputs found');\n\t\t}\n\n\t\ttry {\n\t\t\tfor (const tool of toolInputs) {\n\t\t\t\t// Handle toolkits\n\t\t\t\tif (tool && typeof (tool as Toolkit).getTools === 'function') {\n\t\t\t\t\tconst toolsInToolkit = (tool as Toolkit).getTools();\n\t\t\t\t\tfor (const toolkitTool of toolsInToolkit) {\n\t\t\t\t\t\tif (!(toolkitTool instanceof Tool || toolkitTool instanceof StructuredTool)) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (toolName === toolkitTool.name) {\n\t\t\t\t\t\t\tif (hasGatedToolNodeName(toolkitTool.metadata) && node) {\n\t\t\t\t\t\t\t\tconst toolInput: { toolParameters: unknown } = {\n\t\t\t\t\t\t\t\t\ttoolParameters: getQueryData(toolName) ?? {},\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tconst hitlInput = getQueryData(node);","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/n8n-io/n8n/blob/5ac6606e81f67bb9534255570cd4e86fd8101eee/packages/@n8n/nodes-langchain/nodes/ToolExecutor/ToolExecutor.node.ts#L93-L129","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Connect at least one Tool or Toolkit node to the ToolExecutor's AiTool input.","Verify connected tool nodes execute and return a valid tool instance.","Ensure the connection type is AiTool (not AiLanguageModel or other)."],"exampleFix":"// before: ToolExecutor has toolName set but no tool connected\n// after: connect the desired Tool/Toolkit node to the AiTool input","handlingStrategy":"validation","validationCode":"const toolInputs = await getInputConnectionData(NodeConnectionTypes.AiTool, 0);\nif (!Array.isArray(toolInputs) || toolInputs.length === 0) {\n  throw new Error('Connect at least one Tool/Toolkit');\n}","typeGuard":"function hasToolInputs(t): t is unknown[] { return Array.isArray(t) && t.length > 0; }","tryCatchPattern":null,"preventionTips":["Always connect at least one Tool or Toolkit node to ToolExecutor.","Verify the connection type is AiTool.","Use the editor preview to confirm tools resolve before execution."],"tags":["tool-executor","connections","langchain","config"],"backgroundTag":null,"analyzedSha":"5ac6606e81f67bb9534255570cd4e86fd8101eee","analyzedAt":"2026-08-12T05:26:35.080Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}