canvas-mcp

Canvas MCP Server

License: MIT

This repository contains a Model Context Protocol (MCP) server implementation for interacting with the Canvas Learning Management System API. The server is designed to work with Claude Desktop and other MCP-compatible clients.

Note: Recently refactored to a modular architecture for better maintainability. The legacy monolithic implementation has been archived.

Overview

The Canvas MCP Server bridges the gap between Claude Desktop and Canvas Learning Management System, providing both students and educators with an intelligent interface to their Canvas environment. Built on the Model Context Protocol (MCP), it enables natural language interactions with Canvas data.

πŸŽ‰ Latest Release: v1.0.4

Released: November 10, 2025 View Full Release Notes

Major Features

Improvements

Recent Bug Fix

For Students πŸ‘¨β€πŸŽ“

Get AI-powered assistance with:

β†’ Get Started as a Student

For Educators πŸ‘¨β€πŸ«

Enhance your teaching with:

β†’ Get Started as an Educator

πŸ”’ Privacy & Data Protection

For Educators: FERPA Compliance

Complete FERPA compliance through systematic data anonymization when working with student data:

All student data is anonymized before it reaches AI systems. See Educator Guide for configuration details.

For Students: Your Data Stays Private

Prerequisites

Supported MCP Clients

Canvas MCP works with any application that supports the Model Context Protocol. Popular options include:

Recommended:

AI Coding Assistants:

Development Platforms:

Enterprise:

See the official MCP clients list for more options.

Note: While Canvas MCP is designed to work with any MCP client, setup instructions in this guide focus on Claude Desktop. Configuration for other clients may vary.

Installation

1. Install Dependencies

# Install uv package manager (faster than pip)
pip install uv

# Install the package
uv pip install -e .

2. Configure Environment

# Copy environment template
cp env.template .env

# Edit with your Canvas credentials
# Required: CANVAS_API_TOKEN, CANVAS_API_URL

Get your Canvas API token from: Canvas β†’ Account β†’ Settings β†’ New Access Token

Note for Students: Some educational institutions restrict API token creation for students. If you see an error like β€œThere is a limit to the number of access tokens you can create” or cannot find the token creation option, contact your institution’s Canvas administrator or IT support department to request API access or assistance in creating a token.

3. Claude Desktop Setup

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "canvas-api": {
      "command": "canvas-mcp-server"
    }
  }
}

Verification

Test your setup:

# Test Canvas API connection
canvas-mcp-server --test

# View configuration
canvas-mcp-server --config

# Start server (for manual testing)
canvas-mcp-server

Available Tools

The Canvas MCP Server provides a comprehensive set of tools for interacting with the Canvas LMS API. These tools are organized into logical categories for better discoverability and maintainability.

Tool Categories

Student Tools (New!)

Shared Tools (Both Students & Educators)

  1. Course Tools - List and manage courses, get detailed information, generate summaries with syllabus content
  2. Discussion & Announcement Tools - Manage discussions, announcements, and replies
  3. Page & Content Tools - Access pages, modules, and course content

Educator Tools

  1. Assignment Tools - Handle assignments, submissions, and peer reviews with analytics
  2. Rubric Tools - Full CRUD operations for rubrics with validation, association management, and grading (including bulk_grade_submissions for efficient batch grading)
  3. User & Enrollment Tools - Manage enrollments, users, and groups
  4. Analytics Tools - View student analytics, assignment statistics, and progress tracking
  5. Messaging Tools - Send messages and announcements to students

Developer Tools

  1. Discovery Tools - Search and explore available code execution API operations with search_canvas_tools and list_code_api_modules
  2. Code Execution Tools - Execute TypeScript code with execute_typescript for token-efficient bulk operations (99.7% token savings!)

πŸ“– View Full Tool Documentation for detailed information about all available tools.

πŸš€ Code Execution API (New!)

The Canvas MCP now supports code execution patterns for maximum token efficiency when performing bulk operations.

When to Use Each Approach

Traditional Tool Calling (for simple queries):

Ask Claude: "Show me my courses"
Ask Claude: "Get assignment details for assignment 123"

βœ… Best for: Single queries, small datasets, quick lookups

Bulk Grade Submissions Tool (for batch grading with predefined grades):

Ask Claude: "Grade these 10 students with their specific rubric scores"

βœ… Best for: Batch grading when you already have the grades/scores, concurrent processing

Code Execution (for bulk operations with custom logic):

Ask Claude: "Grade all 90 Jupyter notebook submissions by analyzing each notebook"
Ask Claude: "Send reminders to all students who haven't submitted"

βœ… Best for: Bulk processing with custom analysis logic, large datasets, complex conditions

Token Savings Example

Scenario: Grading 90 Jupyter notebook submissions

Approach Token Usage Efficiency
Traditional 1.35M tokens Loads all submissions into context
Code Execution 3.5K tokens 99.7% reduction! πŸŽ‰

Example: Bulk Grading

import { bulkGrade } from './canvas/grading/bulkGrade';

await bulkGrade({
  courseIdentifier: "60366",
  assignmentId: "123",
  gradingFunction: (submission) => {
    // Analysis happens locally, not in Claude's context!
    const notebook = submission.attachments?.find(f =>
      f.filename.endsWith('.ipynb')
    );

    if (!notebook) return null; // Skip

    const hasErrors = analyzeNotebook(notebook.url);

    return hasErrors ? null : {
      points: 100,
      rubricAssessment: { "_8027": { points: 100 } },
      comment: "Great work! No errors."
    };
  }
});

Example: Bulk Discussion Grading

Grade discussion posts with initial post + peer review requirements:

import { bulkGradeDiscussion } from './canvas/discussions/bulkGradeDiscussion';

// Preview grades first (dry run)
await bulkGradeDiscussion({
  courseIdentifier: "60365",
  topicId: "990001",
  criteria: {
    initialPostPoints: 10,      // Points for initial post
    peerReviewPointsEach: 5,    // Points per peer review
    requiredPeerReviews: 2,     // Must review 2 peers
    maxPeerReviewPoints: 10     // Cap at 10 pts for reviews
  },
  dryRun: true  // Preview first!
});

// Then apply grades
await bulkGradeDiscussion({
  courseIdentifier: "60365",
  topicId: "990001",
  assignmentId: "1234567",  // Required to write grades
  criteria: {
    initialPostPoints: 10,
    peerReviewPointsEach: 5,
    requiredPeerReviews: 2,
    maxPeerReviewPoints: 10
  },
  dryRun: false
});

Features:

Discovering Available Tools

The Canvas MCP Server includes a search_canvas_tools MCP tool that helps you discover and explore available code execution API operations. This tool searches through the TypeScript code API files and returns information about available Canvas operations.

Tool Parameters:

Example Usage:

Ask Claude in natural language:

Or use directly via MCP:

// Search for grading-related tools with signatures
search_canvas_tools("grading", "signatures")

// List all available tools (names only)
search_canvas_tools("", "names")

// Get full implementation details for bulk operations
search_canvas_tools("bulk", "full")

// Find discussion-related operations
search_canvas_tools("discussion", "signatures")

Returns: JSON response with:

Code API File Structure

src/canvas_mcp/code_api/
β”œβ”€β”€ client.ts              # Base MCP client bridge
β”œβ”€β”€ index.ts               # Main entry point
└── canvas/
    β”œβ”€β”€ assignments/       # Assignment operations
    β”‚   └── listSubmissions.ts
    β”œβ”€β”€ grading/          # Grading operations
    β”‚   β”œβ”€β”€ gradeWithRubric.ts
    β”‚   └── bulkGrade.ts  # ⭐ Bulk grading (99.7% token savings!)
    β”œβ”€β”€ discussions/      # Discussion operations
    β”‚   β”œβ”€β”€ listDiscussions.ts
    β”‚   β”œβ”€β”€ postEntry.ts
    β”‚   └── bulkGradeDiscussion.ts  # ⭐ Bulk discussion grading
    β”œβ”€β”€ courses/          # Course operations
    └── communications/   # Messaging operations

How It Works

  1. Discovery: Use search_canvas_tools to find available operations
  2. Execution: Claude reads TypeScript code API files and executes them locally
  3. Processing: Data stays in execution environment (no context cost!)
  4. Results: Only summaries flow back to Claude’s context

πŸ“– View Bulk Grading Example for a detailed walkthrough.

Usage with MCP Clients

This MCP server works seamlessly with any MCP-compatible client:

  1. Automatic Startup: MCP clients start the server when needed
  2. Tool Integration: Canvas tools appear in your AI assistant’s interface
  3. Natural Language: Interact naturally with prompts like:

Students:

Educators:

Quick Start Examples

New to Canvas MCP? Check out these practical guides:

Project Structure

Modern Python package structure following 2025 best practices:

canvas-mcp/
β”œβ”€β”€ pyproject.toml             # Modern Python project config
β”œβ”€β”€ env.template              # Environment configuration template
β”œβ”€β”€ src/
β”‚   └── canvas_mcp/            # Main package
β”‚       β”œβ”€β”€ __init__.py        # Package initialization
β”‚       β”œβ”€β”€ server.py          # Main server entry point
β”‚       β”œβ”€β”€ core/              # Core utilities
β”‚       β”‚   β”œβ”€β”€ config.py      # Configuration management
β”‚       β”‚   β”œβ”€β”€ client.py      # HTTP client
β”‚       β”‚   β”œβ”€β”€ cache.py       # Caching system
β”‚       β”‚   └── validation.py  # Input validation
β”‚       β”œβ”€β”€ tools/             # MCP tool implementations
β”‚       β”‚   β”œβ”€β”€ courses.py     # Course management
β”‚       β”‚   β”œβ”€β”€ assignments.py # Assignment tools
β”‚       β”‚   β”œβ”€β”€ discussions.py # Discussion tools
β”‚       β”‚   β”œβ”€β”€ rubrics.py     # Rubric tools
β”‚       β”‚   β”œβ”€β”€ student_tools.py # Student-specific tools
β”‚       β”‚   β”œβ”€β”€ messaging.py   # Communication tools
β”‚       β”‚   β”œβ”€β”€ discovery.py   # Code API tool discovery
β”‚       β”‚   β”œβ”€β”€ code_execution.py # TypeScript code execution (NEW!)
β”‚       β”‚   └── ...            # Other tool modules
β”‚       β”œβ”€β”€ code_api/          # Code execution API (NEW!)
β”‚       β”‚   β”œβ”€β”€ client.ts      # MCP client bridge
β”‚       β”‚   └── canvas/        # Canvas operations
β”‚       β”‚       β”œβ”€β”€ grading/   # Bulk grading (99.7% token savings!)
β”‚       β”‚       β”œβ”€β”€ courses/   # Course operations
β”‚       β”‚       └── ...        # Other modules
β”‚       └── resources/         # MCP resources
β”œβ”€β”€ examples/                 # Usage examples (NEW!)
└── docs/                     # Documentation

Documentation

Modern Architecture (2025)

Built with current Python ecosystem best practices:

Core Components

Dependencies

Modern Python packages (see pyproject.toml):

Performance Features

Development Tools

For contributors, see the Development Guide for detailed architecture and development reference.

Troubleshooting

If you encounter issues:

  1. Server Won’t Start - Verify your Configuration setup: .env file, virtual environment path, and dependencies
  2. Authentication Errors - Check your Canvas API token validity and permissions
  3. Connection Issues - Verify Canvas API URL correctness and network access
  4. Debugging - Check Claude Desktop console logs or run server manually for error output

Security & Privacy Features

API Security

Privacy Controls (Educators Only)

Educators working with student data can enable FERPA-compliant anonymization:

# In your .env file
ENABLE_DATA_ANONYMIZATION=true  # Anonymizes student names/emails before AI processing
ANONYMIZATION_DEBUG=true        # Debug anonymization (optional)

Students don’t need anonymization since they only access their own data.

For detailed privacy configuration, see:

Publishing to MCP Registry

This server is published to the Model Context Protocol Registry for easy installation.

Publishing is automated via GitHub Actions:

  1. Prepare a release:
    # Update version in pyproject.toml
    # Update CHANGELOG if applicable
    git commit -am "chore: bump version to X.Y.Z"
    git push
    
  2. Create and push a version tag:
    git tag vX.Y.Z
    git push origin vX.Y.Z
    
  3. Automated workflow:
    • Runs tests
    • Builds Python package
    • Publishes to PyPI
    • Publishes to MCP Registry using GitHub OIDC

Prerequisites for Publishing

Alternative: Use API token (legacy method - not recommended):

Manual Publishing (Alternative)

For manual publishing:

# Install MCP Publisher
curl -fsSL https://modelcontextprotocol.io/install.sh | sh

# Login using GitHub
mcp-publisher login github

# Publish server
mcp-publisher publish

Registry Validation

The server.json configuration is automatically validated against the MCP schema during CI/CD. To validate locally:

# Download schema
curl -s https://registry.modelcontextprotocol.io/v0/server.schema.json -o /tmp/mcp-schema.json

# Validate (requires jsonschema CLI)
pip install jsonschema
jsonschema -i server.json /tmp/mcp-schema.json

Contributing

Contributions are welcome! Feel free to:

License

This project is licensed under the MIT License - see the LICENSE file for details.


Created by Vishal Sachdev