The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Canvas MCP listing page.
MCP server for Canvas LMS with up to 101 tools and 8 agent skills. Designed for Claude Desktop, Cursor, Codex, Windsurf, and 40+ other agents; setup and capabilities vary by client.
1. Install the MCP server (everything else, including the skills, needs it running):
canvas-mcp.mcpb from the latest release and double-click it. It prompts for your Canvas URL and token; no terminal needed. Details.pip install into a virtualenv, add your token to .env, and point your client at the canvas-mcp-server binary. Local Installation has the per-client config blocks.2. Verify: canvas-mcp-server --test should report a successful Canvas connection. Then restart your client.
3. Optional: add the workflow skills. These teach your agent the multi-step recipes (weekly plan, morning check, bulk grading, peer review, course QC) on top of the tools:
See Agent Skills for the list. If your agent is Claude Code, the same recipes are also available as slash commands.
Canvas MCP provides up to 101 tools for interacting with Canvas LMS; the default profile registers fewer, and optional feature-gated tools can raise the total to 101. Tools are organized by user type:
| Tool | Purpose | Example Prompt |
|---|---|---|
get_my_upcoming_assignments | Due dates for next N days | "What's due this week?" |
get_my_todo_items | Canvas TODO list | "Show my TODO list" |
get_my_submission_status | Submitted vs missing | "Have I submitted everything?" |
get_my_course_grades | Current grades | "What are my grades?" |
get_my_peer_reviews_todo | Pending peer reviews | "What peer reviews do I need to do?" |
| Tool | Purpose | Example Prompt |
|---|---|---|
list_assignments | All assignments in course | "Show assignments in BADM 350" |
create_assignment | Create new assignment | "Create an assignment due Jan 26 with online text submission" |
update_assignment | Update existing assignment | "Change the due date for Assignment 3 to Feb 15" |
list_submissions | Student submissions | "Who submitted Assignment 3?" |
bulk_grade_submissions | Grade multiple at once | "Grade these 10 students" |
get_assignment_analytics | Performance stats | "Show analytics for Quiz 2" |
send_conversation | Message students | "Message students who haven't submitted" |
create_announcement | Post announcements | "Announce the exam date change" |
| Module Management | ||
create_module | Create course module | "Create a module for Week 5" |
update_module | Update module settings | "Rename the midterm module" |
add_module_item | Add content to module | "Add the syllabus page to Week 1" |
delete_module | Remove a module | "Delete the empty test module" |
| Page & Content | ||
create_page | Create course page | "Create a page for office hours" |
edit_page_content | Update page content | "Update the syllabus page" |
update_page_settings | Publish/unpublish pages | "Publish all Week 3 pages" |
bulk_update_pages | Batch page operations | "Unpublish all draft pages" |
| File Management | ||
upload_course_file | Upload local file to Canvas | "Upload syllabus.pdf to the course" |
| Tool | Purpose |
|---|---|
list_courses | All enrolled courses |
get_course_details | Course info + syllabus |
list_pages | Course pages |
get_page_content | Read page content |
list_modules | List course modules |
list_module_items | Items within a module |
list_discussion_topics | Discussion forums |
list_discussion_entries | Posts in a discussion |
post_discussion_entry | Add a discussion post |
reply_to_discussion_entry | Reply to a post |
| Tool | Purpose | Example Prompt |
|---|---|---|
get_course_structure | Full module→items tree as JSON | "Show me the structure of CS 101" |
scan_course_content_accessibility | WCAG violation scanner (20 checks: headings, tables, links, contrast, alt text, captions, DesignPLUS) | "Audit accessibility for BADM 350" |
fetch_ufixit_report | Institutional accessibility report | "Pull the UFIXIT report for this course" |
parse_ufixit_violations | Extract structured violations | "Parse the UFIXIT violations" |
format_accessibility_summary | Readable violation report | "Summarize the accessibility issues" |
Skills: canvas-course-qc (pre-semester audit), canvas-accessibility-auditor (WCAG-oriented review), canvas-course-builder (scaffold courses from specs/templates).
| Tool | Purpose | When to Use |
|---|---|---|
search_canvas_tools | Discover MCP tools and code API operations | Finding available tools and bulk ops |
execute_typescript | Run TypeScript locally | 30+ items, custom logic, local per-item processing |
Decision tree: Simple query → MCP tools. Batch grading (10+) → bulk_grade_submissions. Complex bulk (30+) → execute_typescript.
Course identifiers: Canvas ID (12345), course code (badm_350_120251_246794), or SIS ID
Cannot do: Create/delete courses, modify course settings, access other users' data
Rate limits: ~700 requests/10 min. Use max_concurrent=5 for bulk operations.
Full documentation: AGENTS.md | tools/TOOL_MANIFEST.json | tools/README.md
The Canvas MCP Server bridges the gap between AI assistants and Canvas Learning Management System, providing role-specific workflows for students, educators, learning designers, and developers. Built on the Model Context Protocol (MCP), it is designed for MCP-compatible clients; setup and supported capabilities vary by client.
Released: August 2026 | Full Changelog | All Releases
A safety release: every delete tool now asks first. Four changes are breaking. Each one's migration is a line long:
delete_announcement removed → call delete_announcement_with_confirmation with the same arguments; it previews first, then deletes on the second call with the token (#318)dry_run removed from the three announcement delete tools → drop the argument; a call without confirmation_token is the dry run and deletes nothing. bulk_delete_announcements used to delete on the first call; it previews now (#318)confirmation_token required on all seven delete tools (delete_announcement_with_confirmation, bulk_delete_announcements, delete_announcements_by_criteria, delete_page, delete_module, delete_module_item, delete_assignment_with_confirmation) → call once with your normal arguments, show the preview, then call again with identical arguments plus the token from the Confirmation token: line. Tokens are single-use, expire in 5 minutes, and stop matching if the target or the arguments changed (#318). Thanks @zqian for the requestrequires-python >= 3.11; upgrade the interpreter, or pin canvas-mcp<1.12 until you can (#315)Also new: delete_assignment_with_confirmation (preview shows due date, points and whether submissions exist); ACCESSIBILITY_CHECKERS so institutions without UDOIT/UFIXIT can set none and drop the three UFIXIT tools while keeping the built-in scanner (#325, thanks @jonespm); the content migration tools (#309); and a Skill Request issue template (#302)
v1.11.0 — A protocol-correctness release. Breaking: send_peer_review_reminders is now send_peer_review_inbox_messages (#303); tool failures set MCP isError: true (#270); string-returning tools no longer duplicate their payload into structuredContent.result (#271); FastMCP floor 3.4.7 (#293). Thanks @jonespm
v1.10.0 — A community bug-fix release driven by live reporter testing — thanks @khagyard, @zqian, @jonespm, @bruchris, and @SHIL0018 (our second outside code contribution). Included a breaking search_canvas_tools response-shape change.
search_canvas_tools response shape v2 (#281). The tool now actually searches the ~99 registered MCP tools alongside the TypeScript code-API files (it previously searched only the latter, so "peer review" found nothing despite ~10 peer-review tools existing). Responses carry schema_version: 2 with labeled mcp_tools / code_execution_api sections; the old flat tools key is gone. Full-detail code-API content is now also capped at 2,000 characters (#287)get_my_peer_reviews_todo gained a direct per-assignment lookup and a Planner-feed discovery path — the same data source Canvas's own student UI uses — validated against a real production payload from the reportercreate_announcement fails safely on student tokens (#283): Canvas silently downgrades the create to a regular discussion topic; the tool now pre-checks course permissions and refuses before creating anything, auto-deletes the unintended topic if a downgrade still slips through, and steers AI clients away from posting the content via discussion tools as a fallbackpython:3.14-slim, CI actions updatedv1.9.0 — Prompt-injection hardening (#239): Canvas-authored text arrives provenance-fenced as data-not-instructions; multi-recipient sends became two-step preview→confirm (breaking); write tools refuse fence markers; OSSF Scorecard published, CI actions SHA-pinned, .mcpb ships SLSA provenance; npm wizard retired (#249). Eleven adversarial review rounds pre-merge
v1.8.0 — Security-scan remediation: 11 of 12 findings fixed, three breaking (HTTPS-only Canvas URLs, stdio-only file transfer tools, no-overwrite downloads), a measured submissions authorization bypass closed centrally, CSV formula-injection protection, code execution fails closed, dependency floors raised (PR #251, #255)
v1.7.0 — Correctness release from instructor bug reports: writes no longer report success when Canvas quietly did less than asked (#219–#221), Planner-API upcoming assignments (#222), check_enrollment AMBIGUOUS answers (#199), wire-format fixes for pages/inbox (#207, #208), MCP-spec tool annotations (#204), CSV rubric format fix (#190), anonymization consolidated to the client layer (#179). Thanks @khagyard and @zqian
v1.6.0 — Tier 1 student write tools behind an explicit allowlist (#170), get_my_enrollments / get_my_profile (#171), three-tier anonymization (#166, #179), rubric association fixes (#180, #181), execute_typescript became opt-in (#178), ruff gating CI (@w3lld1, PR #186)
v1.5.0 — get_syllabus (#134), create_rubric_from_csv (#119), update_discussion_topic (#154), fastmcp 2.x migration (#145), dependency advisories cleared 33 → 0 with a gating CI scan (PR #156)
v1.4.0 — check_enrollment (PR #126), Claude Desktop Extension .mcpb, Entra ID authenticated institutional hosting (#115, PR #125), HTTP fails closed without auth gate (PR #123)
v1.3.0 — create_rubric (PR #100), read_course_file (@DomBarker99, PR #90), event-loop fix for user-scoped tools (PR #99), bulk-delete safety cap (PR #96), dependency pruning (PR #93)
v1.2.0 — Role-Based Tool Filtering (@Promithius-DR, PR #84), Accessibility Remediation (fix_accessibility_issues, scanner expanded 4→20 checks), Security Hardening (path traversal/symlink protections), Windows Support for execute_typescript (PR #85), CI consolidation (11→8 checks)
v1.1.0 — Hosted Server (mcp.illinihunt.org), Learning Designer tools + 3 skills, Agent Skills on skills.sh, File Management (@Metzpapa, PR #75), Token Optimization, Generic Distribution
v1.0.8 — Security Hardening (PII sanitization, audit logging, sandbox-by-default), Ruff linting, 235+ tests
v1.0.7 — Assignment Update Tool (update_assignment), complete CRUD, 9 tests
v1.0.6 — Module Management (7 tools), Page Settings (2 tools), 235+ tests
v1.0.5 — Claude Code Skills, GitHub Pages site
v1.0.4 — Code Execution API for token-efficient bulk operations, MCP 2.14 compliance
Get AI-powered assistance with:
Enhance your teaching with:
AI-powered course design and quality assurance:
3 dedicated skills (canvas-course-qc, canvas-accessibility-auditor, canvas-course-builder) plus the get_course_structure tool.
Pre-built workflow recipes that teach AI agents how to use Canvas MCP tools effectively. Available for 40+ coding agents via skills.sh, or as Claude Code-specific slash commands.
Skills call the MCP tools, so install the server first; a skill without the server has nothing to run.
This launches an interactive picker to install skills into your agent of choice (Claude Code, Cursor, Codex, OpenCode, Cline, Zed, and many more).
| Skill | For | What It Does |
|---|---|---|
canvas-week-plan | Students | Weekly planner: due dates, submission status, grades, peer reviews |
canvas-morning-check | Educators | Course health dashboard: submission rates, struggling students, deadlines |
canvas-bulk-grading | Educators | Grading decision tree: single → bulk → code execution with safety checks |
canvas-peer-review-manager | Educators | Full peer review pipeline: analytics, quality analysis, reminders, reports |
canvas-discussion-facilitator | Both | Discussion browsing, participation monitoring, replying, facilitation |
canvas-course-qc | Learning Designers | Pre-semester quality audit: structure, content, publishing, completeness |
canvas-accessibility-auditor | Learning Designers | WCAG scan, prioritized report, guided remediation, verification |
canvas-course-builder | Learning Designers | Scaffold courses from specs, templates, or existing courses |
Install a specific skill:
If you use Claude Code, the same workflows are also available as slash commands:
Claude Code skills are located in .claude/skills/ and can be customized for your workflow.
Want a custom skill? Submit a request describing your repetitive workflow!
Canvas MCP provides optional privacy controls that can support an institution's FERPA obligations. Compliance still depends on your deployment, configuration, institutional policy, and AI provider:
ENABLE_DATA_ANONYMIZATION=true)When ENABLE_DATA_ANONYMIZATION=true is enabled, supported identity fields are anonymized before tool results reach the AI client. Review the Educator Guide and your institution's requirements before using student data.
.env. In authenticated institutional HTTP deployments, each request supplies the user's Canvas token and the server does not store it.The public hosted server (mcp.illinihunt.org) has been retired. A public MCP endpoint without an access gate isn't safe to operate — it would expose the built-in code-execution tool — so the supported path is local installation below.
The HTTP/streamable transport itself remains fully supported for self-hosting behind your own authentication (canvas-mcp-server --transport streamable-http). Running a shared, authenticated instance for your institution? See deploy/azure/ for a production-tested deployment specification (Azure App Service + Entra ID platform auth, per-user Canvas tokens) with sample workflow and config templates.
Canvas MCP is designed for MCP-compatible clients, including Claude Desktop, Cursor, Zed, Windsurf, Continue, Replit, and Copilot Studio. Setup details and supported capabilities vary by client.
Canvas MCP uses documented Canvas API patterns such as a User-Agent header and per_page pagination. It is intended for Canvas Cloud and compatible self-hosted instances.
If you use Claude Desktop, you can install Canvas MCP with one click — no terminal, no config-file editing:
canvas-mcp.mcpb from the latest release./api/v1 path (e.g. https://canvas.youruniversity.edu/api/v1) — and your Canvas API token (Canvas → Account → Settings → New Access Token — some institutions issue these by request form instead, see below). The token is stored in your OS keychain.The extension runs the server locally and calls Canvas with your own token, so requests use that token's Canvas permissions. Canvas and your AI client may retain their own activity records. Requires Python 3.11+ (the bundled runtime manages dependencies automatically). For other clients, or to run from source, use the manual setup below.
Get your Canvas API token from: Canvas → Account → Settings → New Access Token
Some institutions gate token creation. Where self-service is disabled, the "New Access Token" button is missing or errors out, and tokens are issued through an IT request form instead. Check your institution's IT knowledge base before concluding that API access is unavailable to you.
University of Illinois Urbana-Champaign works this way for everyone — students and instructors alike. Request a token with the Canvas API Token Request form (NetID login required). Once it is approved:
- Go to Canvas → Account → Settings → Approved Integrations, find the new token, click Activate, and refresh the page.
- Retrieve the token value from the U of I Box link Technology Services sends you.
As of August 2026, all new Illinois tokens carry a 30-day expiration (an upstream Instructure requirement). Expiry is not monitored or announced, and expired tokens are removed without notice — request the replacement before the current one lapses. Full details: Answers KB 150325.
Students elsewhere: if you see "There is a limit to the number of access tokens you can create" or cannot find the token creation option, contact your institution's Canvas administrator or IT support department to request API access.
Canvas MCP is designed for MCP-compatible clients. Below are configuration examples for popular clients; exact setup and capabilities vary by client:
Configuration file location:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.jsonConfiguration:
Note: Use the absolute path to your virtualenv binary to avoid issues with shell-specific PATH entries (e.g., pyenv shims).
Configuration file location:
~/.cursor/mcp_config.json%USERPROFILE%\.cursor\mcp_config.jsonConfiguration:
Configuration: Add to Zed's settings.json (accessible via Settings menu)
Configuration file location:
~/Library/Application Support/Windsurf/mcp_config.json%APPDATA%\Windsurf\mcp_config.jsonConfiguration:
Configuration: Add to Continue's config.json (accessible via Continue settings)
For other MCP-compatible clients, the general pattern is:
canvas-api (or any name you prefer)canvas-mcp-server binaryConsult your client's MCP documentation for specific configuration format and file locations.
Windows users: Replace forward slashes with backslashes in paths (e.g.,
C:\Users\YourName\canvas-mcp\.venv\Scripts\canvas-mcp-server.exe)
Test your setup:
The Canvas MCP Server provides a set of tools for interacting with the Canvas LMS API. These tools are organized into logical categories for better discoverability and maintainability.
Student Tools (New!)
Shared Tools (Both Students & Educators)
Educator Tools
4. Assignment Tools - Handle assignments, submissions, and peer reviews with analytics
5. Rubric Tools - List rubrics, associate with assignments, and grade submissions (including bulk_grade_submissions for efficient batch grading). Note: Create/update rubrics via Canvas web UI due to API limitations.
6. User & Enrollment Tools - Manage enrollments, users, and groups
7. Analytics Tools - View student analytics, assignment statistics, and progress tracking
8. Messaging Tools - Send messages and announcements to students
Developer Tools
9. Discovery Tools - Search registered MCP tools and code execution API operations with search_canvas_tools; list code execution modules with list_code_api_modules
10. Code Execution Tools - Execute TypeScript code with execute_typescript so bulk item processing can stay out of the model's context
📖 View Full Tool Documentation for detailed information about the available tools.
For bulk operations (30+ items), Canvas MCP supports TypeScript code execution. Process bulk operations locally without loading every item into the model’s context.
| Approach | Best For | Context Behavior |
|---|---|---|
| MCP tools | Simple queries, small datasets | Returns tool results to the model |
bulk_grade_submissions | Batch grading 10-29 items | Handles a defined batch in one tool call |
execute_typescript | 30+ items, custom logic | Processes items locally and returns selected output |
Use search_canvas_tools to discover available operations, then execute_typescript to run them locally. The default sandbox applies time, memory, environment, and best-effort network controls, but it is not a complete security boundary; use stronger external isolation when untrusted code or strict egress control is required (see issue #157). Works on macOS, Linux, and Windows.
| Mode | Config | What It Does |
|---|---|---|
| Local sandbox (default) | None needed | Timeout 120s, memory 512MB, filtered environment, best-effort network controls |
| Container sandbox | TS_SANDBOX_MODE=container | Container filesystem isolation via Docker/Podman; egress guarantees depend on deployment configuration |
| No sandbox | ENABLE_TS_SANDBOX=false | Full local access (not recommended) |
See Bulk Grading Example for a detailed walkthrough.
MCP clients start the server automatically. Just ask naturally:
Quick start guides: Student | Educator | Real-World Workflows | Troubleshooting
Built on FastMCP with async httpx, pydantic validation, and python-dotenv configuration. Modern src/ layout with pyproject.toml, type hints across core paths, connection pooling, pagination, and rate limiting. An automated test suite and ruff + black support code quality.
If you encounter issues:
.env file, virtual environment path, and dependenciesRuntime security and privacy controls:
| Layer | Default |
|---|---|
| PII sanitization in logs | LOG_REDACT_PII=true |
| Token validation on startup | Always on |
| Structured audit logging | Opt-in: LOG_ACCESS_EVENTS=true |
| Code execution guardrails | ENABLE_TS_SANDBOX=true (best-effort in local mode) |
Optional anonymization for FERPA-conscious educator workflows: ENABLE_DATA_ANONYMIZATION=true. See Educator Guide for scope and configuration details.
Published to PyPI, MCP Registry, and skills.sh (agent skills). Releases are automated via GitHub Actions — tag a version (git tag vX.Y.Z && git push origin vX.Y.Z) and CI handles the rest.
Contributions are welcome! Feel free to:
Thanks to everyone who has contributed to Canvas MCP:
read_course_file tool for remote MCP deployments (#90)This project is licensed under the MIT License - see the LICENSE file for details.
Created by Vishal Sachdev