コンテンツへスキップ
ガイド

GmailからOpenClawを起動する

Pub/Subトピック、Gatewayフック、すべてのメッセージを信頼できないデータとして扱うmail_readerエージェント

7分で読めます

新しい請求書、サポートの依頼、デプロイ失敗の通知など、メールが届いたときにアシスタントに反応してほしいとします。すぐに思いつく配線、つまり普段チャットしているエージェントにGmailを向ける方法では、あなたのアドレスを知っている見知らぬ人なら誰にでも、あなたのシェル、ファイル、ブラウザを握るエージェントの1ターンを与えることになります。OpenClawのGmail経路はそれを避けるために存在し、スイッチ1つではなく、複数の部品のチェーンになっています。

Gmailのメッセージがエージェントに届くまで

  • トランスポートはGoogle Pub/Subです。ラベルに対するGmailのwatchが受信トレイのイベントをトピックに発行し、Pub/Subがそれをgog gmail watch serveプロセスにプッシュし、そのウォッチャーがメールのデータをGatewayのHTTPフックに転送します。内部のHOOK.mdハンドラーが読み込まれることはありません。これはプロセス内のイベントシステムではなく、外部からの受信用フックです。
  • 前提条件は具体的です。gcloud CLI、監視対象のGmailアカウントで認可済みのgog、OpenClawで有効化されたフック、Pub/Subが実際に到達できるHTTPSのプッシュエンドポイント(推奨構成ではTailscale Funnel)、そして動作するサンドボックスバックエンドです。デフォルトのDockerバックエンドを使い続ける場合は、初回実行の前にそのイメージをビルドしておきます。
  • フックが有効でGmailアカウントが設定されていれば、Gatewayがウォッチャーを自動的に起動・更新します。オプトアウト用の環境変数もあります。実行するのは必ず1つだけにしてください。同じリスナーで2つ目のserveプロセスを動かしたり、runコマンドを手動で実行したりするとbindの競合になります。また、リスナーが起動したからといって、watchが登録された証拠にはなりません。
  • マッピングはmessages配列を展開するため、プッシュされた1つのバッチは、メール1通につき1回のエージェント実行になります(上限は200件)。Gmailの経路には、メッセージごとのバイト制限から算出され、32 MiBを上限とする、より大きなリクエストボディの許容量が与えられます。また、上流の履歴ページが数えるのはメールではなく履歴レコードなので、未処理分がたまると、それでも制限に達することがあります。
組み込みGmailプリセットのメッセージごとのセッションは、会話のコンテキストを分離するものです。ターゲットエージェントのツールやワークスペースを制限するものではありません。

メッセージごとのセッションは権限の境界ではない

プリセットは各メッセージに専用のセッションキーを与えるため、2通目のメールが1通目の会話を読むことはできません。それはコンテキストの分離であり、それ以上のものではありません。どのマッピングもエージェントIDを設定していない場合、プリセットはデフォルトのエージェントに解決されます。つまり、見知らぬ人からのメールを、あなたのワークスペースとツールを持つエージェントが要約することになります。gmailパスに一致するカスタムマッピングはプリセットより先に実行されるので、そこでリーダーを指定します。そして、フックの許可済みエージェントIDのリストによって、そのエンドポイントが他のエージェントを選べないようにします。より多くの機能を持つエージェントにGmailをルーティングすることも可能ですが、ドキュメントはそれをセキュリティ上の判断として扱うよう求めています。ラッピングはオン、サンドボックスで実行、ワークフローに必要な範囲を超えて何も付与しない、ということです。

mail_readerエージェント

  • リーダーは、専用のワークスペースとモデルを持つ、エージェント一覧の2つ目のエントリーで、サンドボックスはモードall、sessionスコープ、ワークスペースへのアクセスなしに設定されます。そのため各メールには、ホストエージェントのワークスペースに到達できない新しいサンドボックスが割り当てられ、実行は構造上使い捨てになります。
  • ツールポリシーはminimalプロファイルで、許可されるツールはsession_statusの1つだけです。加えて、ファイルシステム、ランタイム、ウェブの各グループと、browser、cron、gateway、nodesの各ツールを対象とする明示的な拒否リストがあります。このエージェントごとの許可リストは絶対的な制限なので、グローバルなalso-allowの追加がリーダーに漏れ込むことはなく、明示的な拒否によって意図した境界を監査可能に保てます。
  • リーダーを追加すると、エージェント一覧は明示的なフリートになります。そのため、メインのエージェントが引き続き担当するすべてのチャネルに、チャネルごとに1つずつ専用のバインディングが必要になります。チャネルをまたぐワイルドカードはないためです。再起動する前にエージェントをバインディング付きで一覧表示することが、担当者のいないチャネルを見つけるためのチェックになります。また、配信はオフなので、完了した実行は通知されずにログに記録されます。

よく引っかかるルールが1つあります。ツールポリシーは、グローバル、プロバイダー、エージェント、サンドボックスの各レイヤーが組み合わさるにつれて狭まる一方です。そのため、前のレイヤーでsession_statusが削除されていれば、リーダーの許可リストでそれを復活させることはできず、実効的なツールセットが空になると、モデルがメールを見る前に実行が中止されます。メールを接続する前に、リーダーを検証してください。プロバイダーを認証し、リーダーを選択した状態でモデルをプローブし、それから1行のターンを送って、正確な答えが返ってくることを確認します。これが、モデル、ランタイム、サンドボックス、ツールポリシーをまとめて検証できる唯一のチェックです。このリーダーが頼る分離についてはOpenClawのサンドボックスの解説で、今変更したエージェント一覧とバインディングのルールについてはOpenClawのマルチエージェントフリートで説明しています。

2つのトークン、gcloudの設定、境界テスト

Gmailのセットアップコマンドは、トランスポートのブロックを書き込み、プリセットを有効にし、先に適用した制限付きマッピングを保持し、プッシュエンドポイントにはデフォルトでTailscale Funnelを使います。serveモードはtailnet内限定で、公開到達可能なPub/Subのターゲットにはならないため、外部で管理しているURLを使う場合は、トンネルをオフにしてエンドポイントを明示的に渡します。2つのトークンが2つの区間を守ります。プッシュトークンはPub/Subをウォッチャーに対して認証し、フックトークンはヘッダーを通じてウォッチャーをOpenClawに対して認証します。クエリ文字列のトークンは拒否されるため、トークン付きのプッシュURLは、自分でフックのパスを呼び出すためのテンプレートにはなりません。セットアップの出力には両方のトークンが表示されることがあるので、共有する前に伏せ字にしてください。手動の手順は短く、gogのOAuthクライアントを所有するプロジェクトを選択し、GmailとPub/SubのAPIを有効にし、トピックを作成し、Gmailのプッシュ用サービスアカウントにパブリッシャーロールを付与してから、そのトピックに対してwatchを開始します。これはプッシュサブスクリプションを登録せず、リスナーも起動しません。そしてテストします。別のアカウントから、無害な指示を書いたメールを自分宛てに送り(ドキュメントでは、リンクを開いてコマンドを実行するようエージェントに指示する例が挙げられています)、その実行内容を確認します。ウォッチャーの成功はトランスポートの受領を、実行IDを伴うフックの200は受け入れを記録するものです。リンクへの移動、ファイルの書き込み、シェルコマンド、ブラウザ操作、MCPの登録のいずれかが試みられていれば、境界チェックは失敗です。これらすべての背後にある脅威モデルはOpenClawのプロンプトインジェクションで、Google以外で同じリーダーのパターンを使う方法はIMAPメールトリガーで説明しています。

Dialiでは

DialiはOpenClawをマネージドサービスとしてホストしており、各顧客は共有アシスタントの席ではなく、自分専用のアシスタントを運用します。エンジンの設定はダッシュボードの設定から生成され、リリースのたびに書き直されます。一方、セッション、メモリ、ワークスペースのファイルは永続ボリュームに保存され、毎日のスナップショットとワンクリック復元は「バックアップ」アドオン(Maxに含まれます)で利用できます。アシスタントの前段にあるイングレスは当社のものなので、公開到達可能なプッシュエンドポイントは当社と調整して用意していただく部分です。ホスト型アシスタントについてはDialiのマネージドOpenClawホスティングで、各プランに含まれる内容はDialiの料金で説明しています。

  • プリセットが分離するのはコンテキストであり、権限ではありません。
  • 2つのトークン、2つの区間、代用は不可です。
  • フックの200は受け入れであって、要約ではありません。
今すぐ始める

読むだけでなく、作ってみましょう

エージェントを設定してチャネルを選べば、いつも開いているアプリの中でエージェントが働き始めます。