You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When a third-party tool (in our case ClawMetry's sync daemon) connects to the gateway over ws://127.0.0.1:18789 using the token from gateway.auth.token, the connect handshake succeeds but payload.auth.scopes comes back empty, regardless of what the client puts in params.scopes. Every method that requires a scope is then rejected:
Only health (which the gateway also pushes unsolicited) responds. As a result a WS client cannot subscribe to per-session message events at all — which is the only path to capture inbound Telegram / Signal / WhatsApp / Discord / … message bodies, since those adapters store conversations entirely in memory (no JSONL on disk; gateway.log only carries outbound sendMessage ACKs without bodies).
OpenClaw 2026.5.7 (server.version from the connect-ok payload).
Why this is a P0 for downstream observability
Without WS subscribe access, third-party dashboards have no way to see inbound chat-channel messages at all. The only surviving signal is gateway.log outbound ACK lines (no body), which means the user's actual conversations (the most important thing to observe) are invisible to every tool that isn't OpenClaw itself.
Or document a recommended way for a loopback-bound, token-authed CLI client to obtain operator.read non-interactively, so an observability daemon can subscribe to message events without forcing the user through the device-pairing approval UI on every install.
Symptom
When a third-party tool (in our case ClawMetry's sync daemon) connects to the gateway over
ws://127.0.0.1:18789using the token fromgateway.auth.token, theconnecthandshake succeeds butpayload.auth.scopescomes back empty, regardless of what the client puts inparams.scopes. Every method that requires a scope is then rejected:Only
health(which the gateway also pushes unsolicited) responds. As a result a WS client cannot subscribe to per-session message events at all — which is the only path to capture inbound Telegram / Signal / WhatsApp / Discord / … message bodies, since those adapters store conversations entirely in memory (no JSONL on disk;gateway.logonly carries outbound sendMessage ACKs without bodies).Repro
~/.openclaw/openclaw.jsonexcerpt (typical fresh install):{ "gateway": { "mode": "local", "auth": { "mode": "token", "token": "<48-char>" }, "port": 18789, "bind": "loopback" } }OpenClaw
2026.5.7(server.versionfrom the connect-ok payload).Why this is a P0 for downstream observability
Without WS subscribe access, third-party dashboards have no way to see inbound chat-channel messages at all. The only surviving signal is
gateway.logoutbound ACK lines (no body), which means the user's actual conversations (the most important thing to observe) are invisible to every tool that isn't OpenClaw itself.Request
Either:
Land RFE: gateway.auth.tokenScopes config field for headless/single-tenant deployments #80836 (
gateway.auth.tokenScopesconfig field) so headless / single-tenant deployments can declare the token's effective scopes statically. Our use case fits RFE: gateway.auth.tokenScopes config field for headless/single-tenant deployments #80836 exactly — we'd settokenScopes: ["operator.read"]and the WS subscribe path would just work.Or document a recommended way for a loopback-bound, token-authed CLI client to obtain
operator.readnon-interactively, so an observability daemon can subscribe to message events without forcing the user through the device-pairing approval UI on every install.Either resolution unblocks ClawMetry's live WS tap (PR https://github.com/vivekchand/clawmetry/pull/) and any other observer that wants to see in-memory channel traffic.
Related
gateway.auth.tokenScopes(the canonical fix)