Canvas LMS MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| CANVAS_BASE_URL | Yes | Canvas instance URL (e.g., https://school.instructure.com) | |
| CANVAS_API_TOKEN | Yes | Canvas personal access token | |
| CANVAS_PSEUDONYM_DIR | No | Absolute path that overrides the default pseudonym map directory | |
| CANVAS_ALLOWED_ORIGIN | No | CORS origin for HTTP mode (default: http://localhost:3000) | |
| CANVAS_PSEUDONYM_AUDIT_LOG | No | Path to an append-only file that mirrors resolve_pseudonym audit lines | |
| CANVAS_PSEUDONYMIZE_STUDENTS | No | Set to 'true' to enable FERPA mode student pseudonymization | |
| CANVAS_PSEUDONYMIZE_REVERSE_LOOKUP | No | Set to 'true' (with CANVAS_PSEUDONYMIZE_STUDENTS=true) to register the resolve_pseudonym audit tool |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| health_checkA | Check if the Canvas API is reachable and the token is valid. Returns ok/error status. |
| list_coursesA | List courses for the authenticated user. Use fields="slim" when enumerating courses for selection; switch to "full" once you have identified the target. slim returns id, name, course_code, term name, and workflow_state only. "full" (default) includes all Canvas fields plus |
| get_courseA | Get details for a single course. Defaults to requesting |
| get_syllabusB | Get the syllabus HTML body for a course. |
| create_courseB | Create a new course in a Canvas account. Returns the created course object. |
| update_courseB | Update an existing course. Only provided fields are changed; omitted fields are left as-is. |
| list_assignmentsA | List all assignments in a course. Use fields="slim" when enumerating assignments for selection; switch to "full" once you've identified the target. slim returns id, name, due_at, points_possible, published, and course_id only. "full" (default) includes all Canvas fields plus |
| get_assignmentB | Get details for a single assignment by ID. Use |
| list_assignment_groupsA | List assignment groups (categories like Homework, Exams) in a course. Use |
| create_assignmentC | Create a new assignment in a course. |
| update_assignmentC | Update an existing assignment in a course. |
| delete_assignmentB | Delete an assignment from a course. This action is permanent. |
| list_submissionsA | List all submissions for an assignment. Use |
| get_submissionB | Get a single submission for a specific user on an assignment. Defaults to including submission_comments. Pass |
| grade_submissionB | Post or update a grade for a submission. Requires grading permissions. |
| comment_on_submissionC | Add a text comment to a submission. |
| list_course_submission_filesA | List every file attachment submitted by students across all assignments in a course. Returns a manifest — one entry per file — including the original filename, a file_id for re-fetching via download_file, content type, and size. Useful for bulk-archiving student work before a course expires or a Free-For-Teacher account is concluded. Outputs are bounded by max_files (default 500); when the limit is hit, truncated is true and truncation_note explains how to retrieve the rest. Download URLs are time-limited (typically 1 hour) — use the returned file_id with download_file to get a fresh URL at download time. When CANVAS_PSEUDONYMIZE_STUDENTS is enabled, user_name is a stable per-course pseudonym (e.g. "Student 1"); user_id (the raw numeric Canvas ID) is always returned and works as a stable per-student folder key. |
| list_submissions_awaiting_gradingA | Lists all submissions in a course that still need a human grade, sorted oldest-waiting first. Surfaces two categories:
Returns a triage list grouped by assignment or Classic Quiz, with per-submission details: student identity, workflow state, submitted_at, and whether the submission has pending manual-grading questions. Parameters:
Known limitations:
|
| list_rubricsB | List all rubrics in a course. |
| get_rubricA | Get details for a single rubric by ID, including criteria. Use include=["assignment_associations"] to retrieve the rubric association IDs needed for rubric assessment writes. |
| get_rubric_assessmentB | Get the rubric assessment for a specific student submission on an assignment. |
| submit_rubric_assessmentC | Submit a rubric assessment with scores and comments for each criterion. |
| create_rubricA | Create a new rubric in a course with criteria and rating levels. Optionally link it to an assignment immediately. Returns { rubric, rubric_association? }; when an assignment association was requested, rubric_association.id is the association_id that submit_rubric_assessment takes. |
| attach_rubricA | Attach an existing course rubric to an assignment, so one rubric can be shared across many assignments instead of creating a duplicate per assignment with create_rubric. Returns the new rubric association. |
| delete_rubricA | Permanently delete a rubric from a course, removing it from every assignment it is attached to. Returns the deleted rubric. |
| list_quizzesC | List all quizzes in a course. |
| get_quizC | Get details for a single quiz by ID. |
| list_quiz_submissionsC | List all submissions for a quiz. |
| list_quiz_questionsC | List all questions in a quiz. |
| get_quiz_submission_answersC | Get a student's answers for a quiz submission. |
| score_quiz_questionB | Score a specific question in a quiz submission. Specify attempt to score a particular attempt (omit for latest). Requires grading permissions. |
| get_quiz_submission_eventsA | Get the event log for a Classic Quiz submission in chronological order. Events include session_started, question_answered, question_flagged, page_blurred, and page_focused. Use this to understand the timeline of a student's attempt. Classic Quizzes only — New Quizzes does not expose event logs via the Canvas REST API. Events are scoped to a single submission; Canvas enforces access permissions (instructors and the submitting student only). Do not use event logs as the sole basis for academic-integrity conclusions; present them with context. |
| delete_quizA | Permanently delete a Classic quiz from a course, including its questions and every student submission. Classic Quizzes only; use delete_new_quiz for a New Quiz (LTI). |
| delete_quiz_questionA | Permanently delete a single question from a Classic quiz. Classic Quizzes only; use delete_new_quiz_item for a New Quiz item. |
| create_new_quizA | Create a New Quiz (LTI) in a Canvas course. New Quizzes is the modern quiz engine; for Classic quizzes use create_quiz. |
| update_new_quizC | Update an existing New Quiz (LTI) in a Canvas course. |
| delete_new_quizA | Delete a New Quiz (LTI) from a Canvas course. This action is permanent. Use assignment_id (not quiz_id). |
| list_new_quiz_itemsC | List all items (questions) in a New Quiz (LTI). |
| get_new_quiz_itemB | Get a single item (question) from a New Quiz (LTI) by item ID. |
| create_new_quiz_itemA | Create an item (question) in a New Quiz (LTI). Supports 5 types: choice (MCQ), true-false, essay, matching, numeric. Canvas may rate-limit rapid sequential creates. Call serially (not in parallel). For >50 items, chunk and pause between batches. |
| update_new_quiz_itemA | Update an existing item (question) in a New Quiz (LTI). All fields are optional; supply only what changes. Canvas may rate-limit rapid sequential updates. Call serially (not in parallel). For >50 items, chunk and pause between batches. |
| delete_new_quiz_itemB | Delete an item (question) from a New Quiz (LTI). This action is permanent. |
| get_quiz_question_responsesA | Review every student's answer to one or all questions in a Classic Quiz, pivoted by question instead of by student — for grading essay/short-answer/file-upload questions consistently across a class instead of paging through SpeedGrader one student at a time. Classic Quizzes only (quiz_type: assignment, practice_quiz, graded_survey, survey) — New Quizzes exposes responses through a different API. Omit question_id to get every question; provide it to scope to one. Each question reports needs_manual_grading (true for essay and file-upload questions) and points_possible. Questions drawn from a question bank are included: Canvas stores each draw as a generated question that the quiz's question list omits, so they are resolved from the students' own attempts, listed after the quiz's fixed questions, and report position: null. Scans one Canvas API call per completed or pending-review submission, plus one per attempt needed to resolve such questions. A failed per-submission fetch is recorded in submissions_failed, and a response whose question cannot be resolved is counted in unmatched_response_count and unmatched_question_ids, rather than aborting the whole call. When CANVAS_PSEUDONYMIZE_STUDENTS is enabled, student names are replaced with stable pseudonyms. |
| list_filesC | List all files in a course. |
| list_foldersC | List all folders in a course. |
| get_fileA | Get metadata for a single file by ID, including download URL. |
| upload_fileB | Upload a file to a course. Content must be base64-encoded. Canvas performs a multi-step upload internally. |
| delete_fileB | Delete a file by ID. This action is permanent. |
| download_fileA | Download the content of a Canvas file by ID. Text files (plain text, HTML, JSON, XML, JavaScript) are returned as readable text. Binary files (images, PDFs, etc.) are returned as base64-encoded data. Files larger than 10 MB are refused. |
| find_duplicate_filesA | Find duplicate files in a course's Files area — copies with the same name and size, typically left behind by repeated course copies. Each duplicate gets flagged separately by accessibility checkers, so this surfaces them for cleanup with the existing delete_file tool. Groups by display name + size (Canvas file listings carry no content hash), so same-name files of different sizes are not considered duplicates. |
| list_gradebook_history_daysB | List the dates in a course gradebook history that contain grading activity, grouped by grader and assignment. |
| get_gradebook_history_dayA | Get the graders and assignment IDs that had gradebook activity on a specific course date. |
| list_gradebook_history_submissionsA | List versioned submission history for one grader and assignment on a specific gradebook history date. |
| get_gradebook_history_feedA | Get the paginated gradebook history feed for a course, optionally filtered by assignment or user and optionally sorted oldest-first. |
| list_studentsB | List all students enrolled in a course. |
| get_userC | Get details for a single user by ID. |
| get_profileA | Get the profile of the currently authenticated user. |
| search_usersB | Search for users in a Canvas account by name, login, or email. Use |
| list_course_usersA | List users in a course with optional Canvas filters. Use |
| list_groupsB | List all groups in a course. |
| list_group_membersC | List all members of a group. |
| list_enrollmentsB | List all enrollments for the authenticated user across courses. Optional filters and includes mirror Canvas |
| list_course_enrollmentsA | List enrollments within a specific course with Canvas filters. Use |
| enroll_userC | Enroll a user in a course with a specified role. |
| remove_enrollmentA | Remove or conclude an enrollment from a course. The 'delete' task is permanent; 'conclude' and 'deactivate' are reversible. |
| list_discussionsC | List all discussion topics in a course. |
| get_discussionB | Get details for a single discussion topic by ID. |
| list_group_discussionsC | List all discussion topics in a group. |
| get_group_discussionC | Get details for a single discussion topic in a group by ID. |
| list_announcementsC | List all announcements in a course. |
| post_discussion_entryC | Post a new entry (reply) to a discussion topic. |
| create_discussionC | Create a new discussion topic in a course. |
| update_discussionC | Update an existing discussion topic. |
| delete_discussionA | Delete a discussion topic from a course. This action is permanent. |
| list_modulesC | List all modules in a course. |
| get_moduleC | Get details for a single module by ID. |
| list_module_itemsC | List all items within a module. |
| get_course_structureA | Return the full module → items tree for a course in a single call, with summary stats. Avoids N+1 round-trips when an agent needs to reason over the whole course shape. |
| view_course_structureA | Interactive tree view of a course's modules and items. Returns the same payload as |
| create_moduleC | Create a new module in a course. |
| update_moduleC | Update an existing module (rename, reposition, publish/unpublish). |
| create_module_itemC | Add an item (Assignment, Page, Quiz, File, Discussion, ExternalUrl, ExternalTool, SubHeader) to a module. |
| update_module_itemA | Edit an existing module item in place: rename it, repoint an ExternalUrl/ExternalTool item, reposition or re-indent it, publish/unpublish it, or move it to another module. ExternalUrl items exist only as module items, so a stale link carried in by a course copy can only be fixed here. |
| delete_module_itemA | Remove an item from a module. For ExternalUrl, ExternalTool and SubHeader items the item is the content, so this deletes it outright; for Assignment, Page, Quiz, File and Discussion items it only unlinks the item and the underlying content survives. Re-add with create_module_item. |
| list_pagesC | List all wiki pages in a course. |
| get_pageB | Get a single wiki page by its URL slug. |
| create_pageC | Create a new wiki page in a course. |
| update_pageC | Update an existing wiki page. |
| delete_pageA | Delete a wiki page from a course. This action is permanent. |
| list_calendar_eventsA | List calendar events for a course, unbounded by the ~1-week/20-item caps that |
| create_calendar_eventC | Create a new calendar event in Canvas. |
| update_calendar_eventA | Update an existing calendar event. Only provided fields are changed. |
| list_conversationsA | List conversations (inbox messages) for the authenticated user. |
| get_conversationB | Get a single conversation with its full message thread. |
| get_conversation_unread_countA | Get the number of unread conversations for the authenticated user. |
| send_conversationB | Send a new conversation message to one or more recipients. |
| list_peer_reviewsB | List all peer reviews for an assignment in a course. |
| get_submission_peer_reviewsB | List peer reviews assigned to a specific submission. |
| create_peer_reviewC | Assign a user to peer-review a submission. |
| delete_peer_reviewB | Remove a peer review assignment from a submission. This action is permanent. |
| get_accountB | Get details for a Canvas account by ID. |
| list_accountsA | List all accounts accessible to the authenticated user. |
| list_sub_accountsC | List sub-accounts under a given Canvas account. |
| list_account_coursesC | List courses under a given Canvas account. |
| list_account_usersC | List users in a Canvas account. |
| get_account_reportsB | List available report types for a Canvas account. |
| list_account_notificationsA | List active global institution-wide announcements for the current user (maintenance windows, term deadlines, policy notices). |
| view_account_notificationsA | Interactive panel of active institution-wide announcements. Returns the same payload as |
| search_course_contentA | Search for content within a course. Searches pages, assignments, discussions, and announcements by keyword. |
| get_course_analyticsA | Get course-level activity analytics. Returns daily page view and participation counts. |
| get_student_analyticsA | Get per-student activity analytics for a course. Returns page views, participations, and submission timeline for a specific student. |
| get_course_activity_streamA | Get a summary of recent activity in a course. Returns counts of recent events grouped by type (submissions, discussions, announcements, etc.). |
| get_assignment_analyticsA | Get score distribution analytics for assignments in a course. Returns statistical summary (min, max, median, first/third quartile), submission count, and tardiness breakdown (on_time, late, missing) for each assignment. Provide assignment_id to scope to one assignment; omit to return analytics for all assignments in the course. |
| get_root_outcome_groupA | Get the root outcome group for an account or course context. |
| list_outcome_groupsC | List all outcome groups for an account or course context. |
| list_outcome_group_linksC | List all outcome links in an account or course context. |
| get_outcome_groupC | Get details for a specific outcome group in an account or course context. |
| list_outcome_group_outcomesC | List the linked outcomes directly under a specific outcome group. |
| list_outcome_group_subgroupsB | List the immediate child outcome groups under a specific outcome group. |
| get_outcomeC | Get the full details for a specific learning outcome by ID. |
| get_outcome_alignmentsA | Get outcome alignments for a course, optionally filtered to a specific student or assignment. |
| get_outcome_resultsB | Get per-student outcome results for a course, with optional outcome, student, and alignment filters. |
| get_outcome_rollupsB | Get outcome rollups for a course, optionally aggregated or filtered by students, outcomes, and sort options. |
| get_outcome_contributing_scoresB | Get assignment or quiz scores that contributed to a specific outcome for one or more students in a course. |
| get_outcome_mastery_distributionB | Get mastery distribution analytics for outcomes in a course, optionally filtered by students or outcomes. |
| get_my_coursesA | List active courses for the authenticated student. |
| get_my_gradesA | Get grade data for the authenticated student. If course_id is omitted, returns grades across all enrolled courses. |
| get_my_submissionsB | List all submissions for the authenticated student in a course. |
| get_my_upcoming_assignmentsA | List upcoming assignment events for the authenticated student. Canvas caps this endpoint at roughly the next 1 week and at most 20 events server-side — neither limit is adjustable, and results silently stop there even if more assignments fall later. For a longer or specific date range, use |
| get_my_submission_feedbackA | List the authenticated student's own submissions that carry feedback comments from an instructor or a peer reviewer — comments left by the student themselves do not count as feedback and submissions with no non-self comments are omitted. Omit |
| get_my_activity_stream_summaryA | Count unread and total items in the authenticated student's cross-course activity stream, grouped by Canvas item type (e.g. DiscussionTopic, Announcement, Submission, Conversation). No item content — counts only. A good first call in a daily workflow to check "is there anything to look at?" before fetching the full stream. |
| get_my_activity_streamA | The authenticated student's cross-course activity stream: new discussion posts, announcements, conversation messages, graded submissions, peer-review requests and conference invitations from every course at once, newest first. Four caveats, none of them visible in the response: (1) RECENT ACTIVITY ONLY — typically the last ~4 weeks; the retention window is a per-Canvas-instance setting and cannot be read through the API, so "nothing found" is not evidence that nothing happened. (2) Each item's |
| list_my_planner_itemsA | The authenticated student's planner: assignments, ungraded quizzes, planner notes, wiki pages, ungraded discussions, calendar events, peer reviews, sub-assignments and peer-review sub-assignments — everything with a due or to-do date, across every course and group at once. Strictly richer than get_todo_items, which covers only assignments needing submitting or grading. Four caveats: (1) start_date and end_date must be given TOGETHER or OMITTED TOGETHER — supplying only one makes Canvas silently default the other side to a ten-year window, so a half-specified range is rejected outright; omitting both resolves to Canvas's own ~2-week default, echoed back as the response's |
| find_student_across_coursesA | Search the caller's teaching courses — active and, by default, concluded (past-term) ones — for a student by name, login, or email, and report every matching course with the student's enrollment state and last activity. Set |
| get_dashboard_cardsA | Get the current user's dashboard course cards with position, color, and image. |
| get_todo_itemsA | Get the current user's to-do items, including upcoming assignments and grading tasks. |
| get_upcoming_eventsA | Get the current user's upcoming calendar events and assignments. Canvas caps this endpoint at roughly the next 1 week and at most 20 events server-side — neither limit is adjustable, and results silently stop there even if more events fall later. For a longer or specific date range, use |
| get_missing_submissionsA | Get assignments with missing submissions for the current user. |
| list_submission_comments_needing_attentionA | List submissions where the most recent comment is from the student and has not been addressed by grading or a reply — i.e. comments the instructor has likely not seen. Returns a triage list, oldest-unaddressed first. Requires instructor/TA permissions in the course. |
| list_students_needing_attentionA | Report students who may need instructor attention based on inactivity, missing or late submissions, and low current score. Each finding lists the exact signals that fired and the thresholds used — this is a factual report, not a prediction. Requires instructor/TA permissions in the course. |
| create_content_exportA | Start a Canvas course content export (Common Cartridge / QTI / zip). Exports are asynchronous — this tool returns immediately with an export ID and initial workflow_state ("created"). Call get_content_export to poll progress and retrieve the time-limited download link when the export finishes. |
| get_content_exportA | Get the status of a content export. When workflow_state is "exported", attachment.url contains a time-limited download link — download it promptly, as the URL expires (re-fetch to get a fresh one). Returns attachment: null while still "created"/"exporting" or on "failed". |
| list_content_exportsB | List all content exports for a course (most recent first). |
| list_content_migrationsB | List all content migrations for a course (most recent first). |
| get_content_migrationA | Get the status of a single content migration. When workflow_state is "running", poll progress_url for live updates. When "completed", the migration is done. |
| list_content_migration_typesA | List available migration types (migrators) for a course. Returns migrator type keys such as course_copy_importer, common_cartridge_importer, zip_file_importer, qti_converter, moodle_converter. |
| get_migration_selective_dataA | Get the selective import tree for a migration — the list of content items available to selectively import. Only meaningful for migrations in the "waiting_for_select" state. |
| get_migration_asset_id_mappingA | Get the old-to-new asset ID mapping for a completed migration. Useful for resolving references to content that existed in the source course. |
| list_migration_issuesA | List issues encountered during a content migration. Each issue has a type (todo, warning, or error) and a description. |
| create_content_migrationA | Start a content migration (course copy, Common Cartridge import, zip import, QTI conversion, or Moodle conversion). Migrations are asynchronous — this tool returns immediately with a migration ID and progress_url. Poll get_content_migration or progress_url to track completion. |
| list_grading_standardsA | List grading standards available in a course or account context. Provide either course_id (to see standards scoped to a course) or account_id (to see account-level standards, requires admin access). Returns an array of grading standard objects, each with an id, title, context, and grading_scheme array of { name, value } entries. |
| create_grading_standardA | Create a new grading standard (letter-to-percentage scheme) in a course or account context. Provide either course_id or account_id (account requires admin). scheme_entries is an array of { name, value } objects where value is the lower-bound percentage as a fraction 0–1 (e.g. { name: "A", value: 0.94 } means A ≥ 94%). Entries will be sorted descending by value before sending to Canvas. Canvas POST body key is grading_scheme_entry (singular); the returned object uses grading_scheme (plural). Returns the created grading standard object including its id — use that id with apply_grading_standard_to_course to activate it on a course. |
| apply_grading_standard_to_courseA | Apply an existing grading standard to a course so the gradebook uses it. Pass the grading_standard_id returned by create_grading_standard or list_grading_standards. Pass null for grading_standard_id to remove the current grading standard from the course. Returns the updated course object. |
| set_student_quiz_accommodationA | Apply extra time and/or extra attempts to a specific student across all Classic Quizzes in a course (or a specified subset). Fans out to the Canvas quiz extensions API for each quiz. New Quizzes (quiz_type quizzes.next) are skipped — use set_student_new_quiz_accommodation instead. Only applies to quizzes that exist at call time; re-run after creating new quizzes. Assignment due-date overrides are not handled here (separate fast-follow feature). Note: for courses with many quizzes this makes one Canvas API call per quiz. Partial failures are tolerated — a failure on one quiz does not abort the rest. Returns the standard fan-out envelope: separated applied[], skipped[] (each with a skip_reason), and failed[] (each with an error) arrays, a not_found list of any requested quiz_ids absent from the course, and a summary of counts. Provide user_id as the real Canvas user ID. If CANVAS_PSEUDONYMIZE_STUDENTS is enabled, call resolve_pseudonym first to obtain the real user_id from a pseudonym. |
| list_student_quiz_accommodationsA | List the current quiz accommodation (extra time and/or extra attempts) for a specific student across all Classic Quizzes in a course. Useful for auditing before or after calling set_student_quiz_accommodation. New Quizzes (quiz_type quizzes.next) are excluded. Reads extra_time / extra_attempts from each quiz's submission records (Canvas exposes no read endpoint for quiz extensions directly) — one Canvas API call per Classic Quiz, so it may be slow for courses with many quizzes. Errors from any quiz's read propagate immediately (no per-quiz error catching). Provide user_id as the real Canvas user ID. If CANVAS_PSEUDONYMIZE_STUDENTS is enabled, call resolve_pseudonym first. |
| set_student_new_quiz_accommodationA | Apply a time and/or attempts accommodation for a student across all New Quizzes in a course (course-level, single Canvas API call when no assignment_ids are given) or for a specified subset of New Quizzes (per-quiz fan-out when assignment_ids are given). New Quizzes use a time_multiplier (ratio, e.g. 1.5 for 1.5× time), not absolute minutes. For Classic Quizzes (quiz_type: assignment / practice_quiz / etc.) use set_student_quiz_accommodation instead. Partial per-quiz failures are tolerated — a failure on one quiz does not abort the rest. In per-quiz mode, fan-out is sequential (one Canvas API call per assignment ID, awaited in series). Canvas errors on the course-level path (no assignment_ids) propagate as a top-level error (no envelope). Returns a uniform envelope: scope ("course" or "per_quiz"), applied[], failed[], and summary. Provide user_id as the real Canvas user ID. If CANVAS_PSEUDONYMIZE_STUDENTS is enabled, call resolve_pseudonym first to obtain the real user_id from a pseudonym. |
| list_student_new_quiz_accommodationsA | Read the current course-level New Quizzes accommodation (time multiplier and/or extra attempts) for a specific student in a course. Useful for auditing before or after calling set_student_new_quiz_accommodation. Returns has_accommodation: false when no accommodation is set (Canvas 404 is treated as "no record", not an error). New Quizzes store a single course-level accommodation record per student; this is not per-quiz. For Classic Quizzes, use list_student_quiz_accommodations instead. Provide user_id as the real Canvas user ID. If CANVAS_PSEUDONYMIZE_STUDENTS is enabled, call resolve_pseudonym first. |
| list_assignment_overridesA | List all due-date / availability overrides for a specific assignment in a course. Returns overrides targeting individual students, sections, or groups. Useful for auditing before creating a new override — Canvas returns a 422 if a student-set override already exists for the same students on the same assignment. |
| create_assignment_overrideA | Create a due-date / availability override for a specific assignment, targeting a set of students, a course section, or a group. Exactly one of student_ids, course_section_id, or group_id must be provided. At least one date field (due_at, unlock_at, lock_at) should be provided; omit a date field to leave the corresponding date unchanged for the override target. Dates must be ISO 8601 strings (e.g. "2026-09-15T23:59:00Z"). Canvas returns a 422 if a student-set override already exists for the same students on this assignment — use list_assignment_overrides to audit first. Provide student_ids as real Canvas user IDs. If CANVAS_PSEUDONYMIZE_STUDENTS is enabled, call resolve_pseudonym first to resolve pseudonyms to real user IDs. |
| set_student_assignment_datesA | Fan a due-date / availability override for a specific student across all (or a filtered subset of) assignments in a course. Creates one student-set override per assignment via the Canvas assignment overrides API. Partial failures are tolerated — a failure on one assignment does not abort the rest. Note: for courses with many assignments this makes one Canvas API call per assignment. V1 is create-only: if an override for this student already exists on an assignment, Canvas returns a 422 and that assignment appears in the failed[] list. Use list_assignment_overrides to audit first. Dates must be ISO 8601 strings. To shift dates by a relative amount, first call list_assignments with include=overrides to retrieve current dates, compute absolute timestamps, then call this tool. Returns the standard fan-out envelope: separated applied[], skipped[] (unused in this create-only version, always empty), and failed[] (each with an error) arrays, a not_found list, and a summary of counts. Any assignment_ids that do not exist in the course are reported in not_found (they are neither applied nor failed). Provide user_id as the real Canvas user ID. If CANVAS_PSEUDONYMIZE_STUDENTS is enabled, call resolve_pseudonym first to obtain the real user_id from a pseudonym. |
| check_course_setupA | Run a factual course-readiness report that surfaces common configuration problems — assignments missing due dates, unpublished items students will not see, gradebook weighting gaps, graded assignments with no points, and published assignments still accepting submissions after their due date. Returns findings grouped by check with a plain-language detail per item. This is a config-health report only; it does not inspect student submissions or performance (see list_students_needing_attention / get_missing_submissions for those). Requires instructor permissions in the course. |
| explain_gradeA | Recomputes and explains the weighted course grade for a student, including assignment-group weights, drop_lowest / drop_highest / never_drop rules, per-group breakdowns (earned points, dropped assignments, weighted contributions), the mapped letter grade (via the course grading standard when present), and a reconciliation check against Canvas's posted current_score / final_score. Use this when you need to verify that Canvas's displayed grade matches the rules, or to explain to a student or instructor how their grade was calculated. Limitations:
|
| explain_grading_policyA | Explains the grading automation rules configured for a Canvas course:
Also returns a plain-language summary paragraph you can share with students or instructors. Note: the late/missing policy section requires instructor or admin permissions. Students receive the group-weighting and grading-scheme sections only, with a caveat noting what is unavailable. Use explain_grade to compute the actual weighted grade for a specific student. |
| project_gradeA | Projects the minimum score needed on remaining assignments to reach a target course grade. Given a target (as a percentage, e.g. 90, or a letter grade, e.g. "A") and the student's current scores, computes the minimum uniform percentage that must be earned on all remaining (not yet graded) assignments for the overall course grade to reach the target. Accounts for assignment-group weights, drop_lowest / drop_highest / never_drop rules, and the course grading scheme (for letter-grade targets and output letter mapping). Returns:
Limitations:
|
| audit_course_linksA | Scan a course's content (pages, assignments, syllabus, announcements, and optionally quizzes) for broken or outdated links and images. Returns structured findings: cross-course references (links that still point at a previous copy of the course — the canonical stale-copy failure after a course import) and empty/malformed URLs. Pass "quizzes" in |
| audit_course_accessibilityA | Scan a course's content (pages, assignments, syllabus, announcements, and optionally quizzes) for structurally-detectable WCAG 2.1 accessibility problems: images missing alt text or with low-quality (filename/generic) alt text, non-descriptive link text ("click here"), adjacent duplicate links, skipped/empty/overlong headings, and tables missing headers, header scope, or captions. Each finding carries a WCAG success criterion and a severity (error = unambiguous failure, advisory = needs human review). Structural checks only — no color-contrast checking (requires rendered theme CSS this tool cannot see) and no list-misuse detection in this version. Pass "quizzes" in |
| list_appointment_groupsA | List appointment groups (Canvas Scheduler sign-up slots). Use scope=reservable to find groups students can reserve, or scope=manageable for groups the current user manages. |
| get_appointment_groupB | Get a single appointment group by ID, including its time slots and participant counts. |
| create_appointment_groupA | Create a new appointment group (sign-up slots) in Canvas Scheduler. Provide at least one context_code (e.g. "course_123") and a title. Add new_appointments as [start_at, end_at] pairs to define time slots. |
| update_appointment_groupA | Update an existing appointment group. Use publish=true to make a draft group visible to participants, or add new time slots via new_appointments. |
| delete_appointment_groupA | Delete an appointment group and cancel any existing reservations. Provide cancel_reason to notify participants. |
| list_appointment_group_usersB | List participants (users) who have reserved a slot in an appointment group. |
| list_appointment_group_groupsA | List student groups that have reserved a slot in an appointment group (when participant_type=Group). |
| next_appointmentA | Get the current user's next upcoming appointment across all (or specified) appointment groups. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| canvas-accessibility-sweep | Educator and learning-designer skill for a pre-launch accessibility and broken-link sweep of a Canvas course. Walks the structural accessibility audit and the link audit over a course's pages, assignments, syllabus, announcements, and (optionally) quizzes, then produces a prioritised remediation list you can work through in the Canvas editor. Trigger phrases include "accessibility sweep", "accessibility audit", "check course accessibility", "a11y check", "WCAG scan", "alt text audit", "broken links", "check my course for broken links", "pre-launch course check", or "course QC for accessibility". |
| canvas-admin-roster | Admin skill for walking the Canvas account hierarchy: list accounts and sub-accounts, see courses and users under each, look up which canned reports are available, and enroll or remove users from a specific course — one action at a time. Trigger phrases include "admin roster", "list accounts", "sub accounts", "account users", "users in this account", "enroll a user", "remove an enrollment", "account reports", or "what accounts can I see". Uses write tools: enroll_user, remove_enrollment. The workflow asks you to confirm before each write. |
| canvas-at-risk-students | Identify at-risk Canvas students and send targeted outreach. Surfaces students with missing assignments, low grades, or declining submission patterns — then lets you message them directly. Trigger phrases include "at-risk students", "struggling students", "who's falling behind", "students to check in with", or "missing submissions". Uses write tools: send_conversation. The workflow asks you to confirm before each write. |
| canvas-course-pulse | Educator skill for tracking week-over-week course health trends in Canvas. Surfaces assignment performance trends, login activity, engagement gaps, and struggling students across a longer time horizon than a daily check. Trigger phrases include "course pulse", "course health", "course trends", "week-over-week performance", "how is the course going", "engagement trends", "who isn't logging in", or "course activity over time". |
| canvas-course-qc | Learning designer quality-control checklist for Canvas courses. Walks modules, pages, assignments, and rubrics to surface structural issues — broken item sequences, missing rubrics, empty modules, unpublished content — before a course goes live. Trigger phrases include "course QC", "course quality check", "review course structure", "pre-launch audit", "check course content", or "canvas course review". |
| canvas-discussion-facilitator | Educator skill for browsing, reading, replying to, and creating Canvas discussion topics. Surfaces active threads, unread entries, and announcement activity — then lets you post replies or create new topics without leaving your agent session. Trigger phrases include "discussion board", "course discussions", "reply to discussion", "create a discussion", "what's in the discussion forum", "check announcements", or "post to discussion". Uses write tools: create_discussion, post_discussion_entry, update_discussion. The workflow asks you to confirm before each write. |
| canvas-gradebook-audit | Audit gradebook changes and grade edit history in Canvas. Surfaces who changed which grades, when, and by how much — across a date range or for a specific student. Unique to canvas-lms-mcp (no competitor exposes gradebook history). Trigger phrases include "grade audit", "who changed this grade", "gradebook history", "grade edits", "check for grade changes", or "grade integrity". |
| canvas-grading-pass | Educator grading workflow for Canvas. Walks through ungraded submissions one at a time, applying rubric assessments and score comments with explicit confirmation before each write. Trigger phrases include "grade submissions", "start grading", "grading pass", "mark submissions", "grade this assignment", or "rubric grading". Uses write tools: comment_on_submission, grade_submission, submit_rubric_assessment. The workflow asks you to confirm before each write. |
| canvas-morning-check | Educator morning briefing for Canvas. Surfaces ungraded submissions, participation gaps, upcoming deadlines, and flagged students across all active courses — in under a minute. Trigger phrases include "morning Canvas check", "what needs my attention today", "grading queue", "educator briefing", "what's pending", or "Canvas daily summary". |
| canvas-office-hours | Educator skill for running office hours through Canvas Scheduler appointment groups. Create and publish sign-up slots for a course, list existing groups and their time slots, and see which students (or student groups) have reserved — one confirmed action at a time. Trigger phrases include "office hours", "appointment group", "Canvas Scheduler", "sign-up slots", "create office hours", "who signed up for office hours", "manage appointment slots", "publish office hours", or "schedule office hours". Uses write tools: create_appointment_group, delete_appointment_group, update_appointment_group. The workflow asks you to confirm before each write. |
| canvas-outcome-tracker | Track student mastery of learning outcomes in Canvas. Shows outcome rollups by student, mastery distribution across the class, and which outcomes have the lowest proficiency rates. Built for accreditation reviews, program assessment, and advising. Trigger phrases include "outcome tracker", "learning outcomes", "mastery data", "accreditation report", "outcome mastery", or "who hasn't mastered". |
| canvas-peer-review-tracker | Educator skill for tracking peer-review assignments in Canvas. Lists who has been asked to review whom, who has submitted versus who is still pending, and lets you assign new reviewers or send reminder messages — one student at a time. Trigger phrases include "peer reviews", "who hasn't done their peer review", "peer review status", "assign a peer reviewer", "remind students about peer reviews", or "peer review tracker". Uses write tools: create_peer_review, delete_peer_review, send_conversation. The workflow asks you to confirm before each write. |
| canvas-quiz-review | Educator skill for reviewing Canvas quiz performance and regrading individual question scores. Surfaces struggling questions, low-scoring students, and per-student answer breakdowns — then lets you adjust scores for specific questions without leaving your agent session. Unique to canvas-lms-mcp (no other Canvas MCP server exposes quiz tools). Trigger phrases include "quiz review", "quiz results", "struggling quiz questions", "quiz scores", "regrade a quiz question", "quiz performance", or "student quiz answers". Uses write tools: score_quiz_question. The workflow asks you to confirm before each write. |
| canvas-student-todo | Student action list for Canvas. Surfaces every incomplete to-do item, missing submission, and upcoming deadline in one prioritised view — no calendar, no context switching. Trigger phrases include "what do I need to do", "my Canvas to-dos", "student to-do list", "what's missing", "catch me up", or "what should I work on". |
| canvas-syllabus-coach | Learning designer skill for reviewing and improving Canvas course syllabi and front pages. Reads the syllabus and key pages, proposes clarity and completeness improvements, then optionally applies the edits with your confirmation. Trigger phrases include "syllabus review", "improve the syllabus", "syllabus coach", "course front page", "update course description", "review course pages", or "polish the syllabus". Uses write tools: create_page, update_course, update_page. The workflow asks you to confirm before each write. |
| canvas-week-plan | Student weekly planner for Canvas. Pulls upcoming assignments, due dates, current grades, pending submissions, and peer review obligations into a single prioritised plan for the week ahead. Trigger phrases include "plan my week", "what's due this week", "weekly Canvas plan", "week ahead", or "upcoming assignments". |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| Course Structure | Interactive course structure tree |
| Institution Announcements | Interactive institution announcements panel |
TDQS
Scored across 174 tools
Many tools overlap or duplicate each other, such as get_course_structure vs view_course_structure and list_account_notifications vs view_account_notifications. With 174 tools, an agent also faces near-identical read paths like get_my_upcoming_assignments, get_upcoming_events, and list_calendar_events, making misselection likely.
Most names are snake_case and readable, but verb usage is inconsistent: list, get, view, find, search, audit, explain, and project are mixed for similar read/query actions. A few names like health_check and next_appointment break the verb_noun pattern.
174 tools is an extreme mismatch for a single MCP server and far exceeds the typical 3-15 well-scoped range. The surface includes many thin wrappers, duplicates, and audience-specific variants that dilute selection quality.
Coverage spans many Canvas domains, but there are notable gaps: no create/update/delete for announcements, outcomes, groups, sections, users, or folders, and Classic quiz creation/update is missing. The surface is broad but not complete CRUD/lifecycle coverage.