* Gateway: require explicit auth for url overrides * Gateway: scope credential blocking to non-local URLs only Address review feedback: the previous fix blocked credential fallback for ALL URL overrides, which was overly strict and could break workflows that use --url to switch between loopback/tailnet without passing credentials. Now credential fallback is only blocked for non-local URLs (public IPs, external hostnames). Local addresses (127.0.0.1, localhost, private IPs like 192.168.x.x, 10.x.x.x, tailnet 100.x.x.x) still get credential fallback as before. This maintains the security fix (preventing credential exfiltration to attacker-controlled URLs) while preserving backward compatibility for legitimate local URL overrides. * Security: require explicit credentials for gateway url overrides (#8113) (thanks @victormier) * Gateway: reuse explicit auth helper for url overrides (#8113) (thanks @victormier) * Tests: format gateway chat test (#8113) (thanks @victormier) * Tests: require explicit auth for gateway url overrides (#8113) (thanks @victormier) --------- Co-authored-by: Victor Mier <victormier@gmail.com>
16 KiB
summary, read_when, title
| summary | read_when | title | ||
|---|---|---|---|---|
| Agent tool surface for OpenClaw (browser, canvas, nodes, message, cron) replacing legacy `openclaw-*` skills |
|
Tools |
Tools (OpenClaw)
OpenClaw exposes first-class agent tools for browser, canvas, nodes, and cron.
These replace the old openclaw-* skills: the tools are typed, no shelling,
and the agent should rely on them directly.
Disabling tools
You can globally allow/deny tools via tools.allow / tools.deny in openclaw.json
(deny wins). This prevents disallowed tools from being sent to model providers.
{
tools: { deny: ["browser"] },
}
Notes:
- Matching is case-insensitive.
*wildcards are supported ("*"means all tools).- If
tools.allowonly references unknown or unloaded plugin tool names, OpenClaw logs a warning and ignores the allowlist so core tools stay available.
Tool profiles (base allowlist)
tools.profile sets a base tool allowlist before tools.allow/tools.deny.
Per-agent override: agents.list[].tools.profile.
Profiles:
minimal:session_statusonlycoding: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"] },
},
],
},
}
Provider-specific tool policy
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 groups (shorthands)
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:openclaw: all built-in OpenClaw tools (excludes provider plugins)
Example (allow only file tools + browser):
{
tools: {
allow: ["group:fs", "browser"],
},
}
Plugins + tools
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:
- Lobster: typed workflow runtime with resumable approvals (requires the Lobster CLI on the gateway host).
- LLM Task: JSON-only LLM step for structured workflow output (optional schema validation).
Tool inventory
apply_patch
Apply structured patches across one or more files. Use for multi-hunk edits.
Experimental: enable via tools.exec.applyPatch.enabled (OpenAI models only).
exec
Run 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 forhost=node)- Need a real TTY? Set
pty: true.
Notes:
- Returns
status: "running"with asessionIdwhen backgrounded. - Use
processto poll/log/write/kill/clear background sessions. - If
processis disallowed,execruns synchronously and ignoresyieldMs/background. elevatedis gated bytools.elevatedplus anyagents.list[].tools.elevatedoverride (both must allow) and is an alias forhost=gateway+security=full.elevatedonly changes behavior when the agent is sandboxed (otherwise it’s a no-op).host=nodecan target a macOS companion app or a headless node host (openclaw node run).- gateway/node approvals and allowlists: Exec approvals.
process
Manage background exec sessions.
Core actions:
list,poll,log,write,kill,clear,remove
Notes:
pollreturns new output and exit status when complete.logsupports line-basedoffset/limit(omitoffsetto grab the last N lines).processis scoped per agent; sessions from other agents are not visible.
web_search
Search the web using Brave Search API.
Core parameters:
query(required)count(1–10; default fromtools.web.search.maxResults)
Notes:
- Requires a Brave API key (recommended:
openclaw configure --section web, or setBRAVE_API_KEY). - Enable via
tools.web.search.enabled. - Responses are cached (default 15 min).
- See Web tools for setup.
web_fetch
Fetch and extract readable content from a URL (HTML → markdown/text).
Core parameters:
url(required)extractMode(markdown|text)maxChars(truncate long pages)
Notes:
- Enable via
tools.web.fetch.enabled. maxCharsis clamped bytools.web.fetch.maxCharsCap(default 50000).- Responses are cached (default 15 min).
- For JS-heavy sites, prefer the browser tool.
- See Web tools for setup.
- See Firecrawl for the optional anti-bot fallback.
browser
Control the dedicated OpenClaw-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,dialog
Profile management:
profiles— list all browser profiles with statuscreate-profile— create new profile with auto-allocated port (orcdpUrl)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 tobrowser.defaultProfile)target(sandbox|host|node)node(optional; picks a specific node id/name) Notes:- Requires
browser.enabled=true(default istrue; setfalseto disable). - All actions accept optional
profileparameter for multi-instance support. - When
profileis omitted, usesbrowser.defaultProfile(defaults to "chrome"). - Profile names: lowercase alphanumeric + hyphens only (max 64 chars).
- Port range: 18800-18899 (~100 profiles max).
- Remote profiles are attach-only (no start/stop/reset).
- If a browser-capable node is connected, the tool may auto-route to it (unless you pin
target). snapshotdefaults toaiwhen Playwright is installed; useariafor the accessibility tree.snapshotalso supports role-snapshot options (interactive,compact,depth,selector) which return refs likee12.actrequiresreffromsnapshot(numeric12from AI snapshots, ore12from role snapshots); useevaluatefor rare CSS selector needs.- Avoid
act→waitby default; use it only in exceptional cases (no reliable UI state to wait on). uploadcan optionally pass arefto auto-click after arming.uploadalso supportsinputRef(aria ref) orelement(CSS selector) to set<input type="file">directly.
canvas
Drive the node Canvas (present, eval, snapshot, A2UI).
Core actions:
present,hide,navigate,evalsnapshot(returns image block +MEDIA:<path>)a2ui_push,a2ui_reset
Notes:
- Uses gateway
node.invokeunder the hood. - If no
nodeis provided, the tool picks a default (single connected node or local mac node). - A2UI is v0.8 only (no
createSurface); the CLI rejects v0.9 JSONL with line errors. - Quick smoke:
openclaw nodes canvas a2ui push --node <id> --text "Hello from A2UI".
nodes
Discover and target paired nodes; send notifications; capture camera/screen.
Core actions:
status,describepending,approve,reject(pairing)notify(macOSsystem.notify)run(macOSsystem.run)camera_snap,camera_clip,screen_recordlocation_get
Notes:
- Camera/screen commands require the node app to be foregrounded.
- Images return image blocks +
MEDIA:<path>. - Videos return
FILE:<path>(mp4). - Location returns a JSON payload (lat/lon/accuracy/timestamp).
runparams:commandargv array; optionalcwd,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
}
image
Analyze 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:
- Only available when
agents.defaults.imageModelis configured (primary or fallbacks), or when an implicit image model can be inferred from your default model + configured auth (best-effort pairing). - Uses the image model directly (independent of the main chat model).
message
Send messages and channel actions across Discord/Google Chat/Slack/Telegram/WhatsApp/Signal/iMessage/MS Teams.
Core actions:
send(text + optional media; MS Teams also supportscardfor 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/ban
Notes:
sendroutes WhatsApp via the Gateway; other channels go direct.polluses the Gateway for WhatsApp and MS Teams; Discord polls go direct.- When a message tool call is bound to an active chat session, sends are constrained to that session’s target to avoid cross-context leaks.
cron
Manage Gateway cron jobs and wakeups.
Core actions:
status,listadd,update,remove,run,runswake(enqueue system event + optional immediate heartbeat)
Notes:
addexpects a full cron job object (same schema ascron.addRPC).updateuses{ id, patch }.
gateway
Restart or apply updates to the running Gateway process (in-place).
Core actions:
restart(authorizes + sendsSIGUSR1for in-process restart;openclaw gatewayrestart 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:
- Use
delayMs(defaults to 2000) to avoid interrupting an in-flight reply. restartis disabled by default; enable withcommands.restart: true.
sessions_list / sessions_history / sessions_send / sessions_spawn / session_status
List sessions, inspect transcript history, or send to another session.
Core parameters:
sessions_list:kinds?,limit?,activeMinutes?,messageLimit?(0 = none)sessions_history:sessionKey(orsessionId),limit?,includeTools?sessions_send:sessionKey(orsessionId),message,timeoutSeconds?(0 = fire-and-forget)sessions_spawn:task,label?,agentId?,model?,runTimeoutSeconds?,cleanup?session_status:sessionKey?(default current; acceptssessionId),model?(defaultclears override)
Notes:
mainis the canonical direct-chat key; global/unknown are hidden.messageLimit > 0fetches last N messages per session (tool messages filtered).sessions_sendwaits for final completion whentimeoutSeconds > 0.- Delivery/announce happens after completion and is best-effort;
status: "ok"confirms the agent run finished, not that the announce was delivered. sessions_spawnstarts a sub-agent run and posts an announce reply back to the requester chat.sessions_spawnis non-blocking and returnsstatus: "accepted"immediately.sessions_sendruns a reply‑back ping‑pong (replyREPLY_SKIPto stop; max turns viasession.agentToAgent.maxPingPongTurns, 0–5).- After the ping‑pong, the target agent runs an announce step; reply
ANNOUNCE_SKIPto suppress the announcement.
agents_list
List agent ids that the current session may target with sessions_spawn.
Notes:
- Result is restricted to per-agent allowlists (
agents.list[].subagents.allowAgents). - When
["*"]is configured, the tool includes all configured agents and marksallowAny: true.
Parameters (common)
Gateway-backed tools (canvas, nodes, cron):
gatewayUrl(defaultws://127.0.0.1:18789)gatewayToken(if auth enabled)timeoutMs
Note: 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 tobrowser.defaultProfile)target(sandbox|host|node)node(optional; pin a specific node id/name)
Recommended agent flows
Browser automation:
browser→status/startsnapshot(ai or aria)act(click/type/press)screenshotif you need visual confirmation
Canvas render:
canvas→presenta2ui_push(optional)snapshot
Node targeting:
nodes→statusdescribeon the chosen nodenotify/run/camera_snap/screen_record
Safety
- Avoid direct
system.run; usenodes→runonly with explicit user consent. - Respect user consent for camera/screen capture.
- Use
status/describeto ensure permissions before invoking media commands.
How tools are presented to the agent
Tools are exposed in two parallel channels:
- System prompt text: a human-readable list + guidance.
- Tool schema: the structured function definitions sent to the model API.
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.