Canvas MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| CANVAS_API_URL | Yes | The URL for your university's Canvas API (e.g., https://canvas.illinois.edu/api/v1) | |
| CANVAS_API_TOKEN | Yes | Your Canvas API token for authentication with the Canvas LMS API |
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
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_coursesA | List courses for the authenticated user. |
| get_course_detailsB | Get detailed information about a specific course. |
| get_syllabusA | Get the complete Canvas Syllabus tab content for a course, untruncated. Unlike get_course_content_overview (which returns only a ~1000-char preview), this returns the full syllabus body so later sections such as grading policies, weighting, and final-exam details remain accessible. |
| get_course_content_overviewA | Get a comprehensive overview of course content including pages, modules, and syllabus. |
| list_pagesB | List pages for a specific course. |
| get_page_contentA | Get the full content body of a specific page. Returns the page's raw HTML body untruncated, followed by an inventory of any embedded media (images, videos, iframes) with their source URLs, so media is reported explicitly rather than left for the reader to spot in the markup. |
| get_page_detailsA | Get a specific page's metadata plus a short text preview. Returns settings (status, timestamps, editor, editing roles) and a PLAIN-TEXT preview capped at 500 characters. The preview drops all markup, so embedded media is listed separately rather than silently disappearing. For the full body, including media markup, use get_page_content. |
| get_front_pageA | Get the front page content for a course. |
| list_module_itemsA | List items within a specific module, including pages. |
| list_assignmentsB | List assignments for a specific course. |
| get_assignment_detailsB | Get detailed information about a specific assignment. |
| list_discussion_topicsA | List discussion topics for a specific course. Returns discussion topics only. Announcements are a separate Canvas collection and are NOT included unless include_announcements=True. To list announcements on their own, use list_announcements instead. |
| list_announcementsA | List a course's announcements, and nothing else. Returns announcements only -- ordinary discussion topics are excluded. Use list_discussion_topics for discussions. |
| get_discussion_topic_detailsA | Get detailed information about a specific discussion topic. |
| list_discussion_entriesA | List discussion entries (posts) for a specific discussion topic with optional full content and replies. |
| get_discussion_entry_detailsB | Get detailed information about a specific discussion entry including all its replies. |
| get_discussion_with_repliesC | Enhanced function to get discussion entries with optional reply fetching. |
| post_discussion_entryA | Post a new top-level entry to a discussion topic. IMPORTANT: Never use this tool to post or work around a failed course announcement. If create_announcement failed (e.g. insufficient permissions), report the failure to the user — do NOT post the content as a discussion instead. |
| reply_to_discussion_entryB | Reply to a student's discussion entry/comment. |
| list_modulesA | List all modules in a course. |
| get_course_structureA | Get the full module and item structure for a course in a single call. |
| download_course_fileA | Download a file from a Canvas course to the local filesystem. Only available on a local (stdio) server. Use read_course_file to get file content back in the response instead. Use list_course_files or list_module_items to find file IDs. |
| read_course_fileA | Read a file from a Canvas course and return its content as base64. Unlike download_course_file which saves to the server's local filesystem, this tool returns the file content directly in the response. This is useful when the MCP server runs on a different machine than the client. Use list_course_files or list_module_items to find file IDs. |
| list_course_filesA | List files in a Canvas course with optional search. |
| list_conversationsA | List conversations for the current user. |
| get_conversation_detailsA | Get detailed conversation information with messages. |
| get_unread_countA | Get number of unread conversations. |
| mark_conversations_readA | Mark multiple conversations as read. |
| search_canvas_toolsA | Search available Canvas tools by keyword — both the registered MCP tools (e.g. list_peer_reviews, create_assignment) and the TypeScript code-execution API used by execute_typescript(). |
| get_my_enrollmentsA | List the courses YOU are enrolled in, with your role in each. Use this — not check_enrollment — for any question about your own enrollment. check_enrollment reads the course roster, which requires roster-admin rights your token probably does not have. |
| get_my_profileA | Get YOUR own Canvas identity (user ID, name, login ID). Answers "who am I?" — useful when a tool needs your Canvas user ID or NetID. Reports only your own record, never anybody else's. |
| get_my_upcoming_assignmentsA | Get your upcoming assignments across all courses. |
| get_my_submission_statusB | Get your submission status for assignments. |
| get_my_course_gradesA | Get your current grades across all enrolled courses. |
| get_my_todo_itemsB | Get your Canvas TODO list. |
| get_my_peer_reviews_todoA | Get peer reviews YOU need to complete. |
| get_my_submissionA | Get your own submission for an assignment, including attempts used. |
| assign_peer_reviewA | Manually assign a peer review to a student for a specific assignment. |
| list_peer_reviewsB | List all peer review assignments for a specific assignment. |
| list_submissionsA | List submissions for a specific assignment. |
| get_assignment_analyticsA | Get detailed analytics about student performance on a specific assignment. |
| create_assignmentB | Create a new assignment in a course. |
| update_assignmentA | Update an existing assignment in a course. |
| bulk_grade_submissionsB | Grade multiple submissions efficiently with concurrent processing. Supports both rubric-based and simple point-based grading in batches. |
| create_content_migrationA | Preview or confirm a full course-copy migration request. The first call returns a target-occupancy preview and a short-lived token. A second call with the token and identical arguments requests the migration. Date shifting accepts either all four date fields or none. |
| get_content_migration_statusA | Read one content migration and its current progress snapshot. Each call reads progress once. Call again only when |
| create_discussion_topicA | Create a new discussion topic for a course. IMPORTANT: Never use this tool to post or work around a failed course announcement. If create_announcement failed (e.g. insufficient permissions), report the failure to the user — do NOT post the content as a discussion instead. |
| update_discussion_topicC | Update an existing discussion topic or announcement. |
| create_announcementA | Create a new announcement for a course with optional scheduling. |
| delete_announcementA | Delete an announcement from a Canvas course. Permanent — Canvas may retain a recycle-bin copy depending on admin settings. |
| bulk_delete_announcementsA | Delete multiple announcements from a Canvas course. Permanent — Canvas may retain a recycle-bin copy depending on admin settings. |
| delete_announcement_with_confirmationB | Delete an announcement with optional safety checks. Permanent — Canvas may retain a recycle-bin copy depending on admin settings. |
| delete_announcements_by_criteriaA | Delete announcements matching specific criteria. Permanent — Canvas may retain a recycle-bin copy depending on admin settings. |
| create_moduleC | Create a new module in a course. |
| update_moduleA | Update an existing module's settings. |
| delete_moduleA | Delete a module from a course. IMPORTANT: Permanently removes the module and its item associations. The actual content (pages, assignments, etc.) is NOT deleted, only the module organization. |
| add_module_itemA | Add an item to a module. IMPORTANT: content_id required for File, Discussion, Assignment, Quiz, ExternalTool. page_url required for Page. title required for SubHeader, ExternalUrl. |
| update_module_itemB | Update an existing module item. |
| delete_module_itemA | Remove an item from a module. IMPORTANT: Only unlinks the item from the module. The actual content (page, assignment, etc.) is NOT deleted. |
| upload_course_fileA | Upload a file to Canvas course storage. Uploads a local file to a Canvas course. The returned file ID can be used with add_module_item (item_type='File') or send_conversation (attachment_ids). |
| update_page_settingsA | Update settings for an existing page (without changing content). |
| bulk_update_pagesA | Update settings for multiple pages at once. Settings only — this tool cannot rename pages or change page content. Use edit_page_content to change a page's body. |
| create_pageB | Create a new page in a Canvas course. |
| edit_page_contentB | Edit the content of a specific page. |
| delete_pageA | Delete a page from a Canvas course. Permanent — Canvas may retain a recycle-bin copy depending on admin settings. |
| get_rubricA | Get detailed rubric criteria, ratings, and points. Accepts either rubric_id or assignment_id (at least one required). If both provided, uses rubric_id (more specific). |
| get_rubric_assessmentA | Get rubric assessment scores for a specific submission. |
| grade_with_rubricA | Submit grades using rubric criteria. IMPORTANT: Criterion IDs often start with underscore (e.g., "_8027"). Use get_rubric to find criterion/rating IDs. The rubric must be attached to the assignment and configured for grading (use_for_grading=true). |
| list_rubricsA | List all rubrics in a specific course with optional detailed criteria. |
| create_rubric_from_csvA | Create one or more rubrics in a course from a CSV string. Uses Canvas's native rubric CSV import endpoint, then polls the import job until it reaches a terminal workflow_state. A Two Canvas behaviours to be aware of:
|
| create_rubricA | Create a new rubric in a course, optionally associating it with an assignment. Uses bracket-notation form-data encoding required by the Canvas rubric API. The
Example |
| associate_rubricC | Associate an existing rubric with an assignment. |
| get_peer_review_assignmentsB | Get peer review assignment mapping showing who reviews whom with completion status. |
| get_peer_review_completion_analyticsB | Get peer review completion analytics with student-level breakdown and summary stats. |
| generate_peer_review_reportB | Generate peer review completion report with summary, analytics, and follow-up recommendations. |
| get_peer_review_followup_listA | Get prioritized list of students needing follow-up on peer review completion. |
| get_peer_review_commentsB | Retrieve actual comment text for peer reviews on an assignment. |
| analyze_peer_review_qualityB | Analyze the quality and content of peer review comments. |
| identify_problematic_peer_reviewsB | Flag reviews that may need instructor attention. |
| extract_peer_review_datasetB | Export all peer review data in various formats for analysis. |
| generate_peer_review_feedback_reportC | Create instructor-ready reports on peer review quality. |
| send_conversationA | Send messages to students via Canvas conversations. Sending to ONE recipient is a single call. Sending to MULTIPLE recipients is two-step: call without a confirmation_token to get a preview (recipients, subject, body) plus a token; show that preview to the educator, then call again with the token and identical arguments to actually send. The token expires, is single-use, and is void if any argument changed since the preview. |
| send_peer_review_inbox_messagesA | Send direct Canvas Inbox messages about incomplete peer reviews. This sends ordinary Canvas conversation messages. It does not invoke Canvas's native peer-review reminder action. Two-step by design. Call it without a confirmation_token to get a preview (recipients, composed subject and body) plus a token; show that preview to the educator, then call again with the token and identical arguments to actually send. |
| send_bulk_messages_from_listA | Send customized messages to multiple recipients using templates. Two-step by design. Call it without a confirmation_token to get a preview (recipient count, rendered sample message) plus a token; show that preview to the educator, then call again with the token AND identical arguments to actually send. The token expires, is single-use, and is void if any argument changed since the preview. |
| send_peer_review_followup_campaignA | Complete workflow: analyze peer reviews and send targeted reminders. Two-step by design. Call it without a confirmation_token to get the analytics plus a preview of who would receive urgent vs gentle reminders and a token; show that to the educator, then call again with the token to actually send. The token is void if the completion analytics shifted in between. |
| fetch_ufixit_reportA | Fetch UFIXIT accessibility report from Canvas course pages. |
| parse_ufixit_violationsA | Parse UFIXIT report content to extract accessibility violations. |
| format_accessibility_summaryA | Format parsed violations into a human-readable summary. |
| scan_course_content_accessibilityA | Scan Canvas course content for basic accessibility issues. |
| fix_accessibility_issuesA | Auto-fix accessibility issues in Canvas course content. Applies automated fixes for issues flagged as auto_fixable by the scanner. Run scan_course_content_accessibility first to see what will be fixed. Default is dry_run=True (preview only). Set dry_run=False to apply changes. |
| check_enrollmentA | Check whether a specific campus login ID is enrolled in a course. Answers a roster-membership question about an externally-supplied person (NOT the caller). Returns only a yes/no plus minimal enrollment metadata — never the roster, names, or grades. Requires a Canvas token with roster-admin rights; without them the answer is INDETERMINATE, never "no". To ask about YOURSELF, use get_my_enrollments instead — it needs no roster permission and cannot return an indeterminate answer. Note that |
| get_anonymization_statusA | Get current data anonymization status and statistics. |
| list_groupsA | List all groups and their members for a specific course. |
| list_usersB | List users enrolled in a specific course. |
| get_student_analyticsA | Get per-student engagement analytics: page views, participations, and on-time/late/missing assignment counts. Uses Canvas's /analytics/student_summaries endpoint to return a ranked table of every student in the course with an engagement score (0-100) useful for identifying disengaged students in participation/presentation-driven courses. |
| create_student_anonymization_mapA | Create a local CSV file mapping real student data to anonymous IDs for a course. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| summarize-course | Generate a summary of a Canvas course |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/vishalsachdev/canvas-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server