AutomationFlowsAI & RAG › Build and Operate N8n Workflows From Claude with Gemini and Mcp Tools

Build and Operate N8n Workflows From Claude with Gemini and Mcp Tools

ByȚugui Dragoș @tuguidragos on n8n.io

This workflow exposes an MCP server endpoint for Claude Desktop and provides tools to build new n8n workflows from plain-English prompts using Google Gemini, plus tools to list, inspect, activate/deactivate workflows and review executions via the n8n Public API. Receives MCP…

Event trigger★★★★☆ complexityAI-powered26 nodesExecute Workflow TriggerGoogle GeminiHTTP RequestMcp TriggerTool Workflow
AI & RAG Trigger: Event Nodes: 26 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #16165 — we link there as the canonical source.

This workflow follows the Execute Workflow Trigger → HTTP Request recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "LePOGHyyxqdVO7wR",
  "meta": {
    "builderVariant": "mcp",
    "aiBuilderAssisted": true
  },
  "name": "Build and operate n8n workflows from Claude with an MCP server",
  "tags": [],
  "nodes": [
    {
      "id": "546d0d8a-0b3f-4801-9c5b-80290246cdea",
      "name": "Receive Build Request",
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "position": [
        -96,
        336
      ],
      "parameters": {
        "workflowInputs": {
          "values": [
            {
              "name": "description"
            },
            {
              "name": "name"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "d0a8f49e-acc0-4b19-9784-1f5fa7c4a5ec",
      "name": "Generate Workflow JSON",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        128,
        336
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-2.5-flash",
          "cachedResultName": "gemini-2.5-flash"
        },
        "options": {
          "temperature": 0.2,
          "systemMessage": "You convert a plain English description into a valid n8n workflow as STRICT JSON. Output ONLY a JSON object with exactly two keys: nodes (an array) and connections (an object). No markdown and no commentary.\n\nEach node object must have these keys: name (a unique string), type (the full node type string), typeVersion (a number), position (an array of two numbers), parameters (an object).\n\nUse ONLY these node types with exactly these typeVersion numbers:\n- n8n-nodes-base.manualTrigger with typeVersion 1\n- n8n-nodes-base.scheduleTrigger with typeVersion 1.3\n- n8n-nodes-base.webhook with typeVersion 2.1\n- n8n-nodes-base.set with typeVersion 3.4\n- n8n-nodes-base.code with typeVersion 2\n- n8n-nodes-base.httpRequest with typeVersion 4.4\n- n8n-nodes-base.if with typeVersion 2.3\n- n8n-nodes-base.noOp with typeVersion 1\n\nThe workflow must contain exactly one trigger node, which is manualTrigger, scheduleTrigger, or webhook. When unsure, use manualTrigger.\n\nThe connections object must be keyed by the SOURCE node name, using this exact shape: { \"Source Node Name\": { \"main\": [ [ { \"node\": \"Target Node Name\", \"type\": \"main\", \"index\": 0 } ] ] } }\n\nNever include an active field. Never include node ids. Keep parameters minimal and valid for the node type. Place nodes left to right with increasing x positions such as 0, 240, 480, and set y to 0. Reply with JSON only.",
          "maxOutputTokens": 2000
        },
        "messages": {
          "values": [
            {
              "content": "={{ $json.description }}"
            }
          ]
        },
        "jsonOutput": true,
        "builtInTools": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "b8d2511e-ed77-4816-86c6-e99ef134f4d7",
      "name": "Normalize Workflow",
      "type": "n8n-nodes-base.code",
      "position": [
        480,
        336
      ],
      "parameters": {
        "jsCode": "const item = $input.first().json;\nlet data = null;\nif (item && (item.nodes || item.connections)) { data = item; }\nif (!data && item) {\n  let raw = item.content || item.text || item.output || item.message || item.response || '';\n  if (typeof raw === 'object' && raw !== null) { data = raw; }\n  else { raw = (raw || '').toString(); try { data = JSON.parse(raw); } catch (e) { const s = raw.indexOf('{'); const en = raw.lastIndexOf('}'); data = (s !== -1 && en > s) ? (function(){ try { return JSON.parse(raw.slice(s, en + 1)); } catch (e2) { return {}; } })() : {}; } }\n}\ndata = data || {};\nfunction uuid(){ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c){ var r = Math.random()*16|0; var v = c === 'x' ? r : (r&0x3|0x8); return v.toString(16); }); }\nlet nodes = Array.isArray(data.nodes) ? data.nodes : [];\nnodes = nodes.filter(function(n){ return n && n.type && n.name; });\nnodes = nodes.map(function(n, i){ return { parameters: (n.parameters && typeof n.parameters === 'object') ? n.parameters : {}, type: n.type, typeVersion: (typeof n.typeVersion === 'number') ? n.typeVersion : 1, position: Array.isArray(n.position) ? n.position : [i*240, 0], id: n.id || uuid(), name: n.name }; });\nconst connections = (data.connections && typeof data.connections === 'object') ? data.connections : {};\nconst nm = ($('Receive Build Request').first().json.name || '').toString().trim();\nconst body = { name: nm ? nm : (data.name || 'Generated Workflow'), nodes: nodes, connections: connections, settings: {} };\nreturn [{ json: { body: body, node_count: nodes.length } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "ee667bb9-e25c-42e0-a530-7a20185f69a4",
      "name": "Create Workflow",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        704,
        336
      ],
      "parameters": {
        "url": "https://YOUR_N8N_DOMAIN/api/v1/workflows",
        "method": "POST",
        "options": {
          "response": {
            "response": {
              "neverError": true
            }
          }
        },
        "jsonBody": "={{ JSON.stringify($json.body) }}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "typeVersion": 4.4
    },
    {
      "id": "151cec59-076d-453b-91f8-b5bb0b53f107",
      "name": "Build Result",
      "type": "n8n-nodes-base.code",
      "position": [
        928,
        336
      ],
      "parameters": {
        "jsCode": "const resp = $json;\nconst id = resp.id || (resp.data && resp.data.id) || '';\nif (id) {\n  return [{ json: { success: true, id: id, name: resp.name || '', active: resp.active === true, url: 'https://YOUR_N8N_DOMAIN/workflow/' + id, message: 'Workflow created and left INACTIVE. Review it in n8n, then activate it when ready.' } }];\n}\nreturn [{ json: { success: false, error: resp.message || resp.error || resp, hint: 'Not created. Check that node types and typeVersions are from the allowed list and that only name, nodes, connections, settings were sent.' } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "06e136f6-dd3c-4e31-b531-853bce827e0d",
      "name": "Sticky Note 7999b84a",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -128,
        48
      ],
      "parameters": {
        "width": 576,
        "height": 240,
        "content": "## MCP TOOL: Build Workflow (sub-workflow)\nClaude describes a workflow in plain English and this builds it in your n8n.\n\n**Flow:** Gemini turns the description into a strict n8n workflow JSON (nodes plus connections), **Normalize Workflow** repairs and trims it to only the four fields the API accepts (name, nodes, connections, settings), **Create Workflow** posts it to the n8n API, and the result returns the new id and URL.\n\nNew workflows are created **INACTIVE** on purpose, so you can review them before they run. Part of the Build My Workflow Concierge system; runs on demand when the server's Build tool calls it."
      },
      "typeVersion": 1
    },
    {
      "id": "0784cce9-4f0b-4a83-aa2f-9d04292eb5a1",
      "name": "Sticky Note 32553e69",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -128,
        496
      ],
      "parameters": {
        "color": 6,
        "width": 560,
        "height": 256,
        "content": "## SAFETY + LIMITS (READ)\n- To stay reliable, Gemini may only use a safe set of node types (manualTrigger, scheduleTrigger, webhook, set, code, httpRequest, if, noOp) with fixed typeVersions. Complex nodes are intentionally out of scope.\n- The API accepts ONLY name, nodes, connections, settings. Anything else returns a 400, so the Normalize node strips the rest.\n- Created workflows are INACTIVE. Activate them yourself in n8n, or via the activate_workflow tool, after reviewing.\n- Uses the **n8n API Key** credential (header X-N8N-API-KEY) and the base URL in Create Workflow, now the placeholder `https://YOUR_N8N_DOMAIN`. Update both before use."
      },
      "typeVersion": 1
    },
    {
      "id": "4dfe4fde-ad41-4138-9ffc-b29297d19d59",
      "name": "Sticky Note 5c5f0c62",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -128,
        -112
      ],
      "parameters": {
        "color": 3,
        "width": 568,
        "height": 152,
        "content": "## NOTES\n- Build is AI generated, so it is not perfect. If the API returns an error, the tool returns it to Claude so it can try again with a fix.\n- Needs the Google Gemini credential (the brain) and the n8n API Key credential (to create the workflow).\nDocs: see the n8n public API reference for the workflow object schema."
      },
      "typeVersion": 1
    },
    {
      "id": "340baf66-f9e3-4929-8fb5-126de5301b3e",
      "name": "Build Request",
      "type": "n8n-nodes-base.code",
      "position": [
        1360,
        304
      ],
      "parameters": {
        "jsCode": "const inp = $('Receive Build Request').first().json;\nconst a = (inp.action || '').toString();\nconst wid = (inp.workflow_id || '').toString();\nconst eid = (inp.execution_id || '').toString();\nconst base = 'https://YOUR_N8N_DOMAIN/api/v1';\nlet method = 'GET';\nlet url = base + '/workflows';\nif (a === 'list_workflows') { method = 'GET'; url = base + '/workflows?limit=100'; }\nelse if (a === 'get_workflow') { method = 'GET'; url = base + '/workflows/' + wid; }\nelse if (a === 'activate_workflow') { method = 'POST'; url = base + '/workflows/' + wid + '/activate'; }\nelse if (a === 'deactivate_workflow') { method = 'POST'; url = base + '/workflows/' + wid + '/deactivate'; }\nelse if (a === 'list_executions') { method = 'GET'; url = base + '/executions?limit=20' + (wid ? ('&workflowId=' + wid) : ''); }\nelse if (a === 'get_execution') { method = 'GET'; url = base + '/executions/' + eid + '?includeData=true'; }\nreturn [{ json: { method: method, url: url, action: a } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "b7e10ba4-2a85-4a77-824d-da25c5d47902",
      "name": "Call n8n API",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1552,
        304
      ],
      "parameters": {
        "url": "={{ $json.url }}",
        "method": "={{ $json.method }}",
        "options": {
          "response": {
            "response": {
              "neverError": true
            }
          }
        },
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "typeVersion": 4.4
    },
    {
      "id": "065049fa-11a8-4df4-adf3-97fd28154256",
      "name": "Shape Response",
      "type": "n8n-nodes-base.code",
      "position": [
        1760,
        304
      ],
      "parameters": {
        "jsCode": "const action = ($('Receive Build Request').first().json.action || '').toString();\nconst resp = $json;\nif (action === 'list_workflows') {\n  const arr = Array.isArray(resp.data) ? resp.data : [];\n  return [{ json: { count: arr.length, workflows: arr.map(w => ({ id: w.id, name: w.name, active: w.active })), nextCursor: resp.nextCursor || null } }];\n}\nif (action === 'list_executions') {\n  const arr = Array.isArray(resp.data) ? resp.data : [];\n  return [{ json: { count: arr.length, executions: arr.map(e => ({ id: e.id, workflowId: e.workflowId, status: e.status, startedAt: e.startedAt, stoppedAt: e.stoppedAt, finished: e.finished })), nextCursor: resp.nextCursor || null } }];\n}\nreturn [{ json: resp }];"
      },
      "typeVersion": 2
    },
    {
      "id": "b7986363-afa5-41b9-a835-d46758073efa",
      "name": "Sticky Note e7a636c9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1360,
        32
      ],
      "parameters": {
        "width": 520,
        "height": 240,
        "content": "## n8n OPERATE (shared tool sub-workflow)\nThis one sub-workflow powers six MCP tools that let Claude operate your n8n: list_workflows, get_workflow, activate_workflow, deactivate_workflow, list_executions, get_execution.\n\nThe Concierge MCP server passes an **action** plus an optional **workflow_id** or **execution_id**. **Build Request** maps the action to the right n8n API call, **Call n8n API** runs it, and **Shape Response** trims big lists so Claude gets clean JSON.\n\nPart of the Build My Workflow Concierge system. It runs on demand when the server calls it, so keep it saved but do NOT activate it."
      },
      "typeVersion": 1
    },
    {
      "id": "948c3cf5-b630-410d-9995-d1791d18f1f9",
      "name": "Sticky Note f7a7db8f",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1360,
        480
      ],
      "parameters": {
        "color": 6,
        "width": 520,
        "height": 240,
        "content": "## SETUP (READ)\n1. **Base URL:** the Build Request node now uses the placeholder `https://YOUR_N8N_DOMAIN/api/v1`. Replace it with your own n8n instance URL.\n2. **API key:** create one in Settings > n8n API, then put it in the **n8n API Key** credential. The header name must be exactly **X-N8N-API-KEY**.\n3. There is no public run endpoint, so this tool does not execute workflows; trigger those through their own webhook.\n4. This sub-workflow runs on demand when the MCP server calls it, so it does NOT need to be activated. Keep it saved. Only the MCP Server workflow needs to be active."
      },
      "typeVersion": 1
    },
    {
      "id": "2c27115a-a5eb-4d9c-b189-4d9fc1c5d985",
      "name": "MCP Server: Concierge",
      "type": "@n8n/n8n-nodes-langchain.mcpTrigger",
      "position": [
        656,
        1152
      ],
      "parameters": {
        "path": "concierge"
      },
      "typeVersion": 1.1
    },
    {
      "id": "61423ec4-6aba-4816-8659-186592ab5c14",
      "name": "List Workflows",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "position": [
        336,
        1376
      ],
      "parameters": {
        "workflowId": {
          "__rl": true,
          "mode": "id",
          "value": "v1IjvLLm6tSIdSWu",
          "cachedResultName": "Concierge n8n Operate (MCP Tool)"
        },
        "description": "List all workflows in the n8n instance with their id, name, and active status. Use this first to find a workflow id.",
        "workflowInputs": {
          "value": {
            "action": "list_workflows",
            "workflow_id": "",
            "execution_id": ""
          },
          "schema": [
            {
              "id": "action",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "action",
              "canBeUsedToMatch": false
            },
            {
              "id": "workflow_id",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "workflow_id",
              "canBeUsedToMatch": false
            },
            {
              "id": "execution_id",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "execution_id",
              "canBeUsedToMatch": false
            }
          ],
          "mappingMode": "defineBelow"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "bc7ffff8-2046-4419-beb8-fef03cc0fed7",
      "name": "Get Workflow",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "position": [
        464,
        1376
      ],
      "parameters": {
        "workflowId": {
          "__rl": true,
          "mode": "id",
          "value": "v1IjvLLm6tSIdSWu",
          "cachedResultName": "Concierge n8n Operate (MCP Tool)"
        },
        "description": "Get the full details of one workflow by its id, including its nodes and connections. Get the id from List Workflows.",
        "workflowInputs": {
          "value": {
            "action": "get_workflow",
            "workflow_id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('workflow_id', 'The id of the workflow to fetch.') }}",
            "execution_id": ""
          },
          "schema": [
            {
              "id": "action",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "action",
              "canBeUsedToMatch": false
            },
            {
              "id": "workflow_id",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "workflow_id",
              "canBeUsedToMatch": false
            },
            {
              "id": "execution_id",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "execution_id",
              "canBeUsedToMatch": false
            }
          ],
          "mappingMode": "defineBelow"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "b2ae4d0b-8762-42f1-8068-f4e671266154",
      "name": "Activate Workflow",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "position": [
        592,
        1376
      ],
      "parameters": {
        "workflowId": {
          "__rl": true,
          "mode": "id",
          "value": "v1IjvLLm6tSIdSWu",
          "cachedResultName": "Concierge n8n Operate (MCP Tool)"
        },
        "description": "Activate a workflow by its id so it starts running on its trigger. Get the id from List Workflows.",
        "workflowInputs": {
          "value": {
            "action": "activate_workflow",
            "workflow_id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('workflow_id', 'The id of the workflow to activate.') }}",
            "execution_id": ""
          },
          "schema": [
            {
              "id": "action",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "action",
              "canBeUsedToMatch": false
            },
            {
              "id": "workflow_id",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "workflow_id",
              "canBeUsedToMatch": false
            },
            {
              "id": "execution_id",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "execution_id",
              "canBeUsedToMatch": false
            }
          ],
          "mappingMode": "defineBelow"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "e499c860-4cec-4b59-beef-a36888717995",
      "name": "Deactivate Workflow",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "position": [
        720,
        1376
      ],
      "parameters": {
        "workflowId": {
          "__rl": true,
          "mode": "id",
          "value": "v1IjvLLm6tSIdSWu",
          "cachedResultName": "Concierge n8n Operate (MCP Tool)"
        },
        "description": "Deactivate a workflow by its id so it stops running. Get the id from List Workflows.",
        "workflowInputs": {
          "value": {
            "action": "deactivate_workflow",
            "workflow_id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('workflow_id', 'The id of the workflow to deactivate.') }}",
            "execution_id": ""
          },
          "schema": [
            {
              "id": "action",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "action",
              "canBeUsedToMatch": false
            },
            {
              "id": "workflow_id",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "workflow_id",
              "canBeUsedToMatch": false
            },
            {
              "id": "execution_id",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "execution_id",
              "canBeUsedToMatch": false
            }
          ],
          "mappingMode": "defineBelow"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "0500949f-263b-4bd7-baff-d5682a087b3a",
      "name": "List Executions",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "position": [
        848,
        1376
      ],
      "parameters": {
        "workflowId": {
          "__rl": true,
          "mode": "id",
          "value": "v1IjvLLm6tSIdSWu",
          "cachedResultName": "Concierge n8n Operate (MCP Tool)"
        },
        "description": "List recent workflow executions with status. Optionally filter by a workflow id. Use to see if runs succeeded or failed.",
        "workflowInputs": {
          "value": {
            "action": "list_executions",
            "workflow_id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('workflow_id', 'Optional workflow id to filter by, or an empty string for all.') }}",
            "execution_id": ""
          },
          "schema": [
            {
              "id": "action",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "action",
              "canBeUsedToMatch": false
            },
            {
              "id": "workflow_id",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "workflow_id",
              "canBeUsedToMatch": false
            },
            {
              "id": "execution_id",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "execution_id",
              "canBeUsedToMatch": false
            }
          ],
          "mappingMode": "defineBelow"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "8af4a2ad-abe0-4e3c-a843-1aa795aa3b8c",
      "name": "Get Execution",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "position": [
        976,
        1376
      ],
      "parameters": {
        "workflowId": {
          "__rl": true,
          "mode": "id",
          "value": "v1IjvLLm6tSIdSWu",
          "cachedResultName": "Concierge n8n Operate (MCP Tool)"
        },
        "description": "Get the details and result of one execution by its id, including its data. Get the id from List Executions.",
        "workflowInputs": {
          "value": {
            "action": "get_execution",
            "workflow_id": "",
            "execution_id": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('execution_id', 'The id of the execution to fetch.') }}"
          },
          "schema": [
            {
              "id": "action",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "action",
              "canBeUsedToMatch": false
            },
            {
              "id": "workflow_id",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "workflow_id",
              "canBeUsedToMatch": false
            },
            {
              "id": "execution_id",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "execution_id",
              "canBeUsedToMatch": false
            }
          ],
          "mappingMode": "defineBelow"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "43e89620-0105-4f0f-9df6-b73c8c8d556d",
      "name": "Build Workflow",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "position": [
        1104,
        1376
      ],
      "parameters": {
        "workflowId": {
          "__rl": true,
          "mode": "id",
          "value": "RcWMSCiOCv7ATp0e",
          "cachedResultName": "Concierge Build Workflow (MCP Tool)"
        },
        "description": "Build a brand new workflow in n8n from a plain English description. The workflow is created INACTIVE for review. Provide a clear description and a short name.",
        "workflowInputs": {
          "value": {
            "name": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('name', 'A short descriptive name for the new workflow.') }}",
            "description": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('description', 'A plain English description of the workflow to build, including the trigger and the steps.') }}"
          },
          "schema": [
            {
              "id": "description",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "description",
              "canBeUsedToMatch": false
            },
            {
              "id": "name",
              "type": "string",
              "display": true,
              "required": true,
              "displayName": "name",
              "canBeUsedToMatch": false
            }
          ],
          "mappingMode": "defineBelow"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "29a03356-96b8-4013-b502-7e258da0212f",
      "name": "Sticky Note f2006dc0",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        240,
        1520
      ],
      "parameters": {
        "width": 560,
        "height": 536,
        "content": "## BUILD MY WORKFLOW CONCIERGE\nControl your entire n8n from **Claude Desktop**. Read this note first.\n\n**Operate:** list workflows, activate/deactivate, check recent executions and results.\n**Build:** describe a workflow in plain English and it is created in n8n (INACTIVE, for you to review).\n\nThis is the **hub** of a 3-workflow system: this MCP server plus two tool sub-workflows it calls. Six tools share the **Operate** sub-workflow (each passes a different action); **Build Workflow** uses the **Build** sub-workflow.\n\n## Setup\n1. Import all 3 workflows, then re-link each Tool Workflow node here to its imported sub-workflow (IDs change on import).\n2. Create an n8n API key (Settings > n8n API) and add it to the n8n API Key credential (header X-N8N-API-KEY).\n3. Replace the YOUR_N8N_DOMAIN placeholder in BOTH sub-workflows with your instance URL.\n4. Add a Google Gemini credential (used by Build).\n5. Activate only this MCP Server workflow, then connect Claude Desktop. For production, switch the MCP trigger to Bearer Auth.\n\n## Requirements\nSelf-hosted n8n with the public API enabled. Google Gemini (free tier OK). Claude Desktop. No community nodes."
      },
      "typeVersion": 1
    },
    {
      "id": "abe3aa66-619e-46c5-adda-a72cbb241602",
      "name": "Sticky Note 60687e1a",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        720,
        704
      ],
      "parameters": {
        "color": 7,
        "width": 460,
        "height": 220,
        "content": "## SETUP ORDER\n1. Make sure the two tool sub-workflows are SAVED: **Concierge n8n Operate** and **Concierge Build Workflow**. They run on demand when called, so they do NOT need to be activated.\n2. Publish (activate) THIS workflow to turn on the MCP endpoint and reveal the Production URL.\n3. Connect Claude Desktop (see the blue note).\n\nThe six operate tools share the Operate sub-workflow (each passes a different action). Build Workflow uses its own sub."
      },
      "typeVersion": 1
    },
    {
      "id": "bf319ecd-4f9c-4e1e-aaa3-0ec04dc403f1",
      "name": "Sticky Note a7bdfa9a",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        832,
        1520
      ],
      "parameters": {
        "color": 6,
        "width": 480,
        "height": 256,
        "content": "## SECURITY: READ THIS\nAuthentication is None so it works out of the box, and n8n exposes trigger URLs publicly. This endpoint can CREATE and ACTIVATE workflows on your instance, so it is powerful.\n\nBefore production: open the **MCP Server Trigger** node, switch **Authentication** to **Bearer Auth**, and add the same token in Claude Desktop. The destructive delete tool is intentionally NOT included; add it only with care.\nAlso pin mcp-remote to version 0.1.16 or newer (older versions had a critical security bug)."
      },
      "typeVersion": 1
    },
    {
      "id": "e817fdfd-b6b7-43dd-a8d5-c9ddbde08ebb",
      "name": "Sticky Note e543b7dd",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        832,
        1792
      ],
      "parameters": {
        "color": 3,
        "width": 480,
        "height": 272,
        "content": "## CONNECT CLAUDE DESKTOP\nClaude Desktop uses stdio while this server uses SSE/HTTP, so bridge them with mcp-remote.\n\nIn claude_desktop_config.json add an mcpServers entry named \"concierge\":\n- command: npx\n- args: mcp-remote, then your Production URL\n\nThe Production URL appears on the MCP Server Trigger node after you publish. For Bearer auth add an arg: --header Authorization: Bearer YOUR_TOKEN. Restart Claude Desktop after editing.\nDocs: see the MCP Server Trigger node page on docs.n8n.io."
      },
      "typeVersion": 1
    },
    {
      "id": "25398b4e-0177-4d8e-bb5f-0e2e59608278",
      "name": "Sticky Note - Architecture",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1328,
        1616
      ],
      "parameters": {
        "color": 7,
        "width": 560,
        "height": 344,
        "content": "## ARCHITECTURE: why three workflows\nThis template is a system of 3 workflows, not one, and that is deliberate:\n\n**1. Concierge MCP Server** (this one) - holds the MCP endpoint and the 7 tool definitions.\n**2. Concierge n8n Operate** - one sub-workflow shared by 6 tools; each passes a different `action`.\n**3. Concierge Build Workflow** - the sub-workflow behind the Build tool (Gemini + create-via-API).\n\nWhy split it: the *MCP Server Trigger* exposes each tool through a *Tool Workflow* node that calls a separate workflow, so the heavy logic lives outside the server. Benefits: one Operate sub powers six tools (no duplication), each sub is testable on its own, and the server stays a clean router.\n\n**Import order:** import all three workflows first. Then in this server open each *Tool Workflow* node and re-point it to the matching imported sub-workflow (the workflow IDs change on import)."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": true,
    "executionOrder": "v1"
  },
  "versionId": "ab154d50-c3ea-4e64-bbb8-f2e1103ef9d1",
  "nodeGroups": [],
  "connections": {
    "Call n8n API": {
      "main": [
        [
          {
            "node": "Shape Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Workflow": {
      "ai_tool": [
        [
          {
            "node": "MCP Server: Concierge",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Build Request": {
      "main": [
        [
          {
            "node": "Call n8n API",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Execution": {
      "ai_tool": [
        [
          {
            "node": "MCP Server: Concierge",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Build Workflow": {
      "ai_tool": [
        [
          {
            "node": "MCP Server: Concierge",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "List Workflows": {
      "ai_tool": [
        [
          {
            "node": "MCP Server: Concierge",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Create Workflow": {
      "main": [
        [
          {
            "node": "Build Result",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "List Executions": {
      "ai_tool": [
        [
          {
            "node": "MCP Server: Concierge",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Activate Workflow": {
      "ai_tool": [
        [
          {
            "node": "MCP Server: Concierge",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Workflow": {
      "main": [
        [
          {
            "node": "Create Workflow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Deactivate Workflow": {
      "ai_tool": [
        [
          {
            "node": "MCP Server: Concierge",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Receive Build Request": {
      "main": [
        [
          {
            "node": "Generate Workflow JSON",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Workflow JSON": {
      "main": [
        [
          {
            "node": "Normalize Workflow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow exposes an MCP server endpoint for Claude Desktop and provides tools to build new n8n workflows from plain-English prompts using Google Gemini, plus tools to list, inspect, activate/deactivate workflows and review executions via the n8n Public API. Receives MCP…

Source: https://n8n.io/workflows/16165/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

The AI-Powered Shopify SEO Content Automation is an enterprise-grade workflow that transforms product content creation for e-commerce stores. This sophisticated multi-agent system integrates GPT-4o, C

Perplexity Tool, Memory Buffer Window, Agent +15
AI & RAG

Learn how to build an MCP Server and Client in n8n with official nodes.

Agent, Google Calendar Tool, Mcp Trigger +8
AI & RAG

Build your first AI MCP Server. Uses agent, googleCalendarTool, mcpTrigger, executeWorkflowTrigger. Event-driven trigger; 32 nodes.

Agent, Google Calendar Tool, Mcp Trigger +8
AI & RAG

Build your first AI MCP Server. Uses agent, googleCalendarTool, mcpTrigger, executeWorkflowTrigger. Event-driven trigger; 32 nodes.

Agent, Google Calendar Tool, Mcp Trigger +8
AI & RAG

generate_full_word_documents_with_ai. Uses formTrigger, httpRequest, agent, outputParserStructured. Event-driven trigger; 32 nodes.

Form Trigger, HTTP Request, Agent +7