{
  "markdown": "<p align=\"center\">\n  <img src=\"docs/canvas-mcp-header.png\" alt=\"Canvas MCP — AI tools for Canvas LMS\" width=\"800\">\n</p>\n\n# Canvas MCP Server\n\n<!--mcp-name: io.github.vishalsachdev/canvas-mcp-->\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![skills.sh](https://img.shields.io/badge/skills.sh-canvas--mcp-blue)](https://skills.sh)\n\nMCP server for Canvas LMS with **up to 101 tools** and **8 agent skills**. Designed for Claude Desktop, Cursor, Codex, Windsurf, and [40+ other agents](https://skills.sh); setup and capabilities vary by client.\n\n## Quick Start\n\n**1. Install the MCP server** (everything else, including the skills, needs it running):\n\n- **Claude Desktop:** download `canvas-mcp.mcpb` from the [latest release](https://github.com/vishalsachdev/canvas-mcp/releases/latest) and double-click it. It prompts for your Canvas URL and token; no terminal needed. [Details](#install-as-a-claude-desktop-extension-easiest).\n- **Cursor, Zed, Windsurf, Continue, Claude Code and other clients:** `pip install` into a virtualenv, add your token to `.env`, and point your client at the `canvas-mcp-server` binary. [Local Installation](#local-installation) has the per-client config blocks.\n\n**2. Verify:** `canvas-mcp-server --test` should report a successful Canvas connection. Then restart your client.\n\n**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:\n\n```bash\nnpx skills add vishalsachdev/canvas-mcp\n```\n\nSee [Agent Skills](#-agent-skills) for the list. If your agent is Claude Code, the same recipes are also available as slash commands.\n\n## For AI Agents\n\n<!--\n  INLINE AGENT GUIDE: Intentionally duplicates AGENTS.md content.\n  WHY: Agents often can't fetch raw.githubusercontent.com or GitHub blob pages.\n  MAINTENANCE: When updating tools, also update AGENTS.md (source of truth).\n  See CLAUDE.md \"Documentation Maintenance\" for full guidelines.\n-->\n\nCanvas 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:\n\n<details>\n<summary><strong>Student Tools</strong> (click to expand)</summary>\n\n| Tool | Purpose | Example Prompt |\n|------|---------|----------------|\n| `get_my_upcoming_assignments` | Due dates for next N days | \"What's due this week?\" |\n| `get_my_todo_items` | Canvas TODO list | \"Show my TODO list\" |\n| `get_my_submission_status` | Submitted vs missing | \"Have I submitted everything?\" |\n| `get_my_course_grades` | Current grades | \"What are my grades?\" |\n| `get_my_peer_reviews_todo` | Pending peer reviews | \"What peer reviews do I need to do?\" |\n\n</details>\n\n<details>\n<summary><strong>Educator Tools</strong> (click to expand)</summary>\n\n| Tool | Purpose | Example Prompt |\n|------|---------|----------------|\n| `list_assignments` | All assignments in course | \"Show assignments in BADM 350\" |\n| `create_assignment` | Create new assignment | \"Create an assignment due Jan 26 with online text submission\" |\n| `update_assignment` | Update existing assignment | \"Change the due date for Assignment 3 to Feb 15\" |\n| `list_submissions` | Student submissions | \"Who submitted Assignment 3?\" |\n| `bulk_grade_submissions` | Grade multiple at once | \"Grade these 10 students\" |\n| `get_assignment_analytics` | Performance stats | \"Show analytics for Quiz 2\" |\n| `send_conversation` | Message students | \"Message students who haven't submitted\" |\n| `create_announcement` | Post announcements | \"Announce the exam date change\" |\n| **Module Management** | | |\n| `create_module` | Create course module | \"Create a module for Week 5\" |\n| `update_module` | Update module settings | \"Rename the midterm module\" |\n| `add_module_item` | Add content to module | \"Add the syllabus page to Week 1\" |\n| `delete_module` | Remove a module | \"Delete the empty test module\" |\n| **Page & Content** | | |\n| `create_page` | Create course page | \"Create a page for office hours\" |\n| `edit_page_content` | Update page content | \"Update the syllabus page\" |\n| `update_page_settings` | Publish/unpublish pages | \"Publish all Week 3 pages\" |\n| `bulk_update_pages` | Batch page operations | \"Unpublish all draft pages\" |\n| **File Management** | | |\n| `upload_course_file` | Upload local file to Canvas | \"Upload syllabus.pdf to the course\" |\n\n</details>\n\n<details>\n<summary><strong>Shared Tools</strong> (click to expand)</summary>\n\n| Tool | Purpose |\n|------|---------|\n| `list_courses` | All enrolled courses |\n| `get_course_details` | Course info + syllabus |\n| `list_pages` | Course pages |\n| `get_page_content` | Read page content |\n| `list_modules` | List course modules |\n| `list_module_items` | Items within a module |\n| `list_discussion_topics` | Discussion forums |\n| `list_discussion_entries` | Posts in a discussion |\n| `post_discussion_entry` | Add a discussion post |\n| `reply_to_discussion_entry` | Reply to a post |\n\n</details>\n\n<details>\n<summary><strong>Learning Designer Tools</strong> (course design & QC)</summary>\n\n| Tool | Purpose | Example Prompt |\n|------|---------|----------------|\n| `get_course_structure` | Full module→items tree as JSON | \"Show me the structure of CS 101\" |\n| `scan_course_content_accessibility` | WCAG violation scanner (20 checks: headings, tables, links, contrast, alt text, captions, DesignPLUS) | \"Audit accessibility for BADM 350\" |\n| `fetch_ufixit_report` | Institutional accessibility report | \"Pull the UFIXIT report for this course\" |\n| `parse_ufixit_violations` | Extract structured violations | \"Parse the UFIXIT violations\" |\n| `format_accessibility_summary` | Readable violation report | \"Summarize the accessibility issues\" |\n\n**Skills:** `canvas-course-qc` (pre-semester audit), `canvas-accessibility-auditor` (WCAG-oriented review), `canvas-course-builder` (scaffold courses from specs/templates).\n\n</details>\n\n<details>\n<summary><strong>Developer Tools</strong> (for bulk operations)</summary>\n\n| Tool | Purpose | When to Use |\n|------|---------|-------------|\n| `search_canvas_tools` | Discover MCP tools and code API operations | Finding available tools and bulk ops |\n| `execute_typescript` | Run TypeScript locally | 30+ items, custom logic, local per-item processing |\n\n**Decision tree:** Simple query → MCP tools. Batch grading (10+) → `bulk_grade_submissions`. Complex bulk (30+) → `execute_typescript`.\n\n</details>\n\n### Quick Reference\n\n**Course identifiers:** Canvas ID (`12345`), course code (`badm_350_120251_246794`), or SIS ID\n\n**Cannot do:** Create/delete courses, modify course settings, access other users' data\n\n**Rate limits:** ~700 requests/10 min. Use `max_concurrent=5` for bulk operations.\n\n**Full documentation:** [AGENTS.md](AGENTS.md) | [tools/TOOL_MANIFEST.json](tools/TOOL_MANIFEST.json) | [tools/README.md](tools/README.md)\n\n## Overview\n\nThe 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.\n\n## Latest Release: v1.12.0\n\n**Released:** August 2026 | **[Full Changelog](./CHANGELOG.md)** | **[All Releases](https://github.com/vishalsachdev/canvas-mcp/releases)**\n\nA safety release: every delete tool now asks first. **Four changes are breaking.** Each one's migration is a line long:\n\n- **`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](https://github.com/vishalsachdev/canvas-mcp/issues/318))\n- **`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](https://github.com/vishalsachdev/canvas-mcp/issues/318))\n- **`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](https://github.com/vishalsachdev/canvas-mcp/issues/318)). Thanks [@zqian](https://github.com/zqian) for the request\n- **Python 3.10 dropped** → `requires-python >= 3.11`; upgrade the interpreter, or pin `canvas-mcp<1.12` until you can ([#315](https://github.com/vishalsachdev/canvas-mcp/issues/315))\n\nAlso 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](https://github.com/vishalsachdev/canvas-mcp/issues/325), thanks [@jonespm](https://github.com/jonespm)); the **content migration** tools ([#309](https://github.com/vishalsachdev/canvas-mcp/issues/309)); and a **Skill Request** issue template ([#302](https://github.com/vishalsachdev/canvas-mcp/issues/302))\n\n<details>\n<summary>Previous releases</summary>\n\n**v1.11.0** — A protocol-correctness release. Breaking: `send_peer_review_reminders` is now `send_peer_review_inbox_messages` ([#303](https://github.com/vishalsachdev/canvas-mcp/issues/303)); tool failures set MCP `isError: true` ([#270](https://github.com/vishalsachdev/canvas-mcp/issues/270)); string-returning tools no longer duplicate their payload into `structuredContent.result` ([#271](https://github.com/vishalsachdev/canvas-mcp/issues/271)); FastMCP floor 3.4.7 ([#293](https://github.com/vishalsachdev/canvas-mcp/issues/293)). Thanks [@jonespm](https://github.com/jonespm)\n\n**v1.10.0** — A community bug-fix release driven by live reporter testing — thanks [@khagyard](https://github.com/khagyard), [@zqian](https://github.com/zqian), [@jonespm](https://github.com/jonespm), [@bruchris](https://github.com/bruchris), and [@SHIL0018](https://github.com/SHIL0018) (our second outside code contribution). Included a breaking `search_canvas_tools` response-shape change.\n\n- **Breaking: `search_canvas_tools` response shape v2** ([#281](https://github.com/vishalsachdev/canvas-mcp/issues/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](https://github.com/vishalsachdev/canvas-mcp/issues/287))\n- **Students can find their peer reviews** ([#275](https://github.com/vishalsachdev/canvas-mcp/issues/275)): `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 reporter\n- **`create_announcement` fails safely on student tokens** ([#283](https://github.com/vishalsachdev/canvas-mcp/issues/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 fallback\n- **Security:** stricter URL validation (code-scanning fix), Docker base bumped to `python:3.14-slim`, CI actions updated\n\n**v1.9.0** — Prompt-injection hardening ([#239](https://github.com/vishalsachdev/canvas-mcp/issues/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](https://github.com/vishalsachdev/canvas-mcp/issues/249)). Eleven adversarial review rounds pre-merge\n\n**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)\n\n**v1.7.0** — Correctness release from instructor bug reports: writes no longer report success when Canvas quietly did less than asked ([#219](https://github.com/vishalsachdev/canvas-mcp/issues/219)–[#221](https://github.com/vishalsachdev/canvas-mcp/issues/221)), Planner-API upcoming assignments ([#222](https://github.com/vishalsachdev/canvas-mcp/issues/222)), `check_enrollment` AMBIGUOUS answers ([#199](https://github.com/vishalsachdev/canvas-mcp/issues/199)), wire-format fixes for pages/inbox ([#207](https://github.com/vishalsachdev/canvas-mcp/issues/207), [#208](https://github.com/vishalsachdev/canvas-mcp/issues/208)), MCP-spec tool annotations ([#204](https://github.com/vishalsachdev/canvas-mcp/issues/204)), CSV rubric format fix ([#190](https://github.com/vishalsachdev/canvas-mcp/issues/190)), anonymization consolidated to the client layer ([#179](https://github.com/vishalsachdev/canvas-mcp/issues/179)). Thanks [@khagyard](https://github.com/khagyard) and [@zqian](https://github.com/zqian)\n\n**v1.6.0** — Tier 1 student write tools behind an explicit allowlist ([#170](https://github.com/vishalsachdev/canvas-mcp/issues/170)), `get_my_enrollments` / `get_my_profile` ([#171](https://github.com/vishalsachdev/canvas-mcp/issues/171)), three-tier anonymization ([#166](https://github.com/vishalsachdev/canvas-mcp/issues/166), [#179](https://github.com/vishalsachdev/canvas-mcp/issues/179)), rubric association fixes ([#180](https://github.com/vishalsachdev/canvas-mcp/issues/180), [#181](https://github.com/vishalsachdev/canvas-mcp/issues/181)), `execute_typescript` became opt-in ([#178](https://github.com/vishalsachdev/canvas-mcp/issues/178)), ruff gating CI ([@w3lld1](https://github.com/w3lld1), PR #186)\n\n**v1.5.0** — `get_syllabus` ([#134](https://github.com/vishalsachdev/canvas-mcp/issues/134)), `create_rubric_from_csv` ([#119](https://github.com/vishalsachdev/canvas-mcp/issues/119)), `update_discussion_topic` ([#154](https://github.com/vishalsachdev/canvas-mcp/issues/154)), fastmcp 2.x migration ([#145](https://github.com/vishalsachdev/canvas-mcp/issues/145)), dependency advisories cleared 33 → 0 with a gating CI scan (PR #156)\n\n**v1.4.0** — `check_enrollment` (PR #126), Claude Desktop Extension `.mcpb`, Entra ID authenticated institutional hosting ([#115](https://github.com/vishalsachdev/canvas-mcp/issues/115), PR #125), HTTP fails closed without auth gate (PR #123)\n\n**v1.3.0** — `create_rubric` (PR #100), `read_course_file` ([@DomBarker99](https://github.com/DomBarker99), PR #90), event-loop fix for user-scoped tools (PR #99), bulk-delete safety cap (PR #96), dependency pruning (PR #93)\n\n**v1.2.0** — Role-Based Tool Filtering ([@Promithius-DR](https://github.com/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)\n\n**v1.1.0** — Hosted Server (`mcp.illinihunt.org`), Learning Designer tools + 3 skills, Agent Skills on skills.sh, File Management ([@Metzpapa](https://github.com/Metzpapa), PR #75), Token Optimization, Generic Distribution\n\n**v1.0.8** — Security Hardening (PII sanitization, audit logging, sandbox-by-default), Ruff linting, 235+ tests\n\n**v1.0.7** — Assignment Update Tool (`update_assignment`), complete CRUD, 9 tests\n\n**v1.0.6** — Module Management (7 tools), Page Settings (2 tools), 235+ tests\n\n**v1.0.5** — Claude Code Skills, GitHub Pages site\n\n**v1.0.4** — Code Execution API for token-efficient bulk operations, MCP 2.14 compliance\n\n</details>\n\n### For Students 👨‍🎓\nGet AI-powered assistance with:\n- Tracking upcoming assignments and deadlines\n- Monitoring your grades across all courses\n- Managing peer review assignments\n- Accessing course content and discussions\n- Organizing your TODO list\n\n**[→ Get Started as a Student](https://canvas-mcp.illinihunt.org/student-guide.html)**\n\n### For Educators 👨‍🏫\nEnhance your teaching with:\n- Assignment and grading management\n- Student analytics and performance tracking\n- Discussion and peer review facilitation\n- Privacy controls designed to support FERPA-conscious workflows\n- Bulk messaging and communication tools\n\n**[→ Get Started as an Educator](https://canvas-mcp.illinihunt.org/educator-guide.html)**\n\n### For Learning Designers 🎨\nAI-powered course design and quality assurance:\n- **Course scaffolding** — Build entire course structures from specs, templates, or by cloning existing courses\n- **Quality audits** — Pre-semester QC checks for structure, content, publishing, and completeness\n- **Accessibility review** — 20-check WCAG-oriented scanner (headings, tables, scope, contrast, alt text, links, captions, DesignPLUS migration), prioritized reports, guided remediation, and verification\n- **Course structure analysis** — Full module→items tree in a single call for rapid course review\n\n3 dedicated skills (`canvas-course-qc`, `canvas-accessibility-auditor`, `canvas-course-builder`) plus the `get_course_structure` tool.\n\n## 🤖 Agent Skills\n\nPre-built workflow recipes that teach AI agents how to use Canvas MCP tools effectively. Available for **40+ coding agents** via [skills.sh](https://skills.sh), or as Claude Code-specific slash commands.\n\n### Install via skills.sh (Any Agent)\n\nSkills call the MCP tools, so [install the server](#quick-start) first; a skill without the server has nothing to run.\n\n```bash\nnpx skills add vishalsachdev/canvas-mcp\n```\n\nThis launches an interactive picker to install skills into your agent of choice (Claude Code, Cursor, Codex, OpenCode, Cline, Zed, and [many more](https://skills.sh)).\n\n| Skill | For | What It Does |\n|-------|-----|--------------|\n| `canvas-week-plan` | Students | Weekly planner: due dates, submission status, grades, peer reviews |\n| `canvas-morning-check` | Educators | Course health dashboard: submission rates, struggling students, deadlines |\n| `canvas-bulk-grading` | Educators | Grading decision tree: single → bulk → code execution with safety checks |\n| `canvas-peer-review-manager` | Educators | Full peer review pipeline: analytics, quality analysis, reminders, reports |\n| `canvas-discussion-facilitator` | Both | Discussion browsing, participation monitoring, replying, facilitation |\n| `canvas-course-qc` | Learning Designers | Pre-semester quality audit: structure, content, publishing, completeness |\n| `canvas-accessibility-auditor` | Learning Designers | WCAG scan, prioritized report, guided remediation, verification |\n| `canvas-course-builder` | Learning Designers | Scaffold courses from specs, templates, or existing courses |\n\nInstall a specific skill:\n\n```bash\nnpx skills add vishalsachdev/canvas-mcp -s canvas-week-plan\n```\n\n### Claude Code Slash Commands\n\nIf you use [Claude Code](https://claude.ai/code), the same workflows are also available as slash commands:\n\n```\nYou: /canvas-morning-check CS 101\nClaude: [Generates comprehensive course status report]\n\nYou: /canvas-week-plan\nClaude: [Shows prioritized weekly assignment plan]\n```\n\nClaude Code skills are located in `.claude/skills/` and can be customized for your workflow.\n\n**Want a custom skill?** [Submit a request](https://github.com/vishalsachdev/canvas-mcp/issues/new?labels=skill-request&title=[Skill%20Request]) describing your repetitive workflow!\n\n## 🔒 Privacy & Data Protection\n\n### For Educators: FERPA-Conscious Data Handling\n\nCanvas 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:\n\n- **Response anonymization** converts supported identity fields to consistent anonymous IDs (Student_xxxxxxxx)\n- **Email masking and supported PII-pattern filtering** in discussion posts and submissions\n- **Local server deployment** with configurable privacy controls (`ENABLE_DATA_ANONYMIZATION=true`)\n- **Privacy-conscious analytics**: Ask \"Which students need support?\" while reducing the identity data returned to the AI client\n- **De-anonymization mapping tool** for faculty to correlate anonymous IDs with real students locally\n\nWhen `ENABLE_DATA_ANONYMIZATION=true` is enabled, supported identity fields are anonymized before tool results reach the AI client. Review the [Educator Guide](https://canvas-mcp.illinihunt.org/educator-guide.html) and your institution's requirements before using student data.\n\n### For Students: Data Scope & Privacy\n\n- **Canvas-scoped access**: Student-specific tools use Canvas's \"self\" endpoints; shared course-content tools follow the permissions Canvas grants your account\n- **No shared-server credential storage**: Local mode reads your Canvas token from your own `.env`. In authenticated institutional HTTP deployments, each request supplies the user's Canvas token and the server does not store it.\n- **No built-in product analytics**: Canvas MCP does not add telemetry; Canvas and your AI client still apply their own logging and data policies\n- **Optional anonymization**: Student tools are scoped to your own Canvas data, but your AI client's privacy policy still applies\n\n## Hosted Server (Retired)\n\nThe 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](#local-installation)** below.\n\nThe 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/](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.\n\n---\n\n## Prerequisites (Local Installation)\n\n- **Python 3.11+** - Required for modern features and type hints\n- **Canvas API Access** - API token and institution URL\n- **MCP Client** - An MCP-compatible client (Claude Desktop, Cursor, Zed, Windsurf, Continue, etc.); setup and capabilities vary by client\n\n### Supported MCP Clients\n\nCanvas MCP is designed for MCP-compatible clients, including [Claude Desktop](https://claude.ai/download), [Cursor](https://cursor.sh), [Zed](https://zed.dev), [Windsurf](https://codeium.com/windsurf), [Continue](https://continue.dev), [Replit](https://replit.com), and [Copilot Studio](https://www.microsoft.com/microsoft-copilot/microsoft-copilot-studio). Setup details and supported capabilities vary by client.\n\nCanvas 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.\n\n## Install as a Claude Desktop Extension (easiest)\n\nIf you use **Claude Desktop**, you can install Canvas MCP with one click — no terminal, no config-file editing:\n\n1. Download `canvas-mcp.mcpb` from the [latest release](https://github.com/vishalsachdev/canvas-mcp/releases/latest).\n2. Double-click the file (or drag it into Claude Desktop → Settings → Extensions).\n3. When prompted, enter your **Canvas API URL** — this must include the `/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](#2-configure-environment)). The token is stored in your OS keychain.\n\nThe 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.\n\n## Local Installation\n\n### 1. Install Dependencies\n\n```bash\n# (Recommended) Use a dedicated virtualenv so the MCP binary is in a stable location\npython3 -m venv .venv\n. .venv/bin/activate\n\n# Install the package editable\npip install -e .\n```\n\n### 2. Configure Environment\n\n```bash\n# Copy environment template\ncp env.template .env\n\n# Edit with your Canvas credentials\n# Required: CANVAS_API_TOKEN, CANVAS_API_URL\n```\n\nGet your Canvas API token from: **Canvas → Account → Settings → New Access Token**\n\n> **Some institutions gate token creation.** Where self-service is disabled, the\n> \"New Access Token\" button is missing or errors out, and tokens are issued through an\n> IT request form instead. Check your institution's IT knowledge base before concluding\n> that API access is unavailable to you.\n>\n> **University of Illinois Urbana-Champaign** works this way for *everyone* — students\n> and instructors alike. Request a token with the\n> [Canvas API Token Request form](https://help.uillinois.edu/TDClient/42/UIUC/Requests/TicketRequests/NewForm?ID=4AZBjiZfXWs_&RequestorType=Service)\n> (NetID login required). Once it is approved:\n>\n> 1. Go to **Canvas → Account → Settings → Approved Integrations**, find the new token,\n>    click **Activate**, and refresh the page.\n> 2. Retrieve the token value from the U of I Box link Technology Services sends you.\n>\n> As of August 2026, all new Illinois tokens carry a **30-day expiration** (an upstream\n> Instructure requirement). Expiry is not monitored or announced, and expired tokens are\n> removed without notice — request the replacement before the current one lapses.\n> Full details: [Answers KB 150325](https://answers.uillinois.edu/illinois/internal/150325).\n>\n> **Students elsewhere**: if you see \"There is a limit to the number of access tokens you\n> can create\" or cannot find the token creation option, contact your institution's Canvas\n> administrator or IT support department to request API access.\n\n### 3. MCP Client Configuration\n\nCanvas MCP is designed for MCP-compatible clients. Below are configuration examples for popular clients; exact setup and capabilities vary by client:\n\n<details open>\n<summary><strong>Claude Desktop</strong> (Most Popular)</summary>\n\n**Configuration file location:**\n- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`\n- **Windows**: `%APPDATA%\\Claude\\claude_desktop_config.json`\n\n**Configuration:**\n```json\n{\n  \"mcpServers\": {\n    \"canvas-api\": {\n      \"command\": \"/absolute/path/to/canvas-mcp/.venv/bin/canvas-mcp-server\"\n    }\n  }\n}\n```\n\n**Note**: Use the absolute path to your virtualenv binary to avoid issues with shell-specific PATH entries (e.g., pyenv shims).\n\n</details>\n\n<details>\n<summary><strong>Cursor</strong></summary>\n\n**Configuration file location:**\n- **macOS/Linux**: `~/.cursor/mcp_config.json`\n- **Windows**: `%USERPROFILE%\\.cursor\\mcp_config.json`\n\n**Configuration:**\n```json\n{\n  \"mcpServers\": {\n    \"canvas-api\": {\n      \"command\": \"/absolute/path/to/canvas-mcp/.venv/bin/canvas-mcp-server\"\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Zed</strong></summary>\n\n**Configuration:** Add to Zed's `settings.json` (accessible via Settings menu)\n\n```json\n{\n  \"context_servers\": {\n    \"canvas-api\": {\n      \"command\": {\n        \"path\": \"/absolute/path/to/canvas-mcp/.venv/bin/canvas-mcp-server\",\n        \"args\": []\n      }\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Windsurf IDE</strong></summary>\n\n**Configuration file location:**\n- **macOS**: `~/Library/Application Support/Windsurf/mcp_config.json`\n- **Windows**: `%APPDATA%\\Windsurf\\mcp_config.json`\n\n**Configuration:**\n```json\n{\n  \"mcpServers\": {\n    \"canvas-api\": {\n      \"command\": \"/absolute/path/to/canvas-mcp/.venv/bin/canvas-mcp-server\"\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Continue</strong></summary>\n\n**Configuration:** Add to Continue's `config.json` (accessible via Continue settings)\n\n```json\n{\n  \"mcpServers\": {\n    \"canvas-api\": {\n      \"command\": \"/absolute/path/to/canvas-mcp/.venv/bin/canvas-mcp-server\"\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Other MCP Clients</strong></summary>\n\nFor other MCP-compatible clients, the general pattern is:\n\n1. Locate your client's MCP configuration file\n2. Add a server entry with:\n   - **Server name**: `canvas-api` (or any name you prefer)\n   - **Command**: Full path to `canvas-mcp-server` binary\n   - **Optional args**: Additional arguments if needed\n\nConsult your client's MCP documentation for specific configuration format and file locations.\n\n</details>\n\n> **Windows users**: Replace forward slashes with backslashes in paths (e.g., `C:\\Users\\YourName\\canvas-mcp\\.venv\\Scripts\\canvas-mcp-server.exe`)\n\n## Verification\n\nTest your setup:\n\n```bash\n# Test Canvas API connection\ncanvas-mcp-server --test\n\n# View configuration\ncanvas-mcp-server --config\n\n# Start server (for manual testing)\ncanvas-mcp-server\n```\n\n## Available Tools\n\nThe 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.\n\n### Tool Categories\n\n**Student Tools** (New!)\n- Personal assignment tracking and deadline management\n- Grade monitoring across all courses\n- TODO list and peer review management\n- Submission status tracking\n\n**Shared Tools** (Both Students & Educators)\n1. **Course Tools** - List and manage courses, get detailed information, generate summaries with syllabus content\n2. **Discussion & Announcement Tools** - Manage discussions, announcements, and replies\n3. **Page & Content Tools** - Access pages, modules, and course content\n\n**Educator Tools**\n4. **Assignment Tools** - Handle assignments, submissions, and peer reviews with analytics\n5. **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.\n6. **User & Enrollment Tools** - Manage enrollments, users, and groups\n7. **Analytics Tools** - View student analytics, assignment statistics, and progress tracking\n8. **Messaging Tools** - Send messages and announcements to students\n\n**Developer Tools**\n9. **Discovery Tools** - Search registered MCP tools and code execution API operations with `search_canvas_tools`; list code execution modules with `list_code_api_modules`\n10. **Code Execution Tools** - Execute TypeScript code with `execute_typescript` so bulk item processing can stay out of the model's context\n\n📖 [View Full Tool Documentation](tools/README.md) for detailed information about the available tools.\n\n## Code Execution API\n\nFor bulk operations (30+ items), Canvas MCP supports **TypeScript code execution**. Process bulk operations locally without loading every item into the model’s context.\n\n| Approach | Best For | Context Behavior |\n|----------|----------|------------------|\n| MCP tools | Simple queries, small datasets | Returns tool results to the model |\n| `bulk_grade_submissions` | Batch grading 10-29 items | Handles a defined batch in one tool call |\n| `execute_typescript` | 30+ items, custom logic | Processes items locally and returns selected output |\n\nUse `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](https://github.com/vishalsachdev/canvas-mcp/issues/157)). Works on macOS, Linux, and Windows.\n\n<details>\n<summary>Code execution examples and security details</summary>\n\n### Bulk Grading Example\n\n```typescript\nimport { bulkGrade } from './canvas/grading/bulkGrade';\n\nawait bulkGrade({\n  courseIdentifier: \"60366\",\n  assignmentId: \"123\",\n  gradingFunction: (submission) => {\n    const notebook = submission.attachments?.find(f =>\n      f.filename.endsWith('.ipynb')\n    );\n    if (!notebook) return null;\n    return { points: 100, comment: \"Great work!\" };\n  }\n});\n```\n\n### Security Modes\n\n| Mode | Config | What It Does |\n|------|--------|-------------|\n| Local sandbox (default) | None needed | Timeout 120s, memory 512MB, filtered environment, best-effort network controls |\n| Container sandbox | `TS_SANDBOX_MODE=container` | Container filesystem isolation via Docker/Podman; egress guarantees depend on deployment configuration |\n| No sandbox | `ENABLE_TS_SANDBOX=false` | Full local access (not recommended) |\n\nSee [Bulk Grading Example](examples/bulk_grading_example.md) for a detailed walkthrough.\n\n</details>\n\n## Usage\n\nMCP clients start the server automatically. Just ask naturally:\n\n- *\"What's due this week?\"* / *\"Show my grades\"* / *\"What peer reviews do I need?\"*\n- *\"Who hasn't submitted Assignment 3?\"* / *\"Send reminders to missing students\"*\n\nQuick start guides: [Student](examples/student_quickstart.md) | [Educator](examples/educator_quickstart.md) | [Real-World Workflows](examples/real_world_workflows.md) | [Troubleshooting](examples/common_issues.md)\n\n## Documentation\n\n- **[Tool Documentation](tools/README.md)** — Reference for the available tools, including optional feature-gated tools\n- **[Student Guide](https://canvas-mcp.illinihunt.org/student-guide.html)** — Getting started as a student\n- **[Educator Guide](https://canvas-mcp.illinihunt.org/educator-guide.html)** — FERPA considerations and educator workflows\n- **[Bulk Grading Example](examples/bulk_grading_example.md)** — Batch grading walkthrough\n- **[Development Guide](CLAUDE.md)** — Architecture and contributing\n\n<details>\n<summary>Technical details</summary>\n\nBuilt 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.\n\n</details>\n\n## Troubleshooting\n\nIf you encounter issues:\n\n1. **Server Won't Start** - Verify your [Local Installation](#local-installation) setup: `.env` file, virtual environment path, and dependencies\n2. **Authentication Errors** - Check your Canvas API token validity and permissions\n3. **Connection Issues** - Verify Canvas API URL correctness and network access\n4. **Debugging** - Check your MCP client's console logs (e.g., Claude Desktop's developer console) or run server manually for error output\n\n## Security\n\nRuntime security and privacy controls:\n\n| Layer | Default |\n|-------|---------|\n| PII sanitization in logs | `LOG_REDACT_PII=true` |\n| Token validation on startup | Always on |\n| Structured audit logging | Opt-in: `LOG_ACCESS_EVENTS=true` |\n| Code execution guardrails | `ENABLE_TS_SANDBOX=true` (best-effort in local mode) |\n\nOptional anonymization for FERPA-conscious educator workflows: `ENABLE_DATA_ANONYMIZATION=true`. See [Educator Guide](https://canvas-mcp.illinihunt.org/educator-guide.html) for scope and configuration details.\n\n## Publishing\n\nPublished to [PyPI](https://pypi.org/project/canvas-mcp/), [MCP Registry](https://registry.modelcontextprotocol.io/), and [skills.sh](https://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.\n\n## Contributing\n\nContributions are welcome! Feel free to:\n- Submit issues for bugs or feature requests\n- Create pull requests with improvements\n- Share your use cases and feedback\n\n## Contributors\n\nThanks to everyone who has contributed to Canvas MCP:\n\n- **[@DomBarker99](https://github.com/DomBarker99)** — `read_course_file` tool for remote MCP deployments (#90)\n- **[@Promithius-DR](https://github.com/Promithius-DR)** — Role-based tool filtering and tool annotations (#84)\n- **[@Metzpapa](https://github.com/Metzpapa)** — File download and listing tools (#75)\n- **[@JCSnap](https://github.com/JCSnap)** — Student tool bug fixes (#72, #73)\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n---\n\nCreated by [Vishal Sachdev](https://github.com/vishalsachdev)\n",
  "bytes": 36884,
  "sha": "7f50ee2f42594923210d12005cc911b5d88156ab887b6578099137d89b2c909a",
  "repo_slug": "vishalsachdev/canvas-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/skl_vishalsachdev_canvas_mcp_development_can_1949df46/readme"
}