openclaw-control-mcp
Provides tools for managing Telegram as a delivery channel on the OpenClaw gateway, including checking connection status, logging out, and sending messages to Telegram recipients.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@openclaw-control-mcp list my crons"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
openclaw-control-mcp
The OpenClaw control plane MCP server. Operate the gateway's full management surface from Claude Code, Cursor, or any MCP client — list and trigger crons, inspect sessions, configure agents and channels, manage skills and secrets, drive the doctor memory plane, pair devices, approve exec/plugin calls. 143 typed tools covering every JSON-RPC method the gateway publishes.

Different from the upstream
openclaw-mcp, which only wraps/v1/chat/completions. This one talks the JSON-RPC protocol used by the OpenClaw Control panel — so you can operate the gateway itself (its crons, sessions, agents, channels, skills, secrets, …), not just chat through it.
Without vs with
Without openclaw-control-mcp — you bounce between the Control panel UI, your terminal, and Claude Code. "List my crons" means opening the SPA. "Tail this agent session" means staying in the panel and refreshing. "Why did this skill fail?" means hunting through logs.tail manually. The assistant can chat through the gateway but it cannot operate it.
With openclaw-control-mcp — the same assistant queries openclaw_cron_list, follows up with openclaw_sessions_tail to watch a turn in flight, asks openclaw_skills_status for diagnostic data, rotates a secret via openclaw_secrets_set, and approves a stuck openclaw_exec_approval — without you ever leaving the chat. The Control panel becomes an audit interface, not a daily-driver.
Related MCP server: openclaw-tools-mcp
Quickstart
# Claude Code — registers a stdio server under the default config
claude mcp add openclaw-control -- npx -y openclaw-control-mcpOne-click install from supported clients:
On first start the wrapper generates an Ed25519 device identity and surfaces a pairing request id. Approve it once in the OpenClaw Control panel, the gateway issues a device token, and every subsequent call uses it transparently. Full pairing flow below.
Status
0.8.3 — published on npm, indexed on the official MCP Registry as io.github.smurfy92/openclaw-control-mcp. Multi-instance gateway configs, file-based secrets (.env + store.json mode 0600, no OS keychain access — see ADR-006), 143 typed tools across the 128 published JSON-RPC methods, plus two escape hatches: openclaw_introspect enumerates every method/event the gateway publishes in its hello-ok, and openclaw_call lets you reach any method that doesn't have a typed wrapper yet — so new gateway endpoints are reachable without waiting on a release.
The Ed25519 signed handshake is verified live against gateway 2026.4.12+. On first start, the wrapper generates a long-lived device identity, persists it under ${XDG_CONFIG_HOME:-~/.config}/openclaw-control-mcp/store.json (mode 0600), signs the connect frame, and surfaces the resulting pairing request id so you can approve it once via the Control panel. After approval the gateway issues a device token (in hello-ok.auth.deviceToken) which is cached per-gateway and used on subsequent connects to grant scopes.
The wire format (frame types, field names, signing canonicalisation, scopes) was reverse-engineered from the minified Control panel bundle (/api-docs/assets/index-*.js) and cross-checked against openclaw/openclaw/scripts/dev/gateway-smoke.ts. It is not officially documented. Behaviour may change without notice if OpenClaw updates the gateway.
First-run / pairing flow
Start the wrapper (Claude Code does this automatically once registered in
~/.claude.json).Ask Claude to run
openclaw_device_status. The first call:generates an Ed25519 keypair and persists it to disk,
opens a WS to the gateway,
sends a signed
connectframe,the gateway replies with
PAIRING_REQUIREDand arequestId,the tool returns
{ pendingPairing: { requestId }, nextStep: "approve in Control panel…" }.
Open the OpenClaw Control panel → Devices tab → approve the request whose id matches.
Ask Claude to run
openclaw_device_statusagain. This time the gateway accepts the connect, returnsauth.deviceTokeninhello-ok, the wrapper caches it, andpaired: trueplus the granted scopes appear in the response.From then on, scoped tools (
openclaw_cron_list,_status, …) work normally.
Install
From npm (recommended)
claude mcp add openclaw-control -- npx -y openclaw-control-mcpRestart Claude Code, then jump to Configuration.
From source (for contributors)
git clone https://github.com/smurfy92/openclaw-control-mcp.git
cd openclaw-control-mcp
npm install
npm run build
claude mcp add openclaw-control -- node "$(pwd)/dist/index.js"Releasing (npm + official MCP Registry, both from .github/workflows/publish.yml on a v*.*.* tag) is documented in CONTRIBUTING.md.
Configuration
The wrapper requires the WebSocket URL of your OpenClaw gateway. The public Hostinger HTTPS hostname does not expose the WS endpoint — you need the URL the Control panel itself uses internally.
Find it from your browser:
Open the Control panel and log in.
In the DevTools console run:
Object.entries(localStorage).find(([k]) => k.startsWith("openclaw.control.settings.v1"))?.[1]Copy the
gatewayUrlfield (typicallyws://127.0.0.1:18789, a Tailscalews://100.x.y.z:18789, or a dedicatedwss://…host).
Use with Claude Code
Recommended: register, then configure in chat
The slickest path — no ~/.claude.json editing, no env vars. After installing (npx or from source), in chat:
"Configure OpenClaw with gateway
wss://your-gateway.example.comand token<your-token>"
Claude calls openclaw_setup({ gatewayUrl, gatewayToken }), the values get persisted to ~/.config/openclaw-control-mcp/store.json (mode 0600). The next call to openclaw_device_status triggers the WS handshake and pairing flow.
openclaw_setup_show reports the effective configuration, openclaw_setup_clear wipes the persisted config (without touching the device identity / token).
Alternative: env-var-driven
If you prefer env vars (they take precedence over the stored config), edit ~/.claude.json:
"openclaw-control": {
"type": "stdio",
"command": "npx",
"args": ["-y", "openclaw-control-mcp"],
"env": {
"OPENCLAW_GATEWAY_URL": "wss://your-gateway.example.com",
"OPENCLAW_GATEWAY_TOKEN": "<your-token>",
"OPENCLAW_TIMEOUT_MS": "30000"
}
}Restart Claude Code — openclaw_cron_list and friends will be available.
Secrets & the .env file
The server never touches your OS keychain — no security / secret-tool call, no permission prompt, nothing to approve. Since 0.8.0 secrets resolve from exactly two places, in this order:
# | Source | Notes |
1 | Real environment variables | Always win. |
2 | A | Loaded into the environment at startup. Never overwrites a variable that is already set. |
3 |
| What |
.env candidates, highest precedence first:
$OPENCLAW_ENV_FILE— explicit path./.env— the directory the server is started from${XDG_CONFIG_HOME:-~/.config}/openclaw-control-mcp/.env
Copy .env.example, fill it in, then chmod 600 .env. The server warns on stderr if the file is readable by other users. The parser is deliberately minimal — KEY=value, export KEY=value, "quoted", '''raw''', # comments — with no variable interpolation, so a secret is never expanded or reinterpreted.
Want the server to never write a secret to disk? Put OPENCLAW_DEVICE_PRIVATE_KEY + OPENCLAW_DEVICE_TOKEN in the .env (get them from an already-paired install with npx tsx scripts/export-ci-secrets.ts). Env-supplied identity short-circuits the store entirely.
--health reports which .env files were loaded and which variables they supplied.
Upgrading from 0.5.0 – 0.7.0 (keychain removal)
Those versions kept secrets in the OS keychain and left blank fields in store.json. Run the one-shot import once, before your next session:
npx -y openclaw-control-mcp --migrate-from-keychainIt reads the keychain, writes the values into store.json (mode 0600), and prints the security delete-generic-password … / secret-tool clear … commands for the now-unused items — it never deletes anything from your keychain itself. Running it twice is a no-op. This is the only code path in the package that reads a keychain at all; it is dynamically imported behind that flag and never runs on normal startup.
If you'd rather not migrate, openclaw_device_repair wipes the orphaned device and the next connect re-pairs from scratch.
Environment variables
Variable | Required | Description |
| yes | WebSocket URL of the gateway ( |
| recommended | Gateway login token |
| optional | Extra password (some gateway configs require it) |
| optional | Connect / request timeout (default 30000) |
| optional | Set to |
| optional | Override the directory used to persist |
| optional | Explicit path to a |
| optional | Set to |
| optional | HTTP port (default |
| optional | HTTP host (default |
| optional | Set to |
Multi-instance: per-call instance parameter
Every tool accepts an optional instance field so a single MCP can target several gateways without flipping the active default first:
// route this one call to the 'work' gateway, regardless of the active default
{ "name": "openclaw_cron_list", "arguments": { "instance": "work", "limit": 10 } }Configure each gateway with openclaw_setup({ instance: "work", gatewayUrl, gatewayToken }), list them with openclaw_setup_list, switch the active default with openclaw_setup_select_default. When OPENCLAW_GATEWAY_URL is set in the env, it overrides everything (including a instance arg) — the env-var path always wins.
HTTP mode
For clients that don't speak stdio (Cursor, Continue, Cline, Zed, browser), run the MCP as a Streamable HTTP server:
# Loopback (default 127.0.0.1:3333), no bearer — fine for local trust
npx -y openclaw-control-mcp --http --http-port=3333
# Same, but with bearer auth on (recommended even on loopback)
OPENCLAW_HTTP=1 OPENCLAW_HTTP_BEARER="$(openssl rand -hex 32)" \
npx -y openclaw-control-mcp
# Bound to a public interface — bearer is REQUIRED (server refuses to start without)
OPENCLAW_HTTP=1 OPENCLAW_HTTP_HOST=0.0.0.0 OPENCLAW_HTTP_PORT=3333 \
OPENCLAW_HTTP_BEARER="$(openssl rand -hex 32)" \
npx -y openclaw-control-mcpEndpoint: POST/GET http://<host>:<port>/mcp (MCP Streamable HTTP, stateful — each client gets its own session id). Stdio remains the default; the HTTP server only starts when explicitly enabled.
Auth behaviour:
OPENCLAW_HTTP_BEARERset → every/mcprequest must includeAuthorization: Bearer <token>. Mismatched / missing tokens get401 Unauthorizedwith aWWW-Authenticate: Bearer realm="openclaw-control-mcp"header. Comparison is constant-time.OPENCLAW_HTTP_BEARERunset + bound to loopback → starts with a stderr warning. Anyone with local shell access can invoke every tool.OPENCLAW_HTTP_BEARERunset + bound to a non-loopback host (0.0.0.0, public IP, etc.) → the server refuses to start. Public binding without auth is a takeover risk and not negotiable.
For long-lived deployments behind a reverse proxy, terminate TLS at the proxy (nginx, Caddy, Traefik) and forward to 127.0.0.1:3333/mcp — the bearer protects the proxy → MCP hop too.
Mock mode (no gateway required)
Set OPENCLAW_MOCK=1 (or pass --mock) to swap the WebSocket client for an in-memory mock. Useful for:
CI — run tests / demos without a live gateway.
Workflow rehearsals — dry-run a sequence of
cron.add/cron.update/config.patchcalls before pointing at prod.Onboarding — try the MCP without provisioning a gateway instance.
# stdio
OPENCLAW_MOCK=1 npx -y openclaw-control-mcp
# or HTTP
OPENCLAW_MOCK=1 OPENCLAW_HTTP=1 npx -y openclaw-control-mcpState (cron jobs added, config patches, sessions) is kept in-process and discarded on exit. The mock seeds one cron job (sample-weekly) and one session so list calls return non-empty. Methods without a canned handler return { mock: true, ok: true } so nothing crashes — extend src/gateway/mock.ts to specialise additional methods.
Cron templates (no schedule syntax to remember)
Four wrappers on top of cron.add synthesize the wire format for the most common cases:
// every Friday at 09:00 Paris, send a weekly digest to a Telegram channel
{ "name": "openclaw_cron_add_weekly", "arguments": {
"name": "weekly-digest", "dayOfWeek": "fri", "hour": 9, "minute": 0,
"tz": "Europe/Paris", "message": "Compose the weekly digest …",
"channel": "telegram", "to": "-1001234567890"
}}
// every day at 07:00 UTC
{ "name": "openclaw_cron_add_daily", "arguments": {
"name": "morning-check", "hour": 7, "tz": "UTC", "message": "Run the morning checks."
}}
// every 15 minutes (clock-agnostic)
{ "name": "openclaw_cron_add_every", "arguments": {
"name": "ping", "intervalMinutes": 15, "message": "ping the upstream"
}}
// one-shot reminder, auto-deletes after firing
{ "name": "openclaw_cron_add_once", "arguments": {
"name": "remind-meeting", "at": "2026-12-25T09:00:00+01:00",
"message": "Don't forget the holiday call."
}}All four take the standard knobs: agentId?, model?, timeoutSeconds? (default 900), channel? + to?, deliveryMode? (announce | direct | none), instance?.
Tools
143 typed tools wrapping the 128 JSON-RPC methods the gateway publishes (and 2 standalone introspection tools). Run openclaw_introspect once paired to see the live list of methods + events on your specific gateway.
Introspection (no scopes required)
Tool | Notes |
| Returns server version, your role/scopes, and the full |
| Escape hatch — call any JSON-RPC method with arbitrary params. Useful when the gateway adds new methods between releases. Prefer typed wrappers when they exist. |
Setup (no scopes required)
Tool | Notes |
| Persist |
| Report effective config (env vs store), without printing tokens. |
| Wipe persisted gateway config. Device identity + tokens are kept. |
Device & pairing (device.pair.*, device.token.*)
openclaw_device_status / openclaw_device_pair_list / _pair_approve / _pair_reject / _pair_remove / openclaw_device_token_revoke / _token_rotate. Manages your local Ed25519 identity and the per-gateway tokens it's been issued.
Coverage by domain (require operator.read / operator.write / operator.admin)
Domain | Tools | JSON-RPC methods wrapped |
| 7 |
|
| 17 |
|
| 7 |
|
| 3 |
|
| 2 |
|
| 1 |
|
| 1 |
|
| 2 |
|
Root status | 12 |
|
| 6 |
|
| 2 |
|
| 6 |
|
| 2 |
|
| 9 |
|
| 4 |
|
| 4 |
|
| 7 |
|
| 16 |
|
| 6 |
|
| 3 |
|
| 2 |
|
Misc | 3 |
|
Tool names follow openclaw_<domain>_<method>. Method-name dots become underscores: cron.list → openclaw_cron_list, sessions.compaction.restore → openclaw_sessions_compaction_restore.
Destructive tools
These carry destructive side effects (data loss, service interruption, revoked access). Their description is marked accordingly so Claude Code's confirmation gate prompts before each call:
Cron:
cron_remove,cron_run(real execution),cron_updateSessions:
sessions_{abort,reset,delete,compaction_restore}Agents:
agents_{delete,files_set}Chat:
chat_abortChannels:
channels_logoutDevice:
device_{pair_remove,token_revoke,token_rotate}Config:
config_{set,patch,apply}Secrets:
secrets_resolve(returns secret material)Doctor memory:
doctor_memory_{resetDreamDiary,resetGroundedShortTerm,repairDreamingArtifacts,backfillDreamDiary,dedupeDreamDiary}Node:
node_{invoke,rename,pending_drain,pending_enqueue,pending_ack,pair_approve,pair_reject}Skills:
skills_{install,update}Approvals:
exec_approval_resolve,exec_approvals_{set,node_set},plugin_approval_resolveSelf-update:
update_run(gateway-wide, may interrupt sessions)
Examples
Copy-paste prompts you can drop into Claude after the MCP is paired. Each one targets the corresponding tool and shows the kind of natural-language phrasing that resolves to a concrete call.
Health & sanity
> Run a full openclaw health check.→ Calls openclaw_health, reports MCP version, gateway server version, paired device fingerprint, granted scopes, and how recently the last successful call ran.
> What gateway methods do I have access to right now?→ Calls openclaw_introspect, returns the 128 JSON-RPC methods + 24 events the gateway publishes in its hello-ok.
Cron
> List all openclaw cron jobs, including disabled ones.→ openclaw_cron_list({ enabled: "all" }).
> Show me the last 5 runs of cron job <id> — compact mode, just the summaries.→ openclaw_cron_runs({ id: "<job-id>", limit: 5, compact: true }) — summaries truncated to 200 chars, each entry gets a runAtAgo: "3d ago" field.
> Create a cron that runs every Friday at 1pm Paris and posts a summary to Telegram group -1001234567890.→ Generates an openclaw_cron_add payload with the right schedule.kind: "cron", expr: "0 13 * * 5", tz: "Europe/Paris", and delivery.mode: "announce".
Sessions
> List the 10 most recent active openclaw sessions, ranked by last activity.→ openclaw_sessions_list({ limit: 10, sortBy: "updatedAt", sortDir: "desc" }).
> Show me the last 8 messages of session agent:main:cron:<id>.→ openclaw_sessions_preview({ keys: ["agent:main:cron:<id>"] }) — returns role/text turns straight from the gateway.
Agents & channels
> List the agents configured on this gateway and which model they use.→ openclaw_agents_list.
> What's the connection state of my Telegram channel?→ openclaw_channels_status.
Escape hatch
> Use openclaw_call to invoke "config.schema" with no params and return the keys it exposes.→ Useful when a gateway-side method doesn't yet have a typed wrapper, or you want to inspect a feature still in beta.
Resilience
request() retries transient errors (network drop, ws close, timeout, DNS) with exponential backoff: defaults to 1s → 2s → 4s, max 4 attempts. Non-retryable errors (PAIRING_REQUIRED, INVALID, MISSING_SCOPE, etc.) fail fast — no point retrying a permission issue. Tune via:
OPENCLAW_RETRY_ATTEMPTS— total attempts (default4, range1–10)OPENCLAW_RETRY_BASE_MS— initial backoff in ms (default1000, range100–60000)OPENCLAW_DEBUG=1— prints every retry decision to stderr
When a request gives up, the thrown error carries gateway request '<method>' failed (attempt N/M): as a prefix and the original error is preserved as cause for inspection. GatewayError code / details / retryable flags are propagated through the wrap.
The client tracks lastSuccessAtMs for openclaw_health's lastSuccessAgo field — useful for "is the gateway still talking to me?" debug.
Diagnostic CLI
For one-shot health checks without wiring the MCP into a client:
npx -y openclaw-control-mcp --healthPrints a JSON report (MCP version, gateway URL, paired state, scopes, server version, last-success age, error if any) and exits non-zero on failure. Handy in CI / scripts.
Schema looseness
Most v0.3.0 wrappers use z.passthrough() for params — they accept the documented fields plus anything else, and pass them through to the gateway. This trades strict client-side validation for forward-compat: as the gateway evolves, calls don't break on new fields. The downside is you'll only learn about a wrong field when the gateway rejects the request. If you hit a "missing required property" error, look at the gateway's response — it tells you the exact wire shape — and either correct your call, or open an issue / PR to tighten the wrapper's Zod schema.
Threat model
This MCP server exposes secret-bearing and side-effectful gateway operations (config.*, secrets.*, cron.run, sessions.send, agent, channel send) to an LLM that the operator drives via natural language. Treat that surface deliberately:
The gateway token, device private key, and per-gateway device tokens are persisted under
${XDG_CONFIG_HOME:-~/.config}/openclaw-control-mcp/store.json(file mode0600). Since 0.8.0 the server never touches your OS keychain — nosecurity/secret-toolcall, no permission prompt. If you'd rather no secret was written to disk by the server at all, supply them via a.envfile instead (see Secrets & the.envfile). Never commit the store or the.env, and don't post--healthoutput unredacted.openclaw_secrets_setwrites into the gateway config tree viaconfig.patch. Any tool call that reaches this wrapper rotates the underlying secret in the gateway's view. Wrap it with explicit human confirmation in agent prompts.openclaw_callis an escape hatch — it forwards arbitrary JSON-RPC method calls. The gateway enforces per-scope permissions, but on the client side there's no input filter. Limit which tool catalogs your agent can see if untrusted prompts can reach it.OPENCLAW_DEVICE_PRIVATE_KEY/OPENCLAW_DEVICE_TOKENenv vars (for headless / CI / service-account usage) take priority over the store. Set them only in trusted execution contexts (GitHub secrets, K8s secrets, password manager exports, achmod 600.env— never in shell history, Docker--env, or a.envcommitted to a repo).Prompt-injection surface: the gateway's responses (session previews, logs, agent outputs) feed back into the MCP client and can carry attacker-controlled content. Treat any tool output as untrusted when deciding whether to call destructive tools (the destructive list is published in §Destructive tools — confirm before chaining a write tool to a read tool output).
HTTP transport surface: when running
--http, the server enforces a constant-timeBearercheck ifOPENCLAW_HTTP_BEARERis set, refuses to bind to a non-loopback interface without one, and emits a loud stderr warning if started on loopback without one. Rotate the bearer like a gateway admin token — anything that can read it can invoke every tool, includingsecrets.*writes. Terminate TLS at a reverse proxy before exposing the HTTP port to the network.
If you find a vulnerability, please open a private security advisory on GitHub rather than a public issue: https://github.com/smurfy92/openclaw-control-mcp/security/advisories/new.
Roadmap
Auto-reconnect with exponential backoff — shipped in 0.3.1 (
client.request()retries with jitter; tunable viaOPENCLAW_RETRY_ATTEMPTS/OPENCLAW_RETRY_BASE_MSsince 0.4.0).Stream session messages back into the MCP client (currently
sessions.subscriberegisters server-side but stdio can't surface deltas to Claude Code).Tighten Zod schemas for the wrappers added in 0.3.0 — most use
passthrough()until the gateway shape for each domain is fully nailed down. PRs welcome.Streamable HTTP transport in addition to stdio — shipped in 0.5.0 (
--http,http://127.0.0.1:3333/mcp), bearer-token auth added in 0.7.0 (OPENCLAW_HTTP_BEARER). See ADR-005.Claude Desktop Extension (
.mcpb) packaging.
Migrating from openclaw-claw-mcp (early adopters)
If you used the wrapper under its previous name (openclaw-claw-mcp):
The Store automatically reads
~/.config/openclaw-claw-mcp/store.jsonas a fallback when the new path is empty, so your paired device token keeps working.On the next successful connect, the new path (
~/.config/openclaw-control-mcp/store.json) is created. You can then delete the old directory.Update the entry name in
~/.claude.jsonfromopenclaw-clawtoopenclaw-control(purely cosmetic — only changes the tool prefixmcp__openclaw-control__*).The local working dir / build output keeps the same path you cloned to; nothing else needs moving.
Troubleshooting
gateway request '…' failed: expected Uint8Array of length 32, got length=0— the persisteddevice.privateKeyis empty. On 0.8.0+ the usual cause is an upgrade from 0.5.0–0.7.0 where the key still sits in the OS keychain: runnpx -y openclaw-control-mcp --migrate-from-keychainonce. Otherwise recover withopenclaw_device_repair. Background:docs/troubleshooting/empty-private-key.md.gateway request '…' failed: device nonce mismatchafter some idle time — the WS connection went stale and the retry loop reuses a burned nonce. Workaround: re-callopenclaw_setupwith the same params (forces a fresh handshake). Details + proposed fixes:docs/troubleshooting/stale-connection-nonce-mismatch.md.
Caveats
The protocol is reverse-engineered, not documented. Behaviour may change with gateway updates.
The connect frame matches what
openclaw/openclaw/scripts/dev/gateway-smoke.tssends today (client.id: "openclaw-ios",mode: "ui", role + scopes per the iOS operator default). Differentclient.idvalues trigger different server policies —openclaw-control-uiandopenclaw-tuifor example require device identity and a secure-context origin.OPENCLAW_DEBUG=1logs every WS frame to stderr (truncated at 8 KB). Useful when comparing handshakes against the live Control panel SPA.
Available Tools
143 toolsopenclaw_agentA
Root-level agent method — sends a message to the default agent and returns the agent's response. Wire format (verified live against gateway 2026.4.12+): requires message + idempotencyKey (auto-generated if omitted). NOT read-only — this triggers an agent turn. Prefer openclaw_sessions_send when you want explicit session control.
Inputs: message (required), agentId, instance, sessionId, +1 more.
openclaw_agent_identity_getA
Get the gateway's agent identity (current default agent metadata). Wraps agent.identity.get. Read-only.
Inputs: instance.
openclaw_agents_createA
Create a new agent configuration. Wraps agents.create. Pass agentId, displayName, model, plus any extra fields the gateway accepts (system prompt, default tools, etc.). Call openclaw_agents_list first to see the full shape of an existing agent.
Inputs: id, model, agentId, instance, +1 more.
openclaw_agents_deleteA
Delete an agent configuration. Wraps agents.delete. Destructive — confirm before calling. Sessions tied to this agent may be orphaned.
Inputs: agentId (required), instance.
openclaw_agents_files_getA
Fetch a specific agent file's contents (system prompt, tool definitions, etc.). Wraps agents.files.get. Read-only. Pass either path (full path including the file name) or name (file basename) — not both.
Inputs: agentId (required), name, path, instance.
openclaw_agents_files_listA
List files attached to an agent (instructions, system files, etc.). Wraps agents.files.list. Read-only.
Inputs: agentId (required), instance.
openclaw_agents_files_setA
Write or overwrite an agent file. Wraps agents.files.set. Destructive — overwrites existing content silently. Pass agentId, path or name, and content or body (gateway accepts both names depending on version).
Inputs: agentId (required), body, name, path, +2 more.
openclaw_agents_listA
List configured agents on the gateway (e.g. 'main', custom agents). Wraps agents.list. Read-only.
Inputs: instance.
openclaw_agents_updateA
Update an existing agent's configuration. Wraps agents.update. Pass agentId + only the fields you want to change. Schema is permissive — gateway accepts the same shape as agents.create.
Inputs: agentId (required), instance.
openclaw_agent_waitC
Block until the agent finishes its current turn (or timeout). Wraps agent.wait. Long-running — uses the configured request timeout (default 30s).
Inputs: agentId, instance, sessionId, timeoutMs.
openclaw_callA
DESTRUCTIVE ESCAPE HATCH — call ANY JSON-RPC method on the gateway with arbitrary params. Use this to operate on endpoints that don't yet have a typed wrapper. The user must validate the exact method name and params on every call (especially anything matching *.add|remove|delete|update|create|write|terminate|reset|approve|reject). For read-only inspection prefer the typed tools (openclaw_cron_list, openclaw_introspect, …) — openclaw_call should only be used when no typed alternative exists.
Inputs: method (required), params, instance.
openclaw_channels_logoutA
Log out / disconnect a delivery channel. Wraps channels.logout. Destructive — channel won't deliver until re-authenticated. Pass the channel name (e.g. 'telegram').
Inputs: channel (required), instance.
openclaw_channels_statusA
Get the connection status of delivery channels (Telegram, email, etc.). Wraps channels.status. Read-only.
Inputs: instance.
openclaw_chat_abortA
Abort an in-flight chat turn for a session. Wraps chat.abort. Wire format (verified live): requires sessionKey. Destructive — cancels running LLM call.
Inputs: sessionKey (required), instance.
openclaw_chat_historyA
Fetch chat history for a session. Wraps chat.history. Wire format (verified live): requires sessionKey; accepts limit. Read-only. The pre-0.5.x agentId/sessionId/offset fields are rejected.
Inputs: sessionKey (required), limit, instance.
openclaw_chat_sendA
Send a message into a chat session via the gateway's chat layer. Wire format (verified live against gateway 2026.4.12+): requires sessionKey (composite, e.g. 'agent:main:main' from openclaw_sessions_list), message, and idempotencyKey (auto-generated UUID if omitted). The pre-0.5.x agentId/sessionId/text shape is rejected by the gateway. Destructive — triggers an agent turn.
Inputs: message (required), sessionKey (required), instance, idempotencyKey.
openclaw_commands_listA
List the slash-commands registered in the gateway (commands the agent or operator can invoke). Wraps commands.list. Read-only.
Inputs: instance.
openclaw_config_applyB
Apply pending config changes (commit). Wraps config.apply. Destructive — propagates buffered config to running components.
Inputs: instance.
openclaw_config_getA
Read the gateway's current configuration. Wraps config.get. Read-only. The gateway returns the full config; pass path to project to a sub-section client-side after fetch (the gateway itself does NOT support a path filter — verified live against 2026.4.12+).
Inputs: path, instance.
openclaw_config_patchA
Optimistic-locked replace of the FULL gateway config (verified live against 2026.4.12+). Wraps config.patch. Wire format: { raw: string, baseHash: string } where raw is the full config serialized as JSON and baseHash comes from a previous openclaw_config_get call. Pass mergePath + mergeValue for the convenience flow: this tool will fetch the current config, deep-merge your value at the given dotted path, compute the resulting raw JSON, and submit it with the freshly-read baseHash. Destructive — replaces the entire config atomically.
Inputs: raw, baseHash, instance, mergePath, +1 more.
openclaw_config_schemaA
Get the JSON schema describing the gateway's config structure. Wraps config.schema. Read-only — useful before openclaw_config_set/patch to know which paths exist.
Inputs: instance.
openclaw_config_schema_lookupA
Look up the schema description for a specific config path. Wraps config.schema.lookup. Read-only.
Inputs: path (required), instance.
openclaw_config_setA
Replace a config value at a given path. Wraps config.set. Destructive — overwrites the previous value. Prefer openclaw_config_patch for partial updates.
Inputs: path (required), value, instance.
openclaw_cron_addC
Create a new OpenClaw cron job. Wraps cron.add. Field names match the gateway wire format (verified by the Control panel SPA + live calls), NOT the README placeholders sometimes seen in the MCP source: schedule uses expr/tz (cron) or everyMs (every) or at (exact); payload.agentTurn uses message and timeoutSeconds. Examples: { schedule: { kind: "cron", expr: "0 13 * * 5", tz: "Europe/Paris" }, payload: { kind: "agentTurn", message: "...", timeoutSeconds: 180 } }.
Inputs: job (required), instance.
openclaw_cron_add_dailyA
Create a cron job that fires every day at a fixed local time. Synthesizes the cron-kind schedule + agentTurn payload. Pass hour, minute, tz, message. Optional channel delivery via channel + to.
Inputs: hour (required), name (required), message (required), to, +8 more.
openclaw_cron_add_everyA
Create a cron job that fires every N minutes/hours regardless of clock time. Synthesizes an every-kind schedule. Pass either intervalMinutes or intervalHours (the tool computes everyMs). Use for monitoring jobs that don't care about wall-clock alignment.
Inputs: name (required), message (required), to, model, +7 more.
openclaw_cron_add_onceA
Create a one-shot reminder/job that fires exactly once at a given absolute timestamp, then auto-deletes. Synthesizes an exact-kind schedule with deleteAfterRun: true. Pass at as RFC3339 (e.g. '2026-05-08T09:00:00+02:00') and a message.
Inputs: at (required), name (required), message (required), to, +6 more.
openclaw_cron_add_weeklyA
Create a cron job that fires once a week at a fixed local time. Synthesizes a cron-kind schedule and an agentTurn payload, then calls cron.add. Pass dayOfWeek (mon..sun), hour (0-23), minute (0-59), tz (IANA, defaults to Europe/Paris), and message. Optional channel delivery: pass channel + to.
Inputs: hour (required), name (required), message (required), dayOfWeek (required), +9 more.
openclaw_cron_listA
List configured OpenClaw cron jobs. Wraps the gateway JSON-RPC method cron.list. Returns jobs with name, schedule, payload kind, and enabled state.
Inputs: limit, query, offset, sortBy, +4 more.
openclaw_cron_removeA
Delete an OpenClaw cron job by id. Destructive — confirm before calling. Wraps cron.remove.
Inputs: id (required), instance.
openclaw_cron_runB
Trigger an immediate run of a specific OpenClaw cron job by id. Wraps cron.run.
Inputs: id (required), instance.
openclaw_cron_runsA
List recent runs of a specific OpenClaw cron job. Wraps cron.runs. Pass compact: true to truncate each run's summary to 200 chars (saves tokens when scanning many runs); a summaryTruncated flag is added per entry. Each entry also gets a runAtAgo field (e.g. "3h ago") for readability.
Inputs: id (required), limit, offset, compact, +2 more.
openclaw_cron_statusA
Get the OpenClaw cron scheduler status (enabled flag, next-run timestamp, recent failures). Wraps cron.status.
Inputs: instance.
openclaw_cron_updateA
Update an existing OpenClaw cron job in place. Wraps cron.update. Avoids the remove + re-add dance when you just want to change schedule, timeout, payload, or delivery. Wire format (verified live against gateway 2026.4.12+): { id|jobId: string, patch: object } — pass the job id and a patch object containing only the fields you want to change. Older shape { job: { id, ...fields } } is auto-translated for backward compat with pre-0.5.1 callers.
Inputs: id, job, jobId, patch, +1 more.
openclaw_device_pair_approveA
Approve a pending device pairing request. Requires operator.write scope. Wraps device.pair.approve.
Inputs: requestId (required), instance.
openclaw_device_pair_listA
List pending and paired devices known to the gateway. Useful for confirming that this MCP's device shows up in 'pending' before approval. Wraps device.pair.list (operator scope).
Inputs: instance.
openclaw_device_pair_rejectB
Reject a pending device pairing request. Wraps device.pair.reject.
Inputs: requestId (required), instance.
openclaw_device_pair_removeA
Remove a paired device from the gateway. Wraps device.pair.remove. Destructive — the device will need to re-pair to reconnect.
Inputs: deviceId (required), instance.
openclaw_device_repairA
Recover from the expected Uint8Array of length 32, got length=0 failure mode (empty device.privateKey). Backs up store.json to store.json.bak.<ts>, and wipes the broken device + cached tokens (keeps gateway URL + token configs). The next call to any scoped tool regenerates a fresh Ed25519 keypair and surfaces a new pendingPairing.requestId to approve in the Control panel. The instance arg is accepted but currently no-op — the local Store is shared across all instances. Destructive — run only when openclaw_device_status reports the empty-private-key failure mode.
Inputs: instance.
openclaw_device_statusA
Show this MCP's local device identity, pairing status, current scopes (if any), and any pending pairing requestId. Triggers a fresh connect attempt, so it doubles as a 'retry pairing' command after approval. Use when scoped methods fail with 'missing scope: operator.read'.
Inputs: instance.
openclaw_device_token_revokeA
Revoke a device's authentication token. Wraps device.token.revoke. Destructive — the device must re-pair (or use a freshly issued token).
Inputs: deviceId (required), instance.
openclaw_device_token_rotateA
Rotate a device's authentication token (issues a new one, invalidates the old). Wraps device.token.rotate. Destructive — the device's currently cached token stops working.
Inputs: deviceId (required), instance.
openclaw_doctor_memory_backfillDreamDiaryA
Backfill the dream diary from past sessions (re-runs dreaming on history). Wraps doctor.memory.backfillDreamDiary. Mutates — can be expensive in tokens.
Inputs: instance.
openclaw_doctor_memory_dedupeDreamDiaryC
Deduplicate dream diary entries. Wraps doctor.memory.dedupeDreamDiary. Mutates.
Inputs: instance.
openclaw_doctor_memory_dreamDiaryA
Read the dream diary (the gateway's REM/light dream artifacts that promote into MEMORY.md). Wraps doctor.memory.dreamDiary. Read-only.
Inputs: limit, instance.
openclaw_doctor_memory_repairDreamingArtifactsC
Repair corrupted dreaming artifacts (e.g. orphan files, broken JSON). Wraps doctor.memory.repairDreamingArtifacts. Mutates.
Inputs: instance.
openclaw_doctor_memory_resetDreamDiaryA
Wipe the dream diary entirely. Wraps doctor.memory.resetDreamDiary. DESTRUCTIVE — confirm before calling. Loses all promoted-into-memory candidates.
Inputs: instance.
openclaw_doctor_memory_resetGroundedShortTermA
Wipe the grounded short-term memory store. Wraps doctor.memory.resetGroundedShortTerm. DESTRUCTIVE — agents lose their recent recall.
Inputs: instance.
openclaw_doctor_memory_statusA
Get the memory subsystem health (short-term store, dream diary, grounding state). Wraps doctor.memory.status. Read-only.
Inputs: instance.
openclaw_exec_approval_getA
Get details of a specific exec approval request (command, args, agent, status). Wraps exec.approval.get. Read-only.
Inputs: id (required), instance.
openclaw_exec_approval_listB
List pending and recent exec approvals (commands the agent wants to run that need a human OK). Wraps exec.approval.list. Read-only.
Inputs: limit, status, instance.
openclaw_exec_approval_requestA
Submit a new exec approval request (programmatic; normally agents do this themselves). Wraps exec.approval.request.
Inputs: instance.
openclaw_exec_approval_resolveB
Resolve (approve / reject) a pending exec approval. Wraps exec.approval.resolve. Mutates — the agent will proceed (or not) based on this decision.
Inputs: id (required), reason, approved, decision, +1 more.
openclaw_exec_approvals_getA
Get the global exec approvals policy (auto-allow rules, defaults). Wraps exec.approvals.get. Read-only.
Inputs: instance.
openclaw_exec_approvals_node_getB
Get the per-node exec approvals policy override. Wraps exec.approvals.node.get. Read-only.
Inputs: nodeId (required), instance.
openclaw_exec_approvals_node_setB
Set the exec approvals policy for a specific node. Wraps exec.approvals.node.set. Destructive.
Inputs: nodeId (required), instance.
openclaw_exec_approvals_setB
Set / replace the global exec approvals policy. Wraps exec.approvals.set. Destructive — overwrites the existing policy.
Inputs: instance.
openclaw_exec_approval_waitDecisionA
Block until an exec approval gets a decision (or timeout). Wraps exec.approval.waitDecision. Long-running — bounded by the request timeout.
Inputs: id (required), instance, timeoutMs.
openclaw_gateway_identity_getA
Get the gateway's own identity (id, version, owner, region). Wraps gateway.identity.get. Read-only.
Inputs: instance.
openclaw_healthA
Combined health probe — server-side health JSON-RPC plus client-side metadata (MCP version, device pairing state, gateway URL, last successful call). Read-only. Use this for a one-shot 'is everything OK?' check.
Inputs: instance.
openclaw_introspectA
Inspect the OpenClaw gateway capabilities. Triggers a connect (if not already), returns the server version, this device's role/scopes, the full list of JSON-RPC methods and events the gateway publishes, and a coverage report comparing those methods to the typed wrappers this MCP exposes. Use to discover what methods you can call via openclaw_call and to spot endpoints that still need a typed wrapper after a gateway upgrade.
Inputs: instance.
openclaw_last_heartbeatA
Get the last heartbeat info (latest tick processed by the gateway). Wraps last-heartbeat. Read-only.
Inputs: instance.
openclaw_logs_tailA
Tail recent gateway logs. Wraps logs.tail. Read-only. The gateway only forwards limit to the wire; sinceMs, level, and component are applied client-side AFTER fetch (verified live: the gateway rejects them with unexpected property against 2026.4.12+). For wide tails, raise limit and the client filters on the way back. Use this for debug — e.g. tracing why a cron job failed, why a session aborted, or what an agent emitted.
Inputs: level, limit, sinceMs, instance, +1 more.
openclaw_message_actionB
Trigger a message-level action (e.g. retry, mark-as-handled, attach to a session). Wraps message.action. Mutates gateway state.
Inputs: action (required), instance, messageId, sessionId.
openclaw_models_listA
List models available to the gateway (Anthropic, OpenAI, etc.) with their IDs and any provider metadata. Wraps models.list. Read-only.
Inputs: instance.
openclaw_node_canvas_capability_refreshA
Refresh the canvas capability map for nodes (re-registers what each canvas node can do). Wraps node.canvas.capability.refresh.
Inputs: instance.
openclaw_node_describeA
Describe a specific node — capabilities, host, version, last heartbeat. Wraps node.describe. Read-only.
Inputs: nodeId (required), instance.
openclaw_node_eventC
Emit an event toward a node (or the gateway-side node bus). Wraps node.event.
Inputs: event (required), nodeId, instance.
openclaw_node_invokeC
Invoke a method on a specific node (RPC routed through the gateway). Wraps node.invoke. Mutates depending on the target method.
Inputs: method (required), nodeId (required), params, instance.
openclaw_node_invoke_resultA
Fetch the result of a previously-issued node invocation. Wraps node.invoke.result. Read-only.
Inputs: invocationId (required), instance.
openclaw_node_listB
List nodes registered with this gateway (worker / canvas / sub-gateway nodes). Wraps node.list. Read-only.
Inputs: instance.
openclaw_node_pair_approveA
Approve a pending node pairing request. Wraps node.pair.approve. Mutates — node gains gateway access.
Inputs: requestId (required), instance.
openclaw_node_pair_listB
List node pairing requests (pending and resolved). Wraps node.pair.list. Read-only.
Inputs: instance.
openclaw_node_pair_rejectC
Reject a pending node pairing request. Wraps node.pair.reject.
Inputs: requestId (required), instance.
openclaw_node_pair_requestB
Request pairing for a new node. Wraps node.pair.request.
Inputs: instance.
openclaw_node_pair_verifyB
Verify a node pairing handshake. Wraps node.pair.verify.
Inputs: instance.
openclaw_node_pending_ackC
Acknowledge / commit completion of a pending work item. Wraps node.pending.ack.
Inputs: nodeId (required), itemId, instance.
openclaw_node_pending_drainA
Drain (clear) all pending work items for a node. Wraps node.pending.drain. Destructive — discards queued work.
Inputs: nodeId (required), instance.
openclaw_node_pending_enqueueC
Enqueue a new work item for a node. Wraps node.pending.enqueue. Mutates.
Inputs: nodeId (required), instance.
openclaw_node_pending_pullB
Pull pending work items destined for a node (queue drain). Wraps node.pending.pull. Read-and-mutate (work items leave the pending queue).
Inputs: nodeId (required), instance.
openclaw_node_renameC
Rename a node (display name / id). Wraps node.rename. Mutates.
Inputs: nodeId (required), name, newName, instance.
openclaw_plugin_approval_listA
List pending and recent plugin approval requests (a skill / plugin asking for permission to do X). Wraps plugin.approval.list. Read-only.
Inputs: status, instance.
openclaw_plugin_approval_requestC
Submit a plugin approval request (programmatic). Wraps plugin.approval.request.
Inputs: instance.
openclaw_plugin_approval_resolveB
Resolve a pending plugin approval (approve / reject). Wraps plugin.approval.resolve. Mutates.
Inputs: id (required), approved, decision, instance.
openclaw_plugin_approval_waitDecisionB
Block until a plugin approval gets a decision. Wraps plugin.approval.waitDecision. Long-running.
Inputs: id (required), instance, timeoutMs.
openclaw_secrets_reloadA
Reload the gateway's secret store from disk. Wraps secrets.reload. Use after editing the secrets file out-of-band so the gateway picks up new values without a restart.
Inputs: instance.
openclaw_secrets_resolveA
Resolve a command-scoped secret. Wraps secrets.resolve. Wire format (verified live against gateway 2026.4.12+): { commandName: string } — the gateway secrets subsystem is COMMAND-scoped, not arbitrary key/value. SENSITIVE — returns secret material; only use for debugging missing/wrong-values issues. For arbitrary API keys consumed by skills, use openclaw_secrets_set (which writes to the config tree, not the command-scoped secret store).
Inputs: commandName (required), instance.
openclaw_secrets_setA
Store an arbitrary secret (API key, third-party token, etc.) in the gateway's config tree where skills can consume it. Internally calls config.patch with a mergePath so the value lands at config.<scope>.<name>. Default scope is secrets (creates config.secrets.<name>); override with scope for skill-scoped secrets like tools.linkedin-outreach.proxycurlApiKey. Note: this writes to the CONFIG tree, not the gateway's secrets.resolve command-scoped store (which has no public write API). After this call, restart-free — the next agent run sees the updated config.
Inputs: name (required), value (required), scope, instance.
openclaw_sendA
Channel-routed send — pushes a message via the gateway's delivery layer. Wire format (verified live against gateway 2026.4.12+): requires to (channel-specific recipient) + idempotencyKey (auto-generated if omitted). Prefer the typed openclaw_chat_send or openclaw_sessions_send when you want session context.
Inputs: to (required), instance, idempotencyKey.
openclaw_sessions_abortA
Abort the in-flight agent turn for a session (cancels the current LLM call / tool loop). Wraps sessions.abort. Destructive — interrupts running work.
Inputs: id (required), instance.
openclaw_sessions_compactA
Trigger a compaction of a session's history (creates a new compaction snapshot, keeps the session live). Wraps sessions.compact.
Inputs: id (required), instance.
openclaw_sessions_compaction_branchA
Create a NEW session that starts from a previous compaction snapshot of an existing session. Wraps sessions.compaction.branch. Use this when you want to explore an alternative continuation without losing the current session state.
Inputs: id (required), title, instance, sessionId.
openclaw_sessions_compaction_getA
Fetch a specific compaction snapshot by id. Wraps sessions.compaction.get. Read-only.
Inputs: id (required), instance, sessionId.
openclaw_sessions_compaction_listA
List compaction snapshots for a session. Wraps sessions.compaction.list. Read-only.
Inputs: id (required), instance.
openclaw_sessions_compaction_restoreA
Restore a session to a previous compaction snapshot. Wraps sessions.compaction.restore. Destructive — overwrites current session state with the snapshot. The current state is lost unless you branched first.
Inputs: id (required), instance, sessionId.
openclaw_sessions_createA
Create a new agent session. Wraps sessions.create. The default agent id is typically 'main'. Pass an optional title to set the human-readable label shown in the Control panel.
Inputs: title, agentId, instance.
openclaw_sessions_deleteA
Delete a session permanently. Wraps sessions.delete. Destructive — confirm before calling.
Inputs: id (required), instance.
openclaw_sessions_listA
List active OpenClaw agentic sessions. Wraps sessions.list. Each session has both a sessionId (UUID) and a key (composite, e.g. 'agent:main:main', 'agent:main:cron:', 'agent:main:telegram:group:', 'agent:main:subagent:'). Use to find a session before preview/patch/abort/compact/reset. The status filter is applied client-side after fetch (verified live: the gateway itself rejects a status param with unexpected property 'status' against 2026.4.12+).
Inputs: limit, offset, status, agentId, +1 more.
openclaw_sessions_messages_subscribeA
Subscribe to streaming session messages (session.message events). Wraps sessions.messages.subscribe. Note: MCP stdio cannot stream events to Claude Code — server-side subscription only.
Inputs: id (required), instance.
openclaw_sessions_messages_unsubscribeC
Unsubscribe from session message stream. Wraps sessions.messages.unsubscribe.
Inputs: id (required), instance.
openclaw_sessions_patchA
Update session metadata (title, displayName, tags, etc.). Wraps sessions.patch. Pass id + only the fields you want to change. Schema is intentionally permissive — gateway accepts any subset of session fields.
Inputs: id (required), instance.
openclaw_sessions_previewA
Preview one or more sessions without subscribing — returns recent messages, status, and metadata for each key. Wraps sessions.preview. Read-only. Pass keys (array of full session keys like 'agent:main:cron:' from openclaw_sessions_list).
Inputs: keys (required), instance.
openclaw_sessions_resetA
Reset a session (clears working state, keeps session id). Wraps sessions.reset. Destructive — confirm before calling.
Inputs: id (required), instance.
openclaw_sessions_sendA
Send a user message into an existing session. Wraps sessions.send. The agent processes async and streams the reply via session.message events; call openclaw_sessions_preview afterwards (with the session's composite key) to see the result. Use either text or message — gateway accepts both names depending on version.
Inputs: id (required), text, message, instance.
openclaw_sessions_subscribeA
Subscribe to session lifecycle events (sessions.changed). Wraps sessions.subscribe. Note: the MCP runs over stdio and cannot stream events back to the client — this tool registers the subscription server-side but you won't receive deltas in Claude Code. Useful mainly to confirm the subscription was accepted.
Inputs: instance.
openclaw_sessions_tailA
Watch a session by polling sessions.preview and return only the NEW messages that appeared during the tail window. Workaround for the stdio MCP not being able to stream sessions.subscribe / session.message events to Claude Code. Polls every intervalMs (default 2000ms) for up to durationMs (default 30000ms, max 300000ms), or until maxMessages new messages are collected, or until the session reaches a terminal status ('done', 'error', 'aborted', 'timeout', 'completed'). The first poll seeds the 'already-seen' set so existing messages are NOT returned — only what arrives after the tool was called.
Inputs: key (required), instance, durationMs, intervalMs, +1 more.
openclaw_sessions_unsubscribeC
Unsubscribe from session lifecycle events. Wraps sessions.unsubscribe.
Inputs: instance.
openclaw_set_heartbeatsA
Toggle / configure heartbeat emission from the gateway. Wraps set-heartbeats. Pass enabled and any cadence params.
Inputs: enabled, instance, intervalMs.
openclaw_setupA
Persist a named OpenClaw gateway config (URL + token) to local store. Default instance name is 'default'. Pass instance to manage multiple gateways (e.g. 'perso', 'work') from the same MCP. Env vars (OPENCLAW_GATEWAY_URL/TOKEN) still override everything stored here — leave them unset to use named instances. After saving, the matching client connection is closed so the next tool call re-handshakes with the new credentials.
Inputs: gatewayUrl (required), gatewayToken (required), instance, makeDefault, +1 more.
openclaw_setup_clearA
Clear a persisted gateway config. By default clears every instance; pass instance to clear just one. Does NOT touch the device identity or device tokens. After this, the MCP falls back to env vars or errors with 'configure first'.
Inputs: instance.
openclaw_setup_listA
List every persisted gateway instance (name + URL + whether token/password are set, never the values). Plus the active default instance and where secrets come from (env vars / .env vs store.json).
Inputs: no named parameters.
openclaw_setup_select_defaultA
Switch the active default instance — every subsequent tool call (cron.list, sessions.list, etc.) will route to this instance unless an env var overrides. Closes existing client connections so they re-handshake with the new instance's credentials.
Inputs: instance (required).
openclaw_setup_showA
Show the currently resolved gateway configuration for an instance (default 'default' or whichever instance is the active default). Does NOT print tokens. Pass instance to inspect a non-default one.
Inputs: instance.
openclaw_skills_binsA
List the binaries / executables exposed by installed skills. Wraps skills.bins. Read-only.
Inputs: instance.
openclaw_skills_detailA
Get detailed info on a specific skill (manifest, version, dependencies, install state). Wraps skills.detail. Read-only.
Inputs: id (required), instance.
openclaw_skills_installC
Install a skill (or a specific version). Wraps skills.install. Mutates the gateway's skill set — confirm before calling.
Inputs: id (required), version, instance.
openclaw_skills_searchB
Search the available skill catalog (installed and remote). Wraps skills.search. Read-only.
Inputs: limit, query, instance.
openclaw_skills_statusA
Get the skills subsystem status (which skills are installed, enabled, recently updated). Wraps skills.status. Read-only.
Inputs: instance.
openclaw_skills_updateB
Update an installed skill to its latest (or a specified) version. Wraps skills.update. Mutates the gateway state.
Inputs: id (required), version, instance.
openclaw_statusA
Get overall gateway status (uptime, agents, sessions, queues). Wraps the root-level status JSON-RPC method. Read-only.
Inputs: instance.
openclaw_system_eventB
Emit a custom system event onto the gateway bus. Wraps system-event. Mostly used for tooling / debug — operators rarely call this directly.
Inputs: event (required), payload, instance.
openclaw_system_presenceA
Get presence info (which devices are connected, when they last spoke). Wraps system-presence. Read-only.
Inputs: instance.
openclaw_talk_configB
Get / set the talk-mode config (push-to-talk, hold-to-listen, voice activity detection). Wraps talk.config.
Inputs: instance.
openclaw_talk_modeA
Toggle talk mode on/off. Wraps talk.mode. Wire format (verified live against gateway 2026.4.12+): requires enabled: boolean — this is a SETTER, not a getter. Use openclaw_talk_config to read the current state.
Inputs: enabled (required), instance.
openclaw_talk_speakB
Make the agent speak a piece of text out loud (synthesizes + plays). Wraps talk.speak.
Inputs: text (required), instance.
openclaw_tools_catalogA
List the catalog of agent-facing tools available to OpenClaw agents (i.e. what main and other agents can call from inside a session). Wraps tools.catalog. Read-only.
Inputs: agentId, instance.
openclaw_tools_effectiveA
Get the effective (merged) tool set for an agent — base catalog + skill-provided + per-agent overrides. Wraps tools.effective. Read-only.
Inputs: agentId, instance, sessionId.
openclaw_tts_convertC
Synthesize a piece of text to audio. Wraps tts.convert. Returns audio / a download URL depending on the gateway config.
Inputs: text (required), voice, instance.
openclaw_tts_disableB
Disable text-to-speech output. Wraps tts.disable.
Inputs: instance.
openclaw_tts_enableB
Enable text-to-speech output. Wraps tts.enable.
Inputs: instance.
openclaw_tts_providersA
List available TTS providers (and their voices / models). Wraps tts.providers. Read-only.
Inputs: instance.
openclaw_tts_setProviderC
Switch the active TTS provider / voice. Wraps tts.setProvider.
Inputs: provider (required), model, voice, instance.
openclaw_tts_statusA
Get the TTS subsystem status (enabled, current provider, voice). Wraps tts.status. Read-only.
Inputs: instance.
openclaw_update_runA
Trigger an update of the gateway itself (pull latest version, restart components). Wraps update.run. DESTRUCTIVE — may briefly interrupt running sessions. Confirm before calling.
Inputs: version, instance.
openclaw_usage_costA
Get usage cost breakdown (per agent, per model, per period). Wraps usage.cost. Read-only. Pass period/agent filters if supported.
Inputs: agentId, sinceMs, untilMs, instance.
openclaw_usage_statusB
Get usage status (token counts, current period, quotas). Wraps usage.status. Read-only.
Inputs: instance.
openclaw_voicewake_getA
Get the voice-wake configuration (wake word, sensitivity, enabled). Wraps voicewake.get. Read-only.
Inputs: instance.
openclaw_voicewake_setC
Update the voice-wake configuration. Wraps voicewake.set.
Inputs: enabled, instance, wakeWord.
openclaw_wakeC
Wake an agent / session out of idle. Wraps the root-level wake method. Pass agentId/sessionId.
Inputs: agentId, instance, sessionId.
openclaw_wizard_cancelA
Cancel the active wizard flow without applying its changes. Wraps wizard.cancel.
Inputs: instance.
openclaw_wizard_nextA
Advance the active wizard to its next step (with the user's answer to the current step). Wraps wizard.next.
Inputs: instance.
openclaw_wizard_startA
Start a setup wizard flow (e.g. agent onboarding, channel pairing). Wraps wizard.start. Pass the wizard id / kind.
Inputs: id, kind, instance.
openclaw_wizard_statusA
Get the wizard's current step and pending input for a specific session. Wraps wizard.status. Wire format (verified live against gateway 2026.4.12+): requires sessionId. Read-only.
Inputs: sessionId (required), instance.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 143 tools
Many tools have overlapping purposes within the same domain: four variants of sending messages (openclaw_send, openclaw_agent, openclaw_chat_send, openclaw_sessions_send), two abort tools (openclaw_chat_abort, openclaw_sessions_abort), and multiple approval-policy tools (openclaw_exec_approval_* vs openclaw_exec_approvals_*) that are easy to confuse. The descriptions are detailed, but the sheer number of near-miss CRUD operations makes misselection likely.
Naming is a mix of domain_action (openclaw_cron_list), domain_subdomain_action (openclaw_node_pair_list), camelCase method names (openclaw_tts_setProvider), and plural/singular inconsistencies (openclaw_exec_approval_list vs openclaw_exec_approvals_get). While the openclaw_ prefix provides a uniform namespace, the structure after it is inconsistent enough to hurt predictability.
143 tools is an extreme count for a single MCP server, far beyond even a heavy 25+ threshold. While the gateway has a large surface area, exposing every JSON-RPC method plus convenience wrappers and escape hatches results in a sprawling toolset that is overwhelming for an agent to navigate.
The toolset is remarkably comprehensive across gateway domains: sessions, agents, config, cron, skills, nodes, approvals, TTS, and more. Missing operations like skill uninstall, a pending-node list, or a session message history (only tail/preview) are minor gaps; the coverage is strong enough that most workflows have no dead ends.
Maintenance
Related MCP Connectors
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
214 tools for AI agents over one MCP endpoint: image, video, audio, 3D, data, storage, mail, GPUs.
Find, vet, and run MCP tools through a secure audited gateway with prompt-injection risk scoring
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables AI assistants to manage GoClaw AI gateway infrastructure through a comprehensive suite of 66 tools for managing agents, sessions, and configurations. It provides real-time gateway context and guided workflows with enterprise-grade security features like audit logging and secret scrubbing.6612MIT
- AlicenseBqualityFmaintenanceExposes OpenClaw tools (web search, page fetching, browser automation, PDF analysis, messaging, inter-agent communication, Canvas) as MCP tools for ACP agents.7-
- AlicenseNot gradedqualityCmaintenanceExposes OpenClaw gateway tools to MCP clients like Claude Code and Codex, enabling local tool calls, file operations, and subagent session management through a stdio MCP server.1,414 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables administration of LibreChat through MCP, providing tools to manage Skills, Agents, scheduled tasks, Prompt library, and visibility/permissions. It also offers a generic API request tool for interacting with upstream endpoints.MIT