CoderClaw exposes first-class agent tools for browser, canvas, nodes, and cron.
These replace the old coderclaw-* skills: the tools are typed, no shelling,
and the agent should rely on them directly.
You can globally allow/deny tools via tools.allow / tools.deny in coderclaw.json
(deny wins). This prevents disallowed tools from being sent to model providers.
{
tools: { deny: ["browser"] },
}
Notes:
* wildcards are supported ("*" means all tools).tools.allow only references unknown or unloaded plugin tool names, CoderClaw logs a warning and ignores the allowlist so core tools stay available.tools.profile sets a base tool allowlist before tools.allow/tools.deny.
Per-agent override: agents.list[].tools.profile.
Profiles:
minimal: session_status onlycoding: group:fs, group:runtime, group:sessions, group:memory, imagemessaging: group:messaging, sessions_list, sessions_history, sessions_send, session_statusfull: no restriction (same as unset)Example (messaging-only by default, allow Slack + Discord tools too):
{
tools: {
profile: "messaging",
allow: ["slack", "discord"],
},
}
Example (coding profile, but deny exec/process everywhere):
{
tools: {
profile: "coding",
deny: ["group:runtime"],
},
}
Example (global coding profile, messaging-only support agent):
{
tools: { profile: "coding" },
agents: {
list: [
{
id: "support",
tools: { profile: "messaging", allow: ["slack"] },
},
],
},
}
Use tools.byProvider to further restrict tools for specific providers
(or a single provider/model) without changing your global defaults.
Per-agent override: agents.list[].tools.byProvider.
This is applied after the base tool profile and before allow/deny lists,
so it can only narrow the tool set.
Provider keys accept either provider (e.g. google-antigravity) or
provider/model (e.g. openai/gpt-5.2).
Example (keep global coding profile, but minimal tools for Google Antigravity):
{
tools: {
profile: "coding",
byProvider: {
"google-antigravity": { profile: "minimal" },
},
},
}
Example (provider/model-specific allowlist for a flaky endpoint):
{
tools: {
allow: ["group:fs", "group:runtime", "sessions_list"],
byProvider: {
"openai/gpt-5.2": { allow: ["group:fs", "sessions_list"] },
},
},
}
Example (agent-specific override for a single provider):
{
agents: {
list: [
{
id: "support",
tools: {
byProvider: {
"google-antigravity": { allow: ["message", "sessions_list"] },
},
},
},
],
},
}
Tool policies (global, agent, sandbox) support group:* entries that expand to multiple tools.
Use these in tools.allow / tools.deny.
Available groups:
group:runtime: exec, bash, processgroup:fs: read, write, edit, apply_patchgroup:sessions: sessions_list, sessions_history, sessions_send, sessions_spawn, session_statusgroup:memory: memory_search, memory_getgroup:web: web_search, web_fetchgroup:ui: browser, canvasgroup:automation: cron, gatewaygroup:messaging: messagegroup:nodes: nodesgroup:coderclaw: all built-in CoderClaw tools (excludes provider plugins)Example (allow only file tools + browser):
{
tools: {
allow: ["group:fs", "browser"],
},
}
Plugins can register additional tools (and CLI commands) beyond the core set. See Plugins for install + config, and Skills for how tool usage guidance is injected into prompts. Some plugins ship their own skills alongside tools (for example, the voice-call plugin).
Optional plugin tools:
apply_patchApply structured patches across one or more files. Use for multi-hunk edits.
Experimental: enable via tools.exec.applyPatch.enabled (OpenAI models only).
tools.exec.applyPatch.workspaceOnly defaults to true (workspace-contained). Set it to false only if you intentionally want apply_patch to write/delete outside the workspace directory.
execRun shell commands in the workspace.
Core parameters:
command (required)yieldMs (auto-background after timeout, default 10000)background (immediate background)timeout (seconds; kills the process if exceeded, default 1800)elevated (bool; run on host if elevated mode is enabled/allowed; only changes behavior when the agent is sandboxed)host (sandbox | gateway | node)security (deny | allowlist | full)ask (off | on-miss | always)node (node id/name for host=node)pty: true.Notes:
status: "running" with a sessionId when backgrounded.process to poll/log/write/kill/clear background sessions.process is disallowed, exec runs synchronously and ignores yieldMs/background.elevated is gated by tools.elevated plus any agents.list[].tools.elevated override (both must allow) and is an alias for host=gateway + security=full.elevated only changes behavior when the agent is sandboxed (otherwise it’s a no-op).host=node can target a macOS companion app or a headless node host (coderclaw node run).processManage background exec sessions.
Core actions:
list, poll, log, write, kill, clear, removeNotes:
poll returns new output and exit status when complete.log supports line-based offset/limit (omit offset to grab the last N lines).process is scoped per agent; sessions from other agents are not visible.loop-detection (tool-call loop guardrails)CoderClaw tracks recent tool-call history and blocks or warns when it detects repetitive no-progress loops.
Enable with tools.loopDetection.enabled: true (default is false).
{
tools: {
loopDetection: {
enabled: true,
warningThreshold: 10,
criticalThreshold: 20,
globalCircuitBreakerThreshold: 30,
historySize: 30,
detectors: {
genericRepeat: true,
knownPollNoProgress: true,
pingPong: true,
},
},
},
}
genericRepeat: repeated same tool + same params call pattern.knownPollNoProgress: repeating poll-like tools with identical outputs.pingPong: alternating A/B/A/B no-progress patterns.agents.list[].tools.loopDetection.web_searchSearch the web using Brave Search API.
Core parameters:
query (required)count (1–10; default from tools.web.search.maxResults)Notes:
coderclaw configure --section web, or set BRAVE_API_KEY).tools.web.search.enabled.web_fetchFetch and extract readable content from a URL (HTML → markdown/text).
Core parameters:
url (required)extractMode (markdown |
text) |
maxChars (truncate long pages)Notes:
tools.web.fetch.enabled.maxChars is clamped by tools.web.fetch.maxCharsCap (default 50000).browserControl the dedicated CoderClaw-managed browser.
Core actions:
status, start, stop, tabs, open, focus, closesnapshot (aria/ai)screenshot (returns image block + MEDIA:<path>)act (UI actions: click/type/press/hover/drag/select/fill/resize/wait/evaluate)navigate, console, pdf, upload, dialogProfile management:
profiles — list all browser profiles with statuscreate-profile — create new profile with auto-allocated port (or cdpUrl)delete-profile — stop browser, delete user data, remove from config (local only)reset-profile — kill orphan process on profile’s port (local only)Common parameters:
profile (optional; defaults to browser.defaultProfile)target (sandbox |
host |
node) |
node (optional; picks a specific node id/name)
Notes:browser.enabled=true (default is true; set false to disable).profile parameter for multi-instance support.profile is omitted, uses browser.defaultProfile (defaults to “chrome”).target).snapshot defaults to ai when Playwright is installed; use aria for the accessibility tree.snapshot also supports role-snapshot options (interactive, compact, depth, selector) which return refs like e12.act requires ref from snapshot (numeric 12 from AI snapshots, or e12 from role snapshots); use evaluate for rare CSS selector needs.act → wait by default; use it only in exceptional cases (no reliable UI state to wait on).upload can optionally pass a ref to auto-click after arming.upload also supports inputRef (aria ref) or element (CSS selector) to set <input type="file"> directly.canvasDrive the node Canvas (present, eval, snapshot, A2UI).
Core actions:
present, hide, navigate, evalsnapshot (returns image block + MEDIA:<path>)a2ui_push, a2ui_resetNotes:
node.invoke under the hood.node is provided, the tool picks a default (single connected node or local mac node).createSurface); the CLI rejects v0.9 JSONL with line errors.coderclaw nodes canvas a2ui push --node <id> --text "Hello from A2UI".nodesDiscover and target paired nodes; send notifications; capture camera/screen.
Core actions:
status, describepending, approve, reject (pairing)notify (macOS system.notify)run (macOS system.run)camera_snap, camera_clip, screen_recordlocation_getNotes:
MEDIA:<path>.FILE:<path> (mp4).run params: command argv array; optional cwd, env (KEY=VAL), commandTimeoutMs, invokeTimeoutMs, needsScreenRecording.Example (run):
{
"action": "run",
"node": "office-mac",
"command": ["echo", "Hello"],
"env": ["FOO=bar"],
"commandTimeoutMs": 12000,
"invokeTimeoutMs": 45000,
"needsScreenRecording": false
}
imageAnalyze an image with the configured image model.
Core parameters:
image (required path or URL)prompt (optional; defaults to “Describe the image.”)model (optional override)maxBytesMb (optional size cap)Notes:
agents.defaults.imageModel is configured (primary or fallbacks), or when an implicit image model can be inferred from your default model + configured auth (best-effort pairing).messageSend messages and channel actions across Discord/Google Chat/Slack/Telegram/WhatsApp/Signal/iMessage/MS Teams.
Core actions:
send (text + optional media; MS Teams also supports card for Adaptive Cards)poll (WhatsApp/Discord/MS Teams polls)react / reactions / read / edit / deletepin / unpin / list-pinspermissionsthread-create / thread-list / thread-replysearchstickermember-info / role-infoemoji-list / emoji-upload / sticker-uploadrole-add / role-removechannel-info / channel-listvoice-statusevent-list / event-createtimeout / kick / banNotes:
send routes WhatsApp via the Gateway; other channels go direct.poll uses the Gateway for WhatsApp and MS Teams; Discord polls go direct.cronManage Gateway cron jobs and wakeups.
Core actions:
status, listadd, update, remove, run, runswake (enqueue system event + optional immediate heartbeat)Notes:
add expects a full cron job object (same schema as cron.add RPC).update uses { jobId, patch } (id accepted for compatibility).gatewayRestart or apply updates to the running Gateway process (in-place).
Core actions:
restart (authorizes + sends SIGUSR1 for in-process restart; coderclaw gateway restart in-place)config.get / config.schemaconfig.apply (validate + write config + restart + wake)config.patch (merge partial update + restart + wake)update.run (run update + restart + wake)Notes:
delayMs (defaults to 2000) to avoid interrupting an in-flight reply.restart is disabled by default; enable with commands.restart: true.sessions_list / sessions_history / sessions_send / sessions_spawn / session_statusList sessions, inspect transcript history, or send to another session.
Core parameters:
sessions_list: kinds?, limit?, activeMinutes?, messageLimit? (0 = none)sessions_history: sessionKey (or sessionId), limit?, includeTools?sessions_send: sessionKey (or sessionId), message, timeoutSeconds? (0 = fire-and-forget)sessions_spawn: task, label?, agentId?, model?, runTimeoutSeconds?, cleanup?session_status: sessionKey? (default current; accepts sessionId), model? (default clears override)Notes:
main is the canonical direct-chat key; global/unknown are hidden.messageLimit > 0 fetches last N messages per session (tool messages filtered).tools.sessions.visibility (default tree: current session + spawned subagent sessions). If you run a shared agent for multiple users, consider setting tools.sessions.visibility: "self" to prevent cross-session browsing.sessions_send waits for final completion when timeoutSeconds > 0.status: "ok" confirms the agent run finished, not that the announce was delivered.sessions_spawn starts a sub-agent run and posts an announce reply back to the requester chat.
Status, Result, and compact stats.Result is the assistant completion text; if missing, the latest toolResult is used as fallback.status: "ok" means run finished, not that announce delivered).sessions_spawn is non-blocking and returns status: "accepted" immediately.sessions_send runs a reply‑back ping‑pong (reply REPLY_SKIP to stop; max turns via session.agentToAgent.maxPingPongTurns, 0–5).ANNOUNCE_SKIP to suppress the announcement.agents.defaults.sandbox.sessionToolsVisibility: "spawned", CoderClaw clamps tools.sessions.visibility to tree.agents_listList agent ids that the current session may target with sessions_spawn.
Notes:
agents.list[].subagents.allowAgents).["*"] is configured, the tool includes all configured agents and marks allowAny: true.Gateway-backed tools (canvas, nodes, cron):
gatewayUrl (default ws://127.0.0.1:18789)gatewayToken (if auth enabled)timeoutMsNote: when gatewayUrl is set, include gatewayToken explicitly. Tools do not inherit config
or environment credentials for overrides, and missing explicit credentials is an error.
Browser tool:
profile (optional; defaults to browser.defaultProfile)target (sandbox |
host |
node) |
node (optional; pin a specific node id/name)Browser automation:
browser → status / startsnapshot (ai or aria)act (click/type/press)screenshot if you need visual confirmationCanvas render:
canvas → presenta2ui_push (optional)snapshotNode targeting:
nodes → statusdescribe on the chosen nodenotify / run / camera_snap / screen_recordsystem.run; use nodes → run only with explicit user consent.status/describe to ensure permissions before invoking media commands.Tools are exposed in two parallel channels:
That means the agent sees both “what tools exist” and “how to call them.” If a tool doesn’t appear in the system prompt or the schema, the model cannot call it.