This workflow corresponds to n8n.io template #8197 — 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 →
{
"nodes": [
{
"id": "77a797b9-df8f-4891-9147-84e39f2732e5",
"name": "MCP Server Trigger",
"type": "@n8n/n8n-nodes-langchain.mcpTrigger",
"position": [
-816,
496
],
"parameters": {
"path": "c627d58d-63f5-4876-babb-5c3b1243d7e9"
},
"typeVersion": 1
},
{
"id": "90f295aa-56ed-4006-be11-2ef0db62093f",
"name": "Create an Event in Google Calendar with 1 Attendee",
"type": "n8n-nodes-base.googleCalendarTool",
"position": [
-1200,
704
],
"parameters": {
"end": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('End', `Take the time from the user message`, 'string') }}",
"start": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Start', `Take the time from the user message`, 'string') }}",
"calendar": {
"__rl": true,
"mode": "list",
"value": ""
},
"descriptionType": "manual",
"toolDescription": "Create an Event in Google Calendar API with 1 attendee",
"additionalFields": {
"summary": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Summary', ``, 'string') }}",
"showMeAs": "transparent",
"attendees": [
"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('attendees0_Attendees', `take the attendee mail from user message`, 'string') }}"
],
"description": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Description', ``, 'string') }}"
}
},
"typeVersion": 1.3
},
{
"id": "d7203cd8-7940-4435-9b20-25ef06f0ad8c",
"name": "Create an Event in Google Calendar with 2 Attendees",
"type": "n8n-nodes-base.googleCalendarTool",
"position": [
-1024,
784
],
"parameters": {
"end": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('End', ``, 'string') }}",
"start": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Start', ``, 'string') }}",
"calendar": {
"__rl": true,
"mode": "list",
"value": ""
},
"descriptionType": "manual",
"toolDescription": "Create an Event in Google Calendar API with 2 attendees",
"additionalFields": {
"summary": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Summary', ``, 'string') }}",
"attendees": [
"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('attendees0_Attendees', `take the first attendee email from the message.`, 'string') }}",
"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('attendees1_Attendees', `take the second attendee email from the message.`, 'string') }}"
],
"description": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Description', ``, 'string') }}"
}
},
"typeVersion": 1.3
},
{
"id": "1ec06ce1-827f-4de7-bed0-fbfec4bda155",
"name": "Delete an event Google Calendar",
"type": "n8n-nodes-base.googleCalendarTool",
"position": [
-176,
752
],
"parameters": {
"eventId": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Event_ID', ``, 'string') }}",
"options": {},
"calendar": {
"__rl": true,
"mode": "list",
"value": ""
},
"operation": "delete",
"descriptionType": "manual",
"toolDescription": "Delete an event from Google Calendar API"
},
"typeVersion": 1.3
},
{
"id": "eb687e4a-cb99-4be1-aef5-0444bd7c8435",
"name": "Create a weekly recurrent event Event",
"type": "n8n-nodes-base.googleCalendarTool",
"position": [
-800,
832
],
"parameters": {
"end": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('End', ``, 'string') }}",
"start": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Start', ``, 'string') }}",
"calendar": {
"__rl": true,
"mode": "list",
"value": ""
},
"descriptionType": "manual",
"toolDescription": "Create a weekly frequent Event in Google Calendar API with 2 attendees ",
"additionalFields": {
"attendees": [
"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('attendees0_Attendees', `take the first attendee email from the message.`, 'string') }}",
"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('attendees1_Attendees', `take the second attendee email from the message.`, 'string') }}"
],
"repeatFrecuency": "weekly"
}
},
"typeVersion": 1.3
},
{
"id": "99d60bdb-bbbf-42cd-88a4-26d7f84960be",
"name": "complete_task",
"type": "n8n-nodes-base.googleTasksTool",
"position": [
304,
816
],
"parameters": {
"task": "MDQ3MTk5NzQzMTc5NDM3NTA4OTU6MDow",
"taskId": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Task_ID', `The task id to be marked as completed. Get it from the get tasks tool`, 'string') }}",
"operation": "update",
"updateFields": {
"status": "completed"
}
},
"typeVersion": 1
},
{
"id": "707ed206-b176-42a9-aeeb-b6c8851ed994",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-32,
464
],
"parameters": {
"color": 3,
"width": 1540,
"height": 512,
"content": "## Google Tasks MCP Server\n1. Add your credentials\n"
},
"typeVersion": 1
},
{
"id": "e4a770b1-fc7e-4bc4-b411-b102cc855b27",
"name": "update tasks",
"type": "n8n-nodes-base.googleTasksTool",
"position": [
640,
816
],
"parameters": {
"task": "MDQ3MTk5NzQzMTc5NDM3NTA4OTU6MDow",
"taskId": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Task_ID', ``, 'string') }}",
"operation": "update",
"updateFields": {
"notes": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Notes', ``, 'string') }}",
"title": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Title', ``, 'string') }}",
"dueDate": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Due_Date', ``, 'string') }}"
}
},
"typeVersion": 1
},
{
"id": "a40dc545-41b5-4279-bbd0-4b12a7967351",
"name": "create_task",
"type": "n8n-nodes-base.googleTasksTool",
"position": [
0,
816
],
"parameters": {
"task": "MDQ3MTk5NzQzMTc5NDM3NTA4OTU6MDow",
"title": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Title', `Title summary of the task to be done`, 'string') }}",
"additionalFields": {
"notes": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Notes', `Detailed description of the task`, 'string') }}",
"parent": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Parent', `If parent specified, create the task under that parent. Get the parent task id from the get tasks tool`, 'string') }}",
"dueDate": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Due_Date', `Date the task should be completed`, 'string') }}",
"completed": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Completion_Date', `Date the task was completed`, 'string') }}"
}
},
"typeVersion": 1
},
{
"id": "0b0ba749-b34b-4055-bdb6-fe288fb691fd",
"name": "get_tasks",
"type": "n8n-nodes-base.googleTasksTool",
"position": [
160,
816
],
"parameters": {
"task": "MDQ3MTk5NzQzMTc5NDM3NTA4OTU6MDow",
"operation": "getAll",
"returnAll": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Return_All', ``, 'boolean') }}",
"additionalFields": {
"showCompleted": true
}
},
"typeVersion": 1
},
{
"id": "25cf7872-9f5c-408f-92a3-252183f57004",
"name": "delete task",
"type": "n8n-nodes-base.googleTasksTool",
"position": [
784,
816
],
"parameters": {
"task": "MDQ3MTk5NzQzMTc5NDM3NTA4OTU6MDow",
"taskId": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Task_ID', `Get the task ID from the get_tasks tool`, 'string') }}",
"operation": "delete"
},
"typeVersion": 1
},
{
"id": "294d46a7-52d2-4baf-b1ae-06e66f67b586",
"name": "move_task_position",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
976,
816
],
"parameters": {
"url": "=https://tasks.googleapis.com/tasks/v1/lists/{{ $fromAI('Task_List_ID', 'ID of the task list containing the task to move', 'string') }}/tasks/{{ $fromAI('Task_ID', 'ID of the task to move', 'string') }}/move",
"method": "POST",
"options": {},
"sendQuery": true,
"sendHeaders": true,
"authentication": "predefinedCredentialType",
"queryParameters": {
"parameters": [
{
"name": "parent",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters0_Value', `ID of the parent task to move under (optional)`, 'string') }}"
},
{
"name": "previous",
"value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('parameters1_Value', `ID of the sibling task to move after (optional)`, 'string') }}"
}
]
},
"headerParameters": {
"parameters": [
{}
]
},
"nodeCredentialType": "googleTasksOAuth2Api"
},
"typeVersion": 4.2
},
{
"id": "06347e3d-e1c8-4d87-b012-9bf996319845",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
1120,
752
],
"parameters": {
"content": "## Custom tool\n\nUsing http tool for using other APIs which are not directly allowed via available tool nodes."
},
"typeVersion": 1
},
{
"id": "980bb218-849f-4a55-a6f3-a0339c0fe385",
"name": "MCP Server Trigger1",
"type": "@n8n/n8n-nodes-langchain.mcpTrigger",
"position": [
336,
592
],
"parameters": {
"path": "562ffc95-cf8e-4d4d-8f5b-29b3ff22d5ee"
},
"typeVersion": 1
},
{
"id": "27cb0a1a-14d6-423c-a9be-03c85fe643f0",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
-480,
224
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini",
"cachedResultName": "gpt-4o-mini"
},
"options": {}
},
"typeVersion": 1.2
},
{
"id": "3c95fe62-16be-4b40-80f5-14fa15b357b5",
"name": "Telegram Trigger",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
-688,
48
],
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"typeVersion": 1.2
},
{
"id": "cf76721c-6405-40d7-883f-511a3bda1eef",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-368,
48
],
"parameters": {
"text": "={{ $json.message.text }}",
"options": {
"systemMessage": "=You are a helpful assistant named Troy. You can perform two types of tasks:\n1. Google Tasks Management: Create, update, delete, and retrieve tasks using the Google Tasks MCP. \n2. Google Calendar Management: Create, update, delete, and retrieve calendar events using the Google Calendar MCP.\n\nImportant Instructions:\n- Always call get_tasks tool first to retrieve task IDs before performing task operations.\n- CRITICAL: Before creating any calendar event, ALWAYS check for scheduling conflicts:\n 1. Use the GetAll calendar tool to retrieve existing events for the requested time period.\n 2. Compare the requested time slot against existing events.\n 3. Allow a 1-minute buffer between events \u2014 that is, events ending at 8:00 PM and starting at 8:00 PM (or within 1 minute) do not conflict.\n 4. If a conflict is found, inform the user with the details of the existing event and ask if they want to:\n - Reschedule the new meeting to a different time\n - Cancel or move the existing meeting\n - Schedule anyway (double-book)\n 5. Only create the new event after confirming there is no conflict, or if the user agrees to double-book.\n- Choose the correct creation method for calendar events:\n - Use standard calendar creation for one-time events.\n - Use weekly_repeat_create only when the user explicitly mentions terms like \"weekly\", \"every week\", or similar recurring weekly patterns.\n - Use the appropriate variant of the tool depending on the number of attendees:\n - If the event is a single time use the required tool followed by the number of attendees.\n - If the event is recurring weekly, use the required weekly tool followed by the number of attendees. \n- While sending attendee data to the tool, separate attendee names by commas.\n- Analyze the user\u2019s request carefully to determine which tools to use based on time, recurrence, and number of attendees.\n\nSpecial Commands:\n- If the user writes /start, welcome them and explain your capabilities as Troy, their personal assistant.\nCurrent Context:\n - Today's date and time: {{ $now.setZone('Asia/Dhaka') }}\n - Timezone: Asia/Dhaka (Bangladesh Standard Time)\n - Always use Bangladesh time format when creating events.\n\n- If the user greets, answer gracefully. \n\nOutput Instructions:\n- Format response in telegram-compatible text format. \n\nExamples:\n- \"Schedule a meeting tomorrow at 3 pm\" \n \u2192 Check for conflicts at 3 pm tomorrow. \n \u2192 If clear, create the event using the appropriate single-time tool. \n \u2192 If not, suggest alternatives. \n- \"Set up a weekly team meeting every Monday at 10am\". \n \u2192 Check for conflicts on Mondays at 10am. \n \u2192 If no conflict, use weekly_repeat_create (small group variant if attendees \u2264 3). \n \u2192 If conflict, suggest a new time.\n- \"Add a task to buy groceries\" \n \u2192 Use Google Tasks MCP to create a new task.\n\n"
},
"promptType": "define"
},
"typeVersion": 1.9
},
{
"id": "9d5b629c-e698-432e-8f95-d1d342bb3fba",
"name": "Google Tasks MCP",
"type": "@n8n/n8n-nodes-langchain.mcpClientTool",
"position": [
-80,
272
],
"parameters": {
"options": {}
},
"typeVersion": 1
},
{
"id": "52fc3692-4beb-43c0-bdb2-d8c5bdd11ed7",
"name": "Google Calender MCP",
"type": "@n8n/n8n-nodes-langchain.mcpClientTool",
"position": [
128,
272
],
"parameters": {
"options": {}
},
"typeVersion": 1
},
{
"id": "e432a5d0-31ce-4d69-82c3-19d4ce158b8a",
"name": "Simple Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
-272,
272
],
"parameters": {
"sessionKey": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"sessionIdType": "customKey"
},
"typeVersion": 1.3
},
{
"id": "bc1d8286-01e7-4fb5-bab1-ff6831234200",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1296,
464
],
"parameters": {
"width": 1232,
"height": 512,
"content": "## Google Calendar MCP Server\n1. Add Google Calendar Credentials\n2. Select the Calendar from the list (your mail)"
},
"typeVersion": 1
},
{
"id": "f3e0a407-1318-4777-99c4-c16cc49afc84",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-800,
-144
],
"parameters": {
"color": 4,
"width": 1376,
"height": 576,
"content": "## Personal Assistant\n1. Run all three workflows separately \n2. Add the MCP server SSE endpoints in the MCP client \n3. Setup telegram credentials\n"
},
"typeVersion": 1
},
{
"id": "e70ce1ce-3198-43b6-9a18-461a63427d5d",
"name": "Send Error Message",
"type": "n8n-nodes-base.telegram",
"position": [
320,
48
],
"parameters": {
"text": "=We are facing troubles in providing a response right now. Please try again later.",
"chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "8fb00202-2598-4f17-99f7-9d3b7ad3abd5",
"name": "Send Message",
"type": "n8n-nodes-base.telegram",
"onError": "continueErrorOutput",
"position": [
80,
-48
],
"parameters": {
"text": "={{ $json.output }}",
"chatId": "={{ $('Telegram Trigger').item.json.message.chat.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "660211d8-8497-4b77-8742-75ceb6036048",
"name": "Get_Events",
"type": "n8n-nodes-base.googleCalendarTool",
"position": [
-464,
832
],
"parameters": {
"eventId": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Event_ID', ``, 'string') }}",
"options": {},
"calendar": {
"__rl": true,
"mode": "list",
"value": ""
},
"operation": "get",
"descriptionType": "manual",
"toolDescription": "Get an Event from Google Calendar API"
},
"typeVersion": 1.3
},
{
"id": "277fc9fe-f3b1-43a7-bde4-f8919765b814",
"name": "GetAll_Events",
"type": "n8n-nodes-base.googleCalendarTool",
"position": [
-336,
784
],
"parameters": {
"options": {},
"timeMax": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Before', ``, 'string') }}",
"timeMin": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('After', ``, 'string') }}",
"calendar": {
"__rl": true,
"mode": "list",
"value": ""
},
"operation": "getAll",
"returnAll": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Return_All', ``, 'boolean') }}",
"descriptionType": "manual",
"toolDescription": "Get Multiple Events from Google Calendar API"
},
"typeVersion": 1.3
}
],
"connections": {
"AI Agent": {
"main": [
[
{
"node": "Send Message",
"type": "main",
"index": 0
}
]
]
},
"get_tasks": {
"ai_tool": [
[
{
"node": "MCP Server Trigger1",
"type": "ai_tool",
"index": 0
}
]
]
},
"Get_Events": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"create_task": {
"ai_tool": [
[
{
"node": "MCP Server Trigger1",
"type": "ai_tool",
"index": 0
}
]
]
},
"delete task": {
"ai_tool": [
[
{
"node": "MCP Server Trigger1",
"type": "ai_tool",
"index": 0
}
]
]
},
"Send Message": {
"main": [
[],
[
{
"node": "Send Error Message",
"type": "main",
"index": 0
}
]
]
},
"update tasks": {
"ai_tool": [
[
{
"node": "MCP Server Trigger1",
"type": "ai_tool",
"index": 0
}
]
]
},
"GetAll_Events": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "AI Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"complete_task": {
"ai_tool": [
[
{
"node": "MCP Server Trigger1",
"type": "ai_tool",
"index": 0
}
]
]
},
"Google Tasks MCP": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Telegram Trigger": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"move_task_position": {
"ai_tool": [
[
{
"node": "MCP Server Trigger1",
"type": "ai_tool",
"index": 0
}
]
]
},
"Google Calender MCP": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Delete an event Google Calendar": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Create a weekly recurrent event Event": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Create an Event in Google Calendar with 1 Attendee": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
},
"Create an Event in Google Calendar with 2 Attendees": {
"ai_tool": [
[
{
"node": "MCP Server Trigger",
"type": "ai_tool",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
telegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Meet Troy, your intelligent personal assistant that seamlessly manages your Google Calendar and Tasks through Telegram. This workflow combines AI-powered natural language processing with MCP (Model Context Protocol) integration to provide a conversational interface for…
Source: https://n8n.io/workflows/8197/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Jarvis is a powerful multi-agent productivity assistant built in n8n. It works directly from Telegram and can understand both text messages and voice notes.
This multi-agent n8n workflow delivers an automated, intelligent trading analysis system for the WEEX Spot Market. It uses GPT-4o to interpret user prompts, route them to the correct sub-agent tools,
This template is designed for anyone who wants to use WhatsApp as a personal AI assistant hub. If you often juggle tasks, emails, calendars, and expenses across multiple tools, this workflow consolida
This template is designed for anyone who wants to use Telegram as a personal AI assistant hub. If you often juggle tasks, emails, calendars, and expenses across multiple tools, this workflow consolida
Multi Agent System Benefits. Uses gmailTool, lmChatOpenAi, agent, googleCalendarTool. Event-driven trigger; 46 nodes.