data/skills/n8n-mcp-tools-expert/SKILL.md
Master guide for using n8n-mcp MCP server tools to build workflows.
n8n-mcp provides tools organized into categories:
n8n_manage_datatable)n8n_manage_folders)n8n_manage_credentials)n8n_audit_instance)n8n_manage_agents, requires N8N_MCP_ACCESS_TOKEN)n8n_explore_node_resources, requires N8N_MCP_ACCESS_TOKEN)n8n_list_catalog)| Tool | Use When | Speed |
|---|---|---|
search_nodes | Finding nodes by keyword | <20ms |
get_node | Understanding node operations (detail="standard") | <10ms |
validate_node | Checking configurations (mode="full") | <100ms |
n8n_create_workflow | Creating workflows | 100-500ms |
n8n_update_partial_workflow | Editing workflows (MOST USED!) | 50-200ms |
validate_workflow | Checking complete workflow | 100-500ms |
n8n_deploy_template | Deploy template to n8n instance | 200-500ms |
n8n_manage_datatable | Managing data tables and rows | 50-500ms |
n8n_manage_folders | Folder CRUD + organizing workflows | 100-500ms |
n8n_manage_credentials | Credential CRUD + schema discovery | 50-500ms |
n8n_audit_instance | Security audit (built-in + custom scan) | 500-5000ms |
n8n_autofix_workflow | Auto-fix validation errors | 200-1500ms |
n8n_manage_agents | Persisted n8n Agent CRUD/validate/publish | 150-400ms; call action: 5-60s |
n8n_explore_node_resources | Resolve live loadOptions/listSearch values | 200 ms - 5 s |
n8n_list_catalog | List projects or tags | 50-300ms |
Workflow:
1. search_nodes({query: "keyword"})
2. get_node({nodeType: "nodes-base.name"})
3. [Optional] get_node({nodeType: "nodes-base.name", mode: "docs"})
Example:
// Step 1: Search
search_nodes({query: "slack"})
// Returns: nodes-base.slack
// Step 2: Get details
get_node({nodeType: "nodes-base.slack"})
// Returns: operations, properties, examples (standard detail)
// Step 3: Get readable documentation
get_node({nodeType: "nodes-base.slack", mode: "docs"})
// Returns: markdown documentation
Common pattern: search → get_node (18s average)
Workflow:
1. validate_node({nodeType, config: {}, mode: "minimal"}) - Check required fields
2. validate_node({nodeType, config, profile: "runtime"}) - Full validation
3. [Repeat] Fix errors, validate again
Common pattern: validate → fix → validate (23s thinking, 58s fixing per cycle)
Workflow:
1. n8n_create_workflow({name, nodes, connections})
2. n8n_validate_workflow({id})
3. n8n_update_partial_workflow({id, operations: [...]})
4. n8n_validate_workflow({id}) again
5. n8n_update_partial_workflow({id, operations: [{type: "activateWorkflow"}]})
Common pattern: iterative updates (56s average between edits)
Three structural mistakes in generated node JSON break the n8n UI even when the workflow validates:
credentials block with a placeholder ID. A fake ID like "id": "REPLACE_ME" renders the credential selector permanently disabled and non-clickable in the n8n UI ("No credentials yet") — the user has to recreate the node from scratch. If you don't know the real credential ID, omit the credentials block entirely; an absent block shows a normal empty dropdown the user can click. Use n8n_manage_credentials({action: "list"}) to discover real credential IDs first.// ❌ Breaks the credential selector
"credentials": {"httpHeaderAuth": {"id": "REPLACE_ME", "name": "My API Key"}}
// ✅ Unknown ID → omit credentials block; user picks in UI
// ✅ Known ID (from n8n_manage_credentials list) → use the real ID
Generate UUID v4 values for node id — not human-readable strings like "http-list-node". n8n's frontend uses node IDs for form binding and credential component initialization; non-UUID IDs cause subtle UI breakage.
Use the current typeVersion for each node — check get_node rather than hardcoding remembered versions (e.g. httpRequest is at 4.4+, not 4.2).
Two different formats for different tools!
// Use SHORT prefix
"nodes-base.slack"
"nodes-base.httpRequest"
"nodes-base.webhook"
"nodes-langchain.agent"
Tools that use this:
// Use FULL prefix
"n8n-nodes-base.slack"
"n8n-nodes-base.httpRequest"
"n8n-nodes-base.webhook"
"@n8n/n8n-nodes-langchain.agent"
Tools that use this:
// search_nodes returns BOTH formats
{
"nodeType": "nodes-base.slack", // For search/validate tools
"workflowNodeType": "n8n-nodes-base.slack" // For workflow tools
}
Eight recurring mistakes. Two are worth showing in full because they silently corrupt structure:
// nodeType prefix (search/validate tools want the SHORT form)
get_node({nodeType: "slack"}) // ❌ missing prefix → "Node not found"
get_node({nodeType: "n8n-nodes-base.slack"}) // ❌ FULL prefix is for workflow tools
get_node({nodeType: "nodes-base.slack"}) // ✅
// credentials must be nested by type with {id, name} — not a flat string
updates: {credentials: "myApiKey"} // ❌
updates: {credentials: {httpHeaderAuth: {id: "abc123", name: "My API Key"}}} // ✅
| # | Mistake | Fix |
|---|---|---|
| 1 | Wrong nodeType format | SHORT nodes-base.* for search/validate; FULL n8n-nodes-base.* for workflow tools (see above) |
| 2 | detail: "full" by default | Default standard covers 95%; reach for docs/search_properties instead of full |
| 3 | No validation profile | Pass profile: "runtime" explicitly (minimal/ai-friendly/strict for other stages) |
| 4 | Ignoring auto-sanitization | ALL nodes sanitized on ANY update (operator structures, IF/Switch metadata); it can't fix broken connections or branch-count mismatches |
| 5 | Not using smart parameters | Use branch: "true" / case: 0 instead of fragile sourceIndex math |
| 6 | Omitting intent | Always include intent on n8n_update_partial_workflow for better responses |
| 7 | parameters instead of updates | updateNode takes updates: {...}, not parameters: {...} |
| 8 | Wrong credential format | Nest by type with {id, name} (see above) |
Full WRONG/CORRECT examples for each: see VALIDATION_GUIDE.md → Common Mistakes.
Three patterns dominate real usage. Worked, step-by-step examples for each live in the reference guides.
search_nodes({query}) → get_node({nodeType, includeExamples: true}). See SEARCH_GUIDE.md.validate_node({profile: "runtime"}) → read errors → fix config → validate again until clean. See VALIDATION_GUIDE.md.n8n_update_partial_workflow (with intent) → n8n_validate_workflow → finally activateWorkflow. Build iteratively, NOT one-shot. See WORKFLOW_GUIDE.md.See SEARCH_GUIDE.md for:
See VALIDATION_GUIDE.md for:
See WORKFLOW_GUIDE.md for:
See OPERATIONS_GUIDE.md for:
The 2,700+ template library has three tools: search_templates (modes query/by_nodes/by_task/by_metadata), get_template (modes structure/full), and n8n_deploy_template (deploys to your instance with autoFix/autoUpgradeVersions, returns workflow ID + required credentials + fixes applied).
See OPERATIONS_GUIDE.md for full search/get/deploy examples.
n8n_test_workflow has one required parameter (workflowId) and a method that picks the path:
method | Backend | What it does |
|---|---|---|
auto (default) | Public API | Detects a webhook/form/chat trigger and fires it over HTTP. No such trigger → it reports that the workflow cannot be triggered and names the methods below. auto never runs anything through n8n's MCP server. |
trigger | Public API | Same HTTP path, requested explicitly. |
prepare | n8n's MCP server | Read-only: lists the nodes that need pinned data. |
pinned | n8n's MCP server | Runs the workflow with pinData standing in for trigger, credentialed and HTTP Request nodes, and waits. Every other node still runs. A run that finishes in error/crashed/canceled comes back as EXECUTION_FAILED with the executionId. |
direct | n8n's MCP server | Starts a run and returns once it has started; nothing is pinned, so every node runs. message or data/headers are forwarded to the trigger as input. |
N8N_MCP_ACCESS_TOKEN (n8n 2.34+) and the workflow's "Available in MCP" setting.pinData is keyed by node name, and every value is an array of items wrapped as {"json": {...}} — {"Webhook": [{"json": {"id": "123"}}]}, never a flat object. It must be non-empty.triggerNodeName picks the trigger node to start from (defaults to the detected one; n8n requires it whenever inputs are given).direct runs every node; pinned pins only trigger nodes, nodes with credentials and HTTP Request nodes, so Code, Set, If and credential-free I/O (Execute Command, file read/write) still run. Confirm with the user before running a workflow that writes anywhere.executionMode applies to direct: manual (default) or production. It changes the execution context, not whether the run has side effects — a production run goes through the production execution path and is recorded as one. Only pass it when the user asked for one.timeoutMs is the client deadline for the official call (5000-600000; default 30000 for prepare, 300000 for pinned/direct).direct returns as soon as the run starts, so it reports success with an executionId regardless of how the run ends — poll n8n_executions({action: "get", id: executionId}) for the outcome. A dispatch n8n refuses outright comes back as OFFICIAL_MCP_ERROR, not EXECUTION_FAILED.Successful and routed responses state method and backend (public-api or official-mcp); an envelope rejected on argument validation may carry neither.
n8n_workflow_versions reads two independent histories, selected with source:
source: "local" (default) — the snapshots n8n-mcp takes before it changes a workflow. Any n8n version, no token, ids are numbers. Blind to edits made in the n8n UI. The only source that supports delete and prune.source: "native" — n8n's own workflow history, the same list the UI shows, including edits made by people. Needs N8N_MCP_ACCESS_TOKEN (n8n 2.34+; the native diff needs 2.36, where get_workflow_versions_diff shipped) and the workflow's "Available in MCP" setting; ids are opaque strings; list is capped at 50 with an offset; delete and prune are refused with MODE_NOT_SUPPORTED_FOR_SOURCE (n8n owns that retention). Native rollback is not pre-validated — validateBefore is accepted and ignored.mode: "diff" compares two versions (versionId + toVersionId, both from the same source and workflow). A local diff (data.format: "n8n-mcp") reports added/removed/modified nodes as node IDs; a native diff (data.format: "n8n") is n8n's own payload with field-level before/after values.
n8n_manage_datatable is the MCP tool for managing data tables and rows from outside a workflow (table actions createTable/listTables/getTable/updateTable/deleteTable; row actions getRows/insertRows/updateRows/upsertRows/deleteRows, with filtering, pagination, and dryRun). Don't confuse it with the in-workflow nodes-base.dataTable node, which reads/writes rows during execution (see n8n-node-configuration → OPERATION_PATTERNS.md). Rule of thumb: MCP tool to set up a table once, workflow node to read/write on every execution. deleteRows requires a filter; use dryRun: true before bulk changes.
Column actions — addColumn, deleteColumn, renameColumn — change an existing table's columns, which the Public API cannot do; they run through n8n's MCP server and need N8N_MCP_ACCESS_TOKEN (n8n 2.34+). addColumn takes column: {name, type} (name starts with a letter, letters/digits/underscores only, at most 63 chars); deleteColumn/renameColumn take the columnId from getTable, and renameColumn puts the new column name in name. They address the table by project: projectId is resolved automatically when exactly one project is accessible, otherwise the call returns PROJECT_REQUIRED and lists the candidates — pass projectId (from n8n_list_catalog({kind: "projects"})) to skip resolution. Renaming the table is not a column action: use updateTable on the Public API.
See OPERATIONS_GUIDE.md for all actions, filter conditions, and examples.
n8n_manage_folders organizes workflows into folders (actions create/list/get/rename/move/delete; n8n 2.19+, registered free Community tier and up). projectId defaults to 'personal'. Placing workflows happens in the workflow tools: parentFolderId on n8n_create_workflow, or the moveToFolder operation of n8n_update_partial_workflow (both n8n 2.32+; null = project root). Two things to internalize: a workflow's folder is write-only in n8n's API (verify placement via a folder's get counts, never by reading the workflow), and delete without transferToFolderId archives the folder's workflows (transferToFolderId: "0" moves them to the project root instead, keeping them active).
See WORKFLOW_GUIDE.md for all actions, list filters/counts, and the delete semantics.
n8n_manage_credentials is the unified credential tool: actions list, get, create, update, delete, getSchema. It never returns secrets — get/create/update strip the data field. Use getSchema before create to discover required fields. The optional includeUsage: true flag (on list/get) reverse-scans workflows and attaches usedIn: [{id, name, active}] + usageCount — use it before deleting or rotating a credential to see what breaks (it triggers a full client-side scan, caps at 5000 workflows, excludes archived, and degrades to a usageScanError field on failure).
See WORKFLOW_GUIDE.md for all actions, the includeUsage shape, security notes, and the safe delete/rotate workflow.
Three tools talk to n8n's instance-level MCP server (a separate endpoint from the Public API) and need N8N_MCP_ACCESS_TOKEN — see "Tool Availability" below.
n8n_manage_agents — create, configure, validate, run and publish persisted n8n Agents (a standalone assistant artifact: model, instructions, tools, skills, tasks, memory, channels — not the AI Agent workflow node). Actions: reference, search, get, create, mutate, validate, call, publish, unpublish, revert, versions, delete, discover_assets, verify_mcp_server, update_integration. Start with action: "reference", then discover_assets → create → mutate (one resource at a time, always the latest configHash — a stale one comes back as STALE_CONFIG) → validate. publish only on explicit request; call runs the agent with real credentials and tools and may return approvals[] for the human to decide. timeoutMs is a top-level parameter (default 30000, 180000 for call), not part of args. Needs n8n 2.34+ with the agents module; on 2.36.x the agents runtime rejects azureOpenAiApi/aws credentials. See n8n-agents skill's "Persisted n8n Agents" section for the full workflow.n8n_explore_node_resources — resolve the real values behind a node's loadOptions dropdown or resource-locator listSearch (Slack channels, Google Sheets tabs, model lists) using a live credential, instead of guessing an ID. Use it when get_node (standard detail) shows dynamicOptions: {methodName, methodType, dependsOn} on a property — pass that methodName/methodType plus a credentialId from n8n_manage_credentials({action: "list"}).n8n_list_catalog — list instance-level projects (personal project marked, gives projectId for n8n_manage_agents/n8n_manage_datatable) or tags. Works without the token via the Public API; with it configured, falls back to the official MCP server for team projects when the Public API's licence gate refuses (teamProjectsEnabled reports which).n8n_audit_instance combines n8n's built-in audit (categories credentials/database/nodes/instance/filesystem) with a custom deep scan (hardcoded_secrets, unauthenticated_webhooks, error_handling, data_retention). All parameters optional: categories, includeCustomScan (default true), customChecks, daysAbandonedWorkflow. Detected secrets are masked (first 6 + last 4 chars). Output is an actionable markdown report — summary table, findings by workflow, and a Remediation Playbook split into auto-fixable / requires-review / requires-user-action.
See WORKFLOW_GUIDE.md for the two scanning approaches, examples, and remediation types in full.
tools_documentation() — overview of all tools; tools_documentation({topic, depth: "full"}) for a specific tool. Code node guides via topics javascript_code_node_guide / python_code_node_guide.tools_documentation({topic: "ai_agents_guide", depth: "full"}) (no standalone tool); returns architecture, connections, tools, validation, best practices.n8n_health_check() — quick check; n8n_health_check({mode: "diagnostic"}) returns status, env vars, tool status, API connectivity.See OPERATIONS_GUIDE.md for examples.
Always Available (no n8n API needed):
Requires n8n API (N8N_API_URL + N8N_API_KEY):
Requires N8N_MCP_ACCESS_TOKEN (a separate token from n8n Settings → Instance-level MCP, in addition to the Public API credentials above):
method: "prepare"/"pinned"/"direct" (also needs the workflow's "Available in MCP" setting)source: "native" (also needs the workflow's "Available in MCP" setting)addColumn/deleteColumn/renameColumnIf API tools unavailable, use templates and validation-only workflows.
get_node — detail levels (minimal ~200 tok / standard ~1-2K, RECOMMENDED / full ~3-8K, sparingly) and modes (info default, docs, search_properties + propertyQuery, versions, compare, breaking, migrations). Deep dive in SEARCH_GUIDE.md.validate_node — modes full (default, errors/warnings/suggestions) and minimal (required-fields check); profiles minimal/runtime (default, recommended)/ai-friendly/strict. Deep dive in VALIDATION_GUIDE.md.| Tool | Response Time | Payload Size |
|---|---|---|
| search_nodes | <20ms | Small |
| get_node (standard) | <10ms | ~1-2KB |
| get_node (full) | <100ms | 3-8KB |
| validate_node (minimal) | <50ms | Small |
| validate_node (full) | <100ms | Medium |
| validate_workflow | 100-500ms | Medium |
| n8n_manage_folders | 100-500ms | Small |
| n8n_manage_credentials | 50-500ms | Small-Medium |
| n8n_audit_instance | 500-5000ms | Large |
| n8n_create_workflow | 100-500ms | Medium |
| n8n_update_partial_workflow | 50-200ms | Small |
| n8n_deploy_template | 200-500ms | Medium |
patchNodeField for surgical edits to Code node content instead of replacing the entire nodeget_node({detail: "standard"}) for most use casesprofile: "runtime")branch, case) for clarityintent parameter in workflow updatesincludeExamples: true for real configsn8n_deploy_template for quick startsdetail: "full" unless necessary (wastes tokens)nodes-base.*)n8n-nodes-base.*) with search/validate toolsMost Important:
detail: "standard" (default) - covers 95% of use casesnodes-base.* (search/validate) vs n8n-nodes-base.* (workflows)runtime recommended)branch="true", case=0)activateWorkflow operation)n8n_manage_datatable (CRUD + filtering)n8n_manage_folders; workflow placement is write-only (verify via folder counts, not the workflow)n8n_manage_credentials (CRUD + schema discovery)n8n_audit_instance (built-in + custom deep scan)tools_documentation({topic: "ai_agents_guide", depth: "full"})Common Workflow:
For details, see:
Related Skills: