Préparer des réunions externes Google Calendar avec l'IA via MadKudu MCP

Intermédiaire

Ceci est unCRM, AI Summarizationworkflow d'automatisation du domainecontenant 13 nœuds.Utilise principalement des nœuds comme Filter, SplitOut, GoogleCalendar, Agent, ScheduleTrigger. Générer des notes de réunion IA pour Google Calendar avec GPT-4 et MadKudu MCP

Prérequis
  • Clé API OpenAI

Catégorie

Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "id": "Wlqg5aeZgBFNfQRm",
  "meta": {
    "instanceId": "f6f8c184929a9f843505f5273ebb41a7a951a35345a1095a4acc1d4034a73fa3",
    "templateCredsSetupCompleted": true
  },
  "name": "Prepare external Google Calendar meetings with AI using MadKudu MCP",
  "tags": [],
  "nodes": [
    {
      "id": "7c6a9973-5f65-4023-b883-aa248e72cb9b",
      "name": "Déclencheur planifié",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        192,
        0
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "2e638051-76b6-4a00-9f73-e149f6f7f1c6",
      "name": "Get many events",
      "type": "n8n-nodes-base.googleCalendar",
      "position": [
        384,
        0
      ],
      "parameters": {
        "options": {},
        "timeMax": "={{ $now.plus({ hour: 1 }) }}",
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": "margo.rey@madkudu.com",
          "cachedResultName": "margo.rey@madkudu.com"
        },
        "operation": "getAll"
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "uDpevl5X3MHVJwzD",
          "name": "Google Calendar account"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "ba2a5f9a-ab8b-49bd-9a4c-63a7369a9aee",
      "name": "Split Calendar Events",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        592,
        0
      ],
      "parameters": {
        "include": "allOtherFields",
        "options": {},
        "fieldToSplitOut": "id"
      },
      "typeVersion": 1
    },
    {
      "id": "68a13464-f449-4ca3-a2ff-05efbe3ed7fa",
      "name": "Keep meetings with external attendees",
      "type": "n8n-nodes-base.filter",
      "position": [
        1040,
        0
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "9fb0a08e-18b1-4eab-bc5b-3e63100b2b5a",
              "operator": {
                "type": "array",
                "operation": "lengthGt",
                "rightType": "number"
              },
              "leftValue": "={{ $('Split Calendar Events').item.json.attendees }}",
              "rightValue": 1
            },
            {
              "id": "eb7379a1-b7d0-45dc-be04-d9ae54426317",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.attendees.some(a => !a.email.includes('@'+$vars.my_company_domain)) }}",
              "rightValue": "true"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "13b751bb-3854-4df4-8405-dad3d14da24e",
      "name": "Agent IA - Research Attendees",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1376,
        0
      ],
      "parameters": {
        "text": "=# Context\nYou are an executive assistant. You are tasked with helping me prepare for an upcoming meeting.\n\n# Instructions\nPlease research these attendees:  \n  {{ JSON.stringify($json.attendees.filter(a => !a.email.includes('@'+$vars.my_company_domain)).map(a => a.email)) }} \nand their associated company using the following research tools:\n\n- `madkudu-value-prop`\n- `madkudu-account-details`\n- `madkudu-account-activities`\n- `madkudu-account-brief-instruction`\n- `madkudu-account-top-persons`\n- `madkudu-person-details`\n- `madkudu-person-activities`\n\nAlso use, if relevant, the context about the meeting:\n\n– **meeting title:**\n{{ $json.summary }}\n\n– **meeting description:**\n{{ $json.description }}\n\n# Format\nAlways format the output in plain text with the following sections:\n\n## TL;DR\nThis section should help me understand how to approach the meeting.  \nKeep it high level, 2–3 sentences max.\n\n## Person Summary\nShare relevant information about the attendees (excluding madkudu.com, personal emails).\n\n## Account Summary\n### Overall Account Engagement including top persons\nThis section should highlight relevant people based on their engagement so Francis can name drop them.  \nFlag power users, growing usage, and any relevant trend.\n\n## Account Brief\nThis section should help me grasp the overall context of the account and frame the conversation accordingly.  \nShare the full account brief.\n",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.1
    },
    {
      "id": "82cd9069-f074-4fdd-99a1-d34f5d756376",
      "name": "Send summary as event",
      "type": "n8n-nodes-base.googleCalendar",
      "position": [
        1904,
        0
      ],
      "parameters": {
        "end": "={{ $('Keep meetings with external attendees').item.json.end.dateTime }}",
        "start": "={{ $('Keep meetings with external attendees').item.json.start.dateTime }}",
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": "margo.rey@madkudu.com",
          "cachedResultName": "margo.rey@madkudu.com"
        },
        "additionalFields": {
          "summary": "=Prep meeting  {{ $('Keep meetings with external attendees').item.json.summary }}",
          "description": "={{ $json.output }}"
        }
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "uDpevl5X3MHVJwzD",
          "name": "Google Calendar account"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "4d71746d-4f0e-4b34-813d-94b30c8cce8c",
      "name": "MadKudu MCP",
      "type": "@n8n/n8n-nodes-langchain.mcpClientTool",
      "position": [
        1536,
        224
      ],
      "parameters": {
        "sseEndpoint": "=https://mcp.madkudu.com/{{$vars.madkudu_api_key}}/sse\n"
      },
      "typeVersion": 1
    },
    {
      "id": "30ccf0f2-b22e-42fb-8170-6b7781149070",
      "name": "OpenAI Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1376,
        224
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini",
          "cachedResultName": "gpt-4.1-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "gmWcRtweC5afMtgW",
          "name": "n8n free OpenAI API credits"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "dbbfbf49-0783-4d0a-8015-a5a43d5c94f5",
      "name": "Note adhésive",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -304,
        -208
      ],
      "parameters": {
        "width": 416,
        "height": 672,
        "content": "# Try it Out!\n\nThis workflow builds a **Meeting Prep AI Assistant**.\nIt sends a meeting invite at the same time as your scheduled meeting — including a summary of the external attendees and their companies in the event description.\n\nThis helps you show up prepared without manually researching attendees beforehand.\n\n## 💡 **How It Works**\n1. Checks for meetings every hour\nLooks ahead one hour for upcoming meetings in your calendar.\n\n2. Keeps only meetings with external attendees\nFilters out internal-only meetings based on your company domain (e.g. acme.com).\n\n3. Researches the attendees and companies\nUses MadKudu MCP, OpenAI, and other tools to gather info about attendees, past engagement, and company context.\n\n4. Adds the summary to your calendar\nA duplicate event is created at the same time, with the meeting brief in the description — visible to you only.\n\nNeed help?\nJoin the Discord or ask in the Forum.\n\nHappy Hacking!"
      },
      "typeVersion": 1
    },
    {
      "id": "31e1c1e5-7ecc-4a6a-8cba-42fb73e59532",
      "name": "Note adhésive2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        768,
        -192
      ],
      "parameters": {
        "color": 7,
        "width": 544,
        "height": 352,
        "content": "### 2. Keep External Meetings only\nSet your company email domain first (e.g. acme.com) as a [Variable](https://docs.n8n.io/code/variables/#create-variables)   my_company_domain.\nIt is used to identify who are internal attendees vs external attendees. \n\nThe filter node keeps only meetings where there is at least 1 external attendees, aka 1 email with a domain different than your company domain. \nThis ensures you only receive meeting briefs for external-facing meetings"
      },
      "typeVersion": 1
    },
    {
      "id": "da6d92ff-4acd-4835-9e85-5c58c1efee11",
      "name": "Note adhésive3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1360,
        -192
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 352,
        "content": "### 3. Research Attendees and Generate Summary\nEnrich attendee & company data using MadKudu and summarize with AI.\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "b4e8cfc3-8ca0-459d-b819-6deeabfa90b1",
      "name": "Note adhésive4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1824,
        -192
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 352,
        "content": "### 4. Send Meeting invitation with summary\nCreate a private calendar event with the AI-generated brief.\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "4ff628a1-3eea-40c7-9c2b-1681c8c28e02",
      "name": "Note adhésive1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        144,
        -192
      ],
      "parameters": {
        "color": 7,
        "width": 592,
        "height": 352,
        "content": "### 1. Check for new meetings every hour\nThe Scheduler is configured for every hour. \nIt will check in your Google Calendar for meetings in the next hour. Feel free to update the frequency if you have new meetings less frequently. \nThe Split allows preparing the events separately\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "4ac0ba48-715e-476e-836b-6800f0d2e777",
  "connections": {
    "4d71746d-4f0e-4b34-813d-94b30c8cce8c": {
      "ai_tool": [
        [
          {
            "node": "AI Agent - Research Attendees",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "30ccf0f2-b22e-42fb-8170-6b7781149070": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent - Research Attendees",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "2e638051-76b6-4a00-9f73-e149f6f7f1c6": {
      "main": [
        [
          {
            "node": "ba2a5f9a-ab8b-49bd-9a4c-63a7369a9aee",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "2e638051-76b6-4a00-9f73-e149f6f7f1c6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ba2a5f9a-ab8b-49bd-9a4c-63a7369a9aee": {
      "main": [
        [
          {
            "node": "68a13464-f449-4ca3-a2ff-05efbe3ed7fa",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent - Research Attendees": {
      "main": [
        [
          {
            "node": "82cd9069-f074-4fdd-99a1-d34f5d756376",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "68a13464-f449-4ca3-a2ff-05efbe3ed7fa": {
      "main": [
        [
          {
            "node": "AI Agent - Research Attendees",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Intermédiaire - CRM, Résumé IA

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Intermédiaire
Nombre de nœuds13
Catégorie2
Types de nœuds8
Description de la difficulté

Adapté aux utilisateurs expérimentés, avec des workflows de complexité moyenne contenant 6-15 nœuds

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34