Quick setup (beginner)
- Google Cloud プロジェクトを作成し、Google Chat API を有効にします。
- Google Chat API Credentials を開きます。
- API がまだ有効でなければ有効化します。
- Service Account を作成します。
- Create Credentials > Service Account を選択します。
- 任意の名前を付けます (例:
openclaw-chat)。 - 権限は空欄のままにして Continue を押します。
- アクセスを持つ principal も空欄のままにして Done を押します。
- JSON Key を作成してダウンロードします。
- Service Account の一覧から、いま作成したアカウントを開きます。
- Keys タブを開きます。
- Add Key > Create new key を選びます。
- JSON を選択して Create を押します。
- ダウンロードした JSON ファイルをゲートウェイホストへ保存します (例:
~/.openclaw/googlechat-service-account.json)。 - Google Cloud Console Chat Configuration で Google Chat アプリを作成します。
- Application info を入力します。
- App name: 例
OpenClaw - Avatar URL: 例
https://openclaw.ai/logo.png - Description: 例
Personal AI Assistant
- App name: 例
- Interactive features を有効にします。
- Functionality で Join spaces and group conversations を有効にします。
- Connection settings で HTTP endpoint URL を選択します。
- Triggers で Use a common HTTP endpoint URL for all triggers を選び、ゲートウェイの公開 URL に
/googlechatを付けたものを指定します。- Tip:
openclaw statusを実行すると、ゲートウェイの公開 URL を確認できます。
- Tip:
- Visibility で Make this Chat app available to specific people and groups in <Your Domain> を有効にします。
- テキストボックスへ利用者のメールアドレス (例:
user@example.com) を入力します。 - 画面下部の Save を押します。
- Application info を入力します。
- App status を有効にします。
- 保存後に ページを再読み込み します。
- App status セクションを探します。通常は保存後、画面上部または下部付近に表示されます。
- ステータスを Live - available to users に変更します。
- もう一度 Save を押します。
- Service Account のパスと webhook audience を使って OpenClaw を設定します。
- 環境変数:
GOOGLE_CHAT_SERVICE_ACCOUNT_FILE=/path/to/service-account.json - または設定:
channels.googlechat.serviceAccountFile: "/path/to/service-account.json"
- 環境変数:
- webhook audience の type と value を設定します。Chat アプリ側の設定と一致させてください。
- ゲートウェイを起動します。Google Chat は webhook パスに対して POST を送信します。
Add to Google Chat
ゲートウェイが起動しており、利用者のメールアドレスが visibility list に追加されていれば、次の手順で使い始められます。- Google Chat を開きます。
- Direct Messages の横にある + アイコンを押します。
- 通常ユーザーを追加する検索欄に、Google Cloud Console で設定した App name を入力します。
- Note: このボットは非公開アプリのため、“Marketplace” の一覧には表示されません。名前で検索する必要があります。
- 検索結果からボットを選択します。
- Add または Chat を押して 1 対 1 の会話を開始します。
"Hello"を送ってアシスタントを起動します。
Public URL (Webhook-only)
Google Chat の webhook には公開 HTTPS エンドポイントが必要です。セキュリティのため、外部へ公開するのは/googlechat パスだけ にしてください。OpenClaw のダッシュボードや、その他の機密性の高いエンドポイントはプライベートネットワーク内にとどめておくべきです。
Option A: Tailscale Funnel (Recommended)
プライベートダッシュボードには Tailscale Serve を使い、公開する webhook パスには Funnel を使います。これにより、/ は非公開のままにしつつ、/googlechat だけを外部公開できます。
-
ゲートウェイがどのアドレスにバインドされているか確認します。
127.0.0.1、0.0.0.0、または100.x.x.xのような Tailscale IP など、表示された IP アドレスを控えます。 -
ダッシュボードを tailnet 内だけに公開します (port 8443)。
-
webhook パスだけを公開します。
- ノードに Funnel アクセスを許可します。 必要に応じて、出力に表示される認可 URL を開き、tailnet policy 上でそのノードに Funnel を許可してください。
-
設定を確認します。
https://<node-name>.<tailnet>.ts.net/googlechat
プライベートダッシュボードは tailnet 内のままです。
https://<node-name>.<tailnet>.ts.net:8443/
Google Chat アプリの設定には、:8443 を含まない公開 URL を使ってください。
Note: この設定は再起動後も維持されます。削除したい場合はtailscale funnel resetとtailscale serve resetを実行してください。
Option B: Reverse Proxy (Caddy)
Caddy などの reverse proxy を使う場合は、該当パスだけを proxy してください。your-domain.com/ へのリクエストは無視されるか 404 を返し、your-domain.com/googlechat だけが安全に OpenClaw へルーティングされます。
Option C: Cloudflare Tunnel
tunnel の ingress rules を、webhook パスだけに向けるよう設定します。- Path:
/googlechat->http://localhost:18789/googlechat - Default Rule: HTTP 404 (Not Found)
How it works
- Google Chat が webhook POST をゲートウェイへ送信します。各リクエストには
Authorization: Bearer <token>ヘッダーが含まれます。- OpenClaw は、このヘッダーがある場合、webhook 本文を最後まで読んだり解析したりする前に bearer 認証を検証します。
- 本文に
authorizationEventObject.systemIdTokenを持つ Google Workspace Add-on リクエストも、より厳格な事前認証本文バジェットを使ってサポートされます。
- OpenClaw は設定された
audienceTypeとaudienceに対してトークンを検証します。audienceType: "app-url"の場合、audience は HTTPS の webhook URL です。audienceType: "project-number"の場合、audience は Cloud project number です。
- メッセージは space 単位でルーティングされます。
- DM ではセッションキー
agent:<agentId>:googlechat:dm:<spaceId>を使います。 - Space ではセッションキー
agent:<agentId>:googlechat:group:<spaceId>を使います。
- DM ではセッションキー
- DM アクセスはデフォルトでペアリングです。未知の送信者にはペアリングコードが返るため、次のコマンドで承認します。
openclaw pairing approve googlechat <code>
- Group space では、デフォルトで @mention が必要です。アプリのユーザー名がないとメンション検出できない場合は
botUserを設定します。
Targets
配信先や allowlist では、次の識別子を使います。- Direct message:
users/<userId>(推奨) - 生のメールアドレス
name@example.comは変更可能であり、channels.googlechat.dangerouslyAllowNameMatching: trueを設定した場合にだけ、DM allowlist の直接一致へ使われます。 - 非推奨:
users/<email>はメールアドレスの allowlist ではなく、user id として扱われます。 - Space:
spaces/<spaceId>
Config highlights
- Service Account の認証情報は
serviceAccountに JSON 文字列としてインライン指定することもできます。 serviceAccountRefも使えます (env/file SecretRef)。channels.googlechat.accounts.<id>.serviceAccountRefのように、アカウント単位でも指定できます。webhookPathを設定しない場合、既定値は/googlechatです。dangerouslyAllowNameMatchingは、変更可能なメール principal による allowlist 一致を再度有効化します。緊急互換モード向けの設定です。actions.reactionsを有効にすると、リアクションはreactionsツールおよびchannels actionから利用できます。typingIndicatorではnone、message(デフォルト)、reactionを使えます。reactionには user OAuth が必要です。- 添付ファイルは Chat API 経由でダウンロードされ、メディアパイプラインへ保存されます。サイズ上限は
mediaMaxMbです。
Troubleshooting
405 Method Not Allowed
Google Cloud Logs Explorer に次のようなエラーが出る場合があります。-
Channel not configured: 設定に
channels.googlechatセクションがありません。次のコマンドで確認します。Config path not foundが返る場合は、設定を追加してください (Config highlights を参照)。 -
Plugin not enabled: plugin の状態を確認します。
disabledと表示される場合は、設定にplugins.entries.googlechat.enabled: trueを追加してください。 -
Gateway not restarted: 設定追加後にゲートウェイが再起動されていません。次を実行してください。
Other issues
openclaw channels status --probeを使って、認証エラーや audience 設定不足を確認してください。- メッセージが届かない場合は、Chat app 側の webhook URL と event subscriptions を確認してください。
- メンション制御のために返信が止まっている場合は、
botUserにアプリの user resource name を設定し、requireMentionも確認してください。 - テストメッセージを送りながら
openclaw logs --followを実行すると、リクエストがゲートウェイへ届いているか確認できます。