CanvasLMS-API
Provides tools for interacting with Canvas LMS, covering courses, assignments, grading, discussions, modules, pages, files, messaging, peer reviews, and accessibility features.
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., "@CanvasLMS-APIShow my upcoming assignments for this week."
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.
CanvasLMS - API
CanvasLMS - API is a local MCP server that puts your Canvas LMS account in front of an AI assistant. It runs on your machine, talks to Canvas with your own personal access token, and exposes about 100 tools covering courses, assignments, grading, discussions, modules, pages, files, messaging, peer reviews, and accessibility. Every tool returns Markdown. Every tool that changes Canvas previews its change first and only applies it once you confirm.
Quick start
Get a Canvas personal access token: in Canvas go to Account > Settings > Approved Integrations > New Access Token.
Clone the repository and install it.
git clone https://github.com/harryx2011-boop/CanvasLMS-API.git cd CanvasLMS-API uv venv .venv uv pip install -e .Without
uv, use a standard virtual environment instead:python -m venv .venv .venv\Scripts\activate # Windows source .venv/bin/activate # macOS/Linux pip install -e .Copy the example environment file and fill in your Canvas host and token.
cp .env.example .envVerify the connection.
canvaslms-api --testThis prints your name, user id, and active courses. If it fails, check
CANVAS_URLandCANVAS_TOKENin.env.
Related MCP server: Canvas LMS MCP Server
Connect to Claude Code
Windows:
claude mcp add --scope user canvaslms-api -- "<absolute path>\.venv\Scripts\canvaslms-api.exe"macOS/Linux:
claude mcp add --scope user canvaslms-api -- "<absolute path>/.venv/bin/canvaslms-api"The server reads .env from the repository folder at startup, so no environment variables need to go in the client configuration. Use the absolute path to the executable inside .venv.
Connect to Claude Desktop
Add an entry to your Claude Desktop configuration file:
{
"mcpServers": {
"canvaslms-api": {
"command": "<absolute path>\\.venv\\Scripts\\canvaslms-api.exe"
}
}
}On macOS/Linux, use <absolute path>/.venv/bin/canvaslms-api for command.
Config file locations:
Windows:
%APPDATA%\Claude\claude_desktop_config.jsonmacOS:
~/Library/Application Support/Claude/claude_desktop_config.json
Restart Claude Desktop after editing the file.
Other clients
Any MCP client that supports stdio servers can launch the executable directly, the same way as Claude Code and Claude Desktop above.
For clients that only speak HTTP, run the server with the HTTP transport:
canvaslms-api --transport http --host 127.0.0.1 --port 7100Point the client at http://127.0.0.1:7100. The server still reads Canvas credentials from .env in the repository folder.
How it behaves
Course identifiers. Any
courseargument accepts a numeric Canvas id, a course code (ENG101), part of a course name, orsis_course_id:X. Uselist_coursesfirst if you are not sure which one you want.The confirm gate. Every tool that changes Canvas takes a
confirm: bool = falseargument. Called without it, the tool returns a preview of what would change and makes no request that alters Canvas. Call it again withconfirm=trueafter reviewing the preview.Permissions. Every tool runs as the token owner. A student token cannot see other students' private data or use educator tools such as grading or bulk messaging; those calls return the Canvas 403 with a hint about what permission is missing.
Output. Every tool returns Markdown, formatted for direct display in a chat transcript.
Anonymization. When
CANVAS_ANONYMIZE_STUDENTS=true, student names in tool output are replaced with a stable per-course pseudonym instead of their real name.
Tool reference
Write tools (marked confirm) return a preview until called again with confirm=true.
Courses & identity
Tool | Purpose | confirm |
get_profile | Fetch the token owner's Canvas profile | |
get_enrollments | List the token owner's enrollments across courses | |
list_courses | List and search courses the token owner can see | |
get_course | Fetch details for one course | |
get_syllabus | Fetch a course's syllabus body | |
get_course_overview | Summarize a course: syllabus, modules, upcoming work | |
get_course_structure | Fetch a course's full modules/pages/assignments outline | |
get_cache_status | Show what course-resolution data is cached | |
clear_cache | Clear the course-resolution cache |
Student
Tool | Purpose | confirm |
get_upcoming_assignments | List assignments due soon across courses | |
get_todo | Fetch the Canvas to-do list | |
get_submission_status | Show submitted/missing/graded status for a course | |
get_grades | Fetch current grades for one or all courses | |
get_pending_peer_reviews | List peer reviews still owed by the token owner | |
get_submission | Fetch one submission's detail and feedback | |
submit_assignment | Submit an assignment | confirm |
comment_on_submission | Add a comment to a submission | confirm |
mark_module_item_done | Mark a module item complete | confirm |
Assignments & grading
Tool | Purpose | confirm |
list_assignments | List a course's assignments | |
get_assignment | Fetch one assignment's detail | |
list_submissions | List submissions for an assignment | |
get_assignment_analytics | Summarize submission and grade distribution for an assignment | |
get_student_analytics | Summarize one student's activity in a course | |
create_assignment | Create an assignment | confirm |
update_assignment | Update an assignment | confirm |
bulk_grade_submissions | Grade multiple submissions in one call | confirm |
grade_with_rubric | Grade a submission against a rubric | confirm |
Rubrics
Tool | Purpose | confirm |
list_rubrics | List a course's rubrics | |
get_rubric | Fetch one rubric's criteria | |
get_rubric_assessment | Fetch a submission's rubric assessment | |
create_rubric | Create a rubric | confirm |
create_rubric_from_csv | Create a rubric from a CSV definition | confirm |
associate_rubric | Attach a rubric to an assignment | confirm |
Discussions & announcements
Tool | Purpose | confirm |
list_discussion_topics | List a course's discussion topics | |
get_discussion_topic | Fetch one discussion topic | |
list_discussion_entries | List top-level entries in a topic | |
get_discussion_entry | Fetch one discussion entry | |
get_discussion_thread | Fetch a full thread with replies | |
post_discussion_entry | Post a new entry to a topic | confirm |
reply_to_discussion_entry | Reply to an existing entry | confirm |
create_discussion_topic | Create a discussion topic | confirm |
update_discussion_topic | Update a discussion topic | confirm |
list_announcements | List a course's announcements | |
create_announcement | Create an announcement | confirm |
delete_announcement | Delete one announcement | confirm |
delete_announcements | Delete multiple announcements by id | confirm |
delete_announcements_matching | Delete announcements matching a filter | confirm |
Modules
Tool | Purpose | confirm |
list_modules | List a course's modules | |
list_module_items | List items in a module | |
create_module | Create a module | confirm |
update_module | Update a module | confirm |
delete_module | Delete a module | confirm |
add_module_item | Add an item to a module | confirm |
update_module_item | Update a module item | confirm |
delete_module_item | Delete a module item | confirm |
Pages
Tool | Purpose | confirm |
list_pages | List a course's pages | |
get_page | Fetch one page's metadata | |
get_page_content | Fetch one page's body | |
get_front_page | Fetch a course's front page | |
create_page | Create a page | confirm |
edit_page_content | Replace a page's body | confirm |
update_page_settings | Update a page's settings (title, publish state, editing rights) | confirm |
bulk_update_pages | Apply the same edit across multiple pages | confirm |
delete_page | Delete a page | confirm |
Files
Tool | Purpose | confirm |
list_files | List a course's files | |
read_file | Read a text file's content | |
download_file | Download a file to disk | |
upload_file | Upload a file to a course | confirm |
Messaging
Tool | Purpose | confirm |
list_conversations | List Canvas Inbox conversations | |
get_conversation | Fetch one conversation's messages | |
get_unread_count | Get the unread message count | |
mark_conversations_read | Mark conversations as read | confirm |
send_conversation | Send a new message | confirm |
send_bulk_messages | Send the same message to multiple recipients | confirm |
Peer reviews
Tool | Purpose | confirm |
list_peer_reviews | List peer review assignments for an assignment | |
assign_peer_review | Assign a peer review | confirm |
get_peer_review_assignments | List who is reviewing whom | |
get_peer_review_completion_analytics | Summarize peer review completion rates | |
get_peer_review_followup_list | List students who still owe a peer review | |
get_peer_review_comments | Fetch comments left in a peer review | |
analyze_peer_review_quality | Score peer review feedback for depth and usefulness | |
identify_problematic_peer_reviews | Flag low-effort or missing peer reviews | |
generate_peer_review_report | Build a summary report of peer review activity | |
generate_peer_review_feedback_report | Build a report of feedback content across peer reviews | |
extract_peer_review_dataset | Export peer review data for analysis | |
message_peer_reviewers | Message students about their peer review assignments | confirm |
send_peer_review_followups | Send reminders to students with outstanding peer reviews | confirm |
People & privacy
Tool | Purpose | confirm |
list_users | List a course's enrolled users | |
list_groups | List a course's groups | |
check_enrollment | Check one user's enrollment in a course | |
export_anonymization_map | Export the pseudonym-to-real-name mapping | confirm |
get_privacy_status | Show whether anonymization is active |
Accessibility
Tool | Purpose | confirm |
scan_course_content_accessibility | Scan a course's pages and files for accessibility issues | |
fix_accessibility_issues | Apply fixes for detected accessibility issues | confirm |
fetch_ufixit_report | Fetch an existing UFIXIT accessibility report | |
parse_ufixit_violations | Parse violations out of a UFIXIT report | |
format_accessibility_summary | Format an accessibility scan as a readable summary |
Course copy
Tool | Purpose | confirm |
create_content_migration | Start a course content migration/copy | confirm |
get_content_migration_status | Check a content migration's progress |
Meta
Tool | Purpose | confirm |
search_tools | Search the available tools by keyword |
Configuration
All configuration comes from environment variables, loaded from a .env file in the repository root.
Variable | Required | Default | Purpose |
| yes | Your Canvas host, e.g. | |
| yes | Your Canvas personal access token. | |
| no |
| HTTP request timeout, in seconds. |
| no |
| How long course-resolution results are cached, in seconds. |
| no |
| Maximum concurrent requests to Canvas. |
| no |
| Replace student names with stable pseudonyms in tool output. |
| no | system temp directory | Where |
Run canvaslms-api --config to print the resolved configuration, with the token masked.
Development
Install with dev extras:
uv pip install -e ".[dev]"Run tests:
pytestLint:
ruff check .CI runs tests and lint on every push. A Docker image is also available; its entrypoint is canvaslms-api.
Useful CLI flags during development: canvaslms-api --list-tools prints every registered tool name, canvaslms-api --config prints resolved settings, canvaslms-api --version prints the installed version.
Security notes
Your Canvas token stays local. It is read from
.envon startup and used only to call the Canvas API you configured.The token is never logged.
--configandget_privacy_statusmask it.Write tools require an explicit
confirm=trueafter a preview. Nothing changes in Canvas by accident.download_filewill not overwrite an existing file at the destination path.
License
MIT. See LICENSE.
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseCqualityAmaintenanceLocal-first MCP server for Canvas LMS. Stdio transport, no third-party broker, token stays in ~/.canvas.env. Exposes courses, assignments, modules, announcements, grades, planner items, upcoming events, todo list, and bulk file dump as MCP tools.104MIT
- AlicenseBqualityAmaintenanceMCP server for Canvas LMS, providing 115+ tools to read courses, assignments, submissions, rubrics, quizzes; grade, comment, manage course content, and handle Canvas admin workflows from any AI agent.241639955MIT
- AlicenseNot gradedqualityCmaintenanceA local MCP server for Canvas LMS that enables querying courses, assignments, grades, modules, and more from any MCP-compatible AI client.59MIT
- FlicenseNot gradedqualityDmaintenanceMCP server for Canvas LMS that exposes courses, assignments, modules, pages, files, grades, and submissions as tools for AI agents.
Related MCP Connectors
Markdown-first MCP server for Notion API with 8 composite tools and 39 actions.
An MCP server that gives your AI access to the source code and docs of all public github repos
Connect AI agents to Flato's editable canvas runtime through a hosted MCP server.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/harryx2011-boop/CanvasLMS-API'
If you have feedback or need assistance with the MCP directory API, please join our Discord server