🌐 You're viewing the Remote Edition. Only need it on one computer? See the simpler Local Edition β†’
🌐 Remote Edition · 209 tools · any device

Your entire Canvas,
one question away.

A self-hosted MCP server that gives your AI assistant full student access to Canvas LMS from your phone, laptop or the web. Always on, password-protected, with automatic failover across your computers.

Example chat: asking what score is needed on the final and what's due this week (sample data)
209tools
15tool groups
OAuth 2.1password-gated
~1 minfailover
Choose your edition

Remote or Local?

Both editions have the same 209 tools. The difference is where you can use them.

You are here

🌐 Remote

Best if you want Canvas everywhere.

  • Web, desktop and mobile AI apps
  • Always on, in the background
  • Password-protected ngrok tunnel
  • Automatic failover across several computers
  • Set up in about 15 minutes
Other edition

πŸ’» Local

Best if you only need it on one computer.

  • Desktop and command-line MCP clients
  • Your AI app starts it automatically
  • Nothing exposed to the internet
  • Needs only Node.js and a Canvas token
  • Set up in about 5 minutes
Go to Local Edition β†’
Features

Built for how students actually use Canvas

More than a thin API wrapper. Higher-level tools answer the questions you really have.

πŸ“Š

Grade intelligence

What-if scores, β€œwhat do I need on the final”, weighted breakdowns and which assignments move your grade most.

πŸ“…

Smart planning

Week-ahead view, semester snapshot, study priority ranking and every missing assignment across all courses in one call.

πŸ“

Safe submissions

Submit text, links and files. Every write shows a dry-run preview first and only sends when confirmed.

πŸ’¬

Discussions & inbox

Pull entire threads in one request, reply, and message instructors with recipient lookup.

πŸ“

Content & archives

Files, pages, modules, lecture captions and a full .imscc course export before access ends.

πŸ”

Always on

Runs in the background with optional two-computer failover, so the connector stays up when one is off.

Architecture

How it fits together

The server only listens on your own computer. A private tunnel with a password-protected login is the only way in.

Your AI appdesktop Β· web Β· mobile
β†’
ngrok tunnelHTTPS + OAuth
β†’
supervisor.jskeeps it alive Β· failover
β†’
index.js127.0.0.1:3939/mcp
β†’
Canvas APIyour school
Setup

Up and running in about 10 minutes

You need Node.js 18+, a Canvas account and a free ngrok account.

Clone and install

git clone https://github.com/Fireiscoolsolo/canvas-lms-mcp-server.git
cd canvas-lms-mcp-server
npm install

Create a Canvas token

In Canvas, go to Account β†’ Settings β†’ Approved Integrations β†’ + New Access Token. Copy it right away, because Canvas only shows it once.

Set up ngrok

Install ngrok, add your authtoken, and claim a free static domain in the ngrok dashboard.

winget install --id Ngrok.Ngrok -e
ngrok update
ngrok config add-authtoken <your-ngrok-token>

Don't skip ngrok update: the winget version is often too old for ngrok's free plan (ERR_NGROK_121).

Configure .env

Copy .env.example to .env and fill in your values.

CANVAS_API_TOKEN=your_canvas_token
CANVAS_BASE_URL=https://yourschool.instructure.com
CANVAS_MCP_PUBLIC_URL=https://your-domain.ngrok-free.dev
CANVAS_MCP_PASSWORD=a_long_random_password
CANVAS_MCP_CLUSTER_SECRET=another_long_random_secret

Start it

node supervisor.js

When the log says active and serving at https://…, it's running. To start it automatically at logon on Windows, see the README.

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 and log in with your password. Apps that sync connectors to your account will show it on your phone and desktop too. Then ask your assistant to run test_connection.

Command-line and editor clients: add an HTTP MCP server named canvas with the same URL.

Multiple computers

Run it on every computer you own

Install it on your desktop and your laptop, or more. One computer serves, the others stand by, and if the active one sleeps or shuts down, another takes over in about a minute. Nobody gets logged out.

ACTIVEComputer Aserver + ngrok tunnel
STANDBYComputer Btakes over after 2 missed checks

Install on the new computer

git clone https://github.com/Fireiscoolsolo/canvas-lms-mcp-server.git
cd canvas-lms-mcp-server
npm install

Use the same shared settings

Create .env with the same CANVAS_MCP_PUBLIC_URL, CANVAS_MCP_PASSWORD and CANVAS_MCP_CLUSTER_SECRET as your first computer. Give each computer its own Canvas token so you can revoke one without breaking the others. Move secrets with a password manager or USB drive, never by email or cloud storage.

Use the same ngrok account

winget install --id Ngrok.Ngrok -e
ngrok update
ngrok config add-authtoken <same authtoken as computer A>

Start it at logon and verify

Register the same CanvasSupervisor scheduled task, then check supervisor.log. You should see either active and serving or already active and healthy β€” … starting in standby. Both mean it's working.

Test failover

Fully stop the active computer. Within about a minute, the other one logs active instance appears to be gone β€” taking over, and your assistant keeps working.

βœ… Must match everywherePublic URL, password, cluster secret, ngrok account
πŸ”‘ Can differCanvas API token (recommended: one per computer)
πŸ’€ Sleep is handledA computer that wakes up after a takeover steps back to standby on its own
Configuration

Environment variables

Everything lives in .env. The first five are required. The shared ones must match on every computer.

VariableDefaultDescription
CANVAS_API_TOKEN requiredβ€”Your Canvas personal access token
CANVAS_BASE_URL requiredβ€”Your school's Canvas address
CANVAS_MCP_PUBLIC_URL remoteβ€”Your ngrok static domain
CANVAS_MCP_PASSWORD remoteβ€”Password for the login page
CANVAS_MCP_CLUSTER_SECRET remoteβ€”Protects the supervisor's internal endpoints
CANVAS_ALLOW_WRITEStruefalse = read-only mode
CANVAS_PROFILEfullcore = curated subset of tools
CANVAS_CACHE_TTL60Response cache time in seconds
CANVAS_TIMEZONEsystemTime zone for due-date math
CANVAS_DOWNLOAD_DIR./canvas-downloadsWhere downloads are saved
CANVAS_MCP_PORT3939Local port
Tools

209 tools in 15 groups

Covers everything a student account can reach, plus raw_canvas_request for anything else.

Content33

Files, pages, modules, captions, exports

Identity24

Profile, token expiry, rate limits

Discussions17

Full threads, replies, ratings

Courses16

Permissions, nicknames, favorites

Submissions16

Submit, comment, rubric results

Inbox14

Messages and recipients

Grades13

What-if, needed score, impact

Assignments12

Missing work, late policy

Quizzes12

Read-only: dates, attempts

Calendar11

Events, office-hours booking

Groups11

Group workspaces

Rubrics11

Rubrics and peer reviews

Planning11

Week ahead, priorities

Meta4

Raw requests, diagnostics

Search3

Smart and keyword search

Security

Safe by design

Your Canvas token never leaves your computer, and your assistant can't act without asking first.

βœ‹

Confirmation gate

Anything that sends, submits, posts or deletes shows a preview first and needs confirm: true.

πŸ›‘οΈ

Injection fencing

Text other people wrote is wrapped in CANVAS_CONTENT markers and labelled as untrusted.

🚫

No quiz-taking

Quiz attempt endpoints are deliberately left out and blocked.

πŸ”‘

OAuth 2.1

Login is rate limited, access tokens last 1 hour and refresh tokens are replaced every time they're used.

Keep private: .env, oauth-store.json and supervisor.log. All three are already listed in .gitignore.