2026-01-18 08:02:42 +00:00
---
summary: "Run the ACP bridge for IDE integrations"
read_when:
- Setting up ACP-based IDE integrations
- Debugging ACP session routing to the Gateway
2026-01-31 16:04:03 -05:00
title: "acp"
2026-01-18 08:02:42 +00:00
---
# acp
2026-02-27 00:33:58 +01:00
Run the [Agent Client Protocol (ACP) ](https://agentclientprotocol.com/ ) bridge that talks to a OpenClaw Gateway.
2026-01-18 08:02:42 +00:00
This command speaks ACP over stdio for IDEs and forwards prompts to the Gateway
over WebSocket. It keeps ACP sessions mapped to Gateway session keys.
2026-03-09 22:01:30 +01:00
`openclaw acp` is a Gateway-backed ACP bridge, not a full ACP-native editor
runtime. It focuses on session routing, prompt delivery, and basic streaming
updates.
## Compatibility Matrix
2026-03-09 22:17:19 +01:00
| ACP area | Status | Notes |
| --------------------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `initialize` , `newSession` , `prompt` , `cancel` | Implemented | Core bridge flow over stdio to Gateway chat/send + abort. |
| `listSessions` , slash commands | Implemented | Session list works against Gateway session state; commands are advertised via `available_commands_update` . |
| `loadSession` | Partial | Rebinds the ACP session to a Gateway session key and replays stored user/assistant text history. Tool/system history is not reconstructed yet. |
| Prompt content (`text` , embedded `resource` , images) | Partial | Text/resources are flattened into chat input; images become Gateway attachments. |
| Session modes | Partial | `session/set_mode` is supported and the bridge exposes initial Gateway-backed session controls for thought level, tool verbosity, reasoning, usage detail, and elevated actions. Broader ACP-native mode/config surfaces are still out of scope. |
| Session info and usage updates | Partial | The bridge emits `session_info_update` and best-effort `usage_update` notifications from cached Gateway session snapshots. Usage is approximate and only sent when Gateway token totals are marked fresh. |
2026-03-09 22:26:46 +01:00
| Tool streaming | Partial | `tool_call` / `tool_call_update` events include raw I/O, text content, and best-effort file locations when Gateway tool args/results expose them. Embedded terminals and richer diff-native output are still not exposed. |
2026-03-09 22:17:19 +01:00
| Per-session MCP servers (`mcpServers` ) | Unsupported | Bridge mode rejects per-session MCP server requests. Configure MCP on the OpenClaw gateway or agent instead. |
| Client filesystem methods (`fs/read_text_file` , `fs/write_text_file` ) | Unsupported | The bridge does not call ACP client filesystem methods. |
| Client terminal methods (`terminal/*` ) | Unsupported | The bridge does not create ACP client terminals or stream terminal ids through tool calls. |
| Session plans / thought streaming | Unsupported | The bridge currently emits output text and tool status, not ACP plan or thought updates. |
2026-03-09 22:01:30 +01:00
## Known Limitations
2026-03-09 22:17:19 +01:00
- `loadSession` replays stored user and assistant text history, but it does not
reconstruct historic tool calls, system notices, or richer ACP-native event
types.
2026-03-09 22:01:30 +01:00
- If multiple ACP clients share the same Gateway session key, event and cancel
routing are best-effort rather than strictly isolated per client. Prefer the
default isolated `acp:<uuid>` sessions when you need clean editor-local
turns.
- Gateway stop states are translated into ACP stop reasons, but that mapping is
less expressive than a fully ACP-native runtime.
2026-03-09 22:17:19 +01:00
- Initial session controls currently surface a focused subset of Gateway knobs:
thought level, tool verbosity, reasoning, usage detail, and elevated
actions. Model selection and exec-host controls are not yet exposed as ACP
config options.
- `session_info_update` and `usage_update` are derived from Gateway session
snapshots, not live ACP-native runtime accounting. Usage is approximate,
carries no cost data, and is only emitted when the Gateway marks total token
data as fresh.
2026-03-09 22:26:46 +01:00
- Tool follow-along data is best-effort. The bridge can surface file paths that
appear in known tool args/results, but it does not yet emit ACP terminals or
structured file diffs.
2026-03-09 22:01:30 +01:00
2026-01-18 08:02:42 +00:00
## Usage
```bash
2026-01-30 03:15:10 +01:00
openclaw acp
2026-01-18 08:02:42 +00:00
# Remote Gateway
2026-01-30 03:15:10 +01:00
openclaw acp --url wss://gateway-host:18789 --token < token >
2026-01-18 08:02:42 +00:00
2026-02-19 15:33:25 +01:00
# Remote Gateway (token from file)
openclaw acp --url wss://gateway-host:18789 --token-file ~/.openclaw/gateway.token
2026-01-18 08:02:42 +00:00
# Attach to an existing session key
2026-01-30 03:15:10 +01:00
openclaw acp --session agent:main:main
2026-01-18 08:02:42 +00:00
# Attach by label (must already exist)
2026-01-30 03:15:10 +01:00
openclaw acp --session-label "support inbox"
2026-01-18 08:02:42 +00:00
# Reset the session key before the first prompt
2026-01-30 03:15:10 +01:00
openclaw acp --session agent:main:main --reset-session
2026-01-18 08:02:42 +00:00
```
2026-01-18 08:27:27 +00:00
## ACP client (debug)
Use the built-in ACP client to sanity-check the bridge without an IDE.
It spawns the ACP bridge and lets you type prompts interactively.
```bash
2026-01-30 03:15:10 +01:00
openclaw acp client
2026-01-18 08:27:27 +00:00
# Point the spawned bridge at a remote Gateway
2026-02-19 15:33:25 +01:00
openclaw acp client --server-args --url wss://gateway-host:18789 --token-file ~/.openclaw/gateway.token
2026-01-18 08:27:27 +00:00
2026-01-30 03:15:10 +01:00
# Override the server command (default: openclaw)
openclaw acp client --server "node" --server-args openclaw.mjs acp --url ws://127.0.0.1:19001
2026-01-18 08:27:27 +00:00
```
2026-02-24 01:03:12 +00:00
Permission model (client debug mode):
- Auto-approval is allowlist-based and only applies to trusted core tool IDs.
- `read` auto-approval is scoped to the current working directory (`--cwd` when set).
- Unknown/non-core tool names, out-of-scope reads, and dangerous tools always require explicit prompt approval.
- Server-provided `toolCall.kind` is treated as untrusted metadata (not an authorization source).
2026-01-18 08:02:42 +00:00
## How to use this
Use ACP when an IDE (or other client) speaks Agent Client Protocol and you want
2026-01-30 03:15:10 +01:00
it to drive a OpenClaw Gateway session.
2026-01-18 08:02:42 +00:00
1. Ensure the Gateway is running (local or remote).
2. Configure the Gateway target (config or flags).
2026-01-30 03:15:10 +01:00
3. Point your IDE to run `openclaw acp` over stdio.
2026-01-18 08:02:42 +00:00
Example config (persisted):
```bash
2026-01-30 03:15:10 +01:00
openclaw config set gateway.remote.url wss://gateway-host:18789
openclaw config set gateway.remote.token < token >
2026-01-18 08:02:42 +00:00
```
Example direct run (no config write):
```bash
2026-01-30 03:15:10 +01:00
openclaw acp --url wss://gateway-host:18789 --token < token >
2026-02-19 15:33:25 +01:00
# preferred for local process safety
openclaw acp --url wss://gateway-host:18789 --token-file ~/.openclaw/gateway.token
2026-01-18 08:02:42 +00:00
```
## Selecting agents
ACP does not pick agents directly. It routes by the Gateway session key.
Use agent-scoped session keys to target a specific agent:
```bash
2026-01-30 03:15:10 +01:00
openclaw acp --session agent:main:main
openclaw acp --session agent:design:main
openclaw acp --session agent:qa:bug-123
2026-01-18 08:02:42 +00:00
```
Each ACP session maps to a single Gateway session key. One agent can have many
sessions; ACP defaults to an isolated `acp:<uuid>` session unless you override
the key or label.
2026-03-09 22:17:19 +01:00
Per-session `mcpServers` are not supported in bridge mode. If an ACP client
sends them during `newSession` or `loadSession` , the bridge returns a clear
error instead of silently ignoring them.
2026-03-09 04:19:03 +01:00
## Use from `acpx` (Codex, Claude, other ACP clients)
If you want a coding agent such as Codex or Claude Code to talk to your
OpenClaw bot over ACP, use `acpx` with its built-in `openclaw` target.
Typical flow:
1. Run the Gateway and make sure the ACP bridge can reach it.
2. Point `acpx openclaw` at `openclaw acp` .
3. Target the OpenClaw session key you want the coding agent to use.
Examples:
```bash
# One-shot request into your default OpenClaw ACP session
acpx openclaw exec "Summarize the active OpenClaw session state."
# Persistent named session for follow-up turns
acpx openclaw sessions ensure --name codex-bridge
acpx openclaw -s codex-bridge --cwd /path/to/repo \
"Ask my OpenClaw work agent for recent context relevant to this repo."
```
If you want `acpx openclaw` to target a specific Gateway and session key every
time, override the `openclaw` agent command in `~/.acpx/config.json` :
```json
{
"agents": {
"openclaw": {
"command": "env OPENCLAW_HIDE_BANNER=1 OPENCLAW_SUPPRESS_NOTES=1 openclaw acp --url ws://127.0.0.1:18789 --token-file ~/.openclaw/gateway.token --session agent:main:main"
}
}
}
```
For a repo-local OpenClaw checkout, use the direct CLI entrypoint instead of the
dev runner so the ACP stream stays clean. For example:
```bash
env OPENCLAW_HIDE_BANNER=1 OPENCLAW_SUPPRESS_NOTES=1 node openclaw.mjs acp ...
```
This is the easiest way to let Codex, Claude Code, or another ACP-aware client
pull contextual information from an OpenClaw agent without scraping a terminal.
2026-01-18 08:02:42 +00:00
## Zed editor setup
Add a custom ACP agent in `~/.config/zed/settings.json` (or use Zed’ s Settings UI):
```json
{
"agent_servers": {
2026-01-30 03:15:10 +01:00
"OpenClaw ACP": {
2026-01-18 08:02:42 +00:00
"type": "custom",
2026-01-30 03:15:10 +01:00
"command": "openclaw",
2026-01-18 08:02:42 +00:00
"args": ["acp"],
"env": {}
}
}
}
```
To target a specific Gateway or agent:
```json
{
"agent_servers": {
2026-01-30 03:15:10 +01:00
"OpenClaw ACP": {
2026-01-18 08:02:42 +00:00
"type": "custom",
2026-01-30 03:15:10 +01:00
"command": "openclaw",
2026-01-18 08:02:42 +00:00
"args": [
"acp",
2026-01-31 21:13:13 +09:00
"--url",
"wss://gateway-host:18789",
"--token",
"< token > ",
"--session",
"agent:design:main"
2026-01-18 08:02:42 +00:00
],
"env": {}
}
}
}
```
2026-01-30 03:15:10 +01:00
In Zed, open the Agent panel and select “OpenClaw ACP” to start a thread.
2026-01-18 08:02:42 +00:00
## Session mapping
By default, ACP sessions get an isolated Gateway session key with an `acp:` prefix.
To reuse a known session, pass a session key or label:
- `--session <key>` : use a specific Gateway session key.
- `--session-label <label>` : resolve an existing session by label.
- `--reset-session` : mint a fresh session id for that key (same key, new transcript).
If your ACP client supports metadata, you can override per session:
```json
{
"_meta": {
"sessionKey": "agent:main:main",
"sessionLabel": "support inbox",
"resetSession": true
}
}
```
Learn more about session keys at [/concepts/session ](/concepts/session ).
## Options
- `--url <url>` : Gateway WebSocket URL (defaults to gateway.remote.url when configured).
- `--token <token>` : Gateway auth token.
2026-02-19 15:33:25 +01:00
- `--token-file <path>` : read Gateway auth token from file.
2026-01-18 08:02:42 +00:00
- `--password <password>` : Gateway auth password.
2026-02-19 15:33:25 +01:00
- `--password-file <path>` : read Gateway auth password from file.
2026-01-18 08:02:42 +00:00
- `--session <key>` : default session key.
- `--session-label <label>` : default session label to resolve.
- `--require-existing` : fail if the session key/label does not exist.
- `--reset-session` : reset the session key before first use.
- `--no-prefix-cwd` : do not prefix prompts with the working directory.
- `--verbose, -v` : verbose logging to stderr.
2026-01-18 08:27:27 +00:00
2026-02-19 15:33:25 +01:00
Security note:
- `--token` and `--password` can be visible in local process listings on some systems.
- Prefer `--token-file` /`--password-file` or environment variables (`OPENCLAW_GATEWAY_TOKEN` , `OPENCLAW_GATEWAY_PASSWORD` ).
2026-03-07 18:28:32 -06:00
- Gateway auth resolution follows the shared contract used by other Gateway clients:
2026-03-10 21:41:56 -05:00
- local mode: env (`OPENCLAW_GATEWAY_*` ) -> `gateway.auth.*` -> `gateway.remote.*` fallback only when `gateway.auth.*` is unset (configured-but-unresolved local SecretRefs fail closed)
2026-03-07 18:28:32 -06:00
- remote mode: `gateway.remote.*` with env/config fallback per remote precedence rules
- `--url` is override-safe and does not reuse implicit config/env credentials; pass explicit `--token` /`--password` (or file variants)
2026-03-01 20:31:06 -08:00
- ACP runtime backend child processes receive `OPENCLAW_SHELL=acp` , which can be used for context-specific shell/profile rules.
- `openclaw acp client` sets `OPENCLAW_SHELL=acp-client` on the spawned bridge process.
2026-02-19 15:33:25 +01:00
2026-01-18 08:27:27 +00:00
### `acp client` options
- `--cwd <dir>` : working directory for the ACP session.
2026-01-30 03:15:10 +01:00
- `--server <command>` : ACP server command (default: `openclaw` ).
2026-01-18 08:27:27 +00:00
- `--server-args <args...>` : extra arguments passed to the ACP server.
- `--server-verbose` : enable verbose logging on the ACP server.
- `--verbose, -v` : verbose client logging.