The agent3 of 15
Every tool she has
On this page
40 tools across 13 toolsets. Enumerated from the live registry.
All nine Discord tools answer their availability check with a process-local flag that is only set inside the bot process, so in the web app and the terminal they are dropped and the real count is 31 across 12. Everything below is written for the full 40.
Nothing here is guessed. You can print the same list yourself:
python -c "
from kotoba.tools.registry import registry, all_toolsets
print(len(registry()), 'tools in', len(all_toolsets()), 'toolsets')
for n, s in sorted(registry().items()): print(f'{n:26} {s.toolset:10} {s.risk}')
"
The 13 toolsets
| Toolset | Tools | Offered in a conversation? | Page |
|---|---|---|---|
core | 7 — ask_user, cancel_work, clarify, open_link, start_work, todo, view_capture | yes | Core |
web | 2 — web_search, web_extract | yes | Web |
memory | 5 — memory_write, memory_recall, session_search, remember_image, recall_image | yes | Memory |
file | 4 — read_file, write_file, patch, search_files | yes | Files |
terminal | 1 — shell | yes | Terminal and code |
code | 1 — execute_code | yes | Terminal and code |
cron | 1 — cronjob | yes | Reminders |
report | 1 — make_report | yes | Reports |
skills | 2 — skill_list, skill_view | yes | Skills |
discord | 9 — see the page | yes, inside the bot process only | Discord tools |
subagent | 1 — delegate | no — work mode only | Subagents |
browser | 3 — ask_secret, request_credential, get_credential | no — work mode only | Browser and secrets |
mcp | 3 — mcp_install, mcp_find, activate_tools | no — work mode only | MCP |
A connected MCP server adds a fourteenth kind of toolset, named mcp:<server> — for example
mcp:browser. Those are work-mode only too, and they are not counted in the 40: they exist only
while a server is connected.
Risk, and what it actually gates
Every tool declares a risk: read, write, exec or network.
Risk is not an approval level. It decides two things:
- Whether you get a step row.
write,execandnetworkare actions and draw a card in the panel.readdraws no row — just a status line naming the tool. - Its minimum time budget. An
exectool is always given at least as long as its own approval card can stay open, so the loop cannot cancel it while you are still deciding.
The registry can filter on risk as well, but nothing does: every caller passes all four values, and the registry's own comment says why — "the companion gate and the sandbox/approval layer are the real safeguards."
What actually asks you for permission is narrower than risk suggests. Only these ask:
| Tool | Asks |
|---|---|
shell | anything that is not a provably-safe read inside the workspace |
execute_code | every snippet on the host, unless you saved an "always allow" — and even then, code that touches disk, network, eval or a secret path re-prompts |
mcp_install, mcp_find | before launching a server's process |
discord_act, discord_apply_plan | one card per batch of server changes |
Everything else — including every file write and every tool an MCP server exposes — is jailed and
audited, not carded. write_file never asks. It cannot leave the workspace, and that is the whole
of its protection.
The full list
| Tool | Toolset | Risk | Asks first | What it does |
|---|---|---|---|---|
activate_tools | mcp | read | no | Loads a connected server's tools into the toolset |
ask_secret | browser | read | — (it is a prompt) | Masked one-time password box; returns a placeholder, never the value |
ask_user | core | read | — (it is a prompt) | Opens a text box for you to type into |
cancel_work | core | read | no | Stops the running background job |
clarify | core | read | — (it is a question) | Asks one clarifying question |
cronjob | cron | write | no | Creates, lists, cancels or skips a reminder |
delegate | subagent | exec | no | Hands a subtask to a helper agent |
discord_act | discord | write | yes | Changes the Discord server |
discord_apply_plan | discord | write | yes | Applies an approved restructuring plan |
discord_guild_read | discord | read | no | Reads the server's shape |
discord_people | discord | read | no | Looks someone up |
discord_plan | discord | read | no | Proposes a server shape, changing nothing |
discord_read_history | discord | read | no | Reads back what was said in a channel |
discord_remember_person | discord | write | no | Notes a fact about a person on Discord |
discord_send_file | discord | write | no | Attaches a workspace file to the channel |
discord_voice | discord | write | no | Joins or leaves a voice channel |
execute_code | code | exec | yes | Runs a Python snippet |
get_credential | browser | read | no | Hands back a {{secret:NAME}} placeholder for a saved credential |
make_report | report | write | no | Fills the report template and opens the viewer |
mcp_find | mcp | exec | yes | Searches the official MCP registry and installs a server |
mcp_install | mcp | exec | yes | Installs one of eight known servers by name |
memory_recall | memory | read | no | Reads or searches long-term memory |
memory_write | memory | write | no | Saves one durable English fact |
open_link | core | read | — (it is an offer) | Offers you a link to open; never opens one itself |
patch | file | write | no | Replaces an exact snippet in a workspace file |
read_file | file | read | no | Reads a workspace file, paginated |
recall_image | memory | read | no | Brings saved images back into view |
remember_image | memory | write | no | Saves an image into visual memory |
request_credential | browser | read | — (it is a prompt) | Saves one of her reusable credentials |
search_files | file | read | no | Text search across the workspace |
session_search | memory | read | no | Full-text search over past turns |
shell | terminal | exec | usually | Runs a shell command in the workspace |
skill_list | skills | read | no | Lists her skill documents |
skill_view | skills | read | no | Loads one skill's full text |
start_work | core | read | no | Launches a background job |
todo | core | read | no | Her own on-screen task list |
view_capture | core | read | no | Re-opens a screenshot she saved earlier |
web_extract | web | read | no | Fetches one page and returns readable text |
web_search | web | read | no | Provider-side web search |
write_file | file | write | no | Creates or overwrites a workspace file |
What can remove a tool from a turn
Six independent filters, applied every iteration in registry.schemas_for:
- The family is switched off. Settings → toolsets, persisted in
~/.kotoba/settings.yamlunderdisabled_toolsets. This is a whole family — there is no way to disable one command. - Its
check()says no.shellandexecute_codedisappear whenKOTOBA_SANDBOX=none. All nine Discord tools disappear outside the bot process. An MCP tool disappears when its server drops. Results are cached for 30 seconds, because this runs on every loop iteration and a probe can do real I/O — and a probe that raises keeps the last known answer instead of flapping the tool in and out of the schema. - The mode. Companion drops the four non-companion families; work drops
start_workandcancel_work. - A subagent's toolset filter. A helper sees one family plus the built-ins.
- The MCP active set. In work mode, a connected server's tools are offered only after
activate_tools— exceptbrowser, which is always active. - The turn's exclusion list. A Discord guest, for instance, is handed an allow-list and everything else is withheld by name.
web_extract has a seventh, in the loop rather than the registry: it is offered only when a real
http(s) link appears in one of the last 3 user messages. Otherwise the model invents a URL to fetch
instead of searching.
A switched-off family is also checked at dispatch, not only at offer time. Withdrawing a tool from the schema does not remove the name the model already had from earlier in the turn.
