n8n MCP Integration
Connect to n8n's official MCP server to programmatically build, execute, and manage workflows.
Version Support
- n8n version: 2.16.1+
- MCP protocol: 2024-11-05
- Server name: n8n MCP Server v1.1.0
Configuration
MCP Server Setup
In n8n UI:
- Go to Settings → n8n API
- Create an API key for REST API access
- Create an MCP token for MCP server access
Connection Config
{
"mcpServers": {
"n8n-mcp": {
"type": "http",
"url": "http://localhost:5678/mcp-server/http",
"headers": {
"Authorization": "Bearer <MCP_TOKEN>"
}
}
}
}
Environment Variables
export N8N_MCP_URL="http://localhost:5678/mcp-server/http"
export N8N_MCP_TOKEN="<your-mcp-token>"
Available Tools
Workflow Management
| Tool | Description |
|---|
search_workflows | Search workflows with filters |
get_workflow_details | Get workflow details + trigger info |
publish_workflow | Activate workflow for production |
unpublish_workflow | Deactivate workflow |
archive_workflow | Archive a workflow |
update_workflow | Update workflow from code |
Workflow Execution
| Tool | Description |
|---|
execute_workflow | Execute workflow by ID |
get_execution | Get execution details |
test_workflow | Test workflow with pin data |
prepare_test_pin_data | Generate test data for workflow |
Workflow Creation (SDK)
| Tool | Description |
|---|
get_sdk_reference | Get SDK docs and patterns |
search_nodes | Search n8n nodes by service/type |
get_node_types | Get TypeScript type definitions |
get_suggested_nodes | Get curated node recommendations |
validate_workflow | Validate workflow code |
create_workflow_from_code | Create workflow from SDK code |
Data Tables
| Tool | Description |
|---|
search_data_tables | Search data tables |
create_data_table | Create new data table |
rename_data_table | Rename data table |
add_data_table_column | Add column to table |
delete_data_table_column | Delete column |
rename_data_table_column | Rename column |
add_data_table_rows | Insert rows into table |
Projects & Folders
| Tool | Description |
|---|
search_projects | Search projects |
search_folders | Search folders |
Usage Patterns
1. Creating a Workflow
# Step 1: Get SDK reference
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_sdk_reference","arguments":{"section":"all"}}}' \
"$N8N_MCP_URL"
# Step 2: Search nodes
curl -X POST ... -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"search_nodes","arguments":{"queries":["schedule trigger","slack","set"]}}}'
# Step 3: Get node types
curl -X POST ... -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_node_types","arguments":{"nodeIds":["n8n-nodes-base.scheduleTrigger","n8n-nodes-base.slack"]}}}'
# Step 4: Validate code
curl -X POST ... -d '{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"validate_workflow","arguments":{"code":"..."}}}'
# Step 5: Create workflow
curl -X POST ... -d '{"jsonrpc":"2.0","id":5,"method":"tools/call","params":{"name":"create_workflow_from_code","arguments":{"code":"...","name":"My Workflow","description":"..."}}}'
2. Executing a Workflow
# Execute workflow
curl -X POST ... -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"execute_workflow","arguments":{"workflowId":"xxx"}}}'
# Get execution result
curl -X POST ... -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_execution","arguments":{"workflowId":"xxx","executionId":"yyy","includeData":true}}}'
3. Testing with Pin Data
# Prepare test data
curl -X POST ... -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"prepare_test_pin_data","arguments":{"workflowId":"xxx"}}}'
# Test workflow
curl -X POST ... -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"test_workflow","arguments":{"workflowId":"xxx","pinData":{...}}}}'
SDK Workflow Example
import { workflow, trigger, node } from 'n8n-workflow-sdk';
export default workflow({
name: 'Daily Slack Notification',
description: 'Send daily summary to Slack',
nodes: [
trigger.schedule({
name: 'Schedule',
rule: { interval: [{ field: 'hours', hoursInterval: 24 }] }
}),
node.set({
name: 'Prepare Message',
values: { text: 'Daily report ready!' }
}),
node.slack({
name: 'Send to Slack',
resource: 'message',
operation: 'send',
channel: '#general',
text: '={{ $node["Prepare Message"].json.text }}'
})
],
connections: [
{ from: 'Schedule', to: 'Prepare Message' },
{ from: 'Prepare Message', to: 'Send to Slack' }
]
});
MCP Protocol Notes
- Transport: HTTP with SSE (Server-Sent Events)
- Content-Type:
application/json
- Accept:
application/json, text/event-stream (required)
- Auth: Bearer token in Authorization header
Common Errors
| Error | Solution |
|---|
| "Not Acceptable" | Add Accept: application/json, text/event-stream header |
| "Unauthorized" | Check MCP token is valid |
| "Not found" | Verify MCP server URL is correct |
References