Kotoba

Where to start

What Kotoba isWho she is and where she runs, in one page
InstallingOne package, two commands
First runA key, a model, her first words
The approval gateHow she asks before she acts
The two voice modesLocal voice, or the agent tunnel
The soul fileChange who she is
RoadmapWhat grows next, and what was cut on purpose

Or a section

↑↓ move openesc close124 pages
All pages

The agent3 of 15

Every tool she has

About 7 minutes to read

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:

bash
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

ToolsetToolsOffered in a conversation?Page
core7 — ask_user, cancel_work, clarify, open_link, start_work, todo, view_captureyesCore
web2 — web_search, web_extractyesWeb
memory5 — memory_write, memory_recall, session_search, remember_image, recall_imageyesMemory
file4 — read_file, write_file, patch, search_filesyesFiles
terminal1 — shellyesTerminal and code
code1 — execute_codeyesTerminal and code
cron1 — cronjobyesReminders
report1 — make_reportyesReports
skills2 — skill_list, skill_viewyesSkills
discord9 — see the pageyes, inside the bot process onlyDiscord tools
subagent1 — delegateno — work mode onlySubagents
browser3 — ask_secret, request_credential, get_credentialno — work mode onlyBrowser and secrets
mcp3 — mcp_install, mcp_find, activate_toolsno — work mode onlyMCP

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:

  1. Whether you get a step row. write, exec and network are actions and draw a card in the panel. read draws no row — just a status line naming the tool.
  2. Its minimum time budget. An exec tool 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:

ToolAsks
shellanything that is not a provably-safe read inside the workspace
execute_codeevery 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_findbefore launching a server's process
discord_act, discord_apply_planone 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

ToolToolsetRiskAsks firstWhat it does
activate_toolsmcpreadnoLoads a connected server's tools into the toolset
ask_secretbrowserread— (it is a prompt)Masked one-time password box; returns a placeholder, never the value
ask_usercoreread— (it is a prompt)Opens a text box for you to type into
cancel_workcorereadnoStops the running background job
clarifycoreread— (it is a question)Asks one clarifying question
cronjobcronwritenoCreates, lists, cancels or skips a reminder
delegatesubagentexecnoHands a subtask to a helper agent
discord_actdiscordwriteyesChanges the Discord server
discord_apply_plandiscordwriteyesApplies an approved restructuring plan
discord_guild_readdiscordreadnoReads the server's shape
discord_peoplediscordreadnoLooks someone up
discord_plandiscordreadnoProposes a server shape, changing nothing
discord_read_historydiscordreadnoReads back what was said in a channel
discord_remember_persondiscordwritenoNotes a fact about a person on Discord
discord_send_filediscordwritenoAttaches a workspace file to the channel
discord_voicediscordwritenoJoins or leaves a voice channel
execute_codecodeexecyesRuns a Python snippet
get_credentialbrowserreadnoHands back a {{secret:NAME}} placeholder for a saved credential
make_reportreportwritenoFills the report template and opens the viewer
mcp_findmcpexecyesSearches the official MCP registry and installs a server
mcp_installmcpexecyesInstalls one of eight known servers by name
memory_recallmemoryreadnoReads or searches long-term memory
memory_writememorywritenoSaves one durable English fact
open_linkcoreread— (it is an offer)Offers you a link to open; never opens one itself
patchfilewritenoReplaces an exact snippet in a workspace file
read_filefilereadnoReads a workspace file, paginated
recall_imagememoryreadnoBrings saved images back into view
remember_imagememorywritenoSaves an image into visual memory
request_credentialbrowserread— (it is a prompt)Saves one of her reusable credentials
search_filesfilereadnoText search across the workspace
session_searchmemoryreadnoFull-text search over past turns
shellterminalexecusuallyRuns a shell command in the workspace
skill_listskillsreadnoLists her skill documents
skill_viewskillsreadnoLoads one skill's full text
start_workcorereadnoLaunches a background job
todocorereadnoHer own on-screen task list
view_capturecorereadnoRe-opens a screenshot she saved earlier
web_extractwebreadnoFetches one page and returns readable text
web_searchwebreadnoProvider-side web search
write_filefilewritenoCreates or overwrites a workspace file

What can remove a tool from a turn

Six independent filters, applied every iteration in registry.schemas_for:

  1. The family is switched off. Settings → toolsets, persisted in ~/.kotoba/settings.yaml under disabled_toolsets. This is a whole family — there is no way to disable one command.
  2. Its check() says no. shell and execute_code disappear when KOTOBA_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.
  3. The mode. Companion drops the four non-companion families; work drops start_work and cancel_work.
  4. A subagent's toolset filter. A helper sees one family plus the built-ins.
  5. The MCP active set. In work mode, a connected server's tools are offered only after activate_tools — except browser, which is always active.
  6. 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.