Skip to content

Built-in tools

The agent works through tools: it reads files, runs shell commands, searches the web, sets reminders and so on. This page lists every built-in tool in netclaw 0.28.2, who gets it by default and when it prompts you. MCP servers add tools of their own, covered in MCP servers.

Who gets a tool depends on the audience of the conversation. Your own TUI and CLI sessions are Personal, and channel conversations get the audience you map with ChannelAudiences. Security model explains the three audiences.

netclaw 0.28.2 registers 36 built-in tools. 13 are loaded into every prompt (core) and the rest are found with search_tools and loaded with load_tool (deferred). The table columns say which audiences get each tool by default. A tool outside the profile-managed set is available to every audience when its subsystem is enabled, except that Public never gets skill_load, skill_read_resource or spawn_agent: those tools refuse Public in their own code.

File tools respect the audience’s ReadFiles, WriteFiles and AttachFiles roots. By default Public reaches only its own session directory, Team adds GlobalReadRoots for reads, and Personal reaches any path that isn’t protected.

ToolWhat it doesLoadedPublicTeamPersonalApproval by defaultControlled by
file_readRead a text file. Images load for models that accept them, and PDFs, media and archives return metadata.CoreYesYesYesRuns without a prompt. Protected files such as secrets.json and credential folders such as ~/.ssh are denied.-
file_listList one directory without recursing.CoreYesYesYesRuns without a prompt-
file_searchSearch authorized files by name or UTF-8 text, recursively, without a shell.CoreYesYesYesRuns without a prompt-
tool_output_readRead the rest of a truncated tool result by call ID. Large output is spilled to a session file and this tool pages through it.CoreYesYesYesRuns without a prompt-
file_writeCreate or replace a file, creating parent directories.CoreNoYesYesRuns without a prompt. Writes under the config directory are always denied.-
file_editReplace literal text in a file, or write the whole file.CoreNoYesYesRuns without a prompt. Edits under the config directory are always denied.-
attach_fileSend an existing file to the user in the chat.CoreYesYesYesRuns without a prompt-
set_working_directoryDeclare the project directory for the session. It scopes path checks and shell approvals and loads the project’s AGENTS.md.CoreNoYesYesRuns without a prompt-
ToolWhat it doesLoadedPublicTeamPersonalApproval by defaultControlled by
shell_executeRun a shell command. Pass _background: true to run it as a background job.CoreNoNoYesPrompts on Personal unless a saved grant or the reviewed-safe command list covers it. Never available to Team or Public.Tools.ShellMode or Security.ShellExecutionMode, which must resolve to HostAllowed
check_background_jobCheck the status and output tail of a background job, or cancel it.DeferredNoNoYesRuns without a promptTools.ShellMode or Security.ShellExecutionMode, which must resolve to HostAllowed
ToolWhat it doesLoadedPublicTeamPersonalApproval by defaultControlled by
web_searchSearch the web and return titles, URLs and snippets.DeferredNoYesYesRuns without a promptSearch.Enabled, Search.Backend
web_fetchDownload a URL to a local file and return a preview.DeferredNoYesYesRuns without a promptSearch.Enabled, Tools.WebFetch.RequireHttps, Tools.WebFetch.HttpAllowList
ToolWhat it doesLoadedPublicTeamPersonalApproval by defaultControlled by
store_memorySave knowledge to cross-session memory.DeferredYesYesYesRuns without a promptMemory.Enabled
find_memoriesSearch memory. Returns IDs, titles, scores and snippets.DeferredYesYesYesRuns without a promptMemory.Enabled
get_memoriesLoad the full text of memories by ID.DeferredYesYesYesRuns without a promptMemory.Enabled
update_memoryEdit or delete a memory by ID.DeferredYesYesYesRuns without a promptMemory.Enabled
ToolWhat it doesLoadedPublicTeamPersonalApproval by defaultControlled by
skill_loadLoad a skill’s instructions and list its reference files.CoreNoYesYesRuns without a promptSkillSync.Enabled
skill_read_resourceRead a resource file from a skill directory.CoreNoYesYesRuns without a promptSkillSync.Enabled
skill_manageCreate, edit, patch or delete skills and their resource files.DeferredNoYesYesRuns without a prompt-
search_toolsSearch deferred tools by keyword, or list MCP servers. Doesn’t load anything.CoreYesYesYesRuns without a prompt-
load_toolLoad a deferred tool by exact name so the model can call it.CoreYesYesYesRuns without a promptSession.DiscoveredToolRetentionTurns, Session.DiscoveredToolMaxCount
ToolWhat it doesLoadedPublicTeamPersonalApproval by defaultControlled by
set_reminderCreate or update a reminder from a relative time, an every 6h interval or a cron expression.DeferredNoYesYesRuns without a promptScheduling.Enabled
list_remindersList reminders with schedules, status and next run.DeferredNoYesYesRuns without a promptScheduling.Enabled
cancel_reminderCancel a reminder. A one-shot is deleted and its history stays readable for 12 days. A recurring reminder is disabled and kept.DeferredNoYesYesRuns without a promptScheduling.Enabled
get_reminder_historyShow recent runs of a reminder with outcome, duration and session ID.DeferredNoYesYesRuns without a promptScheduling.Enabled
run_reminderRun a reminder’s prompt in the current chat so you can answer approval prompts and save grants for the unattended run.DeferredNoYesYesRuns without a promptScheduling.Enabled
ToolWhat it doesLoadedPublicTeamPersonalApproval by defaultControlled by
set_webhookCreate or update an inbound webhook route.DeferredNoNoYesRuns without a promptWebhooks.Enabled
list_webhooksList webhook routes and whether each one loads.DeferredNoNoYesRuns without a promptWebhooks.Enabled
delete_webhookDelete a webhook route by name.DeferredNoNoYesRuns without a promptWebhooks.Enabled
ToolWhat it doesLoadedPublicTeamPersonalApproval by defaultControlled by
spawn_agentHand a task to a subagent. It returns a run ID at once, the child works in the background, and the result arrives in a later turn as a notice that names its result.md.DeferredNoYesYesRuns without a promptSubAgents.Enabled, SubAgents.PrefillTimeoutSeconds, SubAgents.NoProgressTimeoutSeconds
check_agent_runRead the status of a child run you started, or ask it to cancel. Subagents can’t call it.DeferredYesYesYesRuns without a prompt-
ToolWhat it doesLoadedPublicTeamPersonalApproval by defaultControlled by
send_channel_messagePost to a channel or send a direct message on Slack, Discord or Mattermost, using IDs from the lookup tools.DeferredYesYesYesRuns without a prompta chat channel enabled
lookup_channel_userResolve a person to a stable user ID on an enabled channel.DeferredYesYesYesRuns without a prompta chat channel enabled
lookup_channel_destinationResolve a channel name to a stable ID, or list every destination the bot can reach.DeferredYesYesYesRuns without a prompta chat channel enabled
lookup_slack_userFind a Slack user by name, display name or email.DeferredYesYesYesRuns without a promptSlack.Enabled
lookup_mattermost_userFind a Mattermost user by username or email.DeferredYesYesYesRuns without a promptMattermost.Enabled

The lists below are the 0.28.2 defaults for Tools.AudienceProfiles.<audience>.AllowedTools. Personal uses ToolsMode: All and has no list.

AudienceDefault AllowedTools
Publicfile_read, file_list, file_search, tool_output_read, attach_file
Teamfile_read, file_list, file_search, tool_output_read, file_write, file_edit, attach_file, web_search, web_fetch, skill_manage, set_reminder, list_reminders, cancel_reminder, get_reminder_history, run_reminder, set_working_directory

A tool outside the allow lists, such as the memory tools, is available to every audience while its subsystem is on. The exceptions are skill_load, skill_read_resource and spawn_agent, which return “This tool is not available.” to Public in every configuration. Only the tools in the Public and Team lists above are profile-managed, plus shell_execute and the webhook tools. shell_execute also needs the shell mode to resolve to HostAllowed, which a Personal posture gives you by default.

Each audience has a Tools.AudienceProfiles.<audience>.AllowedTools list, and a list you set replaces the default list. To add web_search to Public, repeat the five default tools and add it:

{
"Tools": {
"AudienceProfiles": {
"Public": {
"AllowedTools": ["file_read", "file_list", "file_search", "tool_output_read", "attach_file", "web_search"]
}
}
}
}

Writing only ["web_search"] would remove file access from Public, and a value that isn’t a list stops the daemon at startup. Personal doesn’t use a list: its ToolsMode is All. The configuration reference has the exact rules.

To take a tool away from an audience that has it by default, including Personal, deny it in that audience’s ApprovalPolicy:

{
"Tools": {
"AudienceProfiles": {
"Personal": {
"ApprovalPolicy": { "ToolOverrides": { "web_fetch": "Deny" } }
}
}
}
}

A denied tool disappears from the model’s tool list. To turn a whole subsystem off, set its switch to false: Memory.Enabled, Search.Enabled, Scheduling.Enabled, SubAgents.Enabled or Webhooks.Enabled. Shell is controlled by Tools.ShellMode. With Off the shell tool stays in the list, but every call is refused.

On a Personal posture one tool prompts by default. shell_execute asks, unless the command is on the reviewed-safe list or a saved grant covers it. Everything else runs without a prompt, including file_write and file_edit. Those two never touch ~/.netclaw/config/: the path policy denies the write in every mode, so no prompt appears. Set ApprovalPolicy.ToolOverrides per audience to change that. How tool approvals work covers the prompts, saved grants and unattended runs, and Reduce approval prompts is the practical guide.

ReleaseChange
0.28.2A model definition carries an output limit and a thinking level. A repeated failing call now counts toward the repeat guard even when the tool name changes.
0.28.1The Compaction model fails over to the Fallback model like the other roles.
0.28.0spawn_agent became asynchronous and check_agent_run was added. File tools and shell commands can never reach credential folders such as ~/.ssh. search_tools ranks its results. A large tool result keeps its tail inline. cancel_reminder deletes a one-shot.
0.27.1run_reminder joined the Team default list. A configured tool list now replaces the default instead of adding to it, and netclaw doctor warns when a Public or Team list lacks tool_output_read.
0.27.0Session context gained a worktree_dir. There’s no worktree tool: the agent uses shell_execute and set_working_directory for Git worktrees.
0.26.0file_search and tool_output_read joined the Public and Team defaults. Bulk workspace tools from the betas were removed in favor of these smaller ones.

An install that wrote the full default list to netclaw.json before 0.27.1 keeps working, because netclaw maps a list that exactly matches an older default to the current one. A list you edited by hand doesn’t get the new tools, so add file_search and tool_output_read yourself.

shell_execute can run a command as a background job when the call sets _background: true. The job runs detached from the conversation, so the agent keeps working while a build, test run or dev server runs. check_background_job reads its status and output tail, or cancels it.

LimitValue
Concurrent jobs5 per daemon. The rest queue first in, first out
Kill timerNone unless the call sets _timeout_seconds
Session goes idleJobs the session owns are killed and marked Reaped. See Session.IdleTimeout
Daemon restartsRunning jobs are marked Lost and the session is told, with the log path
OutputStreams to ~/.netclaw/jobs/<id>/output.log, rotating at about 5 MB, so a job keeps about 10 MB on disk
RetentionA finished job’s definition and log are deleted after 24 hours

A background job needs the same approval as a foreground shell call. For work that has to outlive the conversation, use a reminder instead.

spawn_agent hands a task to a subagent, which runs its own tool loop in the background. The call returns a run ID at once. The parent shouldn’t wait or poll: it gets one notice in a later turn, and reads the child’s result.md with file_read. check_agent_run reads a child’s status or asks it to cancel. In headless netclaw chat -p the session ends with the first turn, so it never sees a later child result. A subagent inherits the audience, approval and shell policy of the session that spawned it, and it can’t call spawn_agent, check_agent_run or attach_file.

A child that needs your approval parks, and the park survives a restart. After the restart you get the prompt again, and one answer resumes the parked calls. A child can end with the reason output_truncated (its reply hit the output limit, and the full text is in artifacts/truncated-output.md), thinking_only_timeout, owner_restarted or park_too_large. A silent child stream times out at Session.FirstTokenTimeoutSeconds (600 seconds), since a profile’s timeoutSeconds key is ignored. Custom subagents shows how to define your own, and SubAgents.PrefillTimeoutSeconds and SubAgents.NoProgressTimeoutSeconds in the configuration reference set the watchdogs.