This page lists what your agent can call on unicorn. You do not call these yourself. You ask in plain language and your agent picks the tool, as in Daily use. unicorn exposes two separate connections:
  • The door, at https://<your-worker>.workers.dev/mcp. It has 14 built-in tools, up to 20 tools you define, four playbook prompts and six widgets. Your agent uses this one every day.
  • The admin connection, at https://<your-worker>.workers.dev/mcp/admin. It takes the admin token only. You mount it briefly to manage feeds and custom tools. See Custom tools.
Every result is text first. Each one ends with a Next: line that suggests what to call next, computed from the data. A failure reads Error (code): message and includes a hint for fixing it. None of the door tools writes to Ed, Moodle, Canvas or Gmail. The tools marked Writes unicorn state change only briefs, plans, labels or corrections inside your deployment.

Door tools

get_briefs

List briefs, which are the notes unicorn and your playbooks leave in your inbox. Call it at the start of a session. Shows the briefs widget.
boolean
default:"true"
Set to false to include briefs you have already read.
integer
default:"20"
How many to return, from 1 to 100.
Returns the briefs and the total number that are unread. Read-only.

ack_briefs

Mark briefs as read so get_briefs stops returning them by default. It never deletes anything. Writes unicorn state.
string[]
required
Brief ids from get_briefs. Between 1 and 100.
Returns how many were marked.

write_brief

File a finished playbook result as a brief. A repeat call with the same key does nothing, so a retried call never makes a duplicate. Writes unicorn state.
string
required
A short label in lowercase words joined by hyphens, up to 40 characters, such as weekly-plan.
string
required
What the brief is about, such as an ISO week or a unit code. Up to 200 characters.
string
required
Up to 200 characters.
string
required
Markdown, up to 20,000 characters.
string
required
A value that stays the same across retries of one run, such as the ISO week. Up to 200 characters.
Returns the brief’s id and creation time.

changes_since

Page through what changed after a position. Shows the changes widget.
string
The nextCursor from a previous call, digits only. Leave it out to get the latest 20 changes.
integer
default:"100"
From 1 to 500.
string
A unit code, to see only that course’s changes.
string[]
Only these change types. The older type names also work.
Returns events, nextCursor, hasMore and counts per type. Read-only.

course

Get one course from every source, grouped into assignment buckets with due dates, submission state and staff answers, plus general notices. Shows the course widget.
string
required
A unit code, up to 20 characters.
Returns the buckets and any unlabeled items. When more than one offering matches, it returns ambiguous with every match instead of guessing. Read-only.

life

Get items that are not tied to a course, grouped into life/events, life/admin and life/other, plus anything not yet labeled. Takes no inputs. Read-only.

search_items

Search item titles and text across every source. Shows the deadlines widget.
string
required
Up to 200 characters.
string
One kind of item, such as assessment or thread.
string
A unit code.
string
An ISO timestamp. Only items at or after it.
integer
default:"20"
From 1 to 100.
Returns matching items with their source, id, title, due date, state and bucket. Read-only.

upcoming

List items with a deadline in the next days, across every course, ordered by due date. Shows the deadlines widget.
integer
default:"14"
From 1 to 180.
string
A unit code.
boolean
default:"false"
Also return missed deadlines from the last 90 days.
Read-only.

get_plan

Read a saved plan. A plan that does not exist yet comes back as empty, not as an error. Shows the plan widget.
string
required
weekly or assignment.
string
required
For weekly, an ISO week such as 2026-W39. For assignment, the item as <source>:<itemId>, exactly as upcoming or search_items returned it. Up to 200 characters.
Read-only.

save_plan

Save a plan, replacing the whole content. Read the plan first to edit rather than replace. Shows the plan widget. Writes unicorn state.
string
required
weekly or assignment.
string
required
As in get_plan.
string
required
Markdown, up to 20,000 characters. Use - [ ] for open tasks.

remember

Save a standing correction exactly as you wrote it. Only durable rules belong here. Playbooks read corrections back when they run. Writes unicorn state.
string
required
Up to 500 characters.
Returns saved, duplicate or empty. When the notes are full, the oldest is dropped to make room.

label_items

File items into buckets. Use it for items that course or life returned as unlabeled. Leave out anything ambiguous instead of guessing. Writes unicorn state.
object[]
required
Between 1 and 200. Each has source, itemId, bucket, and an optional topic of up to 40 characters.
string
default:"client"
client or triage. Records who filed the item.
Returns how many were updated, the items it could not find, and any bucket names that were invalid.

status

Report each source’s last sync and error, whether the scheduler is running, the latest change position and your timezone. Use it to explain stale or missing data. Shows the connections widget. Takes no inputs. Read-only.

run_playbook

Fetch a playbook’s steps and the data it needs, already gathered, plus your saved corrections. Your agent then follows the steps. unicorn takes no further action. See Playbooks.
string
required
weekly-plan, decompose-assignment, forum-brief or triage.
Read-only.

Your own tools

Tools you define appear on the door beside these, up to 20. See Custom tools.

Prompts

The door also offers four prompts with the playbook names. Clients that support prompts list them. Clients that do not, such as ChatGPT, use run_playbook.

Admin tools

These are on the admin connection only.

Change types

Each change event has one of these types. Older history may carry the earlier names item.created, item.updated and capability.changed. They are kept as they were and still work as filters.

Buckets

Every item is filed in one of five kinds of bucket. An assessment owns its bucket, and a forum thread joins an assignment when its category matches the assessment’s title. Both are decided as unicorn reads them, with no AI model. Free text is filed by the triage playbook, or by your agent on the spot. An item that cannot be placed is returned marked unlabeled. unicorn never guesses a course.