Skip to main content
Glama
README.md
# Canvas MCP Server

A Model Context Protocol (MCP) server providing read-only access to Canvas LMS for student workflows, with optional NotebookLM integration for study material organization.

## Features

- **45 Tools** covering Canvas LMS functionality
- **Read-only access** - Safe for student use
- **Smart caching** - Reduces API calls
- **Rate limiting** - Respects Canvas API limits (~3000 req/hour)
- **NotebookLM integration** - Upload course content for AI-powered study

## Quick Start

### 1. Install Dependencies

```bash
npm install
npm run build
```

### 2. Configure Environment

```bash
cp .env.example .env
# Edit .env with your Canvas credentials
```

Required settings:
- `CANVAS_BASE_URL` - Your Canvas instance URL
- `CANVAS_API_TOKEN` - Generate at Canvas > Account > Settings > New Access Token

### 3. Add to Claude Code

Add to your Claude Code MCP configuration (`~/.claude/claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "canvas": {
      "command": "node",
      "args": ["dist/index.js"],
      "cwd": "/path/to/canvas-mcp-server",
      "env": {
        "CANVAS_BASE_URL": "https://your-school.instructure.com",
        "CANVAS_API_TOKEN": "your_token_here"
      }
    }
  }
}
```

### 4. (Optional) Setup NotebookLM

For NotebookLM integration:

```bash
cd src/python-bridge
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
playwright install chromium
```

Then use `notebooklm_auth_setup` tool for interactive Google login.

## Available Tools (45 total)

### Phase 1: Core (5 tools)
| Tool | Description |
|------|-------------|
| `canvas_course_list` | List enrolled courses |
| `canvas_course_get` | Get course details |
| `canvas_assignment_list` | List assignments (with bucket filtering) |
| `canvas_assignment_get` | Get assignment details |
| `canvas_get_my_submission` | Get your submission for an assignment |

### Phase 2: Content (16 tools)
| Tool | Description |
|------|-------------|
| `canvas_module_list` | List course modules |
| `canvas_module_get` | Get module details |
| `canvas_module_items` | List items in a module |
| `canvas_module_progress` | Get module completion progress |
| `canvas_file_list` | List files in a folder |
| `canvas_file_get` | Get file metadata |
| `canvas_file_search` | Search for files |
| `canvas_folder_list` | List folders |
| `canvas_file_download` | Download file content |
| `canvas_discussion_list` | List discussions |
| `canvas_discussion_get` | Get discussion with replies |
| `canvas_announcement_list` | List announcements |
| `canvas_planner_items` | Get planner items |
| `canvas_todo_list` | Get todo items |
| `canvas_upcoming_events` | Get upcoming events |
| `canvas_missing_submissions` | Get missing assignments |

### Phase 3: Assessment (8 tools)
| Tool | Description |
|------|-------------|
| `canvas_rubric_list` | List rubrics in a course |
| `canvas_rubric_get` | Get rubric details |
| `canvas_rubric_for_assignment` | Get rubric for an assignment |
| `canvas_quiz_list` | List quizzes |
| `canvas_quiz_get` | Get quiz details |
| `canvas_quiz_submission` | Get your quiz submission |
| `canvas_group_list` | List your groups |
| `canvas_group_members` | List group members |

### Phase 4: User (11 tools)
| Tool | Description |
|------|-------------|
| `canvas_bookmark_list` | List your bookmarks |
| `canvas_bookmark_create` | Create a bookmark |
| `canvas_bookmark_delete` | Delete a bookmark |
| `canvas_inbox_list` | List inbox messages |
| `canvas_inbox_get` | Get conversation details |
| `canvas_inbox_unread_count` | Get unread message count |
| `canvas_notification_list` | List notifications |
| `canvas_dashboard` | Comprehensive dashboard view |
| `canvas_profile` | Get your profile |
| `canvas_grades_overview` | Get grades across courses |
| `canvas_cache_status` | View/clear cache |

### Phase 5: NotebookLM (5 tools)
| Tool | Description |
|------|-------------|
| `notebooklm_auth_check` | Check Google auth status |
| `notebooklm_auth_setup` | Interactive Google login |
| `notebooklm_list_notebooks` | List NotebookLM notebooks |
| `notebooklm_upload_sources` | Upload sources to notebook |
| `notebooklm_prepare_content` | Convert/split files for upload |

## Authentication

### Canvas API (Primary)
- **API Token**: Required for all API calls
- Generate at: Canvas > Account > Settings > New Access Token
- Provides access to your enrolled courses, assignments, grades, etc.

### Cookies (Secondary, Optional)
- Only needed if file downloads return 403 errors
- Export browser cookies using extensions like "Get cookies.txt"
- Set `CANVAS_COOKIES_FILE` in your environment

### NotebookLM (Interactive)
- Uses Playwright browser automation (no public API exists)
- Run `notebooklm_auth_setup` once to save Google session
- Session persists in `src/python-bridge/state.json`

## Architecture

```
canvas-mcp-server/
├── src/
│   ├── core/
│   │   ├── auth.ts        # Token + cookie authentication
│   │   ├── cache.ts       # Memory cache with TTL
│   │   ├── client.ts      # Canvas API client
│   │   ├── pagination.ts  # Link header parsing
│   │   └── rate-limiter.ts # Token bucket rate limiter
│   ├── tools/
│   │   ├── courses.ts     # Course tools
│   │   ├── assignments.ts # Assignment tools
│   │   ├── modules.ts     # Module tools
│   │   ├── files.ts       # File tools
│   │   ├── discussions.ts # Discussion tools
│   │   ├── planner.ts     # Planner tools
│   │   ├── rubrics.ts     # Rubric tools
│   │   ├── quizzes.ts     # Quiz tools
│   │   ├── groups.ts      # Group tools
│   │   ├── bookmarks.ts   # Bookmark tools
│   │   ├── communication.ts # Inbox/notification tools
│   │   ├── dashboard.ts   # Dashboard tools
│   │   └── notebooklm.ts  # NotebookLM tools
│   ├── python-bridge/
│   │   ├── notebooklm_auth.py   # Google auth management
│   │   ├── notebooklm_upload.py # Source upload automation
│   │   └── requirements.txt     # Python dependencies
│   ├── types/
│   │   └── canvas.ts      # TypeScript types
│   ├── server.ts          # MCP server
│   └── index.ts           # Entry point
├── .env.example           # Environment template
├── mcp.json               # MCP configuration
└── package.json
```

## Rate Limits

Canvas API allows ~3000 requests per hour. This server implements:
- Token bucket rate limiter (0.8 req/sec default)
- Smart caching (5-30 min TTL per resource type)
- Automatic retry with backoff on 429 responses

## License

MIT

TDQS

B3.4/5.0

Scored across 45 tools

Disambiguation4/5

Most tools have distinct purposes targeting specific Canvas resources (e.g., assignments, discussions, files), but some overlap exists. For instance, canvas_assignment_list and canvas_planner_items both help track upcoming assignments, and canvas_missing_submissions overlaps with assignment filtering. The NotebookLM tools are clearly separate but unrelated to Canvas, creating a minor domain split.

Naming Consistency5/5

Tool names follow a highly consistent snake_case pattern with clear verb_noun structure (e.g., canvas_assignment_get, canvas_discussion_list). The Canvas tools all start with 'canvas_' and the NotebookLM tools with 'notebooklm_', maintaining perfect internal consistency within each domain subset.

Tool Count2/5

With 45 tools, the count is excessive for a single server. While Canvas is a complex platform, many tools could be consolidated (e.g., multiple assignment-related tools) or parameterized. The inclusion of unrelated NotebookLM authentication tools further bloats the count without clear integration.

Completeness4/5

The Canvas tools provide comprehensive coverage for student workflows, including assignments, discussions, files, grades, and modules. However, there are gaps in write operations (e.g., no tools to submit assignments, post to discussions, or upload files) and instructor-specific actions. The NotebookLM tools are minimal but functional for their limited scope.