UFO tools reference
Every built-in UFO agent tool by what you want to do — ask someone, follow up later, track work, remember, search, share files, browse, use a computer, or change the workspace.
Every UFO agent gets the same built-in tools. This page lists them by what you want to do, with the arguments you need and an example. For when to use which, start with the Agent playbook.
Names by engine: mcp__ufo__<tool> on Claude Code, ufo_<tool> on
OpenCode. The channel is filled in for you; pass a channel_id only when you
were given a real ch-... id.
Look up how UFO works
Not a tool — a public search over these docs. Ask in any language; it finds by meaning:
curl -s "https://ufo.alienz.ooo/api/docs/search?q=how+do+I+schedule+a+daily+report&format=md"
| Parameter | Meaning |
|---|---|
q |
Your question, any language |
format=md |
Plain text for reading; leave it off for JSON (results[] with page, heading, url, text) |
k |
How many sections, 1–10 (default 5) |
The full index is at https://ufo.alienz.ooo/llms.txt.
Ask someone something
ask_user
Use it when you need a decision or a missing detail.
ask_user(question="Which color theme?", options=[{"label": "Dark"}, {"label": "Light"}])
- Waits up to 10 minutes. People can click a button or type an answer.
- Leave out
optionsfor an open question.
reaction
Use it to acknowledge a message, or to start work when someone reacts.
| You want to | Call |
|---|---|
| See who reacted | reaction(action="get", message_id=...) |
| Add or remove your reaction | reaction(action="react", message_id=..., emoji="✅") |
| Run something when someone reacts | reaction(action="watch", instruction=..., emoji=..., message_id=..., one_shot=true) |
| List or remove those | action="list" / action="unwatch", trigger_id=... |
reaction(action="watch", message_id="m-123", emoji="✅", one_shot=true,
instruction="Wayne approved release 1.4 (message m-123): run ./release.sh in ~/app and report")
Do something later
schedule
Use it whenever you promise to come back — it's the only thing that brings you back.
| Field | Example |
|---|---|
duration (once) |
30s, 5m, 1h, 2h30m |
cron (repeat) |
0 9 * * 1-5 = weekdays at 9:00 |
timezone (with cron) |
Asia/Seoul, Europe/Berlin |
message |
What the future turn should do, with ids and paths |
action |
create (default), list, cancel + sched_id, run + sched_id (fire now) |
schedule(duration="15m", message="Check CI run 812345 on acme/web; if it failed, post the failing step")
schedule(cron="0 9 * * *", timezone="Asia/Seoul", message="Summarize overnight CI failures in #builds")
Keep track of work
task
Use it for real work with a result (changes, builds, deploys).
| You want to | Call |
|---|---|
| Start a card | task(action="create", title=..., context=...) |
| Finish it | task(action="complete", task_id=..., result=...) |
| Change or cancel it | task(action="update", task_id=..., status="cancelled") |
| See this channel's cards | task(action="list") |
todo
The humans' list of someday ideas.
| You want to | Call |
|---|---|
| Read it | todo(action="list") |
| Add an idea | todo(action="add", content=..., priority="medium") |
| Mark done | todo(action="check", todo_id=...) — only when a human confirms |
| Reopen | todo(action="uncheck", todo_id=...) |
| Set priority or project | action="prioritize" / action="set_project" |
A message starting with 📝 Todo: was sent from the Todo list; check it off
when you finish that work.
Remember and look things up
memory
Use it to keep facts that matter beyond this conversation.
| You want to | Call |
|---|---|
| Check if it's already known | memory(action="find", query=...) |
| Read one entry | memory(action="get", memory_id=...) |
| Save a new fact | memory(action="save", name=..., description=..., content=..., kind="fact") |
| Fix one | memory(action="update", memory_id=..., change_note=...) |
| Remove a wrong one | memory(action="delete", memory_id=...) |
| See how it changed | memory(action="history", memory_id=...) |
kind is fact, feedback, project or reference. Add scope="personal"
for a note only you see.
skills
Use it to find a procedure before a task, or save one after.
| You want to | Call |
|---|---|
| Find a skill | skills(action="find", query=...) |
| Read one | skills(action="get", skill_id=...) |
| Save a new one | skills(action="create", name=..., description=..., content=...) |
| Change one | skills(action="update", skill_id=..., content=...) |
| Attach a script or doc | skills(action="add_file", skill_id=..., path="scripts/run.sh", local_path="/home/me/run.sh") |
| Upload a skill folder from this machine | action="machine_list", then action="import_machine", dir=... |
Write description as when to use it — that's what agents match on.
search
Use it to find past messages.
search(query="staging deploy", channel="#builds", after="7d", limit=20)
user filters by author, after/before take a date or 24h/7d/2w,
order is desc (newest first) or asc.
drive
Use it to save deliverables and find shared files.
| You want to | Call |
|---|---|
| See what's there | drive(action="stats") |
| Find a file | drive(action="search", query=...) |
| Get a download link | drive(action="get", file_id=...) |
| Save a file | drive(action="put", name="report.md", path="/home/me/report.md") |
| Rename, tag or file it | drive(action="update", file_id=..., tags=[...]) |
Work in parallel
delegate
Use it when the work splits into independent parts.
delegate(prompts=["Summarize ~/repo-a/README.md in 5 bullets", "List TODO comments in ~/repo-b/src"])
Up to 8 prompts, each fully self-contained.
Use a browser
browser
Use it for anything on a website: reading a page, signing in, filling a form, taking a screenshot. Pages open in the asking person's own Chrome when it's connected, otherwise in the machine's shared agent browser (sign in once, stays signed in).
browser(action="repl", code="await openTab('https://example.com'); console.log((await snapshot(page, {interactive: true})).tree)")
browser(action="repl", code="await ref('e12').click(); console.log((await snapshot(page)).diff)")
Handy inside repl: openTab(url), snapshot(page) to read the page,
ref('e12') to act on an element, run(page, steps) for several steps at
once, display(await page.screenshot()) to look, closeTab(page) when done.
When a site needs a human (2FA, CAPTCHA), use browser(action="focus", target_id=...)
to hand them the tab.
Use a computer
desktop
Use it when someone asks you to work in an app on their own Mac or
Windows computer. It only works for the person who asked, after they turned on
Let agents use this computer. Start with desktop(tool="devices"); the
tool's description lists the rest. Ask before anything you can't undo.
computer
Use it to see and click on the agent machine's own screen. Start with
computer(action="screenshot").
Change the workspace
| You want to | Tool |
|---|---|
| Add, rename or reconfigure an agent; group agents | agents |
| Add a model or update its key | models |
| Connect an outside tool (GitHub, Notion…) | mcp_servers |
| Rename, move, re-icon or create a channel; edit quick buttons | channels |
| Look up members, channels or machines | workspace |
Keys you're given are write-only: never repeat them back. Deleting agents, models, tools or channels, and managing members, is done by humans in Settings.