メッセージと通知
19種類のメッセージングプロバイダーの概要、選び方、設定方法、およびAgentからの使い方。
Minara は、エージェントループから外部プラットフォームへメッセージをプッシュできます。 Autopilot が取引を通知する仕組み、スケジュール済みワークフローがウォッチリストの動きをアラートする仕組み、 そして REPL から離れているときに Agent があなたに連絡する仕組みも、すべてこの機能によるものです。
19のプラットフォームが標準搭載されており、カテゴリ別にグループ化されています。 各プラットフォームには専用の設定ページがあり、認証情報の手順、インバウンド webhook の形式、 署名レシピ、プラットフォーム固有の制限が記載されています。
7 つのチャンネルが現在製品で利用できます。残りは「設定 → メッセージ」に近日公開として表示されます。 トランスポートは実装済みで、運用者は CLI や環境変数から設定できるため以下の設定ページはそのまま有効ですが、 Web UI は接続フォームを表示せず、通知チャンネルとしても選択できません。
現在利用可能:
- Telegram:推奨の出発点。ストリーミング編集に対応
- Discord:Bot とチャンネル。ストリーミング編集に対応(1 秒スロットリングあり)
- Lark / Feishu:tenant token + オプションの AES-256 webhook
- Email:SMTP。送信専用、件名自動分割
- Email (Gmail OAuth):OAuth 認証の Gmail API。ストリーミング編集と返信に対応
- Signal:ローカルの
signal-cliサブプロセス経由。送信専用 - Home Assistant:任意の
notify.*サービス。送信専用
近日公開、エンタープライズ IM:
- Slack:webhook またはボットトークン(ストリーミングはボットのみ)
- WeCom(企業微信):SHA1 ソート + AES エンベロープ
- DingTalk(钉钉):HMAC-SHA256 署名 URL ロボット
- Microsoft Teams:JWT 検証インバウンド付き Bot Framework
- Google Chat:サービスアカウント JWT 認証
- Mattermost:セルフホスト、ボットトークン + outgoing webhook
近日公開、コンシューマー / ソーシャル:
- WeChat OA(公众号):48 時間返信ウィンドウ内のカスタマーサポートメッセージ
- QQ 公式 Bot:Ed25519 webhook。受動返信(アクティブプッシュは月 4 回まで)
- LINE:Messaging API プッシュ + 署名済み webhook
近日公開、フェデレーション / ニッチ:
- Matrix:Client-Server API + ロングポーリングデーモン(E2EE なし)
- BlueBubbles(iMessage):セルフホスト Mac 経由の iMessage ブリッジ
- WhatsApp:Meta Cloud API。送信専用、E.164 形式の宛先
簡単な方法:Minara に聞く
メッセージングチャンネルを設定する最速の方法は、チャットで Minara に伝えることです。
Agent が認証情報の手順を案内し、テストメッセージを送信し、設定を ~/.minara/credentials.json(messaging スロット)に保存します。
set up Telegram notifications, I want trade alerts
connect Slack to channel #trades using my bot token
configure email alerts, I'll give you the SMTP settings
send me a test message on Telegram to make sure it works
what notification channels are configured right now?
turn off the discord gateway, I'm not using it anymore
when ETH breaks $4000, alert me on Telegram最後のプロンプトに対して、Minara は設定済みのメッセージングチャンネルを使うバックグラウンドワークフローをセットアップします。 Agent はアラート条件、チャンネル、ツールセットの許可リストを一度に設定します。
Minara は認証情報の書き込みを保存前に確認します(~/.minara/credentials.json への書き込みはティア 3 のアクション)。
シークレットをエコーバックする際はマスクし、チャンネル設定完了後にテストメッセージを自動送信します。
手動での設定
3つのインターフェースが同じストアとホットリロードのセマンティクスを共有しています。 どれかを変更しても、プロセスを再起動せずに実行中の Agent に反映されます。
シェルから(minara auth messaging)
minara auth messaging list # 設定済みプロバイダーを表示
minara auth messaging add # 対話メニュー、18 プラットフォームすべて
minara auth messaging add <provider> # 対話ウィザード、トークンをマスク
minara auth messaging test <provider> # テストメッセージを送信
minara auth messaging remove <provider> # 認証情報を削除プロバイダー ID なしで minara auth messaging add を実行すると、
対話メニューが表示されます。サポートされているすべてのプラットフォームを一覧表示し、
設定済みのものを示した上で、選択したプラットフォームの認証情報を案内します。
保存後はピングテスト、別プラットフォームの設定、または終了を選べます。
詳細は CLI サブコマンド を参照してください。
REPL 内から(/connect)
/connect # 番号付き選択メニュー
/connect telegram # 対話形式の認証情報入力
/connect slack --test # テストピング
/connect telegram --remove # 認証情報を削除スラッシュコマンドは、会話の途中でプラットフォームの接続が必要と気づいたときに使う画面です。
省略可能なフィールドは空白のまま自動スキップされます。再設定時は既存フィールドに (currently set, blank to keep) と表示されます。
スラッシュコマンドではトークン入力が画面上で見えます(CLI サブコマンドはマスクされます)。
機密性の高い認証情報は CLI か、シェルの rc ファイルで環境変数として設定することを推奨します。
Web UI から(Settings → Messaging)
Web UI はすべてのプロバイダーを一つのパネルに表示します。
- プロバイダーごとのステータスバッジ(
runtime ready/configured/not connected/coming soon) - 各行の
Save/Test/Disconnectボタン Testボタンは実際のピングを送信します。IM やメールクライアントにメッセージが届き、行にlast test ✓と表示されます。- 入力を空にして Save すると、ディスク上のそのフィールドがクリアされます(一般的な設定フォームと同じ保存=クリアのセマンティクスです)。
--removeを使わずに Slack のモードをボットトークンから webhook のみに切り替えるときに便利です。
認証情報は ~/.minara/credentials.json(パーミッション 0600、git 管理外)に保存されるため、
再インストール後も保持され、リポジトリに漏れることはありません。
3つのインターフェースはいずれも書き込み後にプロセスを再起動せず、実行中の Agent のゲートウェイマップをホットリロードします。
ワークフロー:send_message ステップ種別
ワークフローでは、tool_call: send_message 形式を使わずに、ファーストクラスのステップ種別としてメッセージを送信できます。
{
"name": "notify_team",
"kind": "send_message",
"provider": "slack",
"channel": "#alerts",
"text": "BTC crossed ${trigger.threshold}"
}ディスパッチ時のプロバイダー解決順:
step.provider(ステップごとの明示指定)definition.delivery.provider(ワークフローレベルのデフォルト)- 接続済みプロバイダーがちょうど 1 つのとき、そのプロバイダー
- 上記に該当しない場合、アクティベーションは拒否され、
/connect <platform>(REPL)またはSettings → Messaging(Web UI)を示す構造化エラーが返されます。
アクティベーションゲートは Autopilot スイッチとは独立しています。
通知の送信は資金を移動させないため、autopilotEnabled=false の状態でもワークフローをアクティベートして実行できます。
cron トリガーによるメッセージングや Autopilot 自身の成功通知にも同じ独立性が適用されます。
ターゲットプラットフォームが接続されていないためアクティベーションが失敗した場合、
Web UI はモーダルを表示し、ワンクリックの Connect <provider> ボタンを提示します。
このボタンを押すと Settings → Messaging の該当行が展開された状態で表示され、
保存するとワークフローページに戻ってアクティベーションが自動リトライされます。
workflow_test でメッセージングワークフローを検証する
workflow_test は新しいプラットフォームのセットアップをエンドツーエンドで確認するための推奨手段です。
サンプルトリガーで DAG を実行し、本番と同じチャンネルを通じて 実際のメッセージを送信します。
ワークフローをオンにする前に、アラートがスマートフォンに届くことを確認できます。
ターゲットプロバイダーが接続されていない場合、テストは拒否され、/connect <provider>(REPL)または Settings → Messaging(Web UI)を示す構造化 messaging_not_configured エラーが返されます。
同じワークフロー内の資金移動など破壊的なツールはシミュレートされたままで、メッセージングステップのみが実際に実行されます。
詳細は ワークフロー ページの「デプロイ前のローカルワークフローのテスト」セクションを参照してください。
1回限りのアラート
「X が発生したら通知して、それ以降は通知しない」というワークフローには、
send_message の後に deactivate ステップを追加してください。
配信後にワークフロー自身が active = false に切り替わり、トリガーが再発火することはありません。
完全な JSON テンプレートは ワークフロー ページの「1回限りのアラート」セクションを参照してください。
機能マトリクス
すべてのプロバイダーはプレーンテキストの送信をサポートしています。 これはベースラインであり、マトリクスには含めていません。 以下の列はその上に重ねた高度な機能を示しています。
| プロバイダー | ストリーム | 画像 | ファイル | 音声 | スレッド | タイピング | リアクション | リッチ | インバウンド | 文字数制限 |
|---|---|---|---|---|---|---|---|---|---|---|
telegram | ✅ | ✅ | ✅ | ✅ (OGG) | ✅ | ✅ | N/A | N/A | ✅ | 4 096 |
discord | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | N/A | ✅ | 2 000 |
slack | ✅ | ✅ | ✅ | ✅ | ✅ | N/A | ✅ | ✅ | ✅ | 40 000 |
email | ❌ | ✅ | ✅ | ❌ | ✅ | N/A | N/A | N/A | N/A | 1 000 000 |
whatsapp | ❌ | ✅ | ✅ | ❌ | N/A | N/A | N/A | N/A | N/A | 4 096 |
signal | ❌ | ✅ | ✅ | ❌ | N/A | ✅ | ✅ | N/A | N/A | 4 096 |
home_assistant | ❌ | ❌ | ❌ | ❌ | N/A | N/A | N/A | N/A | N/A | 4 096 |
凡例:✅ = このビルドでサポート済み、❌ = プラットフォーム側が非対応、N/A = 未実装(今後の PR で対応予定)。Slack のタイピングセルが空なのは、最新の Slack Web / Events API に Bot タイピングトリガーが存在しないためです(対応していた旧 RTM API はすでに廃止されています)。
「リッチ」とはプロバイダー固有のリッチメッセージ公開機能のことで、共通のテキスト/添付ファイルの枠組みを超えたものを指します。
現在は Slack Block Kit、エフェメラル(chat.postEphemeral)、スケジュール送信(chat.scheduleMessage)、
send_message の provider_options.slack トンネルを通じた metadata が対象です。
他のプロバイダーは同等機能を持たないか(WhatsApp / Signal / HomeAssistant / webhook モードの Slack)、
まだ実装されていません(Telegram のインラインキーボード返信マークアップ、Discord コンポーネント、メール HTML 本文)。
具体的な API については slack ページを参照してください。
Slack の統合モード。 マトリクスは推奨のボットトークンモード(完全な Slack Web API、chat.postMessage、chat.update、files.v2、reactions.add、Events API webhook)を示しています。
Minara は、Slack アプリをインストールできないデプロイ環境向けに、よりシンプルな webhook URL モードもサポートしています。
こちらは機能が限定されます(ストリーミング、ファイルアップロード、リアクション、タイピング、エフェメラル/スケジュール送信なし)が、
プレーンテキスト、Block Kit ブロック、スレッド返信は引き続き使用できます。
両方の設定方法とモード別の機能については Slack ページ を参照してください。
Home Assistant はすべて ❌ ですが、これも同様の構造的な理由によるものです。notify.<service> API は、調査したすべての具体的な notify プラットフォームにわたってテキスト専用のシンクです。
画像を添付したい場合は CDN に置き、URL をメッセージ本文に含めてください。
「ストリーミング」とは、Agent の token ごとのレスポンスが、1つのメッセージとして編集されながら表示されることを指します。
ストリーミングに対応していないプロバイダーは、レスポンス全体をバッファして最終化時に一度送信します。共通の createStreamSink ヘルパー(apps/agent/src/messaging/stream-helpers.ts)を使用します。
添付ファイル
send_message({attachments: [...]}) を使うと、Agent がサンドボックス内で生成した画像、ドキュメント、または音声メモを添付できます(image_generate、audio_generate、write_file、コード実行などから生成されたもの)。
LLM はサンドボックス相対パスで参照します。
send_message({
provider: "telegram",
text: "BTC/USD daily with key levels",
attachments: [
{ kind: "image", sandbox_path: "images/btc-2026-04-19.png" },
{ kind: "file", sandbox_path: "files/levels.csv", caption: "CSV of levels" },
],
})添付ファイルの種別:
image:画像用。プロバイダーの画像最適化エンドポイントにルーティングされます(TelegramsendPhoto、WhatsAppimageなど)。file:汎用ドキュメント添付。PDF、CSV、アーカイブに使用します。voice:短い音声メモ。Telegram は OGG/Opus が必要で、OGG 以外の音声送信には明確なエラーが表示されます。audio:音楽 / ポッドキャスト / 長尺の音声。TelegramsendAudio。専用の音声 UI を持たないプロバイダーではvoiceと同様に扱われます。
セキュリティポリシー:
- サンドボックスパスのみが受け入れられます。リゾルバーは
..エスケープ、絶対パス、サンドボックス外に出るシンボリックリンクを、プロバイダーへのアップロード前に拒否します。攻撃者がsend_messageを情報流出チャンネルとして使用することはできません。 - 添付ファイルあたり 50 MB の上限(
MESSAGING_MAX_ATTACHMENT_BYTESで設定変更可能)。プロバイダー API 側もそれぞれ独自の上限を適用します。 - プロバイダーのサポートは機能ゲートで制御されます。解決されたプロバイダーがサポートしない
kind(例:WhatsApp へのvoice)を送信すると、API レイヤーで 400 になるのではなく、ツール境界で明確なエラーが返されます。
スレッド
スレッド化した会話に投稿するには、send_message に thread を渡します。
send_message({
provider: "slack",
text: "follow-up",
thread: "1700000000.000100", // 親メッセージの ts
})プロバイダーごとのセマンティクス(自動処理。呼び出し元は thread を渡すだけです):
- Telegram:フォーラムトピック用の
message_thread_id(スーパーグループとプライベートチャット)。 - Discord:スレッドはチャンネルです。URL 内のチャンネル ID をスレッド ID に置き換えます。新規スレッドとアーカイブ済みスレッドの両方で機能します。
- Slack:
thread_ts、親メッセージのタイムスタンプ。ボットモードのみ(webhook モードは拒否されます)。 - Email:値は
In-Reply-ToヘッダーとReferencesヘッダーの両方になります。親メールのMessage-ID(通常は<abc@host>のように山かっこ付き)を渡します。
スレッドをサポートしていないプロバイダー(whatsapp、signal、home_assistant)は、thread を渡すとツール境界で明確なエラーを返します。
タイピングインジケーターとリアクション
会話内のフィードバック用に、set_typing と add_reaction という 2 つの追加ツールが利用できます。
これらはティア 2 の CONFIRM_ONCE(装飾的なシグナル、エグレスではない)で、send_message のティア 3 確認とは別です。
// 長い返信の前に、Botが考え中であることをユーザーに伝える。
set_typing({ provider: "telegram", on: true })
// テキストを作成する代わりに、絵文字でインバウンドメッセージを確認する。
add_reaction({
provider: "discord",
message_id: "1234567890",
emoji: "👍",
})タイピングの持続性:Telegram と Discord のインジケーターは約 5〜10 秒後に期限切れになります。apps/agent/src/messaging/typing-heartbeat.ts の typing-heartbeat ヘルパーが自動的に再送します。長い LLM ターンの間ずっと「入力中…」を表示し続けたい場合に使用してください。
機能サポート(上記マトリクスを参照):タイピングは telegram / discord / signal でサポート。リアクションは discord / slack(ボット)/ signal でサポート。他のプロバイダーはツール境界で両方を拒否します。
インバウンドメッセージ:双方向チャット
Minara はメッセージを受信して返信もできるため、CLI の代わりにチャットアプリから直接エージェントと会話できます。メッセージがエージェントに届く経路は2通りあり、プラットフォームがどちらを使うかで、グローバル IP のないマシンで双方向チャットが成立するかどうかが決まります。
クライアントアウトバウンドデーモン(デフォルト)
ほとんどのプラットフォームでは、エージェントが外向きに接続して長時間接続(HTTP ロングポーリングまたは WebSocket)を維持し、その接続を通じてメッセージが流れてきます。エージェントがクライアントになるため、NAT の内側でも、個人のノート PC でも、グローバルアドレス・トンネル・第三者なしで動作します。これがデフォルトです。プラットフォームのアウトバウンド資格情報が設定され、かつそのプラットフォーム向けのグローバル webhook が未設定のとき、対応するデーモンが自動的に起動します。MESSAGING_<PLATFORM>_* スイッチでプラットフォームごとに上書きできます(環境変数 参照)。スイッチは3値です(未設定 = 自動、1 = 強制的に有効、0 = 強制的に無効)。
クライアントアウトバウンドデーモンを持つプラットフォーム:Telegram(getUpdates)、Discord(Gateway)、Slack(Socket Mode)、Mattermost(v4 WebSocket)、QQ(v2 ゲートウェイ)、DingTalk(Stream Mode)、Lark(長時間接続)、加えて Matrix(/sync)と Signal(signal-cli)。
Webhook リスナー(プラットフォームが要求する場合)
一部のプラットフォームは、グローバルな HTTPS エンドポイントへの POST でのみインバウンドを配信します。それらのために、Minara は HTTP webhook サーバー(apps/agent/src/messaging/inbound/server.ts 参照)を MESSAGING_INBOUND_ENABLED でゲートして実行します。デフォルトで 127.0.0.1 にバインドするため、グローバル IP のないホストでは、TLS を終端して転送するリバースプロキシまたはトンネルが必要です。あるプラットフォームの webhook 署名シークレットを設定すると、デーモンがあっても、そのプラットフォームは webhook インバウンドに戻ります。
セキュリティポリシー:
- すべてのリクエストはディスパッチ前に署名検証されます(Telegram の
X-Telegram-Bot-Api-Secret-Token、Slack のv0:{ts}:{body}に対する HMAC-SHA256、Discord と QQ の Ed25519、Lark の AES エンベロープ、Teams と Google Chat の JWT)。検証できないリクエストは 401 を返します。 - タイムスタンプベースのスキームには5分間のリプレイウィンドウがあります。
- ボディサイズの上限(デフォルト 4 MB)。超えると 413 を返します。
到達性:どのプラットフォームが完全ローカルで動くか
| インバウンドモデル | プラットフォーム | グローバル IP なしでの双方向チャット |
|---|---|---|
| クライアントアウトバウンドデーモン | Telegram、Discord、Slack、Mattermost、QQ、DingTalk、Lark、Matrix、Signal | 可能、トンネル不要 |
| webhook のみ(プラットフォームが接続してくる) | WhatsApp、LINE、WeCom、WeChat OA、Teams | 不可、グローバル webhook(トンネル / リバースプロキシ)が必要 |
| 送信のみ(インバウンドなし) | Email、Gmail、Home Assistant | アウトバウンド通知のみ |
Google Chat(Cloud Pub/Sub プル)と BlueBubbles(自己ホストサーバーへのソケット)もクライアントアウトバウンド化できますが、現在は webhook インバウンドで提供されています。
音声文字起こし:MESSAGING_INBOUND_TRANSCRIBE=1 かつ OPENAI_API_KEY が設定されている場合、インバウンドの音声メッセージはディスパッチ前に OpenAI Whisper で文字起こしされます。文字起こし結果は InboundMessage.text に格納され、元の音声は再生用に attachments に残ります。
Minara がメッセージングを使う仕組み
プロバイダーが設定されると、3つのものが送信できるようになります。
1. send_message ツール(Agent 内部から)
LLM が通知が必要と判断したとき、次のように呼び出します。
send_message({
provider: "telegram",
text: "BTC drawdown 5% triggered the watch",
})Agent は会話の途中でこれを呼び出します。例えば「ETH が $4,000 を突破したら Telegram でアラートして」と伝えると、条件が発火したときに send_message を呼び出すスケジュール済みワークフローが設定されます。
2. 自動運用(取引実行レポート)
Autopilot(有効時)は各実行後にサマリーを送信します。
🟢 Bought $100 of SOL @ $167.23
Position: +$100 | Slippage: 0.04% | Gas: $0.12
Reason: momentum > 3σ on 1h chartこれらは、デフォルトの通知ターゲットとして設定されているプロバイダー(~/.minara/settings.json で設定)に送信されます。
3. ワークフロー(cron ベースのアラート)
スケジュール済みモニタリングは、読み取り専用+メッセージング権限でバックグラウンドで実行されます。
you: watch the top 20 tokens by 24h volume, alert me on >5% moves every 15 min
agent: [sets up a cron workflow with tool set "read, memory, messaging"]ワークフローは観察と通知ができますが、LLM が途中で考えを変えても、許可リストによって取引はブロックされます。
ターゲットチャンネルのオーバーライド
send_message は channel のオーバーライドを受け付けるため、1つのプロバイダーを複数の宛先にファンアウトできます。
send_message({
provider: "telegram",
channel: "-1009876543210", // デフォルトとは異なるチャット
text: "Critical: position liquidation imminent",
})通常の通知はデフォルトチャンネルに保ちつつ、緊急アラートを別のスマートフォンやグループにルーティングするときに便利です。
セキュリティポリシー
- 認証情報は
~/.minara/credentials.jsonに保存されます。リポジトリ外、プロジェクトディレクトリ外です。 minara auth messaging listはシークレットを編集して表示します。生のトークンではなく12***xyz (46 chars)のように表示されます。- メッセージングは対話的な呼び出しにおいてティア 3(
ALWAYS_CONFIRM)です。REPL からのsend_message呼び出しはすべて確認を求めます。自律的なターン(cron / Autopilot)でティア 3 のツールを実行できるのはsafetyConfig.autopilotEnabledが設定されているときのみで、そうでなければそれらのパスでメッセージングは拒否されます。minara auth messaging addによる認証情報の書き込みは対話型ウィザード内で行われます(ツールレベルの確認プロンプトは別途ありません。ウィザード自体がプロンプトです)。 - メッセージングは取引を実行できません。ツールセットの許可リストが「閲覧と通知ができる」と「取引できる」を分離しています。メッセージング有効なワークフローは、LLM が使おうとしても資金移動ツールを持ちません。
次のステップ
上記からプラットフォームを選んでセットアップを進めてください。Telegram が最も簡単です。
可動部分が少なく、ストリーミング対応のゲートウェイが最も実績があります。
テストループ(/newbot → チャット ID → minara auth messaging test telegram)は 3 分以内に完了します。