canvas-control
Allows interaction with Canvas LMS, providing tools for listing courses, searching/downloading files, syncing course files, checking grades, and submitting assignments.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@canvas-controllist my courses"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
canvas-control
canvas-control turns Canvas LMS into a fast, scriptable download pipeline and exposes it to AI assistants via MCP.
Download files from multiple Canvas content sources in one command
Sync course files like
git pull— skip unchanged, re-download on demandCheck grades across all courses from the terminal or export to CSV/JSON
Submit assignments from the terminal (file upload, text entry, URL)
Talk to Canvas through AI assistants (Claude Desktop, Cursor, Claude Code) — search files, download by name or type, sync courses, and set paths in natural language
Star History
Related MCP server: Canvas MCP Server
Table of contents
Why canvas-control
One command downloads from
files,assignments,discussions,pages, andmodules.Built for repeatable workflows: predictable output paths, machine-readable manifests, idempotent re-runs.
Guided mode (
download interactive) for beginners, fully scripted mode (download run) for power users.Grades accessible from the terminal: summaries, per-assignment breakdowns, CSV/JSON export.
MCP server lets AI assistants query courses, grades, assignments, and sync files with natural language.
Quick start
canvas-control uses uv for environment and dependency management.
Create and activate a virtual environment (Python 3.12+):
uv venv --python 3.12
source .venv/bin/activateInstall the project and dev dependencies:
uv pip install -e '.[dev]'Set your Canvas base URL once:
cvsctl config set-base-url https://your-school.instructure.comSet
CANVAS_TOKEN(see configuration docs) or letcvsctlprompt for it.Run the onboarding wizard to configure everything interactively, or jump straight to your first command:
# Guided setup (recommended for first-time users)
cvsctl onboard
# Or go straight to listing your courses
cvsctl courses listMCP server (AI assistants)
canvas-control includes an MCP (Model Context Protocol) server so you can interact with Canvas through AI assistants using natural language.
Available tools
Tool | Description |
| List enrolled courses (active or all) |
| Assignments due within a time window |
| Recent course announcements |
| Calendar events within a time window |
| Course syllabus content |
| Grade overview across courses |
| Per-assignment grade breakdown |
| List all files in a course (raw) |
| Search files by name, type, or folder — preview before downloading |
| Download a single file by ID |
| Download a batch of specific files to a local directory |
| Save a download path to config (global or per-course) |
| Mark assignment complete (submission or module completion flow) |
| Sync all course files to local disk; supports custom |
Natural language file downloads
Three new tools enable a conversational download workflow directly from Claude Desktop or Cursor:
**search_course_files** — search before you download. Filter by name substring, file extension, or folder path. The assistant shows you a preview of matching files so you can confirm before anything hits disk.
**download_selected_files** — download a batch of specific files (by Canvas file ID) to any local directory. Skips files that already exist, so it's safe to re-run. Returns a per-file status: downloaded, skipped, or failed.
**set_download_path** — persist a directory path to config so you don't have to specify it every time. Set a global default or a per-course path.
**sync_course_files** — now accepts an optional destination parameter, so you can tell the assistant exactly where to put everything without touching config first.
Example conversation:
You: Search for PDF files in my Biology course
Claude: Found 8 PDFs — Lecture 1.pdf, Lecture 2.pdf, Syllabus.pdf …
You: Download those to ~/Documents/Bio
Claude: Downloaded 7, skipped 1 (already exists). Saved to ~/Documents/Bio.
You: Save that as my default path for Biology
Claude: Saved ~/Documents/Bio as the download path for Biology (course 12345).Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"canvas": {
"command": "uv",
"args": ["--directory", "/path/to/canvas-control", "run", "cvsctl", "mcp", "serve"],
"env": {
"CANVAS_TOKEN": "your-token",
"CANVAS_BASE_URL": "https://your-school.instructure.com",
"CANVAS_TIMEZONE": "America/Los_Angeles"
}
}
}
}Cursor
Add to .cursor/mcp.json in your project or ~/.cursor/mcp.json globally:
{
"mcpServers": {
"canvas": {
"command": "uv",
"args": ["--directory", "/path/to/canvas-control", "run", "cvsctl", "mcp", "serve"],
"env": {
"CANVAS_TOKEN": "your-token",
"CANVAS_BASE_URL": "https://your-school.instructure.com",
"CANVAS_TIMEZONE": "America/Los_Angeles"
}
}
}
}Claude Code
claude mcp add canvas -- uv --directory /path/to/canvas-control run cvsctl mcp serveSet CANVAS_TOKEN, CANVAS_BASE_URL, and optionally CANVAS_TIMEZONE in your shell profile or .envrc.
Example prompts
Courses, grades, and assignments:
"What classes am I taking?"
"What assignments are due this week?"
"Show my grades for Biology"
"Are there any new announcements?"
"Mark Homework 2 complete"
Downloading files:
"Search for slides in my CS101 course"
"Download the lecture PDFs from my Biology course to ~/Documents/Bio"
"Save ~/Documents/Bio as my default download path for Biology"
"Sync all files from my Time Series course to ~/Documents/School"
"Re-download all files for Biology, overwriting existing ones"
CLI highlights
Download all files for a course:
cvsctl download run --course 12345View grades at a glance:
cvsctl grades summaryExport grades to CSV:
cvsctl grades export --detailedGuided interactive download:
cvsctl download interactiveSubmit an assignment:
cvsctl assignments submit --course 12345 --assignment "Homework 1" --file ./solution.pySee CLI Reference for the full command tree and all options.
Documentation
Configuration — token setup, download paths, per-course paths
CLI Reference — full command tree and behavior notes
Guides — workflows, grades, interactive mode, troubleshooting
Dev Testing
When changes are merged into the main branch, update your local clone and reinstall so the MCP server picks up the latest code.
Pull the latest changes:
git pull origin mainReinstall the package (picks up new dependencies or entry-point changes):
uv pip install -e '.[dev]'Run the test suite to verify nothing is broken:
uv run pytestRestart the MCP server in your AI client so it spawns a fresh process:
Claude Desktop: quit and relaunch the app
Cursor: open Settings → MCP and click the refresh/reconnect button
Claude Code: the server is spawned per-session; start a new session
Contributing
Create a branch for your change.
Implement focused changes and tests.
Run tests:
uv run pytestOptional live smoke test (requires real Canvas credentials):
export CANVAS_BASE_URL="https://your-school.instructure.com"
export CANVAS_TOKEN="your-token"
export CANVAS_TEST_COURSE_ID="12345"
uv run pytest -m liveOpen a PR with what changed, why, and test coverage.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/tomtranjr/canvas-control'
If you have feedback or need assistance with the MCP directory API, please join our Discord server