Signal の設定
目次
Hermes は、HTTP モードで動かした signal-cli のデーモンを通して Signal につながります。受信は SSE(Server-Sent Events)でリアルタイムに流れてきて、返信は JSON-RPC で送ります。
Signal は、広く使われているメッセンジャーの中でもっともプライバシーに寄ったものです。既定で端末間の暗号化がかかり、プロトコルは公開されていて、集める情報も最小限です。そのため、機密性が問われるエージェントの用途によく合います。
事前に必要なもの
- signal-cli — Java で書かれた Signal のクライアント(GitHub)
- Java 17 以上の実行環境 — signal-cli が必要とします
- Signal を入れた電話番号 — 副端末として連携するために使います
signal-cli を入れる
# macOS
brew install signal-cli
# Linux (download latest release)
VERSION=$(curl -Ls -o /dev/null -w %{url_effective} \
https://github.com/AsamK/signal-cli/releases/latest | sed 's/^.*\/v//')
curl -L -O "https://github.com/AsamK/signal-cli/releases/download/v${VERSION}/signal-cli-${VERSION}.tar.gz"
sudo tar xf "signal-cli-${VERSION}.tar.gz" -C /opt
sudo ln -sf "/opt/signal-cli-${VERSION}/bin/signal-cli" /usr/local/bin/手順 1: Signal のアカウントを連携する
signal-cli は連携した端末として動きます。WhatsApp Web の Signal 版だと思ってください。主となる端末は手元のスマートフォンのままです。
# Generate a linking URI (displays a QR code or link)
signal-cli link -n "HermesAgent"- スマートフォンで Signal を開きます
- 設定 → 連携済みデバイス を開きます
- 新しいデバイスをリンク をタップします
- QR コードを読み取るか、URI を入力します
手順 2: signal-cli のデーモンを起動する
# Replace +1234567890 with your Signal phone number (E.164 format)
signal-cli --account +1234567890 daemon --http 127.0.0.1:8080動いているか確かめます。
curl http://127.0.0.1:8080/api/v1/check
# Should return: {"versions":{"signal-cli":...}}手順 3: Hermes を設定する
いちばん簡単なのはこれです。
hermes gateway setupプラットフォームの一覧から Signal を選びます。すると案内に沿って次のことが進みます。
- signal-cli が入っているかを確認します
- HTTP の URL を尋ねます(既定は
http://127.0.0.1:8080) - デーモンにつながるかを試します
- 自分のアカウントの電話番号を尋ねます
- 許可する相手とアクセスの方針を設定します
手動で設定する
~/.hermes/.env に次を追加します。
# Required
SIGNAL_HTTP_URL=http://127.0.0.1:8080
SIGNAL_ACCOUNT=+1234567890
# Security (recommended)
SIGNAL_ALLOWED_USERS=+1234567890,+0987654321 # Comma-separated E.164 numbers or UUIDs
# Optional
SIGNAL_GROUP_ALLOWED_USERS=groupId1,groupId2 # Enable groups (omit to disable, * for all)
SIGNAL_HOME_CHANNEL=+1234567890 # Default delivery target for cron jobsそのうえでゲートウェイを起動します。
hermes gateway # Foreground
hermes gateway install # Install as a user service
sudo hermes gateway install --system # Linux only: boot-time system serviceアクセスの制御
個別のやり取り
個別のやり取りの扱いは、Hermes のほかのプラットフォームとまったく同じです。
SIGNAL_ALLOWED_USERSを設定した場合 → そこに書いた相手だけがメッセージを送れます- 許可一覧を設定していない場合 → 知らない相手にはペアリング用のコードが返ります(
hermes pairing approve signal CODEで承認します) SIGNAL_ALLOW_ALL_USERS=trueの場合 → 誰でもメッセージを送れます(扱いには注意してください)
グループのやり取り
グループの扱いは、環境変数 SIGNAL_GROUP_ALLOWED_USERS で決まります。
| 設定 | 動き |
|---|---|
| 未設定(既定) | グループのメッセージはすべて無視されます。ボットは個別のやり取りにだけ応じます。 |
| グループ ID を設定 | 書いたグループだけを見ます(例: groupId1,groupId2)。 |
* を設定 |
ボットは、参加しているどのグループでも応じます。 |
できること
添付ファイル
アダプタは、送る側・受け取る側の両方でメディアを扱えます。
受け取る(利用者 → エージェント):
- 画像 — PNG、JPEG、GIF、WebP(先頭のバイト列から自動で判別します)
- 音声 — MP3、OGG、WAV、M4A(Whisper を設定していれば、音声メッセージは文字に起こされます)
- 書類 — PDF、ZIP、その他のファイル
送る(エージェント → 利用者):
エージェントは返答の中の MEDIA: タグでメディアを送れます。送り方は次のとおりです。
- 画像 —
send_multiple_imagesとsend_image_fileが、PNG、JPEG、GIF、WebP を Signal 本来の添付として送ります - 音声 —
send_voiceが音声ファイル(OGG、MP3、WAV、M4A、AAC)を添付として送ります - 動画 —
send_videoが MP4 の動画を送ります - 書類 —
send_documentが、どんな種類のファイルでも送ります(PDF、ZIP など)
送信するメディアはすべて、Signal の標準の添付 API を通ります。ほかのサービスと違い、Signal はプロトコルの上で音声メッセージとファイルの添付を区別しません。
添付の上限サイズは100 MB です(送る側・受け取る側とも)。
本来の書式、引用返信、リアクション
Signal のメッセージは、マークダウンの記号がそのまま見えるのではなく、Signal 本来の書式で表示されます。アダプタはマークダウン(bold、*italic*、` code 、~~strike~~、||spoiler||、見出し)を Signal の bodyRanges に変換するので、受け取った側の画面では ** や `` の文字が見えるのではなく、実際に装飾された文章として表示されます。
引用返信。 Hermes が特定のメッセージに返すときは、元のメッセージを引用したかたちで返信します。Signal を使う人が自分で「返信」したときと同じ見た目です。受信したメッセージへの返答であれば、これは自動で行われます。
リアクション。 エージェントは標準のリアクション API でメッセージに反応できます。リアクションは余計な文章としてではなく、対象のメッセージに付いた絵文字として Signal に表示されます。
これらに追加の設定は要りません。最近の signal-cli であれば、はじめから有効です。signal-cli の版が古すぎる場合、Hermes は装飾なしの送信に切り替え、一度だけ警告を記録します。
長いメッセージ
Signal では、1 通のメッセージは8,000 文字までです。Hermes はそれを超える返答を切り捨てず、番号付きの塊((1/3)、(2/3) …)に自動で分けます。これは送り出す経路すべてに当てはまり、会話中の返信、定期実行の通知、hermes send、MCP の send_message のいずれでも同じです。太字、斜体、コード、伏せ字といった書式も、分かれ目をまたいでそのまま保たれます。
入力中の表示
ボットはメッセージを処理している間、入力中の表示を出し続けます。8 秒ごとに更新します。
ツールの進み具合の表示
Signal には、送信済みのメッセージを編集する機能がありません。そのため Hermes は、/verbose を有効にしていて、そのプラットフォームに off 以外のモードを保存している場合でも、ゲートウェイのツール進捗の吹き出しを Signal では出しません。
ツールの動きは CLI で見られますし、Signal への最終的な返信には通常どおりエージェントの出力を含められます。チャットの中でツールごとの進み具合をその場で見たい場合は、メッセージの編集に対応したサービスを使ってください。
電話番号の伏せ字
電話番号は、記録の中で自動的に伏せられます。
+15551234567→+155****4567- これは Hermes のゲートウェイの記録にも、全体の伏せ字の仕組みにも当てはまります
自分宛てのメモ(番号を 1 つで使う場合)
ボット用に別の番号を用意せず、自分の電話番号で signal-cli を連携した副端末として動かしている場合は、Signal の「自分へのメモ」から Hermes とやり取りできます。
スマートフォンから自分宛てにメッセージを送るだけで、signal-cli がそれを拾い、Hermes が同じ会話の中で返します。
仕組みはこうです:
- 「自分へのメモ」のメッセージは
syncMessage.sentMessageという形で届きます - アダプタは、それがボット自身のアカウント宛てであることを見分けて、普通の受信メッセージとして処理します
- 送信時刻の記録による折り返し防止が働くので、堂々巡りにはなりません。ボット自身の返信は自動的に除かれます
追加の設定は要りません。 SIGNAL_ACCOUNT が自分の電話番号と一致していれば、そのまま動きます。
接続の見守り
アダプタは SSE の接続を見張っていて、次の場合には自動でつなぎ直します。
- 接続が切れたとき(待ち時間を 2 秒から 60 秒へ少しずつ延ばしながら再接続します)
- 120 秒のあいだ何も届かないとき(signal-cli に問い合わせて生存を確かめます)
困ったときは
| 症状 | 対処 |
|---|---|
| 設定中に 「Cannot reach signal-cli」 と出る | signal-cli のデーモンが動いているか確認します: signal-cli --account +YOUR_NUMBER daemon --http 127.0.0.1:8080 |
| メッセージが届かない | 送り主の番号が E.164 形式(先頭に +)で SIGNAL_ALLOWED_USERS に入っているか確認します |
| 「signal-cli not found on PATH」 と出る | signal-cli を入れて PATH に通すか、Docker を使います |
| 接続がすぐ切れる | signal-cli の記録にエラーが出ていないか確認します。Java 17 以上が入っているかも確かめてください。 |
| グループのメッセージが無視される | SIGNAL_GROUP_ALLOWED_USERS にグループ ID を設定するか、すべてのグループを許可するなら * を設定します。 |
| ボットが誰にも応じない | SIGNAL_ALLOWED_USERS を設定するか、個別のやり取りのペアリングを使います。広く開けたい場合は、ゲートウェイの方針ですべての利用者を明示的に許可します。 |
| 同じメッセージが二重に届く | その電話番号を見ている signal-cli が 1 つだけになっているか確認します |
セキュリティ
- 電話番号は、記録に出るときすべて伏せられます
- 新しい利用者を安全に迎えるには、個別のペアリングか、明示した許可一覧を使います
- グループ機能が本当に必要でなければ切ったままにするか、信頼できるグループだけを許可します
- Signal の端末間暗号化が、やり取りの中身を通信中も守ります
~/.local/share/signal-cli/にある signal-cli のセッションデータにはアカウントの認証情報が入っています。パスワードと同じように扱ってください
環境変数の一覧
| 変数 | 必須 | 既定値 | 説明 |
|---|---|---|---|
SIGNAL_HTTP_URL |
はい | — | signal-cli の HTTP の接続先 |
SIGNAL_ACCOUNT |
はい | — | ボットの電話番号(E.164) |
SIGNAL_ALLOWED_USERS |
いいえ | — | 電話番号または UUID をカンマ区切りで |
SIGNAL_GROUP_ALLOWED_USERS |
いいえ | — | 見にいくグループの ID。すべてなら *(省略するとグループを無効にします) |
SIGNAL_ALLOW_ALL_USERS |
いいえ | false |
誰でもやり取りできるようにします(許可一覧を使いません) |
SIGNAL_HOME_CHANNEL |
いいえ | — | 定期実行の通知の既定の宛先 |