MINARA
Minaraを使用するクライアントとインターフェースメッセージングプラットフォーム

メッセージと通知

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:

近日公開、コンシューマー / ソーシャル:

  • 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}"
}

ディスパッチ時のプロバイダー解決順:

  1. step.provider(ステップごとの明示指定)
  2. definition.delivery.provider(ワークフローレベルのデフォルト)
  3. 接続済みプロバイダーがちょうど 1 つのとき、そのプロバイダー
  4. 上記に該当しない場合、アクティベーションは拒否され、/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/AN/A4 096
discordN/A2 000
slackN/A40 000
emailN/AN/AN/AN/A1 000 000
whatsappN/AN/AN/AN/AN/A4 096
signalN/AN/AN/A4 096
home_assistantN/AN/AN/AN/AN/A4 096

凡例:✅ = このビルドでサポート済み、❌ = プラットフォーム側が非対応、N/A = 未実装(今後の PR で対応予定)。Slack のタイピングセルが空なのは、最新の Slack Web / Events API に Bot タイピングトリガーが存在しないためです(対応していた旧 RTM API はすでに廃止されています)。

「リッチ」とはプロバイダー固有のリッチメッセージ公開機能のことで、共通のテキスト/添付ファイルの枠組みを超えたものを指します。 現在は Slack Block Kit、エフェメラル(chat.postEphemeral)、スケジュール送信(chat.scheduleMessage)、 send_messageprovider_options.slack トンネルを通じた metadata が対象です。 他のプロバイダーは同等機能を持たないか(WhatsApp / Signal / HomeAssistant / webhook モードの Slack)、 まだ実装されていません(Telegram のインラインキーボード返信マークアップ、Discord コンポーネント、メール HTML 本文)。 具体的な API については slack ページを参照してください。

Slack の統合モード。 マトリクスは推奨のボットトークンモード(完全な Slack Web API、chat.postMessagechat.updatefiles.v2reactions.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_generateaudio_generatewrite_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:画像用。プロバイダーの画像最適化エンドポイントにルーティングされます(Telegram sendPhoto、WhatsApp image など)。
  • file:汎用ドキュメント添付。PDF、CSV、アーカイブに使用します。
  • voice:短い音声メモ。Telegram は OGG/Opus が必要で、OGG 以外の音声送信には明確なエラーが表示されます。
  • audio:音楽 / ポッドキャスト / 長尺の音声。Telegram sendAudio。専用の音声 UI を持たないプロバイダーでは voice と同様に扱われます。

セキュリティポリシー:

  • サンドボックスパスのみが受け入れられます。リゾルバーは .. エスケープ、絶対パス、サンドボックス外に出るシンボリックリンクを、プロバイダーへのアップロード前に拒否します。攻撃者が send_message を情報流出チャンネルとして使用することはできません。
  • 添付ファイルあたり 50 MB の上限MESSAGING_MAX_ATTACHMENT_BYTES で設定変更可能)。プロバイダー API 側もそれぞれ独自の上限を適用します。
  • プロバイダーのサポートは機能ゲートで制御されます。解決されたプロバイダーがサポートしない kind(例:WhatsApp への voice)を送信すると、API レイヤーで 400 になるのではなく、ツール境界で明確なエラーが返されます。

スレッド

スレッド化した会話に投稿するには、send_messagethread を渡します。

send_message({
  provider: "slack",
  text: "follow-up",
  thread: "1700000000.000100",  // 親メッセージの ts
})

プロバイダーごとのセマンティクス(自動処理。呼び出し元は thread を渡すだけです):

  • Telegram:フォーラムトピック用の message_thread_id(スーパーグループとプライベートチャット)。
  • Discord:スレッドはチャンネルです。URL 内のチャンネル ID をスレッド ID に置き換えます。新規スレッドとアーカイブ済みスレッドの両方で機能します。
  • Slackthread_ts、親メッセージのタイムスタンプ。ボットモードのみ(webhook モードは拒否されます)。
  • Email:値は In-Reply-To ヘッダーと References ヘッダーの両方になります。親メールの Message-ID(通常は <abc@host> のように山かっこ付き)を渡します。

スレッドをサポートしていないプロバイダー(whatsapp、signal、home_assistant)は、thread を渡すとツール境界で明確なエラーを返します。

タイピングインジケーターとリアクション

会話内のフィードバック用に、set_typingadd_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.tstyping-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_messagechannel のオーバーライドを受け付けるため、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 分以内に完了します。

目次