An open API service indexing awesome lists of open source software.

https://github.com/a-ariff/canvas-mcp

Canvas LMS MCP server - query courses, assignments, grades and more
https://github.com/a-ariff/canvas-mcp

ai assignments canvas canvas-api canvas-lms chatgpt claude cursor edtech education grades llm lms mcp mcp-server model-context-protocol privacy student-tools typescript university

Last synced: 2 months ago
JSON representation

Canvas LMS MCP server - query courses, assignments, grades and more

Awesome Lists containing this project

README

          

# Canvas MCP

[![Build](https://github.com/a-ariff/canvas-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/a-ariff/canvas-mcp/actions/workflows/ci.yml)
[![TypeScript](https://img.shields.io/badge/TypeScript-5.6-blue.svg)](https://www.typescriptlang.org/)
[![MCP](https://img.shields.io/badge/MCP-1.0-green.svg)](https://modelcontextprotocol.io/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)

A local MCP (Model Context Protocol) server for Canvas LMS. Query your courses, assignments, grades, modules, and more from any MCP-compatible AI client — Claude Desktop, Cursor, VS Code Copilot, and others.

**Your API key stays on your machine.** Unlike hosted MCP servers that require you to hand over your Canvas credentials, this server runs locally and communicates directly with your Canvas instance.

## Architecture

```mermaid
graph TB
subgraph "MCP Clients"
Claude["Claude Desktop"]
Cursor["Cursor / VS Code"]
Other["Other MCP Clients"]
end

subgraph "Your Machine (Local)"
Server["Canvas MCP Server
Node.js + TypeScript"]
ENV["Environment Variables
CANVAS_API_KEY"]
end

subgraph "Canvas LMS Tools"
Courses["list_courses"]
Assignments["get_assignments
get_upcoming_assignments"]
Grades["get_grades
get_submission_status"]
Content["get_modules
get_announcements
get_discussions"]
Calendar["get_calendar_events
get_todo_items
get_quizzes"]
Profile["get_user_profile"]
end

subgraph "Canvas Instance"
API["Canvas REST API
HTTPS Only"]
end

Claude -->|stdio| Server
Cursor -->|stdio| Server
Other -->|stdio| Server

ENV -.->|read at startup| Server

Server --> Courses
Server --> Assignments
Server --> Grades
Server --> Content
Server --> Calendar
Server --> Profile

Courses --> API
Assignments --> API
Grades --> API
Content --> API
Calendar --> API
Profile --> API

style Server fill:#4CAF50,stroke:#333,color:#fff
style ENV fill:#FF9800,stroke:#333,color:#fff
style API fill:#2196F3,stroke:#333,color:#fff
style Claude fill:#7C4DFF,stroke:#333,color:#fff
style Cursor fill:#7C4DFF,stroke:#333,color:#fff
style Other fill:#7C4DFF,stroke:#333,color:#fff
```

> **🔒 Privacy by design** — your API key is read from local environment variables and sent only to your Canvas instance over HTTPS. No intermediary servers, no third-party storage.

## Features

- **12 Canvas LMS tools** — courses, assignments, grades, modules, quizzes, and more
- **Runs locally** — your credentials never leave your machine
- **Zero config hosting** — no servers, no Cloudflare, no Docker needed
- **Works with any MCP client** — Claude Desktop, Cursor, VS Code Copilot, ChatGPT
- **TypeScript** — fully typed with Zod validation

## Quick Start

### 1. Get your Canvas API key

Go to `Canvas → Account → Settings → Approved Integrations → New Access Token`

> **📖 Never done this before?** Follow the [step-by-step guide with screenshots](docs/CANVAS_API_GUIDE.md)

### 2. Clone and build

```bash
git clone https://github.com/a-ariff/canvas-mcp.git
cd canvas-mcp
npm install
npm run build
```

### 3. Add to your MCP client

Claude Desktop

Edit `~/Library/Application Support/Claude/claude_desktop_config.json`:

```json
{
"mcpServers": {
"canvas": {
"command": "node",
"args": ["/path/to/canvas-mcp/dist/standalone.js"],
"env": {
"CANVAS_API_KEY": "your-canvas-api-token",
"CANVAS_BASE_URL": "https://your-canvas-instance.edu"
}
}
}
}
```

Cursor / VS Code

Add to your `.cursor/mcp.json` or VS Code MCP settings:

```json
{
"mcpServers": {
"canvas": {
"command": "node",
"args": ["/path/to/canvas-mcp/dist/standalone.js"],
"env": {
"CANVAS_API_KEY": "your-canvas-api-token",
"CANVAS_BASE_URL": "https://your-canvas-instance.edu"
}
}
}
}
```

### 4. Start chatting

Ask your AI assistant things like:

- "What courses am I enrolled in?"
- "What assignments are due this week?"
- "Show me my grades for Computer Science 101"
- "Are there any new announcements?"

## Tools

| Tool | Description | Args |
|------|-------------|------|
| `list_courses` | Get all active courses | — |
| `get_assignments` | Get assignments for a course | `course_id` |
| `get_upcoming_assignments` | Upcoming assignments across all courses | — |
| `get_grades` | Grades and scores for a course | `course_id` |
| `get_user_profile` | Your Canvas profile info | — |
| `get_modules` | Course modules and structure | `course_id` |
| `get_announcements` | Recent course announcements | `course_id` |
| `get_discussions` | Discussion topics | `course_id` |
| `get_calendar_events` | Upcoming calendar events | — |
| `get_todo_items` | Pending action items | — |
| `get_quizzes` | Course quizzes | `course_id` |
| `get_submission_status` | Assignment submission status | `course_id`, `assignment_id` |

## Environment Variables

| Variable | Required | Default | Description |
|----------|----------|---------|-------------|
| `CANVAS_API_KEY` | Yes | — | Your Canvas API access token |
| `CANVAS_BASE_URL` | No | `https://canvas.instructure.com` | Your Canvas instance URL |
| `DEBUG` | No | `false` | Enable debug logging |

## Security

- **Local execution only** — the server runs on your machine via stdio
- **Direct API calls** — your Canvas API key is sent only to your Canvas instance, never to any third party
- **No data storage** — nothing is cached or persisted between sessions
- **Environment-based config** — credentials are read from environment variables, never hardcoded

## Development

```bash
# install deps
npm install

# build
npm run build

# run locally
CANVAS_API_KEY=your-token CANVAS_BASE_URL=https://your-canvas.edu npm start

# run tests
npm test

# lint
npm run lint
```

## Contributing

Contributions welcome! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.

## License

[MIT](LICENSE)