Three CLIs. The ground unicorn stands on.
moodle-cli, edstem-cli and ontrack read Moodle, Ed Discussion and OnTrack as they are right now: for you at a terminal, for your scripts in a pipe, and for the agent you already use.
Written and maintained by bunizao since March 2026. Open source under MIT.
moodle-cli
Moodle
Moodle, without the sign-in wall.
Deadlines, grades, course files, forum posts and quiz reviews, read through the browser session you already have. It keeps that session alive in the background, and can stand up a private MCP server on your own Cloudflare account.
- Version
- 0.9.6
- Agents
- CLI, skill, private MCP server
- Runs on
- Node 22.13+, Bun, or a standalone binary
moodle grades ALG201ALG201 · 2 of 3 graded ┌──────────────┬───────┬───────┬────────────────────────┐ │ Name │ Grade │ Range │ Due │ ├──────────────┼───────┼───────┼────────────────────────┤ │ Assignment 1 │ 17.5 │ 0–20 │ │ │ Quiz 3 │ 8 │ 0–10 │ │ │ Assignment 2 │ - │ 0–25 │ in 6 days · Wed 14 Oct │ └──────────────┴───────┴───────┴────────────────────────┘
edstem-cli
Ed Discussion
Ed Discussion, a thread at a time.
Threads, replies, lessons, slides and files, with an API token you create on Ed. Catch up on what you missed since your last visit, export a whole forum, or post a reply after it shows you exactly what it will send.
- Version
- 0.7.2
- Agents
- CLI, skill, MCP server with interactive views
- Runs on
- Node 20+
edstem threads ALG201 --unread --limit 3┌─────┬───────────────────────────────┬─────────────┬──────────┬─────────┐ │ # │ title │ category │ flags │ created │ ├─────┼───────────────────────────────┼─────────────┼──────────┼─────────┤ │ 214 │ Assignment 2: input format │ Assignments │ pinned │ Oct 7 │ │ 211 │ Week 7 lab room change │ General │ staff │ Oct 6 │ │ 208 │ Dijkstra with negative edges? │ Lectures │ answered │ Oct 5 │ └─────┴───────────────────────────────┴─────────────┴──────────┴─────────┘
ontrack
OnTrack and Doubtfire
OnTrack, from both sides of the desk.
Units, tasks, task sheets, feedback chats and submissions on OnTrack and Doubtfire, for students and teaching staff alike. Anything that changes a task asks first, and refuses in a script unless you pass --yes.
- Version
- 0.3.2
- Agents
- CLI and skill; no MCP server
- Runs on
- Node 22.5+ or Bun
ontrack tasks ALG201┌──────┬─────────────────┬───────────────┬────────┬───────┐ │ task │ name │ status │ due │ grade │ ├──────┼─────────────────┼───────────────┼────────┼───────┤ │ 1.1P │ Sorting warm-up │ Complete │ Aug 4 │ - │ │ 3.2C │ Graph search │ Working on it │ Oct 13 │ - │ │ 4.1D │ Custom project │ Not started │ Oct 27 │ - │ └──────┴─────────────────┴───────────────┴────────┴───────┘
One contract. Three tools.
The three share their grammar through cli-kit, a small library that owns their verbs, output formats, error codes and confirmation rules. Changing any of them takes a major release.
- Tables for people, JSON for pipes
- At a terminal you get a table. Anywhere else, the same command prints JSON.
--json,--yamland--tableoverride it. - The same verbs
- list, show, read, get, search, send, submit, set, mark-read. Learn one tool and the other two read the same way.
- The same exit codes
- 2 for usage, 3 for auth, 4 for not found, 5 when the site fails. Scripts and agents branch on the number, not the wording.
- Changes ask first
- Anything that sends or submits prints its plan.
--dry-runstops there; a pipe without--yesrefuses.
They look. unicorn remembers.
Live: what is there now
Ask a CLI and it goes and looks, on your machine, with your session. Nothing is kept between runs. Use it to fetch a file, read a whole thread, or submit work.
Memory: what changed
unicorn reads Moodle, Ed, Canvas and Gmail every hour on your Cloudflare account and keeps every version. Its readers grew out of the API work in these CLIs; it shares no code with them.