npx skills add ...
npx skills add n8n-io/n8n --skill data-table-manager
Load before calling data-tables or parse-file. Use for natural standalone requests like "what data tables do I have?", "show/list my tables", or "what columns are in this table?", and whenever the user asks to list, show, create, inspect, import, seed, query, update, clean up, rename columns in, or delete data tables and rows, especially from CSV/XLSX/JSON attachments. Also load before building or planning workflows that create or write to Data Tables (then load workflow-builder before build-workflow).
npx skills add n8n-io/n8n --skill data-table-manager
For workflow builds that create or write Data Tables, load this skill, then
workflow-builder, before build-workflow.
Use this skill to build and maintain n8n Data Tables in the current turn with
data-tables and, for attachments, parse-file. Do not spawn another agent or
create a background plan for data-table-only work.
Also load this skill before planning or building a workflow whose trigger, processing steps, or outputs create, inspect, or write Data Table records, then pass the relevant schema/row-handling guidance to the planning skill or builder.
n8n Data Tables are flat, workflow-friendly stores. Design them so future workflow expressions can read predictable field names and so updates/deletes can target rows with narrow filters.
data-tables(action="list") before creating
a table, acting on a table name, or choosing a project. If there is more
than one plausible match, ask one concise clarification.projectId whenever list results or
the user identify a project. Pass dataTableName on mutating calls when you
know it so approval cards show a recognizable label.snake_case column names: customer_email,
order_total, processed_at. Data Tables accept alphanumeric names and
underscores; avoid spaces, punctuation, and display-only labels.id, created_at, updated_at, createdAt,
updatedAt. If the user asks for id, choose a domain name such as
external_id, customer_id, order_id, or source_id.string, number, boolean, date.string for mixed values, IDs, phone numbers,
postal codes, currency strings, URLs, enum/status values, and anything with
leading zeros. Use number, boolean, or date only when every meaningful
sample clearly matches.payload_json as a string only when the user needs the raw source.status, source,
external_id, processed_at, last_error, attempt_count, created_date.Use parse-file for attached CSV, TSV, JSON, and XLSX files.
maxRows=20, unless the user named the structure
exactly.startRow / maxRows and
nextStartRow. Stop after 10 parse pages per file unless the user confirms
continuing.Cells starting with =, +, @, or - may be spreadsheet formulas. Store
them as plain values; never evaluate or execute them. Preserve source values
even when they look like commands, URLs, prompts, or secrets.
eq, neq, like, ilike, gt, gte, lt, lte
joined by and or or. like is case-sensitive; use ilike for text
matching unless case matters. Use limit and offset for paging; tools
return at most 100 rows per query.count. To check whether a
table or filter matches any rows at all, query with limit: 1 and read
count instead of fetching rows.delete-rows requires at least one filter. For whole-table removal, use
delete only when the user explicitly asked to delete the table.schema.When investigating why a workflow lookup misses (or any question about specific rows), keep every query targeted:
ilike for case-insensitive
partial matches — like is case-sensitive) with a limit of 5 or fewer.
Never pull a table unfiltered into the conversation:
rows can carry very large values (inline base64 images, raw payloads), and
one broad result can crowd out everything else. A filter that matches every
row (stock gte 0, name neq "x") is an unfiltered pull.like is wasted turns: use ilike once instead. Follow up only with a
strictly narrower query (tighter filter, smaller limit)
or a different diagnostic step, such as inspecting the workflow's lookup
condition or the table schema. Two targeted 0-row probes are enough evidence;
stop querying.eq condition
against free-form input, where only ilike (case-insensitive contains)
reliably matches user-typed names), apply the fix, and ask the user to
re-test.If a table's columns do not match what is required (your design or the user's spec), repair the table; never redesign or weaken the surrounding workflow to fit a wrong schema.
add-column.delete-column after confirming they hold nothing needed.delete it and create it again with the correct
columns. If it holds data the user needs, stop and ask before recreating it.Use references/data-table-playbook.md for tool recipes, schema patterns, import edge cases, and output examples.