Read-focused Canvas LMS

Canvas in your
terminal

Mirror your whole semester into a local vault, then ask it questions in plain English. canvasctl ask "what's due this week?" — answered by a Claude agent over your real course data.

Architecture

One core, three surfaces

Every Canvas operation is defined exactly once in an ops registry — then served, unchanged, to the CLI, to Claude Code over MCP, and to the built-in chat agent.

CanvasCTL architecture diagram A central ops registry feeds three surfaces: the command-line interface, an MCP server for Claude Code, and a chat agent. ops registry one contract, defined once READ · LOCAL · WRITE CLI canvasctl due · status · sync MCP server tools for Claude Code Chat agent canvasctl ask · chat
What's inside

Built for how you actually check on a semester

Fast, local, and scriptable. Everything reads from a plain-JSON mirror you own — no dashboards, no lock-in.

Local vault mirror

Your whole semester as plain JSON in ~/canvas-vault/. Grep it, jq it, back it up. Structured, atomic, and yours.

ask & chat, in English

A Claude agent answers over your real data — due dates, changes, announcements. canvasctl ask for one-shot, chat for a session.

MCP for Claude Code

Expose every op as tools. claude mcp add canvasctl -- canvasctl mcp and your assistant can read your semester too.

Due-date radar + .ics

See what's due in any window — 24h, 7d, 2w — then export the next 60 days to a calendar you can subscribe to.

Change tracking

SHA-256 snapshots per course, per kind. canvasctl changes replays exactly what shifted between two syncs — added, moved, or edited.

BYOK privacy

Bring your own Canvas token and Anthropic key. They never leave your machine. No servers to trust, no telemetry, no account.

Three steps

From zero to answers in a minute

Install it, point it at your school, and start talking to your semester.

01

Install

One curl line drops canvasctl on your $PATH.

# one line, no sudo
curl -fsSL …/install.sh | sh
02

canvasctl setup

Answer three prompts: your Canvas URL, an access token, and an optional Anthropic key.

$ canvasctl setup
Canvas URL › canvas.psu.edu
Access token › ••••••••
03

Talk to your semester

Sync once, then ask anything — or hand the tools to Claude Code.

$ canvasctl sync
$ canvasctl ask "what changed today?"
Get started

Install in one line

Copy, paste, run. Prefer isolation? Use the pipx tab. Either way, nothing phones home.

$ curl -fsSL https://raw.githubusercontent.com/vivekp-05/canvasctl/main/install.sh | sh
Then wire it into Claude Code: claude mcp add canvasctl -- canvasctl mcp
BYOK · privacy by design

Your keys stay on your machine.

canvasctl talks to Canvas and Anthropic directly, with credentials that live only in your shell and your vault. There is no CanvasCTL backend to send your data to — because there isn't one.

  • Your PAT & API key never leave your device. No proxy, no relay, no account to create.
  • Data lives in ~/canvas-vault/. Plain JSON on disk. Delete the folder and it's gone.
  • Read-focused by design. canvasctl mirrors and reads; any write would require explicit confirmation on every surface.
Questions

Frequently asked

Python 3.10 or newer and a Canvas access token (Account → Settings → New Access Token). The ask / chat agent and MCP features also want an Anthropic API key, but the core read commands work without one.

canvasctl itself is free and MIT-licensed. The only cost is your own Anthropic API usage when you use the Claude agent — billed directly to your key, at your rate, with no markup from us.

Yes. Your token and API key live only on your machine — in your shell environment and vault config. Nothing is sent to any server we operate; Canvas and Anthropic are called directly from your terminal. You can revoke the token in Canvas at any time.

Any Canvas LMS instance. During canvasctl setup you point CANVAS_BASE_URL at your school's Canvas host (for example canvas.your-school.edu). If your institution runs Canvas, canvasctl works.

No. canvasctl is read-focused by design — it mirrors, lists, and answers. There are no write operations in this release, and the architecture requires explicit user confirmation on every surface before any future write to Canvas could ever run.

In ~/canvas-vault/ as plain JSON — metadata, a change log, and any files you pull. It's yours to grep, back up, or delete. Remove the folder and every trace of your synced data is gone.