Local vault mirror
Your whole semester as plain JSON in ~/canvas-vault/. Grep it, jq it, back it up. Structured, atomic, and yours.
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.
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.
Fast, local, and scriptable. Everything reads from a plain-JSON mirror you own — no dashboards, no lock-in.
Your whole semester as plain JSON in ~/canvas-vault/. Grep it, jq it, back it up. Structured, atomic, and yours.
A Claude agent answers over your real data — due dates, changes, announcements. canvasctl ask for one-shot, chat for a session.
Expose every op as tools. claude mcp add canvasctl -- canvasctl mcp and your assistant can read your semester too.
See what's due in any window — 24h, 7d, 2w — then export the next 60 days to a calendar you can subscribe to.
SHA-256 snapshots per course, per kind. canvasctl changes replays exactly what shifted between two syncs — added, moved, or edited.
Bring your own Canvas token and Anthropic key. They never leave your machine. No servers to trust, no telemetry, no account.
Install it, point it at your school, and start talking to your semester.
One curl line drops canvasctl on your $PATH.
# one line, no sudo curl -fsSL …/install.sh | sh
Answer three prompts: your Canvas URL, an access token, and an optional Anthropic key.
$ canvasctl setup Canvas URL › canvas.psu.edu Access token › ••••••••
Sync once, then ask anything — or hand the tools to Claude Code.
$ canvasctl sync $ canvasctl ask "what changed today?"
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
$ pipx install "canvasctl[agent,mcp] @ git+https://github.com/vivekp-05/canvasctl.git"
claude mcp add canvasctl -- canvasctl mcp
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.
~/canvas-vault/. Plain JSON on disk. Delete the folder and it's gone.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.