OpenClaw Tools: The Nervous System of Your AI Agent
When you talk to OpenClaw, you're not just talking to a chatbot. You're talking to an agent capable of acting on your system, your browser, your applications. How? Through tools — functions the agent can invoke to accomplish concrete tasks.
Prerequisites
- OpenClaw installed and configured
- Basic understanding of JSON and command line
- Official documentation: https://docs.openclaw.ai/tools
What Is a Tool?
A tool is a function that OpenClaw can call. When you ask "run this command" or "search the web," the agent doesn't pretend: it calls the exec or web_search tool, receives the result, and responds.
Concrete example: you ask "check if the server is running." The agent:
1. Calls exec with the command systemctl status nginx
2. Receives the stdout
3. Explains the service status
That's what tools are. No magic, just well-defined functions.
Tool Categories
OpenClaw organizes tools into groups:
🖥️ Runtime (group:runtime)
Tools: exec, process
For executing shell commands and managing background processes.
# Via the OpenClaw agent (by talking to it)
"Run the uptime command"
# → Calls exec(command="uptime")
"Start the backup in background"
# → Calls exec(command="backup.sh", background=true)
# → Returns a sessionId
"Check the backup status"
# → Calls process(action="poll", sessionId="...")
Important options:
- pty: true → for interactive commands (vim, tmux)
- timeout → auto-kill after X seconds
- background → launch without waiting for completion
- elevated → execute in privileged mode if allowed
📁 File System (group:fs)
Tools: read, write, edit, apply_patch
For reading and modifying files.
"Read the file /etc/nginx/nginx.conf"
# → Calls read(path="/etc/nginx/nginx.conf")
"Add a line at the end of the file"
# → Calls edit(path="...", oldText="...", newText="...")
"Apply this patch on 3 files"
# → Calls apply_patch(patches=[...])
Note: apply_patch is experimental (OpenAI models only), enabled via tools.exec.applyPatch.enabled.
🌐 Web (group:web)
Tools: web_search, web_fetch
For searching and extracting web content.
"Search for the latest info on Claude 4"
# → Calls web_search(query="Claude 4 latest news", count=5)
"Extract the content from this URL"
# → Calls web_fetch(url="...", extractMode="markdown")
Setup:
{
"tools": {
"web": {
"search": { "enabled": true, "maxResults": 10 },
"fetch": { "enabled": true, "maxCharsCap": 50000 }
}
}
}
Required: Brave API key for web_search → openclaw configure --section web
🌍 Browser (group:ui)
Tool: browser
For controlling a real Chrome browser.
"Open Google and search for OpenClaw"
# 1. browser(action="start")
# 2. browser(action="open", targetUrl="https://google.com")
# 3. browser(action="snapshot", snapshotFormat="ai")
# 4. browser(action="act", request={kind:"type", ref:"searchbox", text:"OpenClaw"})
# 5. browser(action="act", request={kind:"press", key:"Enter"})
"Take a screenshot of the page"
# → browser(action="screenshot") → returns image + MEDIA:
Recommended workflow:
1. status / start → launch the browser
2. snapshot → capture the page state (AI or aria tree)
3. act → click, type, scroll (click, type, press, hover, drag)
4. screenshot → visual confirmation
Multi-profiles: you can have multiple isolated Chrome instances via profile.
📱 Canvas & Nodes
Tools: canvas, nodes
For controlling macOS/iOS devices (OpenClaw companion app).
Canvas: displays visual content on a screen (present, eval, snapshot, A2UI).
Nodes: targets paired devices:
- notify → macOS system notification
- camera_snap → take a photo
- screen_record → screen recording
- location_get → geolocation
- run → shell command on the device
"Take a photo with the MacBook"
# → nodes(action="camera_snap", node="office-mac")
"Record the screen for 10s"
# → nodes(action="screen_record", node="office-mac", durationMs=10000)
💬 Messaging (group:messaging)
Tool: message
For sending messages on Telegram/Discord/Slack/WhatsApp/Signal/iMessage.
"Send a message to #general on Discord"
# → message(action="send", channel="discord", target="#general", message="...")
"Create a poll on Telegram"
# → message(action="poll", channel="telegram", ...)
Actions: send, react, edit, delete, pin, thread-create, search, etc.
⏰ Automation (group:automation)
Tools: cron, gateway
For managing scheduled tasks and configuration.
"Create a cron that reminds me every day at 9am"
# → cron(action="add", job={...})
"List active cron jobs"
# → cron(action="list")
"Restart OpenClaw"
# → gateway(action="restart")
Cron format:
{
"schedule": { "kind": "cron", "expr": "0 9 * * *", "tz": "Europe/Paris" },
"payload": { "kind": "systemEvent", "text": "Daily reminder" },
"sessionTarget": "main"
}
👥 Sessions (group:sessions)
Tools: sessions_list, sessions_history, sessions_send, sessions_spawn, session_status
For managing multiple conversations and sub-agents.
"List my active sessions"
# → sessions_list()
"Send a message to the support session"
# → sessions_send(sessionKey="support", message="...")
"Launch a sub-agent for this task"
# → sessions_spawn(task="...", model="anthropic/claude-sonnet-4-5")
🧠 Memory (group:memory)
Tools: memory_search, memory_get
For searching in MEMORY.md and memory/*.md.
"Remind me what we decided yesterday about project X"
# → memory_search(query="project X decisions", maxResults=5)
# → memory_get(path="memory/2026-02-10.md", from=120, lines=30)
Configuring Tool Access
By default, all tools are available. You can restrict them via openclaw.json:
Global Deny
{
"tools": {
"deny": ["browser", "nodes"]
}
}
→ Completely blocks browser and nodes.
Selective Allow
{
"tools": {
"allow": ["group:fs", "group:web", "sessions_list"]
}
}
→ Only allows these tools (everything else is blocked).
Profiles (Presets)
Instead of listing manually, use a profile:
minimal → session_status only
coding → group:fs, group:runtime, group:sessions, group:memory, image
messaging → group:messaging, sessions tools
full → everything (default)
{
"tools": {
"profile": "coding"
}
}
Per Provider
Restrict for a specific model:
{
"tools": {
"profile": "coding",
"byProvider": {
"google-antigravity": { "profile": "minimal" }
}
}
}
→ Gemini Antigravity will only have session_status, the rest will have the coding profile.
Per Agent
Create a support agent with limited access:
{
"agents": {
"list": [
{
"id": "support",
"tools": {
"profile": "messaging",
"allow": ["slack", "discord"]
}
}
]
}
}
Practical Use Cases
1. Automate a Daily Backup
# 1. Create a backup.sh script
"Create a file backup.sh that copies ~/docs to /backup/"
# 2. Make executable
"Make backup.sh executable"
# → exec(command="chmod +x backup.sh")
# 3. Add a cron job
"Create a cron job that runs backup.sh every day at 2am"
# → cron(action="add", job={...})
2. Scrape a Website
"Go to example.com, find all links, and save them to links.txt"
# 1. browser(action="start")
# 2. browser(action="open", targetUrl="https://example.com")
# 3. browser(action="snapshot")
# 4. Extract links from snapshot
# 5. write(path="links.txt", content="...")
3. Server Monitoring with Alerts
"Check CPU load every 5 min, alert me if >80%"
# → Cron that:
# 1. exec(command="top -bn1 | grep Cpu(s)")
# 2. Parses the value
# 3. If >80% → message(action="send", ...)
4. Sub-agent for Long Tasks
"Analyze all error logs from last month and summarize patterns"
# → sessions_spawn(
# task="Analyze logs /var/log/*.log from last month, summarize error patterns",
# model="anthropic/claude-sonnet-4-5",
# runTimeoutSeconds=600
# )
# → Sub-agent runs in isolation, announces the result
Summary
- Tools = functions the agent can call to act (not just talk)
- 9 main groups: runtime, fs, web, ui, messaging, automation, sessions, memory, nodes
- Fine-grained configuration: profiles, deny/allow, byProvider, per agent
- Typical workflow: status → action → result → next action
- Security: tools.deny to block sensitive actions
Conclusion
Tools are the difference between a chatbot and an agent. With OpenClaw, you don't ask "can you do X?", you ask "do X" — and it happens. Whether it's running a command, scraping the web, or controlling your browser, everything goes through these tools.
Next step: explore Skills that guide the agent on how to use tools in specific contexts. And join the Discord community to share your workflows!