Skip to content
MCP server
Registry

canvas-lms-mcp-server MCP Server

Self-hosted Canvas LMS for every device: 237 student tools over HTTP with OAuth and phone alerts.

canvas-lms-mcp-server scores 66 (Good), licensed MIT and written in JavaScript. It installs as a local process. It does not declare tools yet. Filed under Design, Security. GitHub shows 1 stars. Install configs are generated for 10 clients. Being listed in the registry is not the same as being vendor-official.

by fireiscoolsoloMITJavaScript1 stars
Trust score
66Good
Trust score 66 of 100, Good

Good trust

66 of 100 from six public signals. Nobody can buy a point.

  • Listed in the official MCP registry.
  • OSI-style license: mit.
How we score trust
Scorecard

License, quality and maintenance

How grades work
Trust breakdown

Where the 66 comes from

22 + 20 + 1 + 10 + 10 + 3 = 66. Each factor is capped, so no single signal can carry a listing.

Registry22 / 30

Active in the official MCP registry, plus a known vendor namespace.

Registry: 22 of 30 points.
Maintenance20 / 20

How recently the repository saw a commit or release.

Maintenance: 20 of 20 points.
Popularity1 / 20

GitHub stars and weekly downloads, on a log scale.

Popularity: 1 of 20 points.
License10 / 10

A clear, OSI-style open-source license.

License: 10 of 10 points.
Security10 / 10

Not archived, a secure install path, a pinned version.

Security: 10 of 10 points.
Docs3 / 10

A real summary, a README with depth, listed tools.

Docs: 3 of 10 points.

Install

Pick your client, copy the config, paste it in.

Needs Cursor or VS Code installed on this device. The button opens the app and asks you to confirm before it adds the server.

~/Library/Application Support/Claude/claude_desktop_config.json
{  "mcpServers": {    "fireiscoolsolo-canvas-lms-mcp-server": {      "command": "npx",      "args": [        "-y",        "canvas-lms-mcp-remote@1.3.1"      ],      "env": {        "CANVAS_API_TOKEN": "YOUR_CANVAS_API_TOKEN",        "CANVAS_BASE_URL": ""      }    }  }}

Environment variables

NameRequiredNotes
CANVAS_API_TOKENSecretRequiredCanvas personal access token (Account > Settings > Approved Integrations > New Access Token)
CANVAS_BASE_URLRequiredYour school's Canvas address, e.g. https://yourschool.instructure.com

Tools show up when the registry metadata or the repository README lists them. Public READMEs are read directly. A GitHub token is used only when one is already configured.

About

[!TIP] Want it to run locally, on just your own computer? Go to the Local Edition → (website). It has the same 237 tools, with no tunnel, no password and a one-command 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.

237 tools · OAuth 2.1 · Status page · Phone alerts · ngrok or Cloudflare tunnel · Multi-computer failover

npm npm downloads npm downloads per month Release downloads Tests Windows app Glama score GitHub stars Node.js MCP License: MIT Website PRs welcome

Website · Quick start · Multi-device guide · Configuration · Tools · Phone alerts · Security · Changelog

[!TIP] On Windows? Skip the terminal. The free Canvas MCP Installer Assistant sets this up for Claude or the ChatGPT desktop app with pictures and a check after every step, or does every step for you. Download for Windows


Remote or Local?

Remote (this repo)Local
Works withAny MCP client that supports remote servers, on any deviceClaude Desktop, the ChatGPT desktop app and other MCP clients on this computer
When it runsAlways on, in the backgroundOnly while your AI app is open
You needNode.js (or Docker), a Canvas token, an ngrok or Cloudflare account and a passwordNode.js and a Canvas token
Internet exposurePublic HTTPS address, password-protectedNone
Multiple computersAutomatic failover (guide)Install it separately on each one

Highlights

  • Your day and week: daily_briefing, get_week_ahead, semester_snapshot, planner notes, checking items off your To Do list
  • Study plans: study_plan spreads study time before each deadline; schedule_study_plan puts it on your Canvas calendar
  • Grade intelligence: final_grade_scenarios, what_if_grade, grade_impact_ranking, calculate_gpa, full weighted breakdowns
  • Assignments, submissions, discussions and inbox: assignment_brief in one call; submit, post and message after a preview
  • Content: read lecture PDFs, Word docs and slides with read_course_file; downloads come back as links your phone can open
  • Phone alerts: new grades, announcements, work due soon, new assignments, teacher comments, messages and more, by ntfy, Discord, Telegram, Slack, Teams or Pushover, instantly or as a daily digest
  • Status page: see from any browser whether your server is online, who is signed in, and sign apps out
  • Secure remote access: password-gated OAuth 2.1 with lockout, a login history and optional two-factor codes, over an ngrok or Cloudflare 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
   (or a Cloudflare hostname)      (keeps it alive,     (237 tools, OAuth, status page,
                                    failover)            phone alerts)

Quick start

[!NOTE] Rather click than type? Download the Canvas MCP Installer Assistant for Windows. It walks you through these steps with pictures and checks each one as you go, for both the Remote and Local editions. See screenshots.

Windows may show "Windows protected your PC" because the app isn't code-signed yet. Click More info, then Run anyway.

You need: Node.js 18+ (22+ to read PDFs), a Canvas account and a free ngrok account (or a Cloudflare account with your own domain). Prefer containers? See Docker.

1. Install

With npm (easiest):

npm install -g canvas-lms-mcp-remote
mkdir canvas-mcp
cd canvas-mcp
canvas-lms-mcp-remote init

That folder is your settings folder. It holds your .env, logins and logs, so run every later step from it.

Or from source: git clone https://github.com/Fireiscoolsolo/canvas-lms-mcp-server.git, then run npm install inside the folder. No git? Download the zip from the latest release instead. The repo folder is then your settings folder.

CommandWhat it does
canvas-lms-mcp-remote initCreate a .env template in the current folder
canvas-lms-mcp-remoteStart the supervisor: server, tunnel and failover
canvas-lms-mcp-remote serveStart only the HTTP server on 127.0.0.1 (no tunnel)
canvas-lms-mcp-remote install-serviceStart it automatically when you sign in (Windows, Linux or macOS)
canvas-lms-mcp-remote uninstall-serviceStop starting it automatically
canvas-lms-mcp-remote stop / restartStop the running supervisor, or stop and start it again
canvas-lms-mcp-remote statusIs it running, which computer is serving, who is signed in
canvas-lms-mcp-remote logs [-f]Show the end of supervisor.log (-f keeps following it)
canvas-lms-mcp-remote doctorCheck settings, token, tunnel and startup service, and say how to fix problems
canvas-lms-mcp-remote test-alertSend a test phone alert
canvas-lms-mcp-remote sessions [sign-out <id> | sign-out-all | tidy]List or sign out connected apps
canvas-lms-mcp-remote rotate-passwordMake a new password and sign every app out
canvas-lms-mcp-remote totp-setup / totp-offTurn two-factor codes on or off
canvas-lms-mcp-remote clusterList the computers in your group
canvas-lms-mcp-remote takeoverMake this computer the one that serves
canvas-lms-mcp-remote uninstallStop it, remove the startup service and say how to remove the package
canvas-lms-mcp-remote --stdioServe over stdin/stdout, for directories that inspect servers

From source, use node cli.js <command> instead.

2. 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 a tunnel

ngrok (default):

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.

  1. Install cloudflared (downloads; on Windows winget install --id Cloudflare.cloudflared).
  2. In the Cloudflare dashboard, open Zero Trust → Networks → Tunnels, create a tunnel and copy its token.
  3. Add a public hostname to the tunnel, e.g. canvas.yourdomain.com, pointing at http://localhost:3939.
  4. In .env, set CANVAS_MCP_TUNNEL=cloudflared, CANVAS_MCP_CLOUDFLARED_TOKEN=<token> and CANVAS_MCP_PUBLIC_URL=https://canvas.yourdomain.com.

Using your own reverse proxy or Tailscale Funnel instead? Set CANVAS_MCP_TUNNEL=none and point it at port 3939.

4. Configure .env

Fill in the .env that init created. From source, copy .env.example to .env first. Generate the password and secret with:

node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"

5. Test it

canvas-lms-mcp-remote doctor
canvas-lms-mcp-remote

doctor checks your settings, token and tunnel first. Then wait until you see active and serving at https://…, and press Ctrl+C.

6. Run it automatically when you sign in

canvas-lms-mcp-remote install-service

On Windows this creates the CanvasSupervisor scheduled task, on Linux a systemd user service, and on macOS a launch agent. All of them restart it if it crashes and write supervisor.log in your settings folder, rotating it at 5 MB.

In PowerShell, from your settings folder (the repo folder, if you installed from source):

$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 CanvasSupervisor

run-supervisor.cmd assumes Node is at C:\Program Files\nodejs\node.exe. If yours is somewhere else, edit that file.

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.

  1. Open Settings → Plugins, go to the MCPs tab, then click Add → Add MCP server.

  2. Choose Streamable HTTP and fill in the form:

    FieldValue
    Namecanvas-remote
    URLhttps://<your-domain>/mcp
    Headersngrok-skip-browser-warning = 1
  3. Click Save, then Authenticate and log in with your password. Start a new chat to use it.

The header skips the page ngrok's free plan shows before your server.

Then ask your assistant: "Run test_connection."

Status page

Open https://<your-domain>/status in any browser and enter your password. It shows whether the server is online and which computer is serving, your Canvas connection and when the token expires, the apps that are signed in (each with a Sign out button), recent sign-ins, the computers in your group, your phone-alert settings and recent problems. Nothing secret is ever shown, and the page locks itself after 12 hours.

From a terminal, canvas-lms-mcp-remote status and canvas-lms-mcp-remote sessions show the same things.

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 tunnel, the startup service, checking it works, testing failover, updating code and changing secrets. canvas-lms-mcp-remote cluster lists the computers, and canvas-lms-mcp-remote takeover moves serving to the computer you're on.

Docker

For a home server or NAS: copy .env.example to .env, fill it in, add NGROK_AUTHTOKEN=<your ngrok authtoken>, then:

docker compose up -d

docker-compose.yml runs the server and an ngrok tunnel, keeping your logins in a Docker volume. It also has a commented-out Cloudflare Tunnel service to use instead. One container serves, so there's no failover between computers in this setup; Docker restarts it if it stops.

Configuration

All settings are environment variables in .env. See .env.example.

VariableRequiredDefaultDescription
CANVAS_API_TOKENYes—Your Canvas personal access token
CANVAS_BASE_URLYes—e.g. https://yourschool.instructure.com
CANVAS_MCP_PUBLIC_URLYes—Your public address (ngrok static domain or Cloudflare hostname)
CANVAS_MCP_PASSWORDYes—Password for the login and status pages
CANVAS_MCP_CLUSTER_SECRETYes—Secret that protects the /internal/* endpoints the computers use to coordinate
CANVAS_MCP_TOTP_SECRET—Turns on two-factor codes; set it up with canvas-lms-mcp-remote totp-setup
CANVAS_MCP_TUNNELngrokngrok, cloudflared, or none if you route the address yourself
CANVAS_MCP_CLOUDFLARED_TOKEN—Tunnel token from the Cloudflare dashboard
CANVAS_MCP_FAILOVER_SECONDS50How long the serving computer can be silent before another takes over
CANVAS_ALLOW_WRITEStruefalse = read-only mode
CANVAS_PROFILEfullcore = curated subset of tools
CANVAS_TOOLS / CANVAS_DISABLE_TOOLSall / —Only these tool groups or tools, or leave these out
CANVAS_CACHE_TTL60Response cache time in seconds
CANVAS_TIMEZONEsystemIANA time zone for dates, digests and quiet hours
CANVAS_DOWNLOAD_DIR./canvas-downloadsWhere download tools save files
CANVAS_IP_FAMILYboth4 or 6 uses only that kind of address. Worth trying if new connections time out
CANVAS_MCP_HOST / _PORT127.0.0.1 / 3939Bind address
CANVAS_MCP_OAUTH_STORE_PATH./oauth-store.jsonToken store
CANVAS_MCP_NGROK_PATHwinget pathPath to ngrok.exe
CANVAS_MCP_TRUST_PROXYloopbackWhich proxy's visitor address to trust; Docker uses uniquelocal
CANVAS_MCP_TRANSPORThttpstdio (or the --stdio flag) serves over stdin/stdout instead of HTTP. Used by directories that inspect servers. For everyday local use, see the Local Edition

Phone-alert settings are listed in Phone alerts.

Tools

GroupCountHighlights
Identity27check_token_expiry, notification preferences, custom-data storage
Courses17course_contacts (teachers, TAs, office hours), permissions, nicknames
Assignments13assignment_brief, list_missing_submissions, get_late_policy
Submissions17text, URL, file and annotation submission, comments, rubric assessments
Grades15final_grade_scenarios, what_if_grade, compute_needed_score, grade_impact_ranking, calculate_gpa
Quizzes12read-only: dates, attempts, reviews
Discussions21get_full_topic_view, replies, school-wide announcements, mark announcements read
Inbox14messaging, find_recipients, threads
Calendar11events, office-hours booking
Content36files, pages, modules, captions, ePortfolios, read_course_file for PDF, Word and PowerPoint, course export
Groups11group workspaces
Rubrics11peer reviews
Search3smart_search with keyword fallback
Planner12daily_briefing, planner notes, mark_planner_item_done, study_plan, export_deadlines_ics, calendar feed
Planning13get_week_ahead, semester_snapshot, study_priority_ranking, semester_wrap_up, export_all_courses
Meta4raw_canvas_request for any endpoint not listed above

Prompts and attachments

The server also adds these to your AI app's menus. They don't count as tools.

  • Prompts: Daily briefing, Plan my week, Plan my study blocks, What did I miss?, Start this assignment, Prep me for an exam, How are my grades?, Am I on track to pass?, Catch me up on a course, Draft an email to my professor and Semester wrap-up. Each one tells the assistant which tools to use, and course names autocomplete.
  • Attachments: attach a course syllabus, or an assignment due in the next 14 days, to a chat the same way you'd attach a file.

Apps that support MCP prompts and resources, such as Claude Desktop, show them in the + menu.

Phone alerts

Because the Remote Edition is always on, it can tell you when something happens. On by default once you set a channel:

  • New grades (several at once arrive as one summary)
  • New announcements
  • Work due within 24 hours that you haven't submitted yet
  • A Canvas token that expires within 5 days

Add any of these to CANVAS_ALERTS to turn them on too: assignments (new assignments, quizzes and discussions), comments (a teacher commented on your work), inbox (new messages), grade_drop (a course grade fell below CANVAS_ALERTS_GRADE_BELOW, default 70%) and security (sign-ins and lockouts on your server).

Where they go. Add any of these to .env, then restart the server:

ChannelSettings
ntfy phone appCANVAS_ALERTS_NTFY_TOPIC: a long, hard-to-guess topic name (it works like a password). CANVAS_ALERTS_NTFY_SERVER for your own server
DiscordCANVAS_ALERTS_DISCORD_WEBHOOK: a webhook from a channel's Settings → Integrations → Webhooks
TelegramCANVAS_ALERTS_TELEGRAM_TOKEN (from @BotFather) and CANVAS_ALERTS_TELEGRAM_CHAT_ID
SlackCANVAS_ALERTS_SLACK_WEBHOOK: an incoming webhook URL
Microsoft TeamsCANVAS_ALERTS_TEAMS_WEBHOOK: a Workflows incoming webhook URL
PushoverCANVAS_ALERTS_PUSHOVER_TOKEN and CANVAS_ALERTS_PUSHOVER_USER

When they come.

SettingDefaultWhat it does
CANVAS_ALERTS_DIGEST—One summary a day at this time, e.g. 07:30: what's due today and tomorrow, new grades, missing work and unread messages
CANVAS_ALERTS_MODEboth with a digestdigest sends only urgent alerts (due soon, token, security) in between digests; instant turns the digest off
CANVAS_ALERTS_QUIET—e.g. 22:00-07:00: non-urgent alerts wait until the morning and arrive as one summary
CANVAS_ALERTS_COURSES / _SKIP_COURSESallOnly (or never) these courses, by ID or part of the name
CANVAS_ALERTS_DUE_HOURS24How far ahead "due soon" alerts look
CANVAS_ALERTS_INTERVAL_MINUTES15How often to check (at least 5)

Then run canvas-lms-mcp-remote test-alert from your settings folder to check it works.

Only the computer that is serving sends alerts, and it remembers what it already sent in your Canvas account's own storage, so you don't get repeats when another computer takes over. Alert text passes through the service you pick, so keep the topic, channel or chat private.

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 address, and five wrong passwords lock that address out for 15 minutes. Access tokens last 1 hour, and refresh tokens are replaced every time they're used. The password check takes the same time whatever you type.
  • Two-factor codes (optional): canvas-lms-mcp-remote totp-setup adds a code from your authenticator app to the login and status pages.
  • You can see and end sign-ins: the status page lists signed-in apps and recent sign-in attempts. Unused apps are signed out after 90 days, and rotate-password signs everyone out.
  • Separate coordination secret: the endpoints the computers use to coordinate need a separate shared secret, compared in constant time.
  • No secrets in logs: tokens, passwords and webhook keys are removed from every log line. The public /healthz check says nothing about your account.
  • Download links expire: files the server saves are shared through private links that work for one hour.

Never commit .env, oauth-store.json, login-history.json or supervisor.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=false for read-only mode.

Troubleshooting

Start with canvas-lms-mcp-remote doctor in your settings folder: it checks the settings, token, network, tunnel, server and startup service, and says how to fix what it finds.

SymptomFix
ERR_NGROK_121Your ngrok version is too old. Run ngrok update
ERR_NGROK_334 … already onlineAnother computer or a leftover ngrok.exe holds the domain. This is normal for a standby computer
ERR_NGROK_3200 (endpoint offline)No computer is serving. Check canvas-lms-mcp-remote logs
ngrok shows a "You are about to visit…" page at loginThis is normal on the free plan. Click Visit Site, or use Cloudflare Tunnel, which has no such page
startup check failedCheck CANVAS_BASE_URL and your internet connection
"Your Canvas token was rejected"Your token expired. Create a new one and put it in .env
Reading works but uploads or new connections time outRun doctor on that computer: its Network section times DNS and tests every connection. The server works around a slow DNS lookup by itself, so if a connection still fails, look for a VPN, proxy or firewall
"File not found on the computer running this server"The server reads files from its own disk, so the path must exist on the computer named in the error, not the one you're chatting from
New tools don't show upReconnect the connector or restart your AI app
supervisor.log keeps growingRun canvas-lms-mcp-remote install-service again to switch to the rotating log

More issues with several computers are covered in the Multi-Device guide.

Restart cleanly with canvas-lms-mcp-remote restart. Running an older version that doesn't know it? In PowerShell:

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 CanvasSupervisor

Known 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. While the server is reached over the tunnel, apps get a preview before actions instead of a pop-up confirmation.

License

MIT. This project isn't affiliated with Instructure.

Frequently asked questions

What is canvas-lms-mcp-server MCP Server?

Self-hosted Canvas LMS for every device: 237 student tools over HTTP with OAuth and phone alerts.

How do I install canvas-lms-mcp-server MCP Server in Claude Desktop, Cursor, or VS Code?

Pick your client in the Install section on this page and copy the generated config into the client's config file. Step-by-step guides: Claude Desktop, Cursor, and VS Code. canvas-lms-mcp-server MCP Server runs locally from the npm package canvas-lms-mcp-remote with the command npx -y canvas-lms-mcp-remote@1.3.1.

Is canvas-lms-mcp-server MCP Server free and open source?

Yes. canvas-lms-mcp-server MCP Server is released under the MIT license, an OSI-approved open-source license, so you can use, modify, and self-host it under those terms.

Does canvas-lms-mcp-server MCP Server support remote (HTTP) connections?

No remote endpoint is listed for canvas-lms-mcp-server MCP Server. It runs locally on your machine over stdio, started by your MCP client.

How is canvas-lms-mcp-server MCP Server's trust score calculated?

canvas-lms-mcp-server MCP Server scores 66 out of 100 (Good). The score adds six capped public signals: registry status, maintenance, popularity, license, documentation, and security. Nobody can pay for points. Read the methodology for the full formula.

Reviews

No reviews yet

—Be the first to review

5 star0 reviews at 5 stars
4 star0 reviews at 4 stars
3 star0 reviews at 3 stars
2 star0 reviews at 2 stars
1 star0 reviews at 1 stars

No published reviews yet. Used it? Tell the next person how it went.

Add badge to your README

Paste either snippet into the repository README. The image links to this listing.

Listed on MCPpedia

Top 5 MCP servers

Daily or weekly. Confirm by email, unsubscribe any time.

How often

Manage this listing

Claim this server