Skip to main content
Glama
Canvas MCP Server
by Mattlo0546

Canvas MCP Server: Canvas LMS for Claude, ChatGPT Codex and Cursor

License: MIT MCP Python 3.10+ M8ven Score

canvas-mcp is an open-source Model Context Protocol (MCP) server for Canvas LMS (by Instructure). It lets AI assistants (Claude Desktop, Claude Code, ChatGPT Codex, Cursor, VS Code and SlideMate) read a student's Canvas courses, modules, deadlines and announcements. It can also download every course's lecture slides into one folder per course.

  • Works at any university that uses Canvas. It defaults to the University of Oxford (canvas.ox.ac.uk), and you set CANVAS_BASE_URL for anywhere else.

  • No API token needed. You sign in through your university's normal single sign-on (SSO) and MFA in a real browser window. Many universities, Oxford included, don't let students create Canvas access tokens. If yours does, CANVAS_TOKEN works too.

  • Read-only. It can't submit work, post or change anything on Canvas.

Using Moodle or Blackboard instead? See moodle-mcp (UCL, King's, LSE, Cambridge, Warwick…) and blackboard-mcp (Imperial, Edinburgh, Bristol, Leeds…).

What you can ask

  • "What's due on Canvas this week, and what haven't I submitted?"

  • "Any new announcements in my courses?"

  • "Show me week 3 of PPE101 and download the lecture slides."

  • "Pull every lecture PDF from all my current courses."

Related MCP server: Canvas LMS MCP Server

Tools

Tool

What it does

canvas_login

Opens a browser window for university SSO + MFA and saves the session. It tries a silent refresh first.

canvas_status

Which site you're on, who you're signed in as, and where files download to

canvas_courses

Your current courses, with their term, and whether a full sync pulls each one

canvas_set_courses

Change which courses a full sync pulls (include an info site it skips, exclude a course)

canvas_browse

A course's modules: files, pages, links and assignments with due dates

canvas_deadlines

Assignments, quizzes and discussions due in the next N days, with submission status

canvas_announcements

Recent announcements in one course, or in all of them

canvas_download

Save one file (a file_id from canvas_browse)

canvas_sync / canvas_sync_status

With no course: download the PDFs from every current course, in the background. With a course: download all of its files.

Courses can be named loosely: "PPE101", "philosophy" or the course id all work. A sync files things as <course code>/<module name>/<file>. It skips past courses and files you already have, and it still finds module files in courses that hide the Files tab from students.

A full sync also skips what isn't for studying: sites that aren't courses (guidance hubs, study-skills sites, year-group noticeboards) and, inside courses, posters, handbooks, forms, timetables and modules like "Student support". Its report lists the sites it skipped; canvas_set_courses brings one back. Words that are also lecture topics only count in an admin phrase, so "Mathematical induction" stays and "Induction week schedule" goes (relevance.py).

Install

macOS / Linux, one command

This installs uv, which brings its own Python, so you don't need Xcode or Apple's Command Line Tools. Then it installs canvas-mcp and opens Chrome so you can sign in once:

curl -LsSf https://astral.sh/uv/install.sh | sh && ~/.local/bin/uv tool install --managed-python https://github.com/Mattlo0546/canvas-mcp/archive/refs/heads/main.zip && CANVAS_BASE_URL=canvas.ox.ac.uk ~/.local/bin/canvas-mcp login

Change canvas.ox.ac.uk to your university's Canvas address. Sign-in uses Google Chrome. Without Chrome, first run ~/.local/share/uv/tools/canvas-mcp/bin/playwright install chromium. To update later, add --reinstall after tool install.

Windows

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
uv tool install --managed-python https://github.com/Mattlo0546/canvas-mcp/archive/refs/heads/main.zip
$env:CANVAS_BASE_URL="canvas.ox.ac.uk"; canvas-mcp login

Connect it to your AI app

Set CANVAS_BASE_URL to your university's Canvas address in each config below.

SlideMate

In SlideMate, go to Settings → Your university, then pick your university or Canvas and press Connect. SlideMate installs this server, signs you in and makes the library's Pull button download new slides. Nothing to type.

Claude Code

claude mcp add canvas -e CANVAS_BASE_URL=https://canvas.ox.ac.uk -- ~/.local/bin/canvas-mcp serve

Claude Desktop

Settings → Developer → Edit Config (claude_desktop_config.json):

{
  "mcpServers": {
    "canvas": {
      "command": "/Users/YOU/.local/bin/canvas-mcp",
      "args": ["serve"],
      "env": { "CANVAS_BASE_URL": "https://canvas.ox.ac.uk" }
    }
  }
}

ChatGPT Codex CLI

codex mcp add canvas --env CANVAS_BASE_URL=https://canvas.ox.ac.uk -- ~/.local/bin/canvas-mcp serve

Cursor (~/.cursor/mcp.json) and VS Code (.vscode/mcp.json, under "servers")

{
  "mcpServers": {
    "canvas": {
      "command": "/Users/YOU/.local/bin/canvas-mcp",
      "args": ["serve"],
      "env": { "CANVAS_BASE_URL": "https://canvas.ox.ac.uk" }
    }
  }
}

Universities that use Canvas

Any Canvas site works. These addresses were checked to be Canvas instances:

University

CANVAS_BASE_URL

University of Oxford

canvas.ox.ac.uk

University of Birmingham

canvas.bham.ac.uk

University of Liverpool

canvas.liverpool.ac.uk

University of Sussex

canvas.sussex.ac.uk

Harvard University

canvas.harvard.edu

Stanford University

canvas.stanford.edu

MIT

canvas.mit.edu

UC Berkeley (bCourses)

bcourses.berkeley.edu

UC San Diego

canvas.ucsd.edu

University of Michigan

umich.instructure.com

Columbia University (CourseWorks)

courseworks2.columbia.edu

Carnegie Mellon University

canvas.cmu.edu

National University of Singapore

canvas.nus.edu.sg

University of Newcastle, Australia

canvas.newcastle.edu.au

Your university's Canvas address is the one in your browser's address bar when you open Canvas. Often it's canvas.<university domain> or <name>.instructure.com.

Command line

canvas-mcp login          # sign in (opens Chrome)
canvas-mcp status         # who you're signed in as
canvas-mcp courses        # your current courses
canvas-mcp deadlines      # what's due in the next 14 days
canvas-mcp sync           # PDFs from every current course
canvas-mcp sync PPE101    # every file in one course

Settings (all optional)

Environment variables win over ~/.canvas-mcp/config.json.

Variable

Default

Meaning

CANVAS_BASE_URL

https://canvas.ox.ac.uk

Your Canvas site

CANVAS_TOKEN

none

A Canvas access token (Account → Settings → New access token), if your university allows them. It replaces the browser sign-in.

CANVAS_DOWNLOAD_DIR

SlideMate's first slides folder, else ~/CanvasFiles

Where downloads go

CANVAS_BROWSER_CHANNEL

chrome

Browser for sign-in. "" uses Playwright's own Chromium.

CANVAS_MCP_HOME

~/.canvas-mcp

Where the session and the sign-in browser profile are kept

How sign-in works

Canvas at most universities sits behind SAML or Shibboleth single sign-on with MFA, so there's no password a script can post. canvas_login opens your Canvas site in a real Chrome window and you sign in as usual. It waits until the Canvas REST API (/api/v1/users/self) answers, then saves that site's session cookies, readable only by you. The API client sends those cookies, exactly as the Canvas website does. The browser profile remembers your SSO session, so when the Canvas session lapses, the server signs back in headlessly with no clicks, for as long as your university's SSO allows.

FAQ

Is there a Canvas MCP server that works without an API token? Yes, this one. It signs in through your university's SSO in a browser, so it works where students can't create access tokens.

Does it work with ChatGPT? It works with OpenAI's Codex CLI and with any app that supports local (stdio) MCP servers. The ChatGPT website can only use remote MCP servers.

Can it submit assignments or post on Canvas? No. Every tool is read-only, apart from saving files to your own computer.

Where is my data stored? Only on your computer. The session is at ~/.canvas-mcp/session.json. Delete that file and ~/.canvas-mcp/browser-profile to sign out. Data goes straight between your computer and your university's Canvas.

Is it allowed? It only reads what you can already see when you're signed in, at about the pace of a person clicking through Canvas. Check your university's IT acceptable-use policy if you're unsure.

Development

uv run --with pytest pytest     # offline tests against a fake Canvas: pagination, hidden Files, expiry, stdio
  • moodle-mcp: MCP server for Moodle

  • blackboard-mcp: MCP server for Blackboard Learn (Ultra)

  • classroom-mcp: MCP server for Google Classroom

  • SlideMate: a free Mac app with an AI tutor that has read your whole lecture deck. It sets all of these up in one click.

MIT licensed. Not affiliated with Instructure or the University of Oxford. Canvas is a trademark of Instructure, Inc.

Available Tools

9 tools
canvas_announcementsA

Announcements posted in the last days days, newest first: in one course (id, code or part of the name), or in every current course when course is empty.

Inputs: days, course. Returns: result

canvas_browseA

Show a course's modules with their files, pages, links and assignments (with due dates). course can be a course id, course code, or part of the name. File items include a file_id for canvas_download.

Inputs: course (required).

canvas_coursesA

List the user's Canvas courses (current ones, unless include_past).

Inputs: include_past. Returns: result

canvas_deadlinesA

Assignments, quizzes and discussions due in the next days days (default 14), soonest first, with whether each has been submitted.

Inputs: days. Returns: result

canvas_downloadA

Download one Canvas file (a file_id from canvas_browse) into // (or subdir).

Inputs: course (required), file_id (required), subdir.

canvas_loginA

Sign in to Canvas. Opens a Chrome window on the user's computer at the university sign-in page; the user completes SSO + MFA there and the session is saved for the other tools. Tries a silent refresh first, so it often finishes without any window.

Inputs: timeout_seconds.

canvas_statusA

Check the Canvas session: which site, signed in as whom, and the download folder.

Inputs: no named parameters.

canvas_syncA

Download course files to /// (SlideMate's library if it's set up, else ~/CanvasFiles).

With a course (id, code or part of the name), downloads every file in it and returns the result. Without one, downloads the PDFs (lecture slides, handouts, readings) from every current course in the background and returns {"running": true}; call canvas_sync_status until it reports the result. Files already there are skipped.

Inputs: course, skip_existing.

canvas_sync_statusA

Progress of a sync started by canvas_sync without a course: {"running": true, "progress": …} while it runs, then the result (a summary, files per course and any errors).

Inputs: no named parameters.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4/5.0

    Scored across 9 tools

    Disambiguation4/5

    Most tools have clearly distinct purposes (login, status, courses, browse, deadlines, announcements), and the bulk vs. single-file split between canvas_sync and canvas_download is clarified in the descriptions. The main risk is name-level confusion between canvas_status (session info) and canvas_sync_status (background sync progress), which share the word 'status' but differ in scope.

    Naming Consistency5/5

    All nine tools use a uniform canvas_ prefix with snake_case and largely verb/noun naming (canvas_login, canvas_courses, canvas_browse, canvas_download, canvas_deadlines). The only compound, canvas_sync_status, still fits the same pattern as the status companion to canvas_sync.

    Tool Count5/5

    Nine tools is a well-scoped set for a Canvas file/course access server. Each tool earns its place: authentication, session check, course listing, browsing, two download paths, plus deadlines and announcements.

    Completeness4/5

    The read/download lifecycle is well covered: auth, session status, courses, module browsing, bulk and single-file downloads, deadlines, and announcements. Gaps exist for grades, assignment submission, and messaging/discussion participation, though these may be outside the server's stated file-fetching focus.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers