This workflow follows the Agent → OpenAI Chat 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 →
{
"name": "Canvas LMS Telegram AI Agent",
"nodes": [
{
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"type": "n8n-nodes-base.telegramTrigger",
"typeVersion": 1.2,
"position": [
0,
0
],
"id": "a0000001-0001-0001-0001-000000000001",
"name": "Telegram Trigger",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"promptType": "define",
"text": "={{ $json.message.text }}",
"options": {
"systemMessage": "You are a helpful Canvas LMS assistant for a student. You can look up courses, assignments, grades, planner items, calendar events, announcements, conversations, modules, submissions, and user profile information.\n\nYou are communicating with {{ $json.message.from.first_name }} via Telegram. Address them by name.\n\nWhen the user asks about their courses, assignments, grades, schedule, or anything related to their Canvas LMS account, use the appropriate tools to fetch the data and present it clearly.\n\nKey guidelines:\n- Use list_courses first to get course IDs when the user asks about a specific course by name.\n- For assignments, you need a courseId. Get it from list_courses first if not provided.\n- For grades, use get_grade_summary for an overview, or get_course_grades for a specific course.\n- For schedule/agenda queries, use get_planner_today or get_planner_week.\n- For calendar events, use list_calendar_events with optional date filters.\n- For modules, you need a courseId. List modules first, then get items.\n- Format dates nicely and summarize large data sets.\n- When unsure which course the user means, list courses and ask for clarification.\n- Keep responses concise \u2014 Telegram messages have a 4096 character limit."
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.7,
"position": [
220,
0
],
"id": "a0000001-0001-0001-0001-000000000002",
"name": "Canvas Agent",
"onError": "continueErrorOutput"
},
{
"parameters": {
"chatId": "={{ $('Telegram Trigger').first().json.message.chat.id }}",
"text": "={{ $json.output }}",
"additionalFields": {
"appendAttribution": false
}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
480,
0
],
"id": "a0000001-0001-0001-0001-000000000099",
"name": "Send Telegram Reply",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"model": "gpt-4o-mini",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.2,
"position": [
60,
220
],
"id": "a0000001-0001-0001-0001-000000000003",
"name": "OpenAI Chat Model",
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"sessionIdType": "customKey",
"sessionKey": "=canvas_{{ $('Telegram Trigger').first().json.message.chat.id }}",
"contextWindowLength": 20
},
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"typeVersion": 1.3,
"position": [
160,
220
],
"id": "a0000001-0001-0001-0001-000000000004",
"name": "Conversation Memory"
},
{
"parameters": {
"toolDescription": "List all enrolled courses for the student. Returns an array of course objects with id, name, course_code, enrollment_type, etc.",
"method": "GET",
"url": "https://animocli.zel.kim/api/courses",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
260,
220
],
"id": "a0000001-0001-0001-0001-000000000010",
"name": "list_courses"
},
{
"parameters": {
"toolDescription": "List the student's favorite/starred courses. Returns an array of favorite course objects.",
"method": "GET",
"url": "https://animocli.zel.kim/api/courses/favorites",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
360,
220
],
"id": "a0000001-0001-0001-0001-000000000011",
"name": "list_favorite_courses"
},
{
"parameters": {
"toolDescription": "Get details for a specific course by its ID. Returns a course object with name, description, term, etc.",
"method": "GET",
"url": "https://animocli.zel.kim/api/courses/{courseId}",
"placeholderDefinitions": {
"values": [
{
"name": "courseId",
"description": "The numeric ID of the course",
"type": "string"
}
]
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
460,
220
],
"id": "a0000001-0001-0001-0001-000000000012",
"name": "get_course"
},
{
"parameters": {
"toolDescription": "List assignments for a specific course. Optionally filter by bucket (past, overdue, undated, ungraded, unsubmitted, upcoming, future), search term, or order by (name, due_at, position).",
"method": "GET",
"url": "https://animocli.zel.kim/api/courses/{courseId}/assignments",
"placeholderDefinitions": {
"values": [
{
"name": "courseId",
"description": "The numeric ID of the course",
"type": "string"
}
]
},
"sendQuery": true,
"specifyQuery": "json",
"jsonQuery": "={\"bucket\": \"{{ $fromAI('bucket', 'Optional filter: past, overdue, undated, ungraded, unsubmitted, upcoming, future. Leave empty for all.', 'string') }}\", \"search\": \"{{ $fromAI('search', 'Optional search term to filter assignments. Leave empty for all.', 'string') }}\", \"orderBy\": \"{{ $fromAI('orderBy', 'Optional sort order: name, due_at, or position. Leave empty for default.', 'string') }}\"}",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
560,
220
],
"id": "a0000001-0001-0001-0001-000000000013",
"name": "list_course_assignments"
},
{
"parameters": {
"toolDescription": "Get details for a specific assignment in a course. Returns the assignment object with name, description, due_at, points_possible, submission_types, etc.",
"method": "GET",
"url": "https://animocli.zel.kim/api/courses/{courseId}/assignments/{assignmentId}",
"placeholderDefinitions": {
"values": [
{
"name": "courseId",
"description": "The numeric ID of the course",
"type": "string"
},
{
"name": "assignmentId",
"description": "The numeric ID of the assignment",
"type": "string"
}
]
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
660,
220
],
"id": "a0000001-0001-0001-0001-000000000014",
"name": "get_assignment"
},
{
"parameters": {
"toolDescription": "List upcoming assignments across ALL enrolled courses. Great for seeing what's due soon without specifying a course.",
"method": "GET",
"url": "https://animocli.zel.kim/api/assignments/upcoming",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
760,
220
],
"id": "a0000001-0001-0001-0001-000000000015",
"name": "list_upcoming_assignments"
},
{
"parameters": {
"toolDescription": "List submissions for a specific assignment in a course.",
"method": "GET",
"url": "https://animocli.zel.kim/api/courses/{courseId}/assignments/{assignmentId}/submissions",
"placeholderDefinitions": {
"values": [
{
"name": "courseId",
"description": "The numeric ID of the course",
"type": "string"
},
{
"name": "assignmentId",
"description": "The numeric ID of the assignment",
"type": "string"
}
]
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
860,
220
],
"id": "a0000001-0001-0001-0001-000000000016",
"name": "list_submissions"
},
{
"parameters": {
"toolDescription": "Get the student's own submission for a specific assignment. Shows submission status, grade, submitted_at, etc.",
"method": "GET",
"url": "https://animocli.zel.kim/api/courses/{courseId}/assignments/{assignmentId}/submissions/self",
"placeholderDefinitions": {
"values": [
{
"name": "courseId",
"description": "The numeric ID of the course",
"type": "string"
},
{
"name": "assignmentId",
"description": "The numeric ID of the assignment",
"type": "string"
}
]
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
960,
220
],
"id": "a0000001-0001-0001-0001-000000000017",
"name": "get_my_submission"
},
{
"parameters": {
"toolDescription": "Create/submit a submission for an assignment. Supports online_text_entry or online_url submission types.",
"method": "POST",
"url": "https://animocli.zel.kim/api/courses/{courseId}/assignments/{assignmentId}/submissions",
"placeholderDefinitions": {
"values": [
{
"name": "courseId",
"description": "The numeric ID of the course",
"type": "string"
},
{
"name": "assignmentId",
"description": "The numeric ID of the assignment",
"type": "string"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\"submissionType\": \"{{ $fromAI('submissionType', 'The submission type: online_text_entry or online_url', 'string') }}\", \"body\": \"{{ $fromAI('body', 'The text content for online_text_entry submissions. Leave empty for URL submissions.', 'string') }}\", \"url\": \"{{ $fromAI('url', 'The URL for online_url submissions. Leave empty for text submissions.', 'string') }}\"}",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
1060,
220
],
"id": "a0000001-0001-0001-0001-000000000018",
"name": "create_submission"
},
{
"parameters": {
"toolDescription": "List today's planner items. Shows assignments due today, events, and other scheduled items.",
"method": "GET",
"url": "https://animocli.zel.kim/api/planner/today",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
260,
420
],
"id": "a0000001-0001-0001-0001-000000000020",
"name": "get_planner_today"
},
{
"parameters": {
"toolDescription": "List this week's planner items. Shows assignments due this week, events, and other scheduled items.",
"method": "GET",
"url": "https://animocli.zel.kim/api/planner/week",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
360,
420
],
"id": "a0000001-0001-0001-0001-000000000021",
"name": "get_planner_week"
},
{
"parameters": {
"toolDescription": "List planner items for a custom date range. Optionally specify start and end dates (YYYY-MM-DD format).",
"method": "GET",
"url": "https://animocli.zel.kim/api/planner",
"sendQuery": true,
"specifyQuery": "json",
"jsonQuery": "={\"start\": \"{{ $fromAI('start', 'Start date in YYYY-MM-DD format. Leave empty for today.', 'string') }}\", \"end\": \"{{ $fromAI('end', 'End date in YYYY-MM-DD format. Leave empty for 7 days from start.', 'string') }}\"}",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
460,
420
],
"id": "a0000001-0001-0001-0001-000000000022",
"name": "list_planner_items"
},
{
"parameters": {
"toolDescription": "List calendar events. Optionally filter by date range, type (event or assignment), and context code (e.g., course_123).",
"method": "GET",
"url": "https://animocli.zel.kim/api/calendar",
"sendQuery": true,
"specifyQuery": "json",
"jsonQuery": "={\"start\": \"{{ $fromAI('start', 'Start date YYYY-MM-DD. Leave empty for today.', 'string') }}\", \"end\": \"{{ $fromAI('end', 'End date YYYY-MM-DD. Leave empty for 14 days from start.', 'string') }}\", \"type\": \"{{ $fromAI('type', 'Optional filter: event or assignment. Leave empty for all.', 'string') }}\", \"context\": \"{{ $fromAI('context', 'Optional context code like course_123. Leave empty for all.', 'string') }}\"}",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
560,
420
],
"id": "a0000001-0001-0001-0001-000000000023",
"name": "list_calendar_events"
},
{
"parameters": {
"toolDescription": "Get details for a specific calendar event by its ID.",
"method": "GET",
"url": "https://animocli.zel.kim/api/calendar/{eventId}",
"placeholderDefinitions": {
"values": [
{
"name": "eventId",
"description": "The ID of the calendar event",
"type": "string"
}
]
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
660,
420
],
"id": "a0000001-0001-0001-0001-000000000024",
"name": "get_calendar_event"
},
{
"parameters": {
"toolDescription": "Get grade summary across all enrolled courses. Returns course names with current scores/grades.",
"method": "GET",
"url": "https://animocli.zel.kim/api/grades",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
760,
420
],
"id": "a0000001-0001-0001-0001-000000000025",
"name": "get_grade_summary"
},
{
"parameters": {
"toolDescription": "Get detailed grades for a specific course, broken down by assignment groups.",
"method": "GET",
"url": "https://animocli.zel.kim/api/grades/{courseId}",
"placeholderDefinitions": {
"values": [
{
"name": "courseId",
"description": "The numeric ID of the course",
"type": "string"
}
]
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
860,
420
],
"id": "a0000001-0001-0001-0001-000000000026",
"name": "get_course_grades"
},
{
"parameters": {
"toolDescription": "List modules for a specific course. Modules organize course content into sections.",
"method": "GET",
"url": "https://animocli.zel.kim/api/courses/{courseId}/modules",
"placeholderDefinitions": {
"values": [
{
"name": "courseId",
"description": "The numeric ID of the course",
"type": "string"
}
]
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
960,
420
],
"id": "a0000001-0001-0001-0001-000000000027",
"name": "list_modules"
},
{
"parameters": {
"toolDescription": "Get details for a specific module in a course, including its items.",
"method": "GET",
"url": "https://animocli.zel.kim/api/courses/{courseId}/modules/{moduleId}",
"placeholderDefinitions": {
"values": [
{
"name": "courseId",
"description": "The numeric ID of the course",
"type": "string"
},
{
"name": "moduleId",
"description": "The numeric ID of the module",
"type": "string"
}
]
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
1060,
420
],
"id": "a0000001-0001-0001-0001-000000000028",
"name": "get_module"
},
{
"parameters": {
"toolDescription": "List items within a specific module. Optionally search by name.",
"method": "GET",
"url": "https://animocli.zel.kim/api/courses/{courseId}/modules/{moduleId}/items",
"placeholderDefinitions": {
"values": [
{
"name": "courseId",
"description": "The numeric ID of the course",
"type": "string"
},
{
"name": "moduleId",
"description": "The numeric ID of the module",
"type": "string"
}
]
},
"sendQuery": true,
"specifyQuery": "json",
"jsonQuery": "={\"search\": \"{{ $fromAI('search', 'Optional search term to filter items. Leave empty for all.', 'string') }}\"}",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
260,
620
],
"id": "a0000001-0001-0001-0001-000000000029",
"name": "list_module_items"
},
{
"parameters": {
"toolDescription": "List announcements. Optionally filter by a specific course ID.",
"method": "GET",
"url": "https://animocli.zel.kim/api/announcements",
"sendQuery": true,
"specifyQuery": "json",
"jsonQuery": "={\"course\": \"{{ $fromAI('course', 'Optional course ID to filter announcements. Leave empty for all courses.', 'string') }}\"}",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
360,
620
],
"id": "a0000001-0001-0001-0001-000000000030",
"name": "list_announcements"
},
{
"parameters": {
"toolDescription": "Get details for a specific announcement by its notification ID.",
"method": "GET",
"url": "https://animocli.zel.kim/api/announcements/{notificationId}",
"placeholderDefinitions": {
"values": [
{
"name": "notificationId",
"description": "The ID of the announcement/notification",
"type": "string"
}
]
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
460,
620
],
"id": "a0000001-0001-0001-0001-000000000031",
"name": "get_announcement"
},
{
"parameters": {
"toolDescription": "List conversations (messages). Optionally filter by scope: inbox, unread, archived, or sent.",
"method": "GET",
"url": "https://animocli.zel.kim/api/conversations",
"sendQuery": true,
"specifyQuery": "json",
"jsonQuery": "={\"scope\": \"{{ $fromAI('scope', 'Optional filter: inbox, unread, archived, or sent. Leave empty for default.', 'string') }}\"}",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
560,
620
],
"id": "a0000001-0001-0001-0001-000000000032",
"name": "list_conversations"
},
{
"parameters": {
"toolDescription": "Get a specific conversation with all its messages by conversation ID.",
"method": "GET",
"url": "https://animocli.zel.kim/api/conversations/{conversationId}",
"placeholderDefinitions": {
"values": [
{
"name": "conversationId",
"description": "The ID of the conversation",
"type": "string"
}
]
},
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
660,
620
],
"id": "a0000001-0001-0001-0001-000000000033",
"name": "get_conversation"
},
{
"parameters": {
"toolDescription": "Send a new conversation/message to one or more recipients. Requires recipient user IDs and a message body.",
"method": "POST",
"url": "https://animocli.zel.kim/api/conversations",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\"recipients\": [\"{{ $fromAI('recipients', 'Comma-separated list of recipient user IDs', 'string') }}\"], \"body\": \"{{ $fromAI('body', 'The message body text', 'string') }}\", \"subject\": \"{{ $fromAI('subject', 'Optional message subject. Leave empty if not needed.', 'string') }}\", \"course\": \"{{ $fromAI('course', 'Optional course ID for context. Leave empty if not needed.', 'string') }}\"}",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
760,
620
],
"id": "a0000001-0001-0001-0001-000000000034",
"name": "send_conversation"
},
{
"parameters": {
"toolDescription": "Reply to an existing conversation. Requires the conversation ID and reply body text.",
"method": "POST",
"url": "https://animocli.zel.kim/api/conversations/{conversationId}/reply",
"placeholderDefinitions": {
"values": [
{
"name": "conversationId",
"description": "The ID of the conversation to reply to",
"type": "string"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\"body\": \"{{ $fromAI('body', 'The reply message text', 'string') }}\"}",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
860,
620
],
"id": "a0000001-0001-0001-0001-000000000035",
"name": "reply_to_conversation"
},
{
"parameters": {
"toolDescription": "Get the student's user profile. Returns name, email, avatar URL, and other profile information.",
"method": "GET",
"url": "https://animocli.zel.kim/api/user/profile",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
960,
620
],
"id": "a0000001-0001-0001-0001-000000000036",
"name": "get_user_profile"
},
{
"parameters": {
"toolDescription": "List the student's pending todo items from Canvas.",
"method": "GET",
"url": "https://animocli.zel.kim/api/user/todos",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
1060,
620
],
"id": "a0000001-0001-0001-0001-000000000037",
"name": "get_user_todos"
},
{
"parameters": {
"toolDescription": "List the student's upcoming events from Canvas.",
"method": "GET",
"url": "https://animocli.zel.kim/api/user/upcoming",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
"typeVersion": 1.1,
"position": [
260,
820
],
"id": "a0000001-0001-0001-0001-000000000038",
"name": "get_user_upcoming"
},
{
"parameters": {
"chatId": "={{ $('Telegram Trigger').first().json.message.chat.id }}",
"text": "=\u26a0\ufe0f *Error in Canvas Agent*\n\nNode: {{ $json.error?.name || 'Unknown' }}\nMessage: {{ $json.error?.message || JSON.stringify($json) }}\n\nYour message: {{ $('Telegram Trigger').first().json.message.text }}",
"additionalFields": {
"appendAttribution": false,
"parse_mode": "Markdown"
}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
480,
160
],
"id": "a0000001-0001-0001-0001-000000000100",
"name": "Send Error to Telegram",
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
}
}
],
"connections": {
"Telegram Trigger": {
"main": [
[
{
"node": "Canvas Agent",
"type": "main",
"index": 0
}
]
]
},
"Canvas Agent": {
"main": [
[
{
"node": "Send Telegram Reply",
"type": "main",
"index": 0
}
],
[
{
"node": "Send Error to Telegram",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Canvas Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Conversation Memory": {
"ai_memory": [
[
{
"node": "Canvas Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"list_courses": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"list_favorite_courses": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"get_course": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"list_course_assignments": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"get_assignment": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"list_upcoming_assignments": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"list_submissions": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"get_my_submission": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"create_submission": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"get_planner_today": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"get_planner_week": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"list_planner_items": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"list_calendar_events": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"get_calendar_event": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"get_grade_summary": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"get_course_grades": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"list_modules": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"get_module": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"list_module_items": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"list_announcements": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"get_announcement": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"list_conversations": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"get_conversation": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"send_conversation": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"reply_to_conversation": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"get_user_profile": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"get_user_todos": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"get_user_upcoming": {
"ai_tool": [
[
{
"node": "Canvas Agent",
"type": "ai_tool",
"index": 0
}
]
]
}
},
"meta": {
"templateCredsSetupCompleted": false
}
}
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.
openAiApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Canvas LMS Telegram AI Agent. Uses telegramTrigger, agent, telegram, lmChatOpenAi. Event-driven trigger; 34 nodes.
Source: https://github.com/zelkim/animo-cli/blob/dd637a5d2080c997da08b249894e1a1502a726d8/n8n/canvas-agent.json — 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.
Multi Agent System Benefits. Uses gmailTool, lmChatOpenAi, agent, googleCalendarTool. Event-driven trigger; 46 nodes.
AI marketing Team Agent. Uses toolWorkflow, telegram, memoryBufferWindow, openAi. Event-driven trigger; 46 nodes.
Agent Access Control Template. Uses memoryBufferWindow, lmChatOpenAi, telegramTrigger, airtable. Event-driven trigger; 36 nodes.
This workflow allows granular control over the access to tools connected to AI Agents (including Multi-Agent setups) using Role Based Access Control.
Content Ai Agent. Uses agent, telegramTrigger, memoryBufferWindow, telegram. Event-driven trigger; 28 nodes.