Are you the author? Sign in to claim
canvas-lms-mcp
A minimal Canvas LMS MCP (Machine Conversation Protocol) server for easy access to education data through your Canvas LMS instance. This server provides a bridge between AI systems (like Cursor) and Canvas Learning Management System.
To install Canvas LMS Server for Claude Desktop automatically via Smithery:
npx -y @smithery/cli install @ahnopologetic/canvas-lms-mcp --client claude
uv package manager (recommended)The easiest way to install and run canvas-lms-mcp is using uvx:
uvx canvas-lms-mcp
This will run the server in an isolated environment without installing it permanently.
To install the tool permanently:
uv tool install canvas-lms-mcp
Clone the repository:
git clone https://github.com/yourusername/canvas-lms-mcp.git
cd canvas-lms-mcp
Install with uv:
# Install uv if you don't have it yet
curl -LsSf https://astral.sh/uv/install.sh | sh
# Create a virtual environment and install dependencies
uv venv
uv pip install -e .
Alternatively, use traditional methods:
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
pip install -e .
Set the following environment variables:
export CANVAS_API_TOKEN="your_canvas_api_token"
export CANVAS_BASE_URL="https://your-institution.instructure.com" # Default: https://canvas.instructure.com
You can get your Canvas API token from your Canvas account settings.
Start the server with uv:
uv run src/canvas_lms_mcp/main.py
If installed with uvx tool:
canvas-lms-mcp
By default, the server runs on http://localhost:8000. You can use the FastMCP interface at http://localhost:8000/docs to interact with the API.
The server provides 22 tools for interacting with Canvas LMS:
list_coursesList courses that the user is actively enrolled in.
Parameters:
page (optional, default=1): Page number (1-indexed)items_per_page (optional, default=10): Number of items per pageget_courseGet a single course by ID.
Parameters:
course_id (required): Course IDinclude (optional): List of additional data to includeget_course_syllabusGet a course's syllabus body as HTML.
Parameters:
course_id (required): Course IDget_course_modulesGet modules for a course.
Parameters:
course_id (required): Course IDinclude (optional): List of additional data to includeper_page (optional, default=100): Number of items per pageget_module_itemsGet items for a specific module.
Parameters:
course_id (required): Course IDmodule_id (required): Module IDlist_assignmentsList assignments for a course.
Parameters:
course_id (required): Course IDbucket (required): Filter by "past", "overdue", "undated", "ungraded", "unsubmitted", "upcoming", or "future"order_by (required): Order by "due_at", "position", or "name"include (optional): List of additional data to include (e.g., ["submission"] to see grade status)page (optional, default=1): Page number (1-indexed)items_per_page (optional, default=10): Number of items per pageget_assignmentGet a single assignment by ID.
Parameters:
course_id (required): Course IDassignment_id (required): Assignment IDlist_assignment_groupsList assignment groups for a course (shows grade weighting/categories).
Parameters:
course_id (required): Course IDget_pageGet a single page by its URL slug.
Parameters:
course_id (required): Course IDpage_slug (required): Page URL slug (e.g., "syllabus", "course-handbook")list_submissionsList the current user's submissions for a course, including grades and feedback.
Parameters:
course_id (required): Course IDinclude (optional): List of additional data (e.g., ["assignment", "submission_comments"])page (optional, default=1): Page number (1-indexed)items_per_page (optional, default=10): Number of items per pagelist_announcementsList announcements for one or more courses.
Parameters:
course_ids (required): List of course IDspage (optional, default=1): Page number (1-indexed)items_per_page (optional, default=10): Number of items per pagelist_discussionsList discussion topics for a course.
Parameters:
course_id (required): Course IDpage (optional, default=1): Page number (1-indexed)items_per_page (optional, default=10): Number of items per pageget_discussion_viewGet the full view of a discussion topic including all replies.
Parameters:
course_id (required): Course IDdiscussion_id (required): Discussion topic IDlist_calendar_eventsList calendar events for courses.
Parameters:
context_codes (required): List of context codes (e.g., ["course_123"])start_date (optional): Start date in ISO 8601 formatend_date (optional): End date in ISO 8601 formatpage (optional, default=1): Page number (1-indexed)items_per_page (optional, default=10): Number of items per pagelist_planner_itemsList planner items for the authenticated user.
Parameters:
start_date (required): Start date in ISO 8601 formatend_date (required): End date in ISO 8601 formatcontext_codes (optional): List of context codes (e.g., ["course_123"])page (optional, default=1): Page number (1-indexed)items_per_page (optional, default=10): Number of items per pageget_enrollmentsGet the current user's enrollments including grades.
list_quizzesList quizzes for a course. Note: only works with Classic Quizzes, not New Quizzes (quiz_lti).
Parameters:
course_id (required): Course IDinclude (optional): List of additional data to includepage (optional, default=1): Page number (1-indexed)items_per_page (optional, default=10): Number of items per pageget_quizGet a single quiz by ID.
Parameters:
course_id (required): Course IDquiz_id (required): Quiz IDlist_filesList files for a course or folder. Note: may return 403 for student accounts depending on institution permissions.
Parameters:
course_id (optional): Course IDfolder_id (optional): Folder IDinclude (optional): List of additional data to includepage (optional, default=1): Page number (1-indexed)items_per_page (optional, default=10): Number of items per pageget_fileGet a file by ID. Works with known file IDs even when list_files is restricted.
Parameters:
course_id (required): Course IDfile_id (required): File IDget_tabsGet available tabs/navigation items for a course.
Parameters:
course_id (required): Course IDlist_favoritesList the current user's favorite courses.
This MCP server works with any client that supports the Model Context Protocol, including Claude Desktop, Claude Code, Cursor, Windsurf, and others.
The MCP configuration is the same across all clients — only the config file location differs:
{
"mcpServers": {
"canvas": {
"command": "uvx",
"args": ["canvas-lms-mcp"],
"env": {
"CANVAS_API_TOKEN": "your_canvas_api_token",
"CANVAS_BASE_URL": "https://your-institution.instructure.com"
}
}
}
}
Replace your_canvas_api_token with your Canvas API token (found in Canvas → Account → Settings → New Access Token) and your-institution.instructure.com with your institution's Canvas URL.
Add to your Claude Desktop config file:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.jsonRestart Claude Desktop after saving.
Add to your project's .mcp.json or global ~/.claude/settings.json:
{
"mcpServers": {
"canvas": {
"command": "uvx",
"args": ["canvas-lms-mcp"],
"env": {
"CANVAS_API_TOKEN": "your_canvas_api_token",
"CANVAS_BASE_URL": "https://your-institution.instructure.com"
}
}
}
}
Add to .cursor/mcp.json in your project directory. Restart Cursor after saving.
Add to ~/.codeium/windsurf/mcp_config.json. Restart Windsurf after saving.
Once connected, you can ask your AI assistant about your Canvas data:
For detailed development instructions, please see the DEVELOPMENT.md file.
This project is licensed under the MIT License - see the LICENSE file for details.
Run Claude Code as an MCP server so any agent can delegate coding tasks to it
Browser automation using accessibility snapshots instead of screenshots
Google's universal MCP server supporting PostgreSQL, MySQL, MongoDB, Redis, and 10+ databases
Official GitHub integration for repos, issues, PRs, and CI/CD workflows