Canvas LMS MCP – Remote Edition
Provides tools for interacting with the Canvas LMS API, enabling AI assistants to browse courses, assignments, quizzes and modules; track missing work; submit text, URL and file assignments with a confirmation preview; read discussions, inbox messages and calendars; and compute grades such as what-if grades, needed scores and grade impact rankings, plus week-ahead and semester planning views. Read-only mode and a curated tool profile are supported.
Want it to run locally, on just your own computer? Go to the 💻 Local Edition →. It has the same 209 tools, with no ngrok, no password and about 5 minutes of setup.
🌐 Canvas LMS MCP: Remote Edition
Use Canvas from your AI assistant on any device: web, desktop and mobile. Always on, password-protected, with automatic failover across several computers.
209 tools · OAuth 2.1 · ngrok tunnel · Multi-computer failover
Website · Quick start · Multi-device guide · Configuration · Tools · Security
🤔 Remote or Local?
🌐 Remote (this repo) | 💻 Local | |
Works with | Any MCP client that supports remote servers, on any device | Desktop and command-line MCP clients on this computer |
When it runs | Always on, in the background | Only while your AI app is open |
You need | Node.js, a Canvas token, an ngrok account and a password | Node.js and a Canvas token |
Internet exposure | Public HTTPS address, password-protected | None |
Multiple computers | ✅ Automatic failover (guide) | Install it separately on each one |
Related MCP server: mcp-kg-oauth
✨ Highlights
📊 Grade intelligence:
what_if_grade,compute_needed_score,grade_impact_ranking, full weighted breakdowns📅 Planning:
get_week_ahead,semester_snapshot,study_priority_ranking, cross-course missing work in one call📝 Submissions: submit text, URLs and files, with a dry-run preview first
💬 Discussions & inbox: read whole threads in one request and message instructors
📁 Content: files, pages, modules, lecture captions and full
.imscccourse export🔐 Secure remote access: password-gated OAuth 2.1 over an ngrok tunnel
🔁 Multi-computer failover: run it on two or more computers, and if one sleeps, another takes over in about a minute
🧭 How it works
Your AI app (web / desktop / mobile / CLI)
│ HTTPS + OAuth
▼
your-domain.ngrok-free.dev ──► supervisor.js ──► index.js (127.0.0.1:3939/mcp) ──► Canvas API
(keeps it alive, (209 tools, OAuth,
failover) rate-limit aware)🚀 Quick start
You need: Node.js 18+, a Canvas account and a free ngrok account.
1. Download and install
git clone https://github.com/Fireiscoolsolo/canvas-lms-mcp-server.git
cd canvas-lms-mcp-server
npm install2. Create a Canvas token
In Canvas, go to Account → Settings → Approved Integrations → + New Access Token. Canvas only shows the token once, so copy it right away.
3. Set up ngrok
winget install --id Ngrok.Ngrok -e
ngrok update # the winget version is often too old (ERR_NGROK_121)
ngrok config add-authtoken <your-ngrok-authtoken>Then claim your free static domain in the ngrok dashboard, e.g. your-name.ngrok-free.dev.
4. Configure .env
Copy .env.example to .env and fill it in. Generate the password and secret with:
node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"5. Test it
node supervisor.jsWait until you see active and serving at https://…, then press Ctrl+C.
6. Run it automatically at logon (Windows)
In PowerShell, from the repo folder:
$dir = (Get-Location).Path
$action = New-ScheduledTaskAction -Execute "$dir\run-supervisor.cmd" -WorkingDirectory $dir
$trigger = New-ScheduledTaskTrigger -AtLogOn -User "$env:USERDOMAIN\$env:USERNAME"
$settings = New-ScheduledTaskSettingsSet -RestartCount 999 -RestartInterval (New-TimeSpan -Minutes 1) -ExecutionTimeLimit ([TimeSpan]::Zero) -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -MultipleInstances IgnoreNew
Register-ScheduledTask -TaskName CanvasSupervisor -Action $action -Trigger $trigger -Settings $settings -Force
Start-ScheduledTask -TaskName CanvasSupervisorrun-supervisor.cmd assumes Node is at C:\Program Files\nodejs\node.exe. If yours is somewhere else, edit that file. On Linux, run it as a systemd user service (example). On macOS, run node supervisor.js under launchd or pm2.
7. Connect your AI app, on every device
In your AI app's settings, add a custom connector (also called a remote MCP server) with the URL https://<your-domain>/mcp, then log in with your password. Apps that sync connectors to your account will show it on your phone and desktop too. Command-line and editor clients can add it as an HTTP MCP server with the same URL.
Then ask your assistant: "Run test_connection."
🔁 Multiple computers
You can run the same server on two or more computers, for example a desktop and a laptop, so it stays online when one is off or asleep. One computer serves; the others wait in standby and take over automatically.
➡️ Follow the step-by-step Multi-Device Setup Guide. It covers copying settings safely, the shared ngrok account, the scheduled task, checking it works, testing failover, updating code and changing secrets.
⚙️ Configuration
All settings are environment variables in .env. See .env.example.
Variable | Required | Default | Description |
| ✅ | — | Your Canvas personal access token |
| ✅ | — | e.g. |
| ✅ | — | Your ngrok static domain |
| ✅ | — | Password for the OAuth login page |
| ✅ | — | Secret that protects the |
|
|
| |
|
|
| |
|
| Response cache time in seconds | |
| system | IANA time zone for due-date math | |
|
| Where download tools save files | |
|
| Bind address | |
|
| Token store | |
| winget path | Path to |
🧰 Tools
Group | Count | Highlights |
Identity | 24 |
|
Courses | 16 | permissions, nicknames, favorites |
Assignments | 12 |
|
Submissions | 16 | text, URL and file submission, comments, rubric assessments |
Grades | 13 |
|
Quizzes | 12 | read-only: dates, attempts, reviews |
Discussions | 17 |
|
Inbox | 14 | messaging, |
Calendar | 11 | events, office-hours booking |
Content | 33 | files, pages, modules, captions, |
Groups | 11 | group workspaces |
Rubrics | 11 | peer reviews |
Search | 3 |
|
Planning | 11 |
|
Meta | 4 |
|
🔐 Security
Confirmation gate: tools that send, submit, post or delete return a preview first and only act when called with
confirm: true.Prompt-injection fencing: text other people wrote is wrapped in
<<<CANVAS_CONTENT>>>markers and labelled as untrusted.No quiz-taking: quiz attempt endpoints are deliberately not included.
Loopback only: the server listens on
127.0.0.1. The only way in from outside is the tunnel.OAuth 2.1: login is limited to 10 attempts per 15 minutes per IP, access tokens last 1 hour, and refresh tokens are replaced every time they're used.
Separate coordination secret: the endpoints the computers use to coordinate need a separate shared secret, compared in constant time.
Never commit
.env,oauth-store.jsonorsupervisor.log. They're already listed in.gitignore. See SECURITY.md.
🎓 Responsible use
This is a study and organization tool. It helps you see deadlines, understand your grades and plan your week. It never takes quizzes, and nothing is sent or submitted until you've seen a preview and confirmed it.
Follow your school's academic integrity and acceptable-use policies. Some schools restrict personal API tokens or third-party tools.
Want zero risk of accidental changes? Set
CANVAS_ALLOW_WRITES=falsefor read-only mode.
🛠️ Troubleshooting
Symptom | Fix |
| Your ngrok version is too old. Run |
| Another computer or a leftover |
| No computer is serving. Check |
ngrok shows a "You are about to visit…" page at login | This is normal on the free plan. Click Visit Site |
| Check |
Canvas returns 401 | Your token expired. Create a new one |
New tools don't show up | Reconnect the connector or restart your AI app |
More issues with several computers are covered in the Multi-Device guide.
Restart cleanly. Stop-ScheduledTask alone can leave processes running:
Stop-ScheduledTask -TaskName CanvasSupervisor -ErrorAction SilentlyContinue
Get-CimInstance Win32_Process -Filter "Name='node.exe'" | Where-Object { $_.CommandLine -match 'supervisor\.js|index\.js' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
Get-Process ngrok -ErrorAction SilentlyContinue | Stop-Process -Force
Start-ScheduledTask -TaskName CanvasSupervisorKnown limits: a student token can't reach admin endpoints, gradebook history, course analytics or quiz statistics. smart_search is a Canvas beta feature and often returns 404.
📄 License
MIT. This project isn't affiliated with Instructure.
This server cannot be deployed
Maintenance
Related MCP Connectors
Self-hosted federated MCP gateway: one OAuth 2.1 MCP server in front of N apps, user-level scopes.
Hosted MCP server with managed OAuth for 15+ toolkits: Google Workspace, Fitbit, Oura, Kalshi, etc.
One OAuth connector for your team's remote MCP servers, with Tool Packs, guardrails and logs.
Multi-tenant hosted MCP server for Oura Ring — 21 read-only tools, OAuth per user.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Node.js MCP server with custom OAuth 2.1 + PKCE authentication, enabling secure remote connections to LLMs like Claude and ChatGPT.432 npmMIT
- FlicenseNot gradedqualityCmaintenanceRemote MCP server with built-in OAuth authentication via Cloudflare Access, enabling secure tool usage like math and image generation with user-based access control.-
- FlicenseNot gradedqualityDmaintenanceRemote MCP server with built-in OAuth authentication via Cloudflare Access, enabling secure tool invocation after user sign-in.-
- FlicenseNot gradedqualityCmaintenanceA self-hosted MCP gateway that aggregates all your MCP servers behind a single Streamable HTTP endpoint, with automatic registry discovery (19,000+ servers), on-demand Docker provisioning, multi-device support via SSH, OAuth2 PKCE authentication, and a workflow engine for saving and replaying multi-step tool sequences.-