Canvas MCP gives AI assistants direct access to your Canvas LMS courses. Grade assignments, track progress, manage content, and communicate with students — all through natural language.
Canvas MCP serves different needs depending on who you are. The same server adapts to students, educators, learning designers, and developers.
Track upcoming assignments, check submission status, view grades, and manage peer reviews. 5 self-service tools that use Canvas "self" endpoints — you only see your own data.
5 toolsGrade assignments with rubrics, send targeted messages, analyze peer review completion, manage discussions, and run automated follow-up campaigns. Bulk grade 90+ submissions in one call.
50+ toolsAudit course quality, scan for WCAG accessibility violations, scaffold complete course structures from specs, and verify publishing state across modules.
4 tools + 3 skillsExecute custom TypeScript in a sandboxed environment for bulk operations with 99.7% token savings. Add custom tools, create skills, deploy to your own infrastructure.
3 tools + Code APIWrite TypeScript that runs locally with Canvas credentials. Data stays on the server — only results enter the AI context window. Saves 99.7% of tokens on bulk operations.
Three-layer privacy model: PII redaction in logs, student data anonymization in responses, and structured audit trails. Student names become consistent anonymous IDs.
Run npx canvas-mcp setup and answer 3 questions. The wizard configures your MCP client to connect to the hosted server. No Python, no dependencies.
Canvas MCP is organized into 5 capability layers. Each layer builds on the one below, enabling progressively more sophisticated operations.
The connection between AI clients and the server. Two modes: local stdio for single-user, HTTP for multi-tenant hosting. The HTTP transport uses ContextVar-based per-request credential isolation.
Shared utilities every tool depends on. The HTTP client handles all outbound requests with retry, rate limiting, and a concurrency semaphore. The validation decorator automatically coerces MCP tool parameters to the correct Python types.
The primary interface surface. 58 read tools, 27 write tools, 5 local-only tools, and 2 disabled tools (Canvas API bugs). Organized by Canvas entity type with progressive disclosure patterns.
Tools and systems that orchestrate multiple Layer 2 calls. The peer review follow-up campaign runs analytics, filters students, and sends targeted messages in one tool call. The TypeScript code API enables custom bulk operations.
Multi-step workflows that combine tools with decision logic. Distributed via skills.sh and usable as slash commands in 40+ AI coding agents. Each skill is a procedural guide that an AI follows step-by-step.
User-defined compositions built on all layers below. Write TypeScript for custom bulk operations, create skills for repeatable workflows, add MCP resources, or deploy with institutional configuration overlays.
Three-layer privacy architecture designed for FERPA compliance in educational environments.
All log output automatically redacts PII fields (names, emails, login IDs). Numeric IDs truncated to last 4 characters. Output goes to stderr only — stdout reserved for MCP protocol.
Student names replaced with consistent SHA-256 pseudonyms (Student_a8f7e23d). Emails removed. Real user IDs preserved for functional operations. Configurable per deployment.
Structured JSON-lines audit log with rotating file handler. Endpoint paths sanitized. Code execution logged by SHA-256 hash. ISO 8601 timestamps. Off by default, enable for compliance.
Interactive visualization of how every component connects. Hover nodes for details. Click and drag to explore. Filter by category to focus on specific layers.
Every MCP tool organized by domain. Read tools query Canvas data. Write tools create, update, or delete content. All tools accept Canvas IDs, course codes, or SIS IDs.
| Tool | Purpose | Type |
|---|---|---|
get_my_upcoming_assignments | Assignments due in next N days with submission status | Read |
get_my_submission_status | Submitted vs. missing across courses | Read |
get_my_course_grades | Current grades for all active courses | Read |
get_my_todo_items | Canvas TODO list | Read |
get_my_peer_reviews_todo | Pending peer reviews to complete | Read |
| Tool | Purpose | Type |
|---|---|---|
list_courses | List enrolled courses (refreshes identifier cache) | Read |
get_course_details | Course info: dates, timezone, syllabus, blueprint | Read |
get_course_content_overview | Pages summary + module structure + syllabus | Read |
| Tool | Purpose | Type |
|---|---|---|
list_assignments | All assignments with due dates, points | Read |
get_assignment_details | Full assignment info with description | Read |
list_submissions | Student submissions with scores | Read |
get_assignment_analytics | Performance stats: mean, median, missing students | Read |
create_assignment | Create with full validation (grading, dates, peer reviews) | Write |
update_assignment | Partial update (only sends changed fields) | Write |
assign_peer_review | Manually assign reviewer to reviewee | Write |
list_peer_reviews | Peer review assignments per submission | Read |
| Tool | Purpose | Type |
|---|---|---|
list_discussion_topics | Discussion forums with optional announcements | Read |
get_discussion_topic_details | Single discussion with statistics | Read |
list_discussion_entries | All entries with replies (3-method fallback) | Read |
get_discussion_entry_details | Single entry with replies (4-method fallback) | Read |
get_discussion_with_replies | Entries + replies in tree format | Read |
post_discussion_entry | New top-level discussion post | Write |
reply_to_discussion_entry | Reply to an existing entry | Write |
create_discussion_topic | Create new discussion forum | Write |
list_announcements | Course announcements | Read |
create_announcement | Post a course announcement | Write |
delete_announcement | Delete with title confirmation | Write |
bulk_delete_announcements | Batch delete by ID list | Write |
delete_announcement_with_confirmation | Safe delete with title match + dry run | Write |
delete_announcements_by_criteria | Filter-then-delete (dry_run default) | Write |
| Tool | Purpose | Type |
|---|---|---|
list_modules | Course modules with item summaries | Read |
get_course_structure | Full module/items tree as JSON (one call) | Read |
create_module | New module with prerequisites, unlock date | Write |
update_module | Update module settings | Write |
delete_module | Remove module (content preserved) | Write |
add_module_item | Add content to module (type-specific validation) | Write |
update_module_item | Update item or move between modules | Write |
delete_module_item | Remove item from module | Write |
list_module_items | Items in a specific module | Read |
| Tool | Purpose | Type |
|---|---|---|
list_all_rubrics | All rubrics in a course with criteria | Read |
list_assignment_rubrics | Rubric summary for an assignment | Read |
get_rubric_details | Full rubric with criteria and ratings | Read |
get_assignment_rubric_details | Assignment-specific rubric details | Read |
get_submission_rubric_assessment | Rubric scores for a student submission | Read |
grade_with_rubric | Grade one submission with rubric criteria | Write |
bulk_grade_submissions | Concurrent grading with batching + dry run | Write |
associate_rubric_with_assignment | Link rubric to assignment | Write |
delete_rubric | Delete rubric and associations | Write |
create_rubric | Disabled — Canvas API returns 500 | Disabled |
update_rubric | Disabled — Canvas does full replacement | Disabled |
| Tool | Purpose | Type |
|---|---|---|
send_conversation | Send Canvas inbox message (form data required) | Write |
list_conversations | List by scope (unread/starred/sent/all) | Read |
get_conversation_details | Single conversation with all messages | Read |
get_unread_count | Count of unread conversations | Read |
mark_conversations_read | Bulk mark conversations as read | Write |
send_bulk_messages_from_list | Templated messages to multiple recipients | Write |
send_peer_review_reminders | Automated peer review reminders | Write |
send_peer_review_followup_campaign | Full pipeline: analytics + filter + send | Write |
Two paths: zero-install via the hosted server, or local installation for full control and FERPA compliance.
In Canvas, go to Account > Settings > New Access Token. Copy the token — you will not see it again.
One command configures your AI coding client. Supports Claude Desktop, Codex, Cursor, Windsurf, VS Code, and Claude Code.
Restart your AI client and ask natural language questions about your courses.
Create a .env file with your Canvas API token and institution URL.
Add the server to your MCP client configuration.
Add 8 pre-built workflows for common tasks.
Step-by-step workflows for each persona. Click to expand and see the exact tools used at each step.
Check upcoming work: get_my_upcoming_assignments(days=7) — shows assignments due with submission status
Verify submissions: get_my_submission_status() — submitted vs. missing across all courses
Check peer reviews: get_my_peer_reviews_todo() — pending reviews to complete
View grades: get_my_course_grades() — current standing in each course
Scan submissions: list_assignments + get_assignment_analytics for the past 7 days
Identify at-risk students: Missing 2+ assignments or declining scores
Check peer reviews: get_peer_review_completion_analytics — who hasn't started
Send reminders: send_conversation to students needing attention
Get the rubric: get_assignment_rubric_details — review criteria and point values
Choose approach: 1-9 submissions: grade_with_rubric. 10-29: bulk_grade_submissions. 30+: execute_typescript
Dry run first: Always pass dry_run=true to preview grades before committing
Execute: Confirm results, then run with dry_run=false
Get structure: get_course_structure — full module/items tree with stats
Check content: list_assignments + list_pages — verify all content exists
Verify publishing: Flag unpublished content that should be live
Scan accessibility: scan_course_content_accessibility for WCAG violations
Report: Prioritized findings by severity
Discover API: search_canvas_tools("grading", "signatures") or list_code_api_modules
Write TypeScript: Import from the Code API library, write custom logic
Execute in sandbox: execute_typescript(code) — runs in isolated environment
Results only: Data stays on server. Only the summary enters your AI context window.
Canvas MCP is designed for extension. Add new tools, create custom skills, write TypeScript for bulk operations, or deploy with institutional configuration.
Create or edit a tool file, add decorators, register, and test.
Skills are markdown files with YAML frontmatter that describe multi-step workflows for AI agents.
The Code API provides a typed Canvas client for bulk operations. Data stays on the server.
Deploy with configuration overlays for baseline, public, or enterprise environments.
Where to find everything and what to modify for different types of changes.
src/canvas_mcp/tools/ — create or edit tool file
tools/__init__.py — register
tests/tools/ — add tests
tools/README.md — document
core/anonymization.py — data masking rules
core/client.py — endpoint matching
core/audit.py — audit trail config
.env — toggle settings
src/canvas_mcp/code_api/canvas/ — add module
code_api/canvas/index.ts — re-export
code_api/README.md — usage guide
deploy/setup.sh — clone + configure
deploy/canvas-mcp.service — systemd unit
deploy/nginx-canvas-mcp.conf — reverse proxy
config/overlays/ — environment tier