{ "title": "RPC adapters", "content": "OpenClaw integrates external CLIs via JSON-RPC. Two patterns are used today.\n\n## Pattern A: HTTP daemon (signal-cli)\n\n* `signal-cli` runs as a daemon with JSON-RPC over HTTP.\n* Event stream is SSE (`/api/v1/events`).\n* Health probe: `/api/v1/check`.\n* OpenClaw owns lifecycle when `channels.signal.autoStart=true`.\n\nSee [Signal](/channels/signal) for setup and endpoints.\n\n## Pattern B: stdio child process (legacy: imsg)\n\n> **Note:** For new iMessage setups, use [BlueBubbles](/channels/bluebubbles) instead.\n\n* OpenClaw spawns `imsg rpc` as a child process (legacy iMessage integration).\n* JSON-RPC is line-delimited over stdin/stdout (one JSON object per line).\n* No TCP port, no daemon required.\n\n* `watch.subscribe` → notifications (`method: \"message\"`)\n* `watch.unsubscribe`\n* `send`\n* `chats.list` (probe/diagnostics)\n\nSee [iMessage](/channels/imessage) for legacy setup and addressing (`chat_id` preferred).\n\n## Adapter guidelines\n\n* Gateway owns the process (start/stop tied to provider lifecycle).\n* Keep RPC clients resilient: timeouts, restart on exit.\n* Prefer stable IDs (e.g., `chat_id`) over display strings.", "code_samples": [], "headings": [ { "level": "h2", "text": "Pattern A: HTTP daemon (signal-cli)", "id": "pattern-a:-http-daemon-(signal-cli)" }, { "level": "h2", "text": "Pattern B: stdio child process (legacy: imsg)", "id": "pattern-b:-stdio-child-process-(legacy:-imsg)" }, { "level": "h2", "text": "Adapter guidelines", "id": "adapter-guidelines" } ], "url": "llms-txt#rpc-adapters", "links": [] }