Canvas LMS MCP (Model Context Protocol) server for AI assistants. Query student grades, assignments, and academic data through Claude or other MCP-compatible AI tools.
npm install @mtgibbs/canvas-lms-mcp


An MCP (Model Context Protocol) server that connects AI assistants like Claude to your Canvas LMS
account. Query grades, assignments, missing work, and more through natural language.
Perfect for: Parents monitoring their child's academic progress, students tracking their own
work, or anyone who wants to interact with Canvas data through AI.
Ask Claude things like:
- "What assignments are due this week?"
- "Show me missing assignments across all classes"
- "What's my grade in Biology?"
- "Are there any late assignments I should know about?"
- "What's on the to-do list for the next 7 days?"
Choose the method that works best for you:
| Method | Best For | Credential Storage |
| ------------------------------------------------------------ | ------------------------------ | ------------------------------- |
| Desktop Extension | Easy one-click install | OS Keychain (secure) |
| Claude Code (CLI) | Developers using Claude Code | Shell env vars or config file |
| npm Package | Claude Desktop + 1Password | Config file or password manager |
| Standalone CLI | Direct terminal use without AI | Environment variables |
---
1. Log into your Canvas LMS instance (e.g., https://yourschool.instructure.com)
2. Go to Account → Settings
3. Scroll to Approved Integrations
4. Click + New Access Token
5. Give it a name (e.g., "Claude MCP") and click Generate Token
6. Copy the token immediately - you won't be able to see it again
Your Canvas base URL is the main URL you use to access Canvas:
- https://yourschool.instructure.com
- https://canvas.yourdistrict.org
---
The easiest way to get started. Your API token is stored securely in your operating system's
keychain.
1. Download the latest .mcpb file from
Releases
2. Double-click to install, or drag into Claude Desktop
3. Claude Desktop will prompt you to enter your Canvas credentials
4. Done! Start chatting about your courses
- API Token → macOS Keychain / Windows Credential Manager (encrypted)
- Base URL → Claude Desktop settings
- Student ID → Claude Desktop settings (if using observer account)
---
For developers using Claude Code, the AI-powered
CLI tool.
Requires: Node.js 18+
1. Add environment variables to your shell profile (~/.zshrc or ~/.bashrc):
``bash`
export CANVAS_API_TOKEN="your_token_here"
export CANVAS_BASE_URL="https://yourschool.instructure.com"Optional for parent/observer accounts:
export CANVAS_STUDENT_ID="123456"
2. Reload your shell:
`bash`
source ~/.zshrc # or source ~/.bashrc
3. Add the MCP server to your Claude Code settings.
Edit ~/.claude/settings.json (global) or .mcp.json (project-level):
`json`
{
"mcpServers": {
"canvas": {
"command": "npx",
"args": ["-y", "@mtgibbs/canvas-lms-mcp"],
"env": {
"CANVAS_API_TOKEN": "${CANVAS_API_TOKEN}",
"CANVAS_BASE_URL": "${CANVAS_BASE_URL}"
}
}
}
}
4. Restart Claude Code - the Canvas MCP will be available.
- npx -y automatically downloads the package from npm on first run (no npm install needed)${VAR}
- The syntax pulls values from your shell environment
- Claude Code will have access to all Canvas tools when chatting
If you prefer to install globally:
`bash`
npm install -g @mtgibbs/canvas-lms-mcp
Then update your config:
`json`
{
"mcpServers": {
"canvas": {
"command": "canvas-lms-mcp",
"args": [],
"env": {
"CANVAS_API_TOKEN": "${CANVAS_API_TOKEN}",
"CANVAS_BASE_URL": "${CANVAS_BASE_URL}"
}
}
}
}
---
For Claude Desktop users who want more flexibility than the Desktop Extension.
Requires: Node.js 18+
Edit your Claude Desktop configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows:%APPDATA%\Claude\claude_desktop_config.json
`json`
{
"mcpServers": {
"canvas": {
"command": "npx",
"args": ["-y", "@mtgibbs/canvas-lms-mcp"],
"env": {
"CANVAS_API_TOKEN": "your_token_here",
"CANVAS_BASE_URL": "https://yourschool.instructure.com"
}
}
}
}
Restart Claude Desktop after saving.
---
The basic setup stores your token in plain text. Here are more secure alternatives:
If you use 1Password, you can inject secrets at runtime so they never
touch your config file.
1. Install the 1Password CLI: Download here
2. Store your Canvas credentials in 1Password (note the vault and item names)
3. Create a wrapper script at ~/.config/canvas-mcp-wrapper.sh:
`bash
#!/bin/bashCanvas MCP 1Password Wrapper
exec npx -y @mtgibbs/canvas-lms-mcp
`
4. Make it executable:
`bash`
chmod +x ~/.config/canvas-mcp-wrapper.sh
5. Update your Claude Desktop config:
`json`
{
"mcpServers": {
"canvas": {
"command": "/Users/YOUR_USERNAME/.config/canvas-mcp-wrapper.sh",
"args": []
}
}
}
Now your token lives in 1Password and is only loaded when the MCP server starts.
If you must store the token in the config file, at least restrict access:
`bash`macOS/Linux
chmod 600 ~/Library/Application\ Support/Claude/claude_desktop_config.json
---
If you're a parent with an observer account linked to your child's Canvas account, add the student
ID:
Enter the Student ID when prompted during setup.
Add CANVAS_STUDENT_ID to your environment variables:
`json`
{
"env": {
"CANVAS_API_TOKEN": "...",
"CANVAS_BASE_URL": "...",
"CANVAS_STUDENT_ID": "123456"
}
}
1. Log into Canvas with your observer account
2. The student ID appears in URLs when viewing their information (e.g., /users/123456)
3. Or ask your school's Canvas administrator
---
Once connected, Claude has access to these capabilities:
| Tool | Description |
| -------------------------- | -------------------------------------------------------------- |
| get_courses | List all courses with current grades |get_comprehensive_status
| | Full academic overview in one call (grades, missing, upcoming) |get_missing_assignments
| | Assignments flagged as missing by Canvas |get_unsubmitted_past_due
| | Past-due work not yet submitted |get_recent_grades
| | Recently graded assignments with scores |get_upcoming_assignments
| | Assignments due soon for a specific course |get_due_this_week
| | All assignments due across all courses |list_assignments
| | Search/filter assignments by status |get_stats
| | Late/missing statistics by course |get_todo
| | Planner items and to-do list |
---
This package also includes a standalone command-line tool for querying Canvas directly from your
terminal—no AI required.
`bashOption 1: Install globally
npm install -g @mtgibbs/canvas-lms-mcp
$3
Set environment variables in your shell profile (
~/.zshrc or ~/.bashrc):`bash
export CANVAS_API_TOKEN="your_token_here"
export CANVAS_BASE_URL="https://yourschool.instructure.com"
export CANVAS_STUDENT_ID="123456" # Optional: for observer accounts
`$3
`bash
List all courses with grades
canvas courses
canvas courses --format tableGet comprehensive academic status
canvas status
canvas status --format tableList missing assignments
canvas missing
canvas missing --summary # Counts by course
canvas missing --include-unsubmitted # Include past-due not yet flaggedList assignments due soon
canvas due --days 7
canvas due --show-graded # Include already-graded itemsList unsubmitted past-due assignments
canvas unsubmitted
canvas unsubmitted --course-id 12345List assignments with filters
canvas assignments --all-courses --due-this-week
canvas assignments --course-id 12345 --upcoming 7
canvas assignments --course-id 12345 --bucket overdueList grades/submissions
canvas grades --all-courses
canvas grades --all-courses --below B
canvas grades --course-id 12345 --days 14Show upcoming events
canvas upcoming --days 14
canvas upcoming --type assignmentShow to-do list
canvas todo --days 7
canvas todo --hide-submittedShow late/missing statistics
canvas stats
canvas stats --hide-empty
`$3
These options work with all commands:
| Option | Description |
| ------------------- | ---------------------------------------------------------------------------------- |
|
--format | Output format: json (default) or table |
| --student | Student ID for observer accounts (uses CANVAS_STUDENT_ID from config if omitted) |
| --help | Show help for a command |$3
- JSON (default): Machine-readable, great for scripting or piping to
jq
- Table: Human-readable formatted output`bash
JSON output (default)
canvas coursesTable output
canvas courses --format tablePipe JSON to jq for filtering
canvas missing | jq '.[] | select(.points_possible > 50)'
`---
Available Prompts
Prompts are pre-built conversation starters that guide Claude through common workflows:
| Prompt | Description |
| -------------------- | -------------------------------------------------------------------------- |
|
daily-checkin | Quick daily overview of grades, due items, and concerns |
| week-planning | Plan the upcoming week with prioritized assignments |
| course-analysis | Deep dive into a specific course's performance |
| grade-recovery | Find opportunities to improve grades through extra credit or resubmissions |
| missing-work-audit | Comprehensive audit of all missing and late work |$3
In Claude Desktop, you can trigger prompts directly:
1. Click the prompt icon (📝) in the chat input
2. Select a prompt from the list
3. Fill in any required parameters (like student ID)
4. Claude will execute the workflow using the appropriate tools
Or just ask naturally - Claude will use the right tools:
> "Can you do a daily check-in for my student?"
---
Example Conversations
These examples show realistic interactions, including which tools Claude calls and what output to
expect.
$3
User prompt:
> "Give me a quick update on my kid's school situation"
Tools called:
1.
get_courses - retrieves all courses with current grades
2. get_missing_assignments - checks for missing work
3. get_due_this_week - finds upcoming deadlinesClaude's response:
> Here's today's overview for your student:
>
> Current Grades:
>
> - AP Biology: 92% (A-)
> - English 11: 87% (B+)
> - US History: 78% (C+)
> - Algebra 2: 91% (A-)
>
> Needs Attention:
>
> - "Chapter 12 Reading Quiz" in US History - due yesterday, not submitted
> - "Lab Report: Photosynthesis" in AP Biology - due 2 days ago
>
> Coming Up This Week:
>
> - Essay Draft (English 11) - due Thursday
> - Unit Test (Algebra 2) - due Friday
>
> I'd recommend prioritizing those two missing assignments first, especially the History quiz since
> that class has the lowest grade.
---
$3
User prompt:
> "What assignments are missing across all classes?"
Tools called:
1.
get_missing_assignments - gets Canvas-flagged missing items
2. get_unsubmitted_past_due - catches items Canvas may have missedClaude's response:
> I found 4 missing assignments:
>
> | Assignment | Course | Due Date | Points |
> | -------------------------- | ---------- | -------- | ------ |
> | Chapter 12 Reading Quiz | US History | Jan 18 | 20 |
> | Lab Report: Photosynthesis | AP Biology | Jan 16 | 50 |
> | Vocabulary Set 8 | English 11 | Jan 15 | 15 |
> | Problem Set 7.3 | Algebra 2 | Jan 10 | 25 |
>
> Total points at risk: 110 points
>
> The Biology lab report is worth the most - I'd start there. The Algebra problem set is oldest, so
> check if late submissions are still accepted.
---
$3
User prompt:
> "What's due in the next 7 days? Help me prioritize."
Tools called:
1.
get_due_this_week - retrieves all assignments due in the next 7 days
2. get_stats - gets late/missing statistics for contextClaude's response:
> Here's what's coming up in the next 7 days:
>
> High Priority (worth 50+ points):
>
> - Unit 5 Test (Algebra 2) - Friday, Jan 24 - 100 points
> - Research Paper Draft (English 11) - Thursday, Jan 23 - 75 points
>
> Medium Priority:
>
> - Lab Questions (AP Biology) - Wednesday, Jan 22 - 30 points
> - Map Quiz (US History) - Tuesday, Jan 21 - 25 points
>
> Lower Priority:
>
> - Discussion Post (English 11) - Sunday, Jan 26 - 10 points
>
> Suggested Schedule:
>
> - Monday: Start research paper outline
> - Tuesday: Map quiz prep + continue paper
> - Wednesday: Bio lab questions
> - Thursday: Finish and submit paper
> - Friday: Algebra test prep
>
> Note: US History currently has 2 missing assignments, so staying current there is important.
---
Troubleshooting
$3
Your API token isn't being passed correctly. Double-check:
- The token is in the
env section of your config
- There are no extra spaces or quotes around the token
- The config file is valid JSON
- If using 1Password wrapper, run it manually to test: ~/.config/canvas-mcp-wrapper.sh$3
Make sure your Canvas URL is set and includes
https://.$3
- Restart Claude Desktop completely
- Check that your config file is valid JSON (use a JSON validator)
- Ensure Node.js 18+ is installed:
node --version$3
- Your API token may have expired - generate a new one
- Make sure the token has the necessary permissions
- Verify the base URL is correct (no trailing slash)
$3
- Verify
CANVAS_STUDENT_ID is set correctly
- Confirm your observer account is properly linked to the student in Canvas
- Try the student ID without quotes (as a number)$3
- Run
op signin manually first to authenticate
- Check that the item path matches your vault: op read "op://VaultName/ItemName/field"
- Ensure the wrapper script is executable: chmod +x ~/.config/canvas-mcp-wrapper.sh---
Privacy & Security
$3
This MCP server collects and processes the following data locally on your machine:
| Data Type | Source | Purpose |
| ------------------- | ------------- | ----------------------------------------- |
| Course information | Canvas API | Display grades and course lists |
| Assignment data | Canvas API | Show due dates, missing work, submissions |
| Student identifiers | Canvas API | Associate data with correct student |
| API credentials | User-provided | Authenticate with Canvas |
$3
- Local processing only: All data flows directly between Canvas and Claude on your machine
- No external transmission: This server does not send data to any third-party services
- No telemetry: We do not collect usage statistics, analytics, or crash reports
- No data storage: Data is fetched on-demand and not persisted between sessions
$3
This extension connects to:
- Canvas LMS (your school's instance): To retrieve academic data using your API token
- Claude (Anthropic): The AI assistant that processes your queries locally
We do not share your data with any other third parties.
$3
- Session-based: Data is only held in memory during active use
- No caching: Academic data is not cached or stored locally
- Credentials: Stored according to your installation method:
- Desktop Extension: OS Keychain (macOS Keychain / Windows Credential Manager)
- npm + 1Password: Your 1Password vault
- npm with env vars: Your config file (recommend restricting file permissions)
$3
- You can revoke access at any time by deleting your Canvas API token
- Uninstalling the extension removes all local configuration
- Your school's Canvas instance retains its own data per their policies
$3
- Token scope: Your API token only accesses data you can already see in Canvas
- Read-only operations: This server only reads data; it cannot modify assignments or grades
- No network exposure: The server only communicates via local stdio, not over the network
$3
For privacy questions or concerns:
- GitHub Issues:
github.com/mtgibbs/canvas-lms-mcp/issues
- Author: @mtgibbs
---
Support
Need help? Here's how to get support:
- Bug Reports:
Open an issue
- Feature Requests:
Open an issue
- Questions: Start a discussion
- Security Issues: Please report security vulnerabilities privately via
GitHub Security Advisories
Response times: We aim to respond to issues within a few days. This is a community project
maintained in spare time.
---
Development
This project is built with Deno and uses
dnt for npm packaging.
`bash
Clone the repo
git clone https://github.com/mtgibbs/canvas-lms-mcp.git
cd canvas-lms-mcpRun MCP server in development (requires Deno)
deno run -A agent.tsRun CLI in development
deno task dev courses --format tableBuild npm package
deno task build:npmBuild Desktop Extension
deno task build:extensionType check
deno task check
`$3
Releases are fully automated via Release Please +
npm Trusted Publishing (OIDC). No tokens required!
How it works:
`
Push commits with conventional messages (feat:, fix:, etc.)
↓
Release Please creates/updates a Release PR
↓
Merge the PR when ready
↓
Release Please creates GitHub Release + tag
↓
Publish workflow runs automatically
↓
npm package published + .mcpb attached to release
`Commit message format:
-
feat: add new tool → minor version bump (0.1.0 → 0.2.0)
- fix: correct API error → patch version bump (0.1.0 → 0.1.1)
- feat!: breaking change → major version bump (0.1.0 → 1.0.0)
- chore: update deps → no releaseFirst-time setup:
1. Publish the first version manually:
`bash
deno task build:npm
cd npm && npm publish --access public
`2. Configure Trusted Publisher on npmjs.com:
- Go to your package → Settings → Trusted Publisher
- Select GitHub Actions
- Organization/user:
mtgibbs
- Repository: canvas-lms-mcp
- Workflow filename: publish.yml`After that, just push commits and merge Release PRs - everything else is automatic!
---
MIT License - see LICENSE for details.
---
- Canvas LMS API Documentation
- MCP Protocol Specification
- Claude Desktop
- 1Password CLI
- Report Issues