Canvas LMS MCP Server
The Canvas LMS MCP Server provides 119 tools for AI agents to read, manage, and automate nearly every aspect of a Canvas LMS instance.
Health & Connectivity
Verify Canvas API reachability and token validity.
Courses
List, create, update, and fetch course details, syllabi, and full course structure.
Assignments
List, create, update, and delete assignments and assignment groups.
Submissions & Grading
View, grade, and comment on submissions; submit rubric assessments; audit gradebook history (grade changes by date, grader, and assignment).
Rubrics
List, view, create, and submit rubric assessments.
Quizzes (Classic)
List quizzes, questions, submissions, and student answers; score individual questions.
New Quizzes (LTI)
Create, update, and delete quizzes and quiz items (multiple-choice, true/false, essay, matching, numeric).
Files
List, upload, download, delete files and folders.
Users & Enrollments
Search users, list students/course users, get profiles; enroll/remove users; list groups and group members.
Discussions & Announcements
List, create, update, delete discussion topics and announcements; post replies.
Modules & Pages
List, create, update modules and module items; list, create, update, delete wiki pages.
Calendar
List, create, and update calendar events.
Conversations (Inbox)
List conversations, read threads, send messages, get unread count.
Peer Reviews
List, create, and delete peer review assignments.
Accounts (Admin)
List accounts, sub-accounts, account courses/users, and available reports.
Analytics
Search course content; get course-level and per-student analytics and activity stream summaries.
Outcomes
List outcome groups, get outcome details, results, rollups, and mastery distributions.
Student & Instructor Workflows
Students: view own courses, grades, submissions, and upcoming assignments.
Instructors: dashboard cards, to-do items, upcoming events, missing submissions, submission comments needing attention, and students needing intervention.
Privacy (FERPA Mode)
Opt-in pseudonymization of student PII in all tool responses, with an optional audit-logged reverse-lookup tool.
Deployment & Integration
Deployable via stdio, HTTP, or Docker; importable as a Node.js library. Includes pre-built agent skills for common workflows (e.g., identifying at-risk students, auditing gradebooks) and an interactive course structure viewer for MCP App-compatible hosts.
Provides tools for interacting with Canvas LMS, enabling AI agents to manage courses, assignments, submissions, rubrics, quizzes, files, users, groups, enrollments, discussions, modules, pages, calendar, conversations, peer reviews, accounts, analytics, outcomes, and more.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Canvas LMS MCP ServerList my current courses"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Canvas LMS MCP Server
The TypeScript MCP server for Canvas LMS.
MCP server for Canvas LMS. Read courses, assignments, submissions, rubrics, quizzes; grade, comment, manage course content, and handle Canvas admin workflows from any AI agent.
165 tools across Canvas courses, assignments, submissions, gradebook history, rubrics, quizzes, New Quizzes (LTI), files, users, groups, enrollments, discussions, modules, pages, calendar, conversations, peer reviews, accounts, analytics, outcomes, grading standards, grade projection, link audit, accessibility audit, content exports, content migrations, quiz accommodations, appointment groups, student workflows, student search, dashboard, instructor attention workflows, and health checks. Three deployment modes: stdio, HTTP, and library import.
One-click install (Claude Desktop)
Download
canvas-lms-mcp.mcpbfrom the latest release.Double-click the file (or drag it into Claude Desktop's Extensions settings).
When prompted, paste your Canvas API token and Canvas base URL — your institution's origin only, e.g.
https://school.instructure.com(do not append/api/v1). Teachers and staff handling student data can also flip FERPA mode — pseudonymize students on in the same dialog (what it does).
No terminal, no Node.js install, no config-file editing — Claude Desktop bundles the runtime and handles config for you. The same .mcpb works in Claude Code and MCP for Windows.
Prefer the terminal? Use the Quick Start below.
Related MCP server: Canvas MCP
One-click install (Cursor / VS Code)
Click a badge to open Cursor or VS Code with canvas-lms-mcp pre-configured (placeholder credentials filled in — replace with your actual Canvas API token and base URL after install). For manual config-file setup, see docs/manual-setup.md.
One-click install (Claude Code plugin)
/plugin marketplace add bruchris/canvas-lms-mcp
/plugin install canvas-lms-mcpInstalls the MCP server (via npx canvas-lms-mcp) and all 16 Agent Skills in a single step, versioned and updatable through Claude Code's plugin manager. On enable, Claude Code prompts for your Canvas API token and base URL (and the optional FERPA pseudonymization settings). See the Claude Code plugins reference for how marketplaces and plugin manifests work.
Comparison
canvas-lms-mcp | |||
Language | TypeScript | Python | TypeScript |
Tools | 165 | 80+ | 54 |
License | |||
Last commit |
Quick Start
1. Get a Canvas API Token
Log in to your Canvas instance
Go to Account > Settings
Scroll to Approved Integrations and click + New Access Token
Give it a name (e.g., "MCP Server") and click Generate Token
Copy the token immediately -- you won't see it again
2. Run the Setup Wizard
npx canvas-lms-mcp initThe wizard detects your installed AI clients (Claude Desktop, Cursor, VS Code, Windsurf, Codex, Continue, Claude Code), prompts for your Canvas token and base URL, validates the credentials against your Canvas instance, and writes the config for every client you select.
add-mcp is also supported as a generic alternative: npx add-mcp canvas-lms-mcp.
For clients not yet supported by the wizard, or if you prefer editing config files by hand, see docs/manual-setup.md.
Agent Skills
Install reusable Canvas workflows into Claude Code, Cursor, GitHub Copilot, Cline, and 40+ other AI agents:
npx skills add bruchris/canvas-lms-mcpSkill | Description |
| Surface students with missing assignments or declining grades and send targeted outreach |
| Inspect the full grade-change audit trail — who changed what grade, when, and by how much |
| Track learning outcome mastery and class-wide proficiency for accreditation and program review |
| Pre-launch WCAG accessibility and broken-link sweep of a course, with a prioritised remediation list |
| Create, publish, and manage Canvas Scheduler office-hour sign-up slots and see who reserved |
Skills are markdown workflow files (no extra dependencies). They work with the MCP server you already have installed. See the skills/ directory for the full list.
Example Prompts
Once configured, try these prompts with your AI client:
"List all my active courses"
"Show me the assignments for course 12345"
"What's the average grade on the midterm exam?"
"Grade Alice's essay submission with a B+ and add feedback"
"Show me the rubric for the final project"
"What discussions are happening in my Biology course?"
"List all upcoming calendar events for course 12345"
"Send a message to student 67890 about their missing assignment"
Tool Inventory
All Registered Tools (165)
Category | Tools |
Health |
|
Courses |
|
Assignments |
|
Assignment Overrides |
|
Submissions |
|
Submissions Awaiting Grading |
|
Submission Files |
|
Rubrics |
|
Quizzes |
|
Quiz Question Responses |
|
Quiz Accommodations |
|
New Quizzes (LTI) |
|
New Quiz Accommodations |
|
Files |
|
Gradebook History |
|
Grade Explanation |
|
Grading Policy |
|
Grade Projection |
|
Grading Standards |
|
Users |
|
Groups |
|
Enrollments |
|
Discussions |
|
Modules |
|
Pages |
|
Calendar |
|
Conversations |
|
Peer Reviews |
|
Accounts |
|
Analytics |
|
Outcomes |
|
Content Exports |
|
Course Setup |
|
Link Audit |
|
Accessibility Audit |
|
Appointment Groups |
|
Student |
|
Student Search |
|
Dashboard |
|
Attention |
|
FERPA (conditional) |
|
117 tools are read-only and 48 tools perform Canvas write operations. When FERPA mode is enabled, resolve_pseudonym is registered as the 166th tool overall (118th read tool).
All write tools require appropriate Canvas permissions. Canvas enforces its own permission model -- the MCP server does not bypass it.
Bulk operations
Canvas applies rate limits per-user. When creating many New Quizzes items (e.g., RAG-generated quizzes), call the tools serially rather than in parallel. For >50 items, chunk and pause between batches. If you hit a rate-limit error, wait a few seconds and retry.
MCP Resources (2)
Resource | URI Template | Type |
Course Syllabus |
| text/html |
Assignment Description |
| text/html |
Interactive widgets
view_course_structure is an MCP Apps tool: hosts that support the spec render an interactive tree explorer (collapsible modules, type-filter chips, title search, published/unpublished badges, links open in a new tab); hosts that don't fall back transparently to the same JSON payload that get_course_structure returns. The widget is self-contained — no external scripts, fonts, or network calls — and is shipped inline with the tool definition.
Tool | UI resource URI | Fallback |
|
| Same JSON payload as |
Host verification (Claude Desktop, ChatGPT, Codex fallback) is performed manually after each release, since it requires real Canvas credentials. A screenshot will be added once the first verified host pass lands.
Deployment Modes
stdio (Default)
For local AI clients like Claude Desktop, Cursor, and VS Code. The server communicates over stdin/stdout.
npx canvas-lms-mcp --token $CANVAS_API_TOKEN --base-url $CANVAS_BASE_URLHTTP
For web-based clients or hosted services. Starts an HTTP server with Streamable HTTP transport.
npx canvas-lms-mcp serve \
--token $CANVAS_API_TOKEN \
--base-url $CANVAS_BASE_URL \
--port 3001 \
--allowed-origin https://your-app.example.comEndpoints:
POST /mcp-- MCP protocol endpointGET /health-- Health check (returns{"status":"ok"})
Docker
docker compose up -dRequires CANVAS_API_TOKEN and CANVAS_BASE_URL environment variables. See docker-compose.yml.
services:
canvas-lms-mcp:
build: .
ports:
- "3001:3001"
environment:
- CANVAS_API_TOKEN=${CANVAS_API_TOKEN}
- CANVAS_BASE_URL=${CANVAS_BASE_URL}Library Import
Use the server factory directly in your own Node.js application:
import { createCanvasMCPServer } from 'canvas-lms-mcp'
const { server, canvas } = createCanvasMCPServer({
token: userToken,
baseUrl: canvasBaseUrl,
})Or use the Canvas client standalone (no MCP dependency):
import { CanvasClient } from 'canvas-lms-mcp/canvas'
const canvas = new CanvasClient({
token: userToken,
baseUrl: canvasBaseUrl,
})
const courses = await canvas.courses.list()CLI Reference
Flag | Env Variable | Default | Description |
|
| (required) | Canvas personal access token |
|
| (required) | Canvas instance URL |
| -- | stdio mode | Switch to HTTP mode |
| -- |
| HTTP server port |
|
|
| CORS allowed origin |
|
| (all tools) | Filter tools by Canvas role: |
Environment Variables
Variable | Required | Description |
| Yes | Canvas personal access token |
| Yes | Canvas instance URL (e.g., |
| No | CORS origin for HTTP mode (default: |
| No | Filter the tool list by role: |
| No | Set to |
| No | Set to |
| No | Set to |
| No | Absolute path that overrides the default pseudonym map directory |
| No | Path to an append-only file that mirrors |
Student assignment submission (opt-in)
Two write tools — upload_submission_file and submit_assignment — let a student submit their own work via the MCP server. They are off by default and must be explicitly enabled:
# Environment variable
CANVAS_ENABLE_ASSIGNMENT_SUBMISSION=true canvas-lms-mcp --base-url https://school.instructure.com
# CLI flag
canvas-lms-mcp --base-url https://school.instructure.com --enable-assignment-submissionSupported submission types: online_text_entry, online_url, online_upload.
Two-step workflow for file uploads:
Call
upload_submission_file(course_id, assignment_id, name, content_base64, content_type)once per file — returns aCanvasFilewith anid.Call
submit_assignment(course_id, assignment_id, submission_type: 'online_upload', file_ids: [...])with the collected ids.
Why off by default: submissions are irreversible (Canvas has no unsubmit API) and may consume a limited attempt. An explicit opt-in makes agentic submission a deliberate, documented choice. The destructiveHint: true annotation on both tools also triggers the MCP host's own confirmation prompt. Before calling, the model shows the user exactly what will be submitted and asks for explicit confirmation.
Role filtering: with CANVAS_ROLE=teacher or admin, these tools are hidden (they act on the token holder's own student enrollment and are meaningless for staff tokens).
FERPA mode (student pseudonymization)
Opt-in, server-side mode that replaces student names and contact info in tool output with stable pseudonyms (Student 1, Student 2, …) so structured PII never reaches the LLM. Designed for teacher / staff tokens — students running their own MCP should leave the flag off, otherwise their own data is replaced too.
CANVAS_PSEUDONYMIZE_STUDENTS=true canvas-lms-mcp serve --base-url https://school.instructure.comWhat it does:
Replaces
name,short_name,sortable_name,email,login_id,sis_user_id,integration_id,avatar_url,bio,pronouns, andlast_loginon student users.Maps are stable per
(canvas-base-url, course_id)and persisted to disk under${XDG_DATA_HOME:-~/.local/share}/canvas-lms-mcp/pseudonyms(Linux),~/Library/Application Support/canvas-lms-mcp/pseudonyms(macOS), or%APPDATA%\canvas-lms-mcp\pseudonyms(Windows). Override the location withCANVAS_PSEUDONYM_DIR.Student 7in March is stillStudent 7in October. Dropped students are marked historical; their slot is never reused.Tool responses carry
_meta.pseudonymized: trueso the agent can mention it in summaries.Cannot be toggled per tool call, per HTTP header, or per session. The env flag is the only switch.
What it does NOT do:
It does not scrub free text inside submission bodies, discussion messages, or page bodies — a student writing "Hi, I'm Alice" in their submission still says so. Document this for your end users.
It cannot re-anonymize the LLM's working memory. If the agent saw real names in a prior turn, they remain in its context.
It does not protect the bare
canvas-lms-mcp/canvaslibrary import — pseudonymization is a tool-layer concern. Embedders that use the raw Canvas client get raw data.HTTP transports are process-wide: to run both modes side by side, run two server instances.
Conversation participants are pseudonymized as Person N from a cross-course pool. If you chat with a colleague, they appear as Person 1 rather than their name — conservative because conversations span courses and we cannot infer their role.
Optional resolve_pseudonym reverse-lookup tool: register it only by also setting CANVAS_PSEUDONYMIZE_REVERSE_LOOKUP=true. Every call is audit-logged to stderr (and to CANVAS_PSEUDONYM_AUDIT_LOG if set). When the flag is off the tool is absent from tools/list — a prompt-injection attempt to call it fails at the protocol layer.
Threat model and design rationale in docs/superpowers/specs/2026-05-25-ferpa-pseudonymization.md.
Role-based tool filtering
Optionally narrow the tool list to a single Canvas role so an agent sees only the tools relevant to its user. This is a client-side UX / context-reduction filter only — Canvas still enforces real permissions server-side. Setting CANVAS_ROLE=admin does not grant admin powers; a 403 still comes from Canvas if the token lacks the scope.
# stdio: env var or --role flag (flag wins)
CANVAS_ROLE=student canvas-lms-mcp --base-url https://school.instructure.com
canvas-lms-mcp --base-url https://school.instructure.com --role teacherThree roles, plus the default of "unset = every tool":
| Tools exposed | Typical use |
(unset) | all (~165) | default; backwards-compatible |
| ~59 | a student's own courses, grades, submissions, and read-only course content |
| ~138 | grading, roster, content authoring, analytics |
| ~150 | everything |
Notes:
Equivalent to
CANVAS_ROLEin vishalsachdev/canvas-mcp — set the same value to migrate.Role values are case-insensitive;
allis accepted as an explicit "no filter". An unrecognised value logs a warning to stderr and registers all tools (a config typo never stops the server).teacher/admindo not see the student-onlyget_my_*tools in v1 — they should uselist_submissions/get_submissionetc. instead.The FERPA
resolve_pseudonymtool isteacher/admin-only and is never exposed tostudent, even when reverse lookup is enabled.HTTP transport: the role is read per request from the
X-Canvas-Roleheader, falling back toCANVAS_ROLEfrom the server config. A valid header (orall) overrides the configured default; an invalid header is ignored with a warning.Tool counts above are a snapshot and grow as tools are added — the authoritative guarantee is that every tool resolves to exactly one audience (enforced by
tests/tools/audience-coverage.test.ts).
Design rationale in BRU-1530 (role taxonomy, why three roles, auto-detect deferred to v2).
Development
pnpm install # Install dependencies
pnpm dev # Watch mode build
pnpm build # Production build
pnpm test # Run tests (768 tests)
pnpm lint # ESLint + Prettier check
pnpm lint:fix # Auto-fix lint issues
pnpm typecheck # TypeScript strict type checkDependency audit
The pnpm.overrides.hono entry pins hono to ^4.12.27 as a
belt-and-suspenders guard. @modelcontextprotocol/sdk@1.30.0 pulls in
@hono/node-server@2.0.11, which already declares
peerDependencies: { hono: "^4.12.27" } — a floor above the
vulnerability threshold (4.12.14). The override is therefore redundant
but harmless and can be removed once you have confirmed your resolved
hono version is ≥ 4.12.27.
Architecture
src/canvas/ Standalone Canvas REST API client (pure fetch, no MCP dependency)
src/tools/ MCP tool definitions with Zod input schemas
src/resources/ MCP resource templates (syllabus, assignment description)
src/server.ts Factory: createCanvasMCPServer(config)
src/stdio.ts stdio transport entry point
src/http.ts HTTP transport entry point
src/cli.ts CLI argument parserContributing
See CONTRIBUTING.md for the full contribution and validation workflow.
Fork the repo
Create a feature branch (
git checkout -b feat/my-feature)Use conventional commits (
feat:,fix:,chore:,test:,docs:)Ensure
pnpm lint && pnpm typecheck && pnpm testpassOpen a pull request
Guides
Manual Setup -- Per-client JSON/TOML config snippets for Claude Desktop, Cursor, VS Code, Windsurf, Codex, Continue, Claude Code, and HTTP clients
Getting Started -- Step-by-step setup for non-developers: token, config, first query, troubleshooting
Student Guide -- Token setup, AI client configuration, 10 example prompts
Educator Guide -- Grading workflows, write operations, privacy considerations
Integration Guide -- Three integration patterns with code examples
Agent Discovery -- Generated tool/workflow manifests and workflow-pack index
Educator Assignment Review Workflow -- Read-first grading flow with write-safety guidance
Student Weekly Planning Workflow -- Read-only weekly planning sequence for students
Privacy Policy
canvas-lms-mcp runs entirely on your own machine. The maintainers operate no
servers and collect no telemetry or analytics — your Canvas API token and all
Canvas data stay local and travel only between your machine and your own Canvas
instance. Optional FERPA pseudonymization runs locally; the only data written to
disk is the optional pseudonym map and audit log. Full details — data
collection, usage, storage, third-party sharing, retention, and contact — are in
PRIVACY.md.
License
MIT
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityBmaintenanceMCP server that connects AI assistants to Instructure Canvas LMS, enabling teachers and administrators to manage courses, assignments, grades, and more through natural language.801841MIT
- Flicense-qualityDmaintenanceMCP server for Canvas LMS that exposes courses, assignments, modules, pages, files, grades, and submissions as tools for AI agents.
- Alicense-qualityDmaintenanceMCP server that provides tools to read UBC Canvas LMS data, including courses, assignments, announcements, submissions, and calendar, for use with Claude Desktop, Claude Code, or n8n AI agents.59MIT
- Alicense-qualityCmaintenanceEnables managing Canvas LMS courses, assignments, grades, modules, and more from MCP-compatible clients like Claude Desktop, Kiro, or Amazon Q Developer.MIT
Related MCP Connectors
Free public MCP for AI agents — 193 tools, 44 workflows. No API key.
Security-first WordPress MCP server. 129 tools for Claude, ChatGPT, Gemini. Free on wp.org.
Hosted MCP with 91 agent tools: X, domains, SEO, Maps, Trends, Search, YouTube, TikTok, and more.
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/bruchris/canvas-lms-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server