{
  "id": "cAnnq47P2I9a2zu5",
  "meta": {
    "builderVariant": "mcp",
    "aiBuilderAssisted": true
  },
  "name": "Nova, your personal AI assistant on Telegram (voice, email and calendar)",
  "tags": [],
  "nodes": [
    {
      "id": "ef44b53a-f8d5-452f-a48f-8d76fd2f7995",
      "name": "Telegram Trigger",
      "type": "n8n-nodes-base.telegramTrigger",
      "position": [
        -48,
        48
      ],
      "parameters": {
        "updates": [
          "message"
        ],
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "55386d64-4edc-49b2-b021-212beb568051",
      "name": "Configuration",
      "type": "n8n-nodes-base.set",
      "position": [
        192,
        48
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a1",
              "name": "assistant_name",
              "type": "string",
              "value": "Nova"
            },
            {
              "id": "a2",
              "name": "chat_model",
              "type": "string",
              "value": "gpt-5.4"
            },
            {
              "id": "a3",
              "name": "output_language",
              "type": "string",
              "value": "auto"
            },
            {
              "id": "a4",
              "name": "voice_language",
              "type": "string",
              "value": "fr"
            },
            {
              "id": "a5",
              "name": "memory_window",
              "type": "number",
              "value": 15
            },
            {
              "id": "a6",
              "name": "approver_chat_id",
              "type": "string",
              "value": "={{ $('Telegram Trigger').item.json.message.chat.id }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "5e23a4a3-a221-4348-9381-16a8633a3e1f",
      "name": "Is voice message?",
      "type": "n8n-nodes-base.if",
      "position": [
        432,
        48
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "c1",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $('Telegram Trigger').item.json.message.voice.file_id }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "b40ace66-02cb-492e-985c-ef2b2af9be25",
      "name": "Get voice file",
      "type": "n8n-nodes-base.telegram",
      "position": [
        672,
        -128
      ],
      "parameters": {
        "fileId": "={{ $('Telegram Trigger').item.json.message.voice.file_id }}",
        "resource": "file",
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "375d3066-0a88-4c7b-9fbe-e3b127967837",
      "name": "Transcribe voice",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        912,
        -128
      ],
      "parameters": {
        "options": {
          "language": "={{ $('Configuration').item.json.voice_language }}"
        },
        "resource": "audio",
        "operation": "transcribe"
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "ede37e49-3a5b-4c93-aa63-6a51490737bc",
      "name": "Prepare voice input",
      "type": "n8n-nodes-base.set",
      "position": [
        1152,
        -128
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "v1",
              "name": "user_input",
              "type": "string",
              "value": "={{ $('Transcribe voice').item.json.text }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "a1afcf35-d03c-4d2c-89db-72eead89f1fa",
      "name": "Nova",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1376,
        -48
      ],
      "parameters": {
        "text": "={{ $json.user_input }}",
        "options": {
          "systemMessage": "=You are {{ $('Configuration').item.json.assistant_name }}, a warm, sharp and concise personal assistant that lives inside Telegram. Today is {{ $now.toFormat('cccc, dd LLLL yyyy') }}.\n\nLanguage: always reply in the SAME language the user wrote in.\n\nYou can use these tools:\n- \"Get recent emails\": read and summarize the inbox.\n- \"Get calendar events\": check the upcoming schedule.\n- \"Get Notion tasks\": read the to-do list.\n- \"Get Notion contacts\": look up a person before emailing them.\n- \"Send email\": compose and send an email. It is gated by a human approval on Telegram, so use it freely and do NOT ask the user to confirm yourself. If the user gives only a name, first look up the email with \"Get Notion contacts\".\n\nStyle: keep answers short and easy to read on a phone. Use plain text, avoid HTML tags and heavy markdown. Be proactive and helpful."
        },
        "promptType": "define"
      },
      "typeVersion": 3.1
    },
    {
      "id": "0ffdc4cc-3e0f-453c-91b2-27c613091b4a",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1200,
        160
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Configuration').item.json.chat_model }}"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "1cd0aeaa-9145-465c-a1fd-3e06fed62f78",
      "name": "Simple Memory",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        1344,
        160
      ],
      "parameters": {
        "sessionKey": "={{ $('Configuration').item.json.approver_chat_id }}",
        "sessionIdType": "customKey",
        "contextWindowLength": "={{ $('Configuration').item.json.memory_window }}"
      },
      "typeVersion": 1.4
    },
    {
      "id": "702c1f4c-16c4-41a9-bf24-5a716af4e5e4",
      "name": "Get recent emails",
      "type": "n8n-nodes-base.gmailTool",
      "position": [
        1504,
        160
      ],
      "parameters": {
        "limit": 10,
        "filters": {
          "q": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('gmail_query', 'Optional Gmail search query. Leave empty for the latest emails.') }}"
        },
        "operation": "getAll",
        "descriptionType": "manual",
        "toolDescription": "Read and summarize the most recent emails from the user Gmail inbox. Optionally pass a Gmail search query (e.g. is:unread, newer_than:2d, from:user@example.com)."
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "9f7c3ae9-d104-446e-9e9f-9e388561bcf3",
      "name": "Get calendar events",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        1664,
        160
      ],
      "parameters": {
        "limit": 20,
        "options": {},
        "calendar": {
          "__rl": true,
          "mode": "id",
          "value": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Calendar', ``, 'string') }}",
          "cachedResultName": "Primary"
        },
        "operation": "getAll",
        "descriptionType": "manual",
        "toolDescription": "List the user upcoming Google Calendar events (about the next 7 days)."
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "0717d187-cca0-48fd-82d8-cc9e00f16ae6",
      "name": "Get Notion tasks",
      "type": "n8n-nodes-base.notionTool",
      "position": [
        1808,
        160
      ],
      "parameters": {
        "limit": 25,
        "options": {},
        "resource": "databasePage",
        "operation": "getAll",
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "1ac3d655-0fd9-80d3-bee6-c47e78f067f6",
          "cachedResultUrl": "https://app.notion.com/p/1ac3d6550fd980d3bee6c47e78f067f6",
          "cachedResultName": "Contacts n8n"
        },
        "descriptionType": "manual",
        "toolDescription": "Read the user to-do / tasks from their Notion tasks database."
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "da406a3e-7727-488a-9794-275a55190039",
      "name": "Get Notion contacts",
      "type": "n8n-nodes-base.notionTool",
      "position": [
        1968,
        160
      ],
      "parameters": {
        "limit": 25,
        "options": {},
        "resource": "databasePage",
        "operation": "getAll",
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "1ac3d655-0fd9-80d3-bee6-c47e78f067f6",
          "cachedResultUrl": "https://app.notion.com/p/1ac3d6550fd980d3bee6c47e78f067f6",
          "cachedResultName": "Contacts n8n"
        },
        "descriptionType": "manual",
        "toolDescription": "Look up people in the user Notion contacts database, for example to find an email address before sending an email."
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "d930d838-8d2f-4c6a-a438-16eaf6968732",
      "name": "Ask my approval on Telegram",
      "type": "n8n-nodes-base.telegramHitlTool",
      "position": [
        1520,
        368
      ],
      "parameters": {
        "chatId": "={{ $('Configuration').item.json.approver_chat_id }}",
        "message": "=Nova wants to send an email:\n\nTo: {{ $tool.parameters.to }}\nSubject: {{ $tool.parameters.subject }}\n\n{{ $tool.parameters.body }}\n\nApprove sending?",
        "options": {
          "limitWaitTime": {
            "values": {
              "resumeUnit": "minutes",
              "resumeAmount": 30
            }
          },
          "appendAttribution": false
        },
        "approvalOptions": {
          "values": {
            "approvalType": "double",
            "approveLabel": "\u2705 Send it",
            "disapproveLabel": "\u274c Cancel"
          }
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "5f5a5e69-c188-4982-afe3-75a7a87fc0b3",
      "name": "Send email",
      "type": "n8n-nodes-base.gmailTool",
      "position": [
        1472,
        592
      ],
      "parameters": {
        "sendTo": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('to', 'Recipient email address') }}",
        "message": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('body', 'Full email body text') }}",
        "options": {
          "appendAttribution": false
        },
        "subject": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('subject', 'Email subject line') }}",
        "emailType": "text",
        "descriptionType": "manual",
        "toolDescription": "Send an email from the user Gmail. This tool is gated by a human approval step on Telegram: use it freely, the user approves the exact content before it is sent, so do not ask the user for confirmation yourself."
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "ce4e3a30-e921-4293-aa45-6cfad6d6986d",
      "name": "Prepare text input",
      "type": "n8n-nodes-base.set",
      "position": [
        672,
        192
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "t1",
              "name": "user_input",
              "type": "string",
              "value": "={{ $('Telegram Trigger').item.json.message.text }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "295e8f5a-c7ae-4521-a8a6-0ffdc867a88b",
      "name": "Send reply on Telegram",
      "type": "n8n-nodes-base.telegram",
      "position": [
        2240,
        -48
      ],
      "parameters": {
        "text": "={{ $json.output }}",
        "chatId": "={{ $('Configuration').item.json.approver_chat_id }}",
        "additionalFields": {
          "appendAttribution": false
        }
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "d4a70017-4629-4f36-a5d3-4e3d4b605885",
      "name": "Sticky Note ffc59511",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -672,
        -512
      ],
      "parameters": {
        "width": 520,
        "height": 1624,
        "content": "# Nova, your personal AI assistant on Telegram (voice, email and calendar)\n\n# \ud83d\udce5  [Open full documentation on Notion](https://automatisation.notion.site/Course-Build-Nova-a-personal-AI-assistant-on-Telegram-39a3d6550fd981af9a71e5e18feefe7b)\n\n## How it works\nNova is a personal AI assistant that lives in Telegram. Send it a text or a voice message and it will transcribe voice with OpenAI, understand your request, then use its tools to read your recent emails, check your Google Calendar, read your Notion tasks and contacts, and draft and send an email for you \u2014 always after you approve it on Telegram. It keeps a short memory of the conversation so you can ask follow-up questions.\n\n## Setup\n1. Telegram: select your bot credential on the 3 Telegram nodes (Trigger, Approval, Reply).\n2. OpenAI: select the \"OpenAi account\" credential on the Chat model and the Transcribe node.\n3. Gmail: select your Gmail credential on the two email tools.\n4. Google Calendar: select your credential on the calendar tool.\n5. Notion: select your credential on the two Notion tools, then pick your Tasks database and your Contacts database in the dropdowns.\n6. Open the Configuration node to set the assistant name, model, languages and memory window.\n\n## Requirements\n- An n8n instance (cloud or self-hosted). All nodes are native, no community node required.\n- A Telegram bot token (via @BotFather).\n- OpenAI, Gmail, Google Calendar and Notion credentials.\n\n## Customization\n- Change the model in Configuration (e.g. gpt-5.4-mini for lower cost).\n- Add or remove tools on the Nova agent.\n- Edit Nova personality in the agent System Message.\n- The email tool is gated by a Telegram approval \u2014 you can switch it to a single button or a form.\n\nNeed help customizing?\nContact me for consulting and support : [Linkedin](https://www.linkedin.com/in/doctor-firass/)\n\n# MY NEW YOUTUBE CHANNEL\n\ud83d\udc49 [Subscribe to my new YouTube channel](https://www.youtube.com/@DrFiras_AI). Here I'll share videos and Shorts with practical tutorials and FREE templates for n8n.\n\n[![The AI Doctor](https://www.dr-firas.com/the-ai-doctor.png)](https://www.youtube.com/@DrFiras_AI)"
      },
      "typeVersion": 1
    },
    {
      "id": "a8a88cdb-0707-4275-addf-a72e7d928d1e",
      "name": "Sticky Note 79736445",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -96,
        -384
      ],
      "parameters": {
        "color": 7,
        "width": 396,
        "height": 214,
        "content": "## 1. Voice or text input\nThe Telegram Trigger receives the message. Configuration holds all the knobs. If it is a voice note, it is downloaded and transcribed by OpenAI; otherwise the text is used directly."
      },
      "typeVersion": 1
    },
    {
      "id": "14584133-c86a-4c9b-8676-1f5d40779bc2",
      "name": "Sticky Note 3b2af7ad",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1104,
        -416
      ],
      "parameters": {
        "color": 7,
        "width": 452,
        "height": 248,
        "content": "## 2. Nova \u2014 the AI brain\nThe agent reads the user message, remembers the conversation (Simple Memory keyed on the chat ID) and picks the right tool with the OpenAI chat model."
      },
      "typeVersion": 1
    },
    {
      "id": "f7aa7fa4-4e42-4e9d-8528-3997f4dc9d8f",
      "name": "Sticky Note e2a2af6e",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1584,
        -416
      ],
      "parameters": {
        "color": 7,
        "width": 476,
        "height": 242,
        "content": "## 3. Tools Nova can use\nRead emails, calendar, Notion tasks and contacts."
      },
      "typeVersion": 1
    },
    {
      "id": "d72fbeb0-2079-48c8-aae1-62afadfbf034",
      "name": "Sticky Note 081a214c",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2096,
        -416
      ],
      "parameters": {
        "color": 7,
        "width": 480,
        "height": 236,
        "content": "## 4. Send email (with your approval)\nWhen Nova wants to send an email, it must first pass the Telegram approval step. Nothing is sent until you tap \u2705."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": true,
    "executionOrder": "v1"
  },
  "versionId": "69237b01-b6d7-41e2-897f-d2894420af95",
  "nodeGroups": [],
  "connections": {
    "Nova": {
      "main": [
        [
          {
            "node": "Send reply on Telegram",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send email": {
      "ai_tool": [
        [
          {
            "node": "Ask my approval on Telegram",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Configuration": {
      "main": [
        [
          {
            "node": "Is voice message?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory": {
      "ai_memory": [
        [
          {
            "node": "Nova",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Get voice file": {
      "main": [
        [
          {
            "node": "Transcribe voice",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Notion tasks": {
      "ai_tool": [
        [
          {
            "node": "Nova",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Telegram Trigger": {
      "main": [
        [
          {
            "node": "Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transcribe voice": {
      "main": [
        [
          {
            "node": "Prepare voice input",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get recent emails": {
      "ai_tool": [
        [
          {
            "node": "Nova",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Is voice message?": {
      "main": [
        [
          {
            "node": "Get voice file",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Prepare text input",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Nova",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Prepare text input": {
      "main": [
        [
          {
            "node": "Nova",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Notion contacts": {
      "ai_tool": [
        [
          {
            "node": "Nova",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Get calendar events": {
      "ai_tool": [
        [
          {
            "node": "Nova",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Prepare voice input": {
      "main": [
        [
          {
            "node": "Nova",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Ask my approval on Telegram": {
      "ai_tool": [
        [
          {
            "node": "Nova",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    }
  }
}