Gmail Pub/Sub -> OpenClaw
목표: Gmail watch -> Pub/Sub push ->gog gmail watch serve -> OpenClaw webhook.
사전 요구 사항
gcloud가 설치되어 있고 로그인되어 있어야 함 (install guide).gog(gogcli)가 설치되어 있고 해당 Gmail 계정에 대해 인증되어 있어야 함 (gogcli.sh).- OpenClaw hooks가 활성화되어 있어야 함 (Webhooks 참조).
tailscale에 로그인되어 있어야 함 (tailscale.com). 지원되는 구성은 공개 HTTPS endpoint에 Tailscale Funnel을 사용하는 방식임. 다른 tunnel 서비스도 동작할 수 있지만, 직접 연결해야 하며 공식 지원 범위는 아님. 현재는 Tailscale만 지원함.
deliver와 선택적인 channel/to를 설정하는 mapping으로 preset을 override함:
channel과 to를 함께 설정함. 그렇지 않으면 channel: "last"가 마지막 delivery route를 사용함 (WhatsApp으로 fallback).
Gmail 실행에 더 저렴한 모델을 강제하려면 mapping에 model을 설정함 (provider/model 또는 alias). agents.defaults.models를 강제하면 해당 목록에 포함되어 있어야 함.
Gmail hook 전용 기본 model과 thinking level을 설정하려면 config에 hooks.gmail.model / hooks.gmail.thinking을 추가함:
- Mapping의 개별
model/thinking이 여전히 이 기본값보다 우선함. - Fallback 순서는
hooks.gmail.model→agents.defaults.model.fallbacks→ primary(auth/rate-limit/timeouts)임. agents.defaults.models가 설정되어 있다면 Gmail model이 allowlist에 있어야 함.- Gmail hook content는 기본적으로 external-content safety boundary로 감싸짐.
이를 비활성화하려면(위험함)
hooks.gmail.allowUnsafeExternalContent: true를 설정함.
hooks.mappings 또는 ~/.openclaw/hooks/transforms 아래의 JS/TS transform module을 추가함 (Webhooks 참조).
설정 마법사 (권장)
OpenClaw helper를 사용해 전체 구성을 연결할 수 있음 (macOS에서는 brew로 의존성을 설치함):- 공개 push endpoint에 Tailscale Funnel을 사용함.
openclaw webhooks gmail run용hooks.gmailconfig를 작성함.- Gmail hook preset(
hooks.presets: ["gmail"])을 활성화함.
tailscale.mode가 활성화되면 OpenClaw는 자동으로
hooks.gmail.serve.path를 /로 설정하고 공개 경로는
hooks.gmail.tailscale.path(기본값 /gmail-pubsub)에 유지함. 이는 Tailscale이
proxy 전에 set-path prefix를 제거하기 때문임.
Backend가 prefixed path를 그대로 받아야 하면
hooks.gmail.tailscale.target(또는 --tailscale-target)을
http://127.0.0.1:8788/gmail-pubsub 같은 전체 URL로 설정하고
hooks.gmail.serve.path와 일치시킴.
Custom endpoint가 필요하면 --push-endpoint <url> 또는 --tailscale off를 사용함.
플랫폼 참고: macOS에서는 마법사가 Homebrew를 통해 gcloud, gogcli, tailscale을 설치함. Linux에서는 먼저 수동 설치가 필요함.
Gateway 자동 시작 (권장):
hooks.enabled=true이고hooks.gmail.account가 설정되어 있으면 Gateway가 부팅 시gog gmail watch serve를 시작하고 watch를 자동 갱신함.- 직접 daemon을 실행한다면
OPENCLAW_SKIP_GMAIL_WATCHER=1로 opt out할 수 있음. - 수동 daemon을 동시에 실행하지 말아야 하며, 그렇지 않으면
listen tcp 127.0.0.1:8788: bind: address already in use오류가 발생함.
gog gmail watch serve 시작 + auto-renew):
1회성 설정
gog가 사용하는 OAuth client를 소유한 GCP project를 선택함.
- API를 활성화함:
- Topic을 생성함:
- Gmail push가 publish할 수 있도록 권한을 부여함:
Watch 시작
history_id를 저장해 두면 디버깅에 유용함.
Push handler 실행
로컬 예시 (shared token auth):--token은 push endpoint를 보호함 (x-gog-token또는?token=).--hook-url은 OpenClaw/hooks/gmail을 가리킴 (mapped; isolated run + summary to main).--include-body와--max-bytes는 OpenClaw로 보내는 body snippet을 제어함.
openclaw webhooks gmail run은 같은 흐름을 감싸고 watch를 자동 갱신함.
Handler 노출 (고급, 비권장)
Tailscale이 아닌 tunnel이 필요하면 직접 연결하고 push subscription에 공개 URL을 사용함 (unsupported, no guardrails):테스트
감시 중인 inbox로 메시지를 보냄:문제 해결
Invalid topicName: project mismatch(topic이 OAuth client project에 없음).User not authorized: topic에roles/pubsub.publisher가 누락됨.- Empty messages: Gmail push는
historyId만 제공하므로gog gmail history로 가져와야 함.