OpenClaw

OpenClaw Signal チャンネル

メッセージング
難しい

signal-cli(Signal プロトコル用のサードパーティ製オープンソースコマンドラインインターフェース)を使用して OpenClaw を Signal に接続します。この統合により、完全なエンドツーエンド暗号化を備えたプライバシー重視の AI メッセージングが実現します。OpenClaw は HTTP JSON-RPC と Server-Sent Events を介して signal-cli デーモンと通信し、AI アシスタントが Signal でメッセージの送受信を行えるようにします。ボットアカウントには専用の電話番号が必要です。

基本情報
難易度難しい
カテゴリメッセージング
対応機能数4 / 6

Signal 対応機能

テキストメッセージ

対応

メディア・ファイル

対応

リアクション

対応

スレッド

非対応

音声メッセージ

非対応

グループチャット

対応

Signal 前提条件

  • Signal ボットアカウント用の専用電話番号(個人番号とは別の番号)
  • サーバーに Java Runtime Environment(JRE 25+)がインストール済み
  • signal-cli がインストールされ、PATH に設定済み
  • OpenClaw Gateway が稼働・設定済み
  • ボットをリンクするための既存の Signal アカウント(または新規登録)

Signal クイックセットアップ

1

signal-cli をインストール

公式 GitHub リポジトリから signal-cli をダウンロードしてインストールします。Java 25 以降が必要です。ターミナルで 'signal-cli --version' を実行してインストールを確認してください。

2

Signal アカウントをリンクまたは登録

'signal-cli link -n "OpenClaw"' を実行し、別のデバイスから QR コードをスキャンして既存の Signal アカウントにリンクします。または、'signal-cli -a +15551234567 register' で新しいアカウントを登録します。専用の番号を使用してください。個人アカウントで実行するとセルフメッセージのループが発生します。

3

Signal チャンネル設定を追加

~/.openclaw/openclaw.json に Signal チャンネルの設定を追加します。'account' フィールドにボットの E.164 形式の電話番号を設定し、dmPolicy(pairing、allowlist、または open)を設定してアシスタントにメッセージを送信できるユーザーを制御します。

4

Gateway を起動してテストメッセージを送信

Gateway プロセスを起動します。OpenClaw は自動的に signal-cli デーモンを開始します。別の Signal アカウントからボットの番号にメッセージを送信してください。デフォルトの pairing ポリシーを使用している場合は、'openclaw pairing approve signal <code>' で送信者を承認してください。

Signal 設定例

config.json
{
  "channels": {
    "signal": {
      "enabled": true,
      "account": "+15551234567",
      "dmPolicy": "pairing"
    }
  }
}

Signal 詳細ドキュメント

アーキテクチャ概要

OpenClaw は signal-cli を通じて Signal に接続します。signal-cli は Signal プロトコルを実装した Java ベースのコマンドラインクライアントです。アーキテクチャは HTTP JSON-RPC インターフェースと Server-Sent Events(SSE)を使用してリアルタイムメッセージ配信を実現しています。 デフォルトでは、OpenClaw は Gateway 起動時に signal-cli デーモンプロセスを自動的に起動します。デーモンはすべての Signal プロトコル操作(暗号化、鍵交換、メッセージ送受信)を処理し、OpenClaw はローカル HTTP API を介して通信します。これにより、Signal プロトコル層は AI ロジックから完全に分離されます。 また、signal-cli を外部デーモンとして実行し、httpUrl 設定で OpenClaw を接続することもできます。signal-cli を独立して管理する場合や、別のホストで実行する場合に便利です。
自動起動デーモンはデフォルトで 127.0.0.1:8080 にバインドされます。別のアドレスが必要な場合は httpHost と httpPort を変更してください。
signal-cli を外部で実行すると、アップデートやライフサイクル管理をより細かく制御できます。自動起動を無効にするには httpUrl にデーモンの完全な URL を設定してください。

Signal アカウントのセットアップ

ボットには専用の Signal アカウントが必要です。個人の番号は使用しないでください。Signal はセルフメッセージを無視するため、同じ番号でボットと個人アカウントを運用するとルーティングの競合が発生します。 アカウントセットアップには2つの方法があります: • 既存デバイスにリンク — 'signal-cli link -n "OpenClaw"' を実行してデバイスリンク URI を生成します。プライマリ Signal アプリから QR コードをスキャンしてください。最も簡単なため推奨のアプローチです。 • 新規登録 — 'signal-cli -a +15551234567 register' を実行して新しい Signal アカウントを直接登録します。SMS または音声通話で番号を認証する必要があります。 リンクまたは登録後、signal-cli は認証情報と鍵をローカルに保存します。再起動後も保持されます。
openclaw.json
{
  "channels": {
    "signal": {
      "account": "+15551234567",
      "cliPath": "/usr/local/bin/signal-cli"
    }
  }
}
個人の Signal 番号でボットを運用することは避けてください。Signal のセルフメッセージ保護機能により、自分自身に送信したメッセージは無視され、ボットは正常に動作しません。

外部デーモンモード

高度なデプロイメントでは、OpenClaw の外部で signal-cli をスタンドアロンのデーモンプロセスとして実行できます。signal-cli のアップデートを独立して管理する場合、別のマシンで実行する場合、または1つのデーモンを複数のサービスで共有する場合に便利です。 手動でデーモンを起動するには: signal-cli -a +15551234567 daemon --http=127.0.0.1:8080 次に httpUrl を設定して OpenClaw を接続します。httpUrl が設定されると、OpenClaw はデーモンの自動起動をスキップし、既存のプロセスに接続します。
openclaw.json
{
  "channels": {
    "signal": {
      "account": "+15551234567",
      "httpUrl": "http://127.0.0.1:8080/api/v1/rpc"
    }
  }
}
外部デーモンを使用する場合は、Gateway の前にデーモンが起動していることを確認してください。OpenClaw はデーモンが利用可能になるまで最大 startupTimeoutMs(最大120秒)待機します。

DM ポリシー

DM(ダイレクトメッセージ)ポリシーは、プライベートチャットで AI アシスタントとやり取りできるユーザーを制御します。OpenClaw は4つのポリシーをサポートしています: • pairing(デフォルト)— 新しい連絡先がボットに初めてメッセージを送信するとランダムなペアリングコードを受け取ります。コードは1時間後に期限切れになります。ターミナルで 'openclaw pairing approve signal <code>' を使用して承認します。承認後は自由にチャットできます。 • allowlist — allowFrom にリストされた電話番号または UUID のみがボットにメッセージを送信できます。それ以外はサイレントに無視されます。電話番号には E.164 形式を使用し、UUID のみの連絡先には 'uuid:<id>' を使用してください。 • open — ボットにメッセージを送信した全員が応答を受け取ります。安全確認として allowFrom リストに '*' を追加する必要があります。注意して使用してください。 • disabled — DM 機能が完全に無効化されます。
openclaw.json
{
  "channels": {
    "signal": {
      "dmPolicy": "allowlist",
      "allowFrom": ["+15551234567", "uuid:a1b2c3d4-e5f6-7890-abcd-ef1234567890"]
    }
  }
}
電話番号を共有せずに Signal に登録した連絡先は、allowFrom リストに 'uuid:<id>' として表示されます。UUID は Gateway ログで確認できます。
連絡先ごとの履歴制限は dms["<phone_or_uuid>"].historyLimit を使用して、グローバルの dmHistoryLimit を上書きできます。

グループチャット管理

OpenClaw は設定可能なアクセス制御を備えた Signal グループチャットをサポートしています: • open — すべてのグループメンバーからのメッセージを受信 • allowlist — 承認された送信者(groupAllowFrom で指定)のみがボットをトリガー可能 • disabled — すべてのグループメッセージを無視 グループ会話は DM から完全に分離されています。メッセージは 'agent:<agentId>:signal:group:<groupId>' としてタグ付けされ、グループごとに個別のコンテキストと履歴が維持されます。 グループごとに historyLimit を設定して、AI コンテキストに含めるメッセージ数を制御できます(デフォルト50、0で履歴を無効化)。
openclaw.json
{
  "channels": {
    "signal": {
      "groupPolicy": "open",
      "historyLimit": 50
    }
  }
}

プライバシーとエンドツーエンド暗号化

Signal はプライベートメッセージングのゴールドスタンダードです。ボットと連絡先間のすべてのメッセージは Signal Protocol(Double Ratchet アルゴリズム + X3DH 鍵合意)を使用してエンドツーエンド暗号化されます。OpenClaw は転送中の平文メッセージを見ることはありません。復号化はサーバー上の signal-cli プロセス内でローカルに行われます。 主なプライバシー特性: • メッセージはクライアント間で暗号化されます。Signal のサーバーは内容を読めません • signal-cli は暗号化キーをサーバー上にローカル保存します • Anthropic、OpenAI、その他のサードパーティ AI プロバイダーのインフラを経由するデータはありません(メッセージはローカルで復号化され、セルフホストの Gateway で処理され、会話コンテキストのみが設定した AI プロバイダーに送信されます) • ストーリーイベントは ignoreStories: true で完全に無視できます
最大限のプライバシーを確保するには、Signal とローカルホストの LLM プロバイダー(例:Ollama)を組み合わせて、すべてのデータを自社インフラ内に留めてください。

リアクション

OpenClaw は Signal メッセージでの絵文字リアクションの送受信をサポートしています。リアクションは確認(ユーザーのメッセージが受信されたことを示す)やインタラクティブなエージェント動作に便利です。 リアクション構文は E.164 形式、UUID 形式、またはグループ形式のターゲットを持つメッセージツールを使用します: • DM リアクション:target=+15551234567 または target=uuid:<id> • グループリアクション:target=signal:group:<groupId>、targetAuthor=uuid:<sender> リアクション動作はグローバルまたはアカウントごとに設定できます: • actions.reactions — リアクション機能の有効/無効(デフォルト true) • reactionLevel — off/ack(無効)または minimal/extensive(ガイダンス付きで有効)
openclaw.json
{
  "channels": {
    "signal": {
      "reactionLevel": "minimal"
    }
  }
}

メディアと添付ファイル

OpenClaw は Signal 上の画像、ドキュメント、音声、動画を含むメディアファイルを処理します。メディアは signal-cli を通じて Base64 エンコードされたデータとして転送されます。 受信メディアは ignoreAttachments が true に設定されていない限り、自動的にダウンロードされ処理されます。送信メディアは送信前に signal-cli から Base64 で取得されます。 デフォルトのファイルサイズ制限は 8 MB(mediaMaxMb)です。Signal 自体はより大きなファイルをサポートしていますが、Base64 エンコーディングのオーバーヘッドと処理時間を考慮すると、8 MB が実用的なデフォルトです。
openclaw.json
{
  "channels": {
    "signal": {
      "mediaMaxMb": 8,
      "ignoreAttachments": false
    }
  }
}

タイピングインジケーターと既読確認

OpenClaw は AI の応答生成中にタイピングインジケーターを送信し、自然な会話感を維持します。Gateway は signal-cli の sendTyping エンドポイントを呼び出し、応答生成中にインジケーターを定期的にリフレッシュします。 承認済み DM 連絡先に対して sendReadReceipts を有効にすると、既読確認を転送できます。これにより、送信者のメッセージが処理されたことを知らせることができます。 注意:グループの既読確認は signal-cli ではサポートされていません。
openclaw.json
{
  "channels": {
    "signal": {
      "sendReadReceipts": true
    }
  }
}

テキストのチャンク分割と配信

長い AI の応答に対して、OpenClaw はテキストを自動的に複数のメッセージに分割します。デフォルトのチャンクサイズはメッセージあたり 4,000 文字です。 2つのチャンクモードが利用可能です: • length(デフォルト)— 文字数制限でハード分割 • newline — まず段落の境界で分割し、その後文字数制限を適用 配信ターゲットには E.164 電話番号、UUID、またはグループ ID を使用します: • DM:signal:+15551234567 またはベアの E.164 番号 • UUID DM:uuid:<id> またはベアの UUID • グループ:signal:group:<groupId>
openclaw.json
{
  "channels": {
    "signal": {
      "textChunkLimit": 4000,
      "chunkMode": "newline"
    }
  }
}

Signal 設定リファレンス

enabled
Type: booleanDefault: true

Signal チャンネルの有効/無効を切り替え

account
Type: stringDefault: ""

ボットの電話番号(E.164 形式、例:+15551234567)。必須

cliPath
Type: stringDefault: "signal-cli"

signal-cli 実行ファイルのパス

httpUrl
Type: stringDefault: ""

外部 signal-cli デーモンの完全な URL。設定すると自動起動が無効化されます

httpHost
Type: stringDefault: "127.0.0.1"

自動起動される signal-cli デーモンがバインドするホストアドレス

httpPort
Type: numberDefault: 8080

自動起動される signal-cli デーモンがバインドするポート

autoStart
Type: booleanDefault: true

Gateway 起動時に signal-cli デーモンを自動的に起動するかどうか

startupTimeoutMs
Type: numberDefault: 30000

signal-cli デーモンが利用可能になるまでの最大待機時間(ミリ秒)。最大 120000

dmPolicy
Type: stringDefault: "pairing"

ボットに DM を送信できるユーザーを制御。オプション:pairing、allowlist、open、disabled

allowFrom
Type: string[]Default: []

ボットにメッセージを送信できる電話番号(E.164)または uuid:<id> 識別子のリスト

dmHistoryLimit
Type: numberDefault: 50

会話ごとに AI コンテキストとして含める最近の DM メッセージ数

groupPolicy
Type: stringDefault: "disabled"

グループチャットポリシー。オプション:disabled、allowlist、open

groupAllowFrom
Type: string[]Default: []

グループでボットをトリガーできる電話番号または UUID(groupPolicy が allowlist の場合)

historyLimit
Type: numberDefault: 50

AI コンテキストに含める最大グループメッセージ数。0 で無効化

sendReadReceipts
Type: booleanDefault: false

承認済み DM 連絡先に既読確認を転送するかどうか

textChunkLimit
Type: numberDefault: 4000

チャンク分割前の送信メッセージあたりの最大文字数

chunkMode
Type: stringDefault: "length"

テキストのチャンクモード。オプション:length(ハード分割)、newline(段落対応)

mediaMaxMb
Type: numberDefault: 8

受信/送信添付ファイルの最大メディアファイルサイズ(メガバイト)

ignoreAttachments
Type: booleanDefault: false

受信メディア添付ファイルのダウンロードをスキップ

ignoreStories
Type: booleanDefault: false

Signal ストーリーイベントを完全に無視

receiveMode
Type: stringDefault: ""

メッセージ受信モード。オプション:on-start(起動時に取得)、manual

configWrites
Type: booleanDefault: true

/config コマンドによるチャンネル設定のランタイム変更を許可

reactionLevel
Type: stringDefault: "ack"

ボットのリアクション機能。オプション:off、ack、minimal、extensive

Signal よくある質問

Signal トラブルシューティング

signal-cli が Java エラーで起動に失敗する

Java がインストールされていないか、インストールされたバージョンが古すぎます。signal-cli には Java 25 以降が必要です。

サーバーに OpenJDK 25+ をインストールしてください。'java --version' で確認します。複数の Java バージョンがインストールされている場合は、正しいバージョンが PATH に設定されているか、JAVA_HOME を設定してください。また、'signal-cli --version' を実行して signal-cli が正しくインストールされていることを確認してください。
ボットがメッセージに一切応答しない

account フィールドが正しくない、signal-cli デーモンが実行されていない、または送信者がペアリングで承認されていない可能性があります。

account の番号が登録済みの signal-cli アカウント(国コード付きの E.164 形式)と一致していることを確認してください。'openclaw status' と 'openclaw gateway status' を実行してデーモンが稼働中か確認します。pairing ポリシーを使用している場合は、'openclaw pairing list signal' で保留中のペアリングを確認し、送信者を承認してください。
承認後も DM が無視される

送信者が allowFrom リストに含まれていない(allowlist ポリシー使用時)、または送信者の識別子形式が一致していない可能性があります。

Gateway ログで送信者の識別子を確認してください。一部の Signal ユーザーは電話番号を共有せずに登録しているため、電話番号ではなく 'uuid:<id>' として表示されます。正しい識別子を allowFrom に追加してください。'openclaw channels status --probe' を実行して詳細なチャンネル診断を確認できます。
グループメッセージが受信されない

groupPolicy が 'disabled'(デフォルト)に設定されているか、グループが許可リストに含まれていません。

groupPolicy を 'open' に設定してすべてのグループメッセージを受信するか、'allowlist' を使用してグループ ID を groupAllowFrom に追加してください。グループメッセージを受信した際の Gateway ログでグループ ID を確認できます。
外部デーモン接続に失敗する(httpUrl に到達不能)

signal-cli デーモンが実行されていない、URL が正しくない、またはファイアウォールが接続をブロックしています。

デーモンが稼働中で想定されるホスト:ポートでリッスンしていることを確認してください。'curl http://127.0.0.1:8080/api/v1/rpc' で接続をテストします。マシン間で実行している場合はファイアウォールルールを確認してください。デーモンが httpUrl 設定と一致する正しい --http フラグで起動されていることを確認してください。