Skip to main content
Glama
README.md
# quercus-mcp

An [MCP](https://modelcontextprotocol.io) server that lets Claude read your University of Toronto **Quercus** courses: assignments, due dates, grades, announcements, files, and modules.

Quercus runs on Canvas LMS, so it also works with **any school that uses Canvas**.

Ask Claude things like:

- "What's due this week across all my courses?"
- "Summarize the latest announcements in MAT188."
- "What's my current grade in CIV100?"
- "Find the lecture slides for week 3 in my calculus course."

## How it works

The server runs locally on your computer and talks to the Canvas REST API with a personal access token that you create. Your token stays on your machine. It is only ever sent to your school's Canvas server, never anywhere else.

Every tool is **read-only**. The server can't submit work, post, or change anything in your account.

## Setup

**Requirements:** Node.js 18 or newer, and Claude Code or Claude Desktop.

### 1. Get a Quercus access token

1. Sign in to [Quercus](https://q.utoronto.ca).
2. Go to **Account → Settings → Approved Integrations**.
3. Click **+ New Access Token**, give it a name like "Claude", and copy the token.

Treat this token like a password. Anyone who has it can read your Quercus account.

### 2. Install and build

```bash
git clone https://github.com/lance-lii/quercus-mcp.git
cd quercus-mcp
npm install
npm run build
```

### 3. Connect it to Claude

**Claude Code:**

```bash
claude mcp add quercus -s user \
  -e QUERCUS_API_TOKEN=<your token> \
  -e QUERCUS_BASE_URL=https://q.utoronto.ca/api/v1 \
  -- node /absolute/path/to/quercus-mcp/dist/index.js
```

Start a new Claude Code session afterwards so it picks up the new tools. Check the connection with `claude mcp get quercus`.

**Claude Desktop:** add this to your `claude_desktop_config.json` and restart the app:

```json
{
  "mcpServers": {
    "quercus": {
      "command": "node",
      "args": ["/absolute/path/to/quercus-mcp/dist/index.js"],
      "env": {
        "QUERCUS_API_TOKEN": "<your token>",
        "QUERCUS_BASE_URL": "https://q.utoronto.ca/api/v1"
      }
    }
  }
}
```

### Using a different Canvas school

Set `QUERCUS_BASE_URL` to your school's Canvas API, for example `https://yourschool.instructure.com/api/v1`, and create the token from that school's Canvas settings page.

## Tools

| Tool | What it does |
|---|---|
| `list_courses` | Your active, completed, or all enrolled courses |
| `list_assignments` | Assignments for a course, optionally filtered (upcoming, overdue, ungraded, and more) |
| `get_course_grades` | Your grade and enrollment info for one course |
| `list_all_grades` | Your grades across all courses |
| `list_announcements` | Announcements for one or more courses |
| `list_todo` | Your Quercus to-do list |
| `list_upcoming_events` | Upcoming events and due dates |
| `list_calendar_events` | Calendar events or assignments in a date range |
| `list_files` | Files in a course |
| `get_file_download_url` | Metadata and an authenticated download link for a file |
| `get_course_modules` | A course's modules and their items |

## Security notes

- Keep your token out of git. `.env` is already in `.gitignore`. Copy `.env.example` to `.env` if you'd rather keep your token in a file.
- If a token leaks, delete it under **Approved Integrations** in Quercus and create a new one.
- Check your school's policies on third-party tools before using this.

## Development

```bash
npm run build   # compile TypeScript to dist/
npm start       # run the server over stdio
```

Source is in `src/`: `canvas.ts` handles the API client and pagination, and `index.ts` defines the tools.

## Disclaimer

This is an independent student project. It isn't affiliated with or endorsed by the University of Toronto or Instructure.

## License

[MIT](LICENSE) © 2026 Lance Li

TDQS

B3.3/5.0

Scored across 11 tools

Disambiguation4/5

Most tools target distinct resources (courses, assignments, grades, announcements, files, modules). The only meaningful overlap is between list_upcoming_events and list_calendar_events, both of which return events/assignment due dates, though descriptions clarify one is upcoming and the other is a custom date range.

Naming Consistency5/5

Every tool uses snake_case with a consistent verb_noun pattern: all are either list_* or get_* prefixed. The convention is applied uniformly across all 11 tools.

Tool Count5/5

11 tools is a well-scoped set for a Quercus integration, covering the main read-only resources without unnecessary bloat. Each tool has a clear purpose.

Completeness3/5

The surface is entirely read-only (list/get) and lacks any create, update, or delete operations, such as submitting assignments, posting to discussions, or uploading files. While read coverage is solid, these are notable gaps for an LMS agent.

Maintenance

ActivityMaintained
ResponsivenessNo issues