AutomationFlowsAI & RAG › Whatsapp Assistant with Gemini AI for Calendar Management via Evolution API

Whatsapp Assistant with Gemini AI for Calendar Management via Evolution API

ByPedro Protes @pedroprotes on n8n.io

This workflow receives messages and media from WhatsApp via the Evolution API, converts the content into structured inputs, and forwards them to an AI Agent capable of triggering MCP tools to execute external actions. A Webhook receives messages sent to WhatsApp via the…

Webhook trigger★★★★★ complexityAI-powered31 nodesN8N Nodes Evolution ApiGoogle GeminiGoogle Gemini ChatMemory Buffer WindowAgentMcp TriggerMcp Client ToolGoogle Calendar Tool
AI & RAG Trigger: Webhook Nodes: 31 Complexity: ★★★★★ AI nodes: yes Added:

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

This workflow follows the Agent → Google Calendar Tool 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": "DL4PDuLscgVPGTI5",
  "name": "AI Agent that uses MCP Server to execute actions requested via Evolution API",
  "tags": [],
  "nodes": [
    {
      "id": "9c79cb31-075a-47b8-a70a-177b21ded9fd",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        896,
        784
      ],
      "parameters": {
        "path": "Calendar",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2.1
    },
    {
      "id": "90843418-ffd4-49a1-89c2-8fa82fb96991",
      "name": "Message Type",
      "type": "n8n-nodes-base.switch",
      "position": [
        1216,
        736
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Text",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "949f8192-31a5-4cab-a117-b2d7c93ddef7",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.body.data.messageType }}",
                    "rightValue": "conversation"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Image",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "4514c001-3c80-4753-84a5-9ea1fe3580db",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.body.data.messageType }}",
                    "rightValue": "=imageMessage"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Audio",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "35b2f657-3889-48c0-a948-85599df15925",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.body.data.messageType }}",
                    "rightValue": "audioMessage"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "PDF",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "e1dcdc00-7063-49f0-b1f9-8a2bcbaa8c18",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.body.data.messageType }}",
                    "rightValue": "documentMessage"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {
          "fallbackOutput": "extra",
          "renameFallbackOutput": "Message not supported"
        }
      },
      "typeVersion": 3.3
    },
    {
      "id": "8068da69-86aa-4d8e-bd20-6027ba5f55f5",
      "name": "Message not supported",
      "type": "n8n-nodes-evolution-api.evolutionApi",
      "position": [
        1216,
        1104
      ],
      "parameters": {
        "resource": "messages-api",
        "remoteJid": "={{ $json.body.data.key.remoteJid }}",
        "messageText": "This type of message is not supported by the system.",
        "instanceName": "Example",
        "options_message": {}
      },
      "typeVersion": 1
    },
    {
      "id": "72b60365-e073-48bc-8267-3127ec4f9856",
      "name": "Transcribe a recording",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        2288,
        912
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-2.5-flash"
        },
        "options": {},
        "resource": "audio",
        "inputType": "binary",
        "binaryPropertyName": "data_1"
      },
      "typeVersion": 1
    },
    {
      "id": "11fe97c6-08a2-4147-a9df-7c6bf91f0dbe",
      "name": "Audio",
      "type": "n8n-nodes-base.set",
      "position": [
        2480,
        912
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "78e287e5-e2e1-45ee-82a4-5c71fd6fa52f",
              "name": "text",
              "type": "string",
              "value": "={{ $json.content.parts[0].text }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "ace7a128-d0e4-4662-a1d6-ae8a4c2de895",
      "name": "Get base64 audio",
      "type": "n8n-nodes-evolution-api.evolutionApi",
      "position": [
        1808,
        912
      ],
      "parameters": {
        "resource": "chat-api",
        "messageId": "={{ $json.body.data.key.id }}",
        "operation": "get-media-base64",
        "instanceName": "Example"
      },
      "typeVersion": 1
    },
    {
      "id": "6ae0a135-f566-4381-81f8-6cea69c1fd3d",
      "name": "Get base64 image",
      "type": "n8n-nodes-evolution-api.evolutionApi",
      "position": [
        1808,
        672
      ],
      "parameters": {
        "resource": "chat-api",
        "messageId": "={{ $json.body.data.key.id }}",
        "operation": "get-media-base64",
        "instanceName": "Example"
      },
      "typeVersion": 1
    },
    {
      "id": "24e7d816-31f6-4f80-a7d0-7b267116a04a",
      "name": "Edit Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        1808,
        480
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "ca660f65-1742-449d-b3b7-6e810b17eb2a",
              "name": "text",
              "type": "string",
              "value": "={{ $json.body.data.message.conversation }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "54d0a730-2b5b-4d58-b9f5-6c10c25dd261",
      "name": "Convert to image",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        2064,
        672
      ],
      "parameters": {
        "options": {},
        "operation": "toBinary",
        "sourceProperty": "data.base64"
      },
      "typeVersion": 1.1
    },
    {
      "id": "ad8d7772-c441-4a9e-b293-349f6db66daf",
      "name": "Convert to audio",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        2064,
        912
      ],
      "parameters": {
        "options": {},
        "operation": "toBinary",
        "sourceProperty": "data.base64",
        "binaryPropertyName": "data_1"
      },
      "typeVersion": 1.1
    },
    {
      "id": "5bbf0be8-d450-44db-b516-fadcf14da307",
      "name": "Analyze an image",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        2272,
        672
      ],
      "parameters": {
        "text": "=You are an image analyst. Your task is to describe the provided image with factual accuracy, avoiding subjective interpretations or unverifiable assumptions.\n\nMandatory rules:\n\n1. Describe only what is visible\u2014do not invent context, intentions, or missing information.\n\n2. Begin by identifying:\n- main elements,\n- secondary elements,\n- setting/environment.\n\n3. For each relevant element, describe:\n- shape,\n- color,\n- position,\n- spatial relationship.\n\n4. If there are people, describe:\n- posture,\n- actions,\n- approximate number,\n- approximate age range without guessing identity.\n\n5. Do not describe emotions unless there is a clear facial expression.\n\n6. Do not use \u201cseems,\u201d \u201cmaybe,\u201d \u201cprobably,\u201d except when the image is obscure or out of focus.\n\n7. Maintain temporal consistency: describe the scene as a single moment.\n\n8. Submit the answer in the following format:\n\n{\n\"general_description\": \"...\",\n\n\"relevant_objects\": [\n\n{\"object\": \"...\", \"position\": \"...\", \"characteristics\": \"...\"}\n\n],\n\"environment\": \"...\",\n\n\"observations\": \"...\"\n\n}\n\nIf any element is illegible, use: \"undefined\".",
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-2.5-flash",
          "cachedResultName": "models/gemini-2.5-flash"
        },
        "options": {},
        "resource": "image",
        "inputType": "binary",
        "operation": "analyze"
      },
      "typeVersion": 1
    },
    {
      "id": "d33c46ef-8f0c-4575-85e3-f9444c17516c",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        3040,
        688
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "1a991222-1732-4de5-bd22-1e92eb637e64",
      "name": "Simple Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        3184,
        688
      ],
      "parameters": {
        "sessionKey": "={{ $('Webhook').item.json.body.data.key.remoteJid }}",
        "sessionIdType": "customKey",
        "contextWindowLength": 8
      },
      "typeVersion": 1.3
    },
    {
      "id": "69df440b-9879-46b3-a348-7d4a21a84121",
      "name": "Archestrator Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        3088,
        480
      ],
      "parameters": {
        "text": "={{ $json.text }}",
        "options": {
          "systemMessage": "=You are an AI assistant responsible for interpreting each user request and deciding whether a tool is needed.\n\nRules:\n1. Before acting, analyze the request and determine:\n\na) if it's possible to respond directly without tools;\n\nb) if a tool is necessary to complete the task.\n\n2. When a tool is truly necessary, choose only the most appropriate one and make a single call.\n\n3. Never call unnecessary tools.\n\n4. If any essential information is missing to perform the task correctly or safely, explicitly request the missing data before proceeding.\n\n5. Always respond objectively, directly, and without speculation.\n\nWhenever you need to update or delete an event:\n1. First, use the event search tool to obtain the list with IDs.\n2. Choose the event that best matches the user's request.\n3. Use the ID of that event to call the update or delete tool.\n4. If there is ambiguity (more than one candidate), request confirmation, for example:\n\"I found multiple matching events, (list events), which one do you want to modify?\"\n\n\n\nFor temporal references:\nWhen the user makes requests with relative time references (e.g., \"next week,\" \"in two days,\" \"next month's events\"), and does not provide a specific date, use the date {{ $now.toISO() }} as the starting point.\n\nMandatory conventions:\n1. \"Next week\" = 7-day interval starting the day after the current day.\nExample: if today is 11/15/2025 \u2192 period = 11/16/2025 to 11/22/2025.\n\n2. \"In the next X days\" = period between (today + 1) and (today + X).\n\n3. \"In X days\" = exactly (today + X).\n\n4. If the user requests a specific month (\u201cnext month\u201d, \u201cin two months\u201d), consider:\n- start = first day of the current month,\n- end = last day of that month.\n\n5. If the user provides explicit dates, ignore all the rules above.\n\nNote:\nIf the requested task is outside the available tools, explain the limitation and offer the closest alternative.\n"
        },
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "cbacb2c1-ce41-424a-9d3d-e83b29090651",
      "name": "Get base64 document",
      "type": "n8n-nodes-evolution-api.evolutionApi",
      "position": [
        1808,
        1136
      ],
      "parameters": {
        "resource": "chat-api",
        "messageId": "={{ $json.body.data.key.id }}",
        "operation": "get-media-base64",
        "instanceName": "Example"
      },
      "typeVersion": 1
    },
    {
      "id": "b11d0b3b-de6d-4900-a6a7-1b22edb29c25",
      "name": "Convert to document",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        2064,
        1136
      ],
      "parameters": {
        "options": {},
        "operation": "toBinary",
        "sourceProperty": "data.base64",
        "binaryPropertyName": "data_1"
      },
      "typeVersion": 1.1
    },
    {
      "id": "dba364a6-041d-44eb-a2fa-66233a3441b4",
      "name": "Analyze document",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        2288,
        1136
      ],
      "parameters": {
        "text": "=What is this document about?\nPlease provide a summary of the subject matter. Be as brief as possible.",
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-2.5-flash"
        },
        "options": {},
        "resource": "document",
        "inputType": "binary",
        "binaryPropertyName": "data_1"
      },
      "typeVersion": 1
    },
    {
      "id": "c60639b5-9e4c-4cc3-83a5-e11f9433b80f",
      "name": "Document",
      "type": "n8n-nodes-base.set",
      "position": [
        2480,
        1136
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "78e287e5-e2e1-45ee-82a4-5c71fd6fa52f",
              "name": "text",
              "type": "string",
              "value": "={{ $json.content.parts[0].text }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "498ed1c7-35da-41db-b33c-74bc88bb369a",
      "name": "MCP Server Google Calendar",
      "type": "@n8n/n8n-nodes-langchain.mcpTrigger",
      "position": [
        3072,
        1184
      ],
      "parameters": {
        "path": "calendar"
      },
      "typeVersion": 2
    },
    {
      "id": "2895f54e-11d3-4c54-9f6b-cb6a500211fb",
      "name": "Send message",
      "type": "n8n-nodes-evolution-api.evolutionApi",
      "position": [
        3504,
        480
      ],
      "parameters": {
        "resource": "messages-api",
        "remoteJid": "={{ $('Webhook').item.json.body.data.key.remoteJid }}",
        "messageText": "={{ $json.output }}",
        "instanceName": "Example",
        "options_message": {}
      },
      "typeVersion": 1
    },
    {
      "id": "956c5c40-958c-4b43-96fe-82bca9460ec6",
      "name": "MCP Calendar",
      "type": "@n8n/n8n-nodes-langchain.mcpClientTool",
      "position": [
        3344,
        688
      ],
      "parameters": {
        "options": {},
        "endpointUrl": "https://hexagom-n8n.cloudfy.cloud/mcp/calendar"
      },
      "typeVersion": 1.1
    },
    {
      "id": "3aea7b65-0803-4ef2-b84c-981049b1a687",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        224,
        176
      ],
      "parameters": {
        "width": 592,
        "height": 1168,
        "content": "## AI Agent that uses MCP Server to execute actions requested via Evolution API.\n This workflow receives messages and media from WhatsApp via the Evolution API, converts the content into structured inputs, and forwards them to an AI Agent capable of triggering MCP tools to execute external actions.\n\n### \ud83d\udd27  **How it works**\n- A **Webhook** receives messages sent to WhatsApp via the **Evolution API**.\n- The **\"Message Type\"** node detects and forwards the received media. It handles the types `Text`, `Image`, `Audio`, and `Document`. If it is another media type, the fallback forwards a \"media not supported\" message to the user.\n- The message goes to the system where it retrieves the **Base64** of the media.\n- The media is converted into **Binary File(s)** and a Gemini node will generate a text input for the agent.\n- The **AI Agent** receives the structured input and calls the appropriate **MCP Tool**. In this example, only one **MCP Server** was configured.\n- The AI \u200b\u200bAgent generates the output and sends it to the user.\n\n### \ud83d\uddd2\ufe0f Requirements\n- Evolution API Account, with the instance configured.\n- Gemini API.\n- Google Calendar API.\n- MCP Server (Internal or external, whichever you prefer) configured and with a URL to link to the MCP Tool.\n\n### \u2714\ufe0f How to set up\n- **Configure the Evolution API webhook**\n    - Copy the webhook URL generated in the first node.\n    - In the Evolution API panel, go to the instance > webhook > paste the URL into the corresponding field.\n- **Configure Google Calendar credentials**\n    - In n8n, go to *Credentials \u2192 Create New* and select **Google Calendar OAuth2**.\n    - Select this credential in all Google Calendar MCP nodes (Get, Create, Update, Delete).\n- **Enable MCP Server nodes**\n    - Copy the MCP Server URL and paste it into the \u201c**Endpoint** field of the MCP Tool.\n- **Configure Evolution API nodes**\n    - In all Evolution API nodes, you need to fill in the \u201c**instance** field with the name of your Evolution API instance.\n\n### \ud83e\uddbe how to adapt it?\n- **Customize or extend the MCP Tools**\n    - You can add new MCP tools (e.g., Google Sheets, Notion, ClickUp).\n    - Only the agent prompt needs to be updated; the workflow structure remains the same.\n- I opted to use simple memory, but if you want the agent to remember the entire conversation, I recommend changing the memory type; as it is, it will only remember the last 8 messages.\n- If you're going to use a tool like Chatwoot or TypeBot, simply change the webhook URL and pay attention to the objects that the switch (Message Type) uses."
      },
      "typeVersion": 1
    },
    {
      "id": "8f8ae7cf-09a9-4e9a-84f9-6e8d3204291c",
      "name": "Image",
      "type": "n8n-nodes-base.set",
      "onError": "continueErrorOutput",
      "position": [
        2480,
        672
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "f8495522-4a0c-4c82-89ec-5a2ef6fe2f8b",
              "name": "Imagem_description",
              "type": "string",
              "value": "={{ $json.content.parts[0].text }}"
            },
            {
              "id": "4dbb0d59-5e0b-4388-90a7-562cbfb86307",
              "name": "image_caption",
              "type": "string",
              "value": "={{ $('Message Type').item.json.body.data.message.imageMessage.caption }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "9ac3d873-506a-4a3c-86c8-7bdd55462c97",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1744,
        400
      ],
      "parameters": {
        "color": 7,
        "width": 944,
        "height": 896,
        "content": "## Search, convert, and analyze media"
      },
      "typeVersion": 1
    },
    {
      "id": "62b005ea-9fa7-416c-8ca9-11a09272bc9a",
      "name": "Create an event",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        3024,
        1360
      ],
      "parameters": {
        "end": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('End', ``, 'string') }}",
        "start": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Start', ``, 'string') }}",
        "calendar": {
          "__rl": true,
          "mode": "id",
          "value": "=example@gmail.com"
        },
        "additionalFields": {
          "summary": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Summary', ``, 'string') }}",
          "description": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Description', ``, 'string') }}"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "8b5858e5-118a-451e-bd5f-7c7370fcd941",
      "name": "Get many events",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        3152,
        1440
      ],
      "parameters": {
        "options": {},
        "timeMax": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Before', ``, 'string') }}",
        "timeMin": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('After', ``, 'string') }}",
        "calendar": {
          "__rl": true,
          "mode": "id",
          "value": "=example@gmail.com"
        },
        "operation": "getAll",
        "returnAll": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Return_All', ``, 'boolean') }}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "e7b7b106-8c2b-4662-9506-527f716b7b64",
      "name": "Delete an event",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        3296,
        1440
      ],
      "parameters": {
        "eventId": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Event_ID', ``, 'string') }}",
        "options": {},
        "calendar": {
          "__rl": true,
          "mode": "id",
          "value": "=example@gmail.com"
        },
        "operation": "delete"
      },
      "typeVersion": 1.3
    },
    {
      "id": "10b30eb1-95d5-40aa-baa3-8c6090c213d5",
      "name": "Update an event",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        3424,
        1360
      ],
      "parameters": {
        "eventId": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Event_ID', ``, 'string') }}",
        "calendar": {
          "__rl": true,
          "mode": "id",
          "value": "=example@gmail.com"
        },
        "operation": "update",
        "updateFields": {
          "end": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('End', ``, 'string') }}",
          "start": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Start', ``, 'string') }}",
          "summary": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Summary', ``, 'string') }}",
          "description": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Description', ``, 'string') }}"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "b1347318-30da-4a52-b2b0-45a616e6fdd1",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2960,
        1088
      ],
      "parameters": {
        "color": 7,
        "width": 592,
        "height": 496,
        "content": "## MCP Server with the tools connected.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "5d4aec7b-ce77-47ff-b383-1077d3e6db58",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1104,
        608
      ],
      "parameters": {
        "color": 7,
        "width": 384,
        "height": 672,
        "content": "## Here it will identify the type and forward the message."
      },
      "typeVersion": 1
    },
    {
      "id": "92a348db-5b2f-4e14-a6fe-3884a6f5f4b6",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2960,
        336
      ],
      "parameters": {
        "color": 7,
        "width": 768,
        "height": 480,
        "content": "## The orchestrating agent will analyze the input, request the necessary tools, and generate the output.\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "a0e87096-a3f8-4395-9197-952f275d5e54",
  "connections": {
    "Audio": {
      "main": [
        [
          {
            "node": "Archestrator Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Image": {
      "main": [
        [
          {
            "node": "Archestrator Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "Message Type",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Document": {
      "main": [
        [
          {
            "node": "Archestrator Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Archestrator Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "MCP Calendar": {
      "ai_tool": [
        [
          {
            "node": "Archestrator Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Message Type": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Get base64 image",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Get base64 audio",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Get base64 document",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Message not supported",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory": {
      "ai_memory": [
        [
          {
            "node": "Archestrator Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Create an event": {
      "ai_tool": [
        [
          {
            "node": "MCP Server Google Calendar",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Delete an event": {
      "ai_tool": [
        [
          {
            "node": "MCP Server Google Calendar",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Get many events": {
      "ai_tool": [
        [
          {
            "node": "MCP Server Google Calendar",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Update an event": {
      "ai_tool": [
        [
          {
            "node": "MCP Server Google Calendar",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Analyze an image": {
      "main": [
        [
          {
            "node": "Image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze document": {
      "main": [
        [
          {
            "node": "Document",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert to audio": {
      "main": [
        [
          {
            "node": "Transcribe a recording",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert to image": {
      "main": [
        [
          {
            "node": "Analyze an image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get base64 audio": {
      "main": [
        [
          {
            "node": "Convert to audio",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get base64 image": {
      "main": [
        [
          {
            "node": "Convert to image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Archestrator Agent": {
      "main": [
        [
          {
            "node": "Send message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert to document": {
      "main": [
        [
          {
            "node": "Analyze document",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get base64 document": {
      "main": [
        [
          {
            "node": "Convert to document",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transcribe a recording": {
      "main": [
        [
          {
            "node": "Audio",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Archestrator Agent",
            "type": "ai_languageModel",
            "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 receives messages and media from WhatsApp via the Evolution API, converts the content into structured inputs, and forwards them to an AI Agent capable of triggering MCP tools to execute external actions. A Webhook receives messages sent to WhatsApp via the…

Source: https://n8n.io/workflows/10944/ — 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

This workflow is an AI-powered Dental Appointment Assistant that automates appointment booking, rescheduling, and cancellations through Telegram or a Webhook. It uses intelligent agents to understand

Memory Buffer Window, Output Parser Structured, Mcp Client Tool +12
AI & RAG

> This n8n template builds Stacey, an AI assistant that runs inside Telegram. Stacey listens to your messages, understands what you want using AI, and intelligently routes commands to MCP-connected

Tool Workflow, Tool Http Request, Telegram +11
AI & RAG

Personal Assistant MCP server. Uses chatTrigger, lmChatGoogleGemini, memoryBufferWindow, mcpTrigger. Chat trigger; 20 nodes.

Chat Trigger, Google Gemini Chat, Memory Buffer Window +6
AI & RAG

Personal Assistant MCP server. Uses chatTrigger, lmChatGoogleGemini, memoryBufferWindow, mcpTrigger. Chat trigger; 20 nodes.

Chat Trigger, Google Gemini Chat, Memory Buffer Window +6
AI & RAG

Wouldn't it be cool to just tell your computer or phone to "schedule a meeting with Sarah next Tuesday at 3 PM" or "find John Doe's email address" and have it actually do it? That's the dream of a per

Chat Trigger, Google Gemini Chat, Memory Buffer Window +6