n8n-code-tool
Lets your agent write and debug code for custom tools. It handles schemas and return formats. Useful for creating AI tools that interact with n8n.
What it does
This tool helps you write and fix JavaScript or Python code for a specific n8n function called 'Custom Code Tool'. It ensures your code works correctly within that environment.
When to use it
- ✓When you need to write code that will be executed by n8n's 'Custom Code Tool'.
- ✓When debugging or fixing JavaScript or Python code already used in the 'Custom Code Tool'.
- ✓To understand the rules and limitations of how code interacts with n8n's 'Custom Code Tool'.
Example of what to ask your AI
“Write JavaScript code for the Custom Code Tool that takes a name and returns 'Hello, [name]!'”
Want more? Open the sections below.
How to use
The easiest way: copy the message below and paste it into Claude, ChatGPT, Cursor or any AI. It reads the skill and follows the instructions.
Skill link
Ready-to-paste message
How it works
You provide the JavaScript or Python code. The tool checks if it follows the rules of n8n's 'Custom Code Tool' and suggests fixes if needed.
Installation
Easiest way: copy the skill link and paste it into Claude, ChatGPT or Cursor asking it to follow the instructions.
In the terminal (Claude Code, Codex, Cursor), in your project folder:
npx skills add sickn33/agentic-awesome-skills --skill n8n-code-toolOr download just the file:
curl -L https://raw.githubusercontent.com/sickn33/agentic-awesome-skills/main/plugins/agentic-awesome-skills-claude/skills/n8n-code-tool/SKILL.md -o SKILL.mdTechnical content (original SKILL.md)
Original text by the author, straight from GitHub.
n8n Custom Code Tool
When to Use
Use this skill specifically for code executed by the AI-agent-callable n8n Custom Code Tool. Use the separate JavaScript or Python Code-node skills for ordinary workflow Code nodes.
Do not hardcode secrets or accept arbitrary executable code from untrusted input. Constrain inputs with a schema, validate outputs, allowlist any network destinations, and ask before testing a tool whose code can write data or invoke an external service.
Expert guidance for writing code inside @n8n/n8n-nodes-langchain.toolCode — the tool an AI Agent can invoke, not the regular workflow Code node.
⚠️ This is NOT the Code node
The Custom Code Tool looks like a Code node in the editor — same JavaScript editor, similar layout — but it is a completely different node from a different package with a different runtime contract.
| Code node | Custom Code Tool | |
|---|---|---|
| Node type | n8n-nodes-base.code |
@n8n/n8n-nodes-langchain.toolCode |
| Package | n8n-nodes-base |
@n8n/n8n-nodes-langchain |
| Invoked by | Previous node (workflow flow) | AI Agent (LangChain) |
| Input | $input.all() — item stream |
query — string or object from LLM |
| Return | [{json: {...}}] (items array) |
A string |
$fromAI() |
N/A | Not available (see Errors) |
| HTTP helper | this.helpers.httpRequest (auth helpers blocked) |
Not exposed to the tool sandbox |
| State | Per-run execution data | No getContext, no $getWorkflowStaticData |
If you treat it like a Code node, it fails. The rest of this skill covers the Code Tool's actual contract.
Quick Start
Minimal JavaScript Code Tool
// `query` is whatever the AI sent (a string by default)
return `You asked: ${query}`;
Minimal Python Code Tool
# `_query` is whatever the AI sent (a string by default)
return f"You asked: {_query}"
Essential Rules
- Return a string. Numbers are auto-converted. Anything else throws
"The response property should be a string, but it is an object". - Input variable is fixed:
query(JS),_query(Python). You cannot rename it. - Do NOT use
$fromAI()inside the Code Tool sandbox — it throws"No execution data available". - Do NOT use
[{json: {...}}]return format — that's for Code nodes. Throws"Wrong output type returned". - Use a descriptive tool name (letters/numbers/underscores, v1.1+). The agent calls the tool by its name.
- Write a precise description — the LLM decides whether to invoke the tool based on it.
The Two Input Modes
The Code Tool has two input shapes, controlled by specifyInputSchema:
Mode 1: Unstructured (default, specifyInputSchema: false)
The AI passes a single string as query. If you need multiple fields, the AI has to stuff them into that one string and you parse them out. In practice, LLMs will happily pass a JSON string if your description tells them to.
// Parse a JSON string the AI sent
let params;
try {
params = typeof query === 'string' ? JSON.parse(query) : query;
} catch (e) {
throw new Error('Expected a JSON object. Parser said: ' + e.message);
}
const price = Number(params.price);
const months = Number(params.months);
// ...
return JSON.stringify({ monthly_payment: /* ... */ });
Pros: simplest to set up, one field to describe. Cons: no schema validation — if the LLM forgets a field, the tool throws at runtime.
Best for: quick prototypes, tools with one natural input (a question, a URL, a text blob).
Mode 2: Structured (specifyInputSchema: true)
The tool becomes a LangChain DynamicStructuredTool. The LLM sees a typed argument schema and passes a validated object as query. You access fields directly.
// query is now an object matching your schema
const price = query.price;
const months = query.months;
const residual_percent = query.residual_percent;
const monthly = computeAnnuity(price, months, residual_percent);
return JSON.stringify({ monthly_payment: monthly });
Schema is defined via either:
schemaType: "fromJson"+jsonSchemaExample(n8n v≥1.3) — paste an example JSON, n8n infers the schemaschemaType: "manual"+inputSchema— write a full JSON Schema yourself
Pros: LLM gets type hints, invalid calls rejected before your code runs, cleaner code.
…
FAQ
What's the difference between the 'Custom Code Tool' and a regular Code node in n8n?
The 'Custom Code Tool' is used by an AI Agent and has different input/output rules compared to a regular Code node, which is executed by your workflow's flow.
What happens if my code doesn't return a string?
The 'Custom Code Tool' expects code to return a string. If it returns another type (like an object or array), the code will fail, and an error message will be shown.
Can I use variables like '$fromAI()' or the '[{json: {...}}]' return format?
No, these features are not available in the 'Custom Code Tool'. Using them will result in errors.
Details
Original description by the author
Write and debug JavaScript or Python for the AI-callable n8n Custom Code Tool, including schemas, sandbox limits, and return formats.
Popularity
- GitHub stars
- 48k
- Ranking position
- #3656
- License
- MIT
- Updated
- 10/15/2026
Comments
- …
More skills from this repository
00-andruia-consultant
Helps your agent start or improve AI projects. It analyzes code, suggests tools, and creates action plans in Spanish.
sickn33/agentic-awesome-skills
007
Lets your agent perform security audits and threat modeling. It's useful for protecting projects against attacks and vulnerabilities.
sickn33/agentic-awesome-skills
10-andruia-skill-smith
Helps your agent create or improve AI tools. It defines how tools work, writes documentation, and validates the structure.
sickn33/agentic-awesome-skills
20-andruia-niche-intelligence
Lets your agent create a summary about a specific industry. It's useful for understanding the context, rules, usage patterns, and risks of a project, using reliable sources.
sickn33/agentic-awesome-skills
Similar skills
benchmark-optimization-loop
Has your agent improve something's speed in a measured way. It tests multiple versions and chooses the fastest one that still works correctly.
affaan-m/ECC
change-impact
Helps your agent analyze the impact of code changes before making them. It compares the planned vs. actual results afterward, covering paths, data, tests, and documentation. Useful for risky or system-wide changes.
affaan-m/ECC
click-path-audit
Lets your agent trace all user buttons and interactions to find bugs. It finds issues where functions seem to work alone but fail together. Useful when bugs persist even after debugging.
affaan-m/ECC