When building AI agent workflows in n8n, one of the first problems you run into is token bloat. If your agent needs to know about a set of reusable instruction sets (skills), the naive approach is to dump all of them into the system prompt. That works — until you have 10, 20, or 50 skills. Suddenly your context is huge and most of it is irrelevant to the current task.
Here's a minimal, native n8n solution that solves this with zero custom code.
The Idea: Give the LLM a Menu, Not the Full Kitchen
Instead of sending all skill content to the AI upfront, you send only a lightweight catalog — just names and short descriptions. The LLM reads the menu and calls for exactly what it needs.
Startup → LLM gets: skill names + when to use them
On demand → LLM calls Get("create-report") → receives full instructions
This is lazy loading for AI skills.
The Setup
1. Data Table Node
Create a Data Table node with two columns:
| name | skill |
|---|---|
| create-report | You are a report writing assistant. When given data, structure it into... |
| send-email | Draft a professional email based on the context provided. Always... |
| analyze-data | Analyze the provided dataset. Identify trends, outliers and... |
-
name— short identifier the LLM will use to request the skill -
skill— full instruction text, only loaded when requested
2. Node Description
In the Data Table node description, write the catalog for the LLM — names and short hints only:
Available skills:
- create-report: use when the user wants a report, summary or data overview
- send-email: use when a message or notification needs to be sent
- analyze-data: use when processing numbers, trends or comparisons
To load a skill, call the Get function with the skill name.
This is all the LLM sees at startup. The actual skill content stays hidden.
3. Get Function
Wire up a Get operation on the Data Table node. When the LLM calls Get("create-report"), it receives only that row — the full skill content for that one skill.
Why This Works
The LLM reads the catalog, understands the context from the description, and autonomously decides which skill to load. It then calls Get with the exact name. No guessing, no ID numbers to remember — just semantic names.
The result:
- Minimal tokens on startup — catalog only
- Full content on demand — loaded exactly when needed
- Zero custom code — pure native n8n nodes
- Easy to maintain — add or edit skills directly in the Data Table
The Flow
User message
↓
AI Agent reads catalog from Data Table description
↓
Agent decides which skill is relevant
↓
Agent calls Get("skill-name")
↓
Full skill instructions loaded
↓
Agent follows the instructions
Takeaway
Sometimes the simplest solution is already there in the tool you're using. The Data Table node in n8n wasn't designed for this — but it fits perfectly. A catalog in the description, a Get call for the content, and you have a lightweight skill system with native nodes.
No npm packages. No custom code. No external databases. No MCPs.
This is a prototype approach. A more robust solution would involve a custom n8n node with built-in skill management UI — but for getting the concept working quickly, this is hard to beat.
What's Next
Based on this exact principle, I've built a native n8n community node that takes this concept further — with a proper skill management UI built directly into the node, so you can add, edit and delete skills without touching the Data Table at all.
It's currently in testing and will be released soon.
If you want to be the first to know when it drops — follow me here on dev.to or on X. More details coming shortly.


Top comments (0)