mcpField
O
ops-inbox

ops-inbox

github.com/davepoon生産性3.7k73 回インストール今日更新
リポジトリ

ops-inbox について

ops-inbox は、設定済みの連絡チャネルをスキャンし、返信状況ごとに会話を整理する Claude プラグインのスキルです。返信候補を提示する前に、スレッドや連絡先の背景情報を集めます。

主な機能

  1. 01全チャネルの受信箱スキャン
  2. 02会話の返信状況を分類
  3. 03スレッドと連絡先の情報収集
  4. 04コミュニケーション設定に沿った返信案
  5. 05チャネルの並列処理に対応

活用シーン

  1. 01最近のメールやチャットの確認
  2. 02返信が必要な会話の優先付け
  3. 03文脈を踏まえた返信案の作成

MCP 対応

設定済みの MCP 連携を通じて Slack、Telegram、Notion に接続し、他のチャネルにはコマンドラインツールを使用します。会話へのアクセス前に、チャネルの利用可否と認証状態を確認します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/davepoon/buildwithclaude --skill ops-inbox

インストール後、Claude Code で/ops-inboxを入力して読み込まれたか確認します。

同梱ファイルCHANNELS.md

詳細

OPS ► INBOX ZERO

ランタイムコンテキスト

実行する前に、利用可能なコンテキストを読み込んでください。

  1. 設定:${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json を読み込みます

    • default_channels — デフォルトでスキャンするチャネル
    • secrets_manager / doppler — チャネルの認証情報が環境変数にない場合の解決方法
  2. デーモンの健全性:${CLAUDE_PLUGIN_DATA_DIR}/daemon-health.json を読み込みます

    • wacli-sync の状態を確認します。実行中でない場合、または認証が必要な場合は、WhatsApp をスキップして問題を提示してください
    • また、wacli コマンドを実行する前に ~/.wacli/.health で現在の認証状態も確認してください
  3. Ops のメモリー:返信の下書きを作成する前に ${CLAUDE_PLUGIN_DATA_DIR}/memories/ を確認します。

    • contact_*.md — 返信しようとしている相手のプロフィールを読み込みます
    • preferences.md — ユーザーのコミュニケーションスタイルと言語設定を適用します
    • topics_active.md — この相手に関連する進行中のスレッドや期限を確認します
    • donts.md — 下書きでこれらの制限に決して違反しないでください

CLI/API リファレンス

wacli(WhatsApp)

ヘルスファイル — wacli コマンドを実行する前に、必ず ~/.wacli/.health を確認してください。

  • status=connected → 通常どおり進めます
  • status=needs_auth → ユーザーに「ターミナルで wacli auth を実行し、QR コードをスキャンしてください」と促します
  • status=needs_reauth → ユーザーに「WhatsApp のセッションの有効期限が切れています。再ペアリングするには wacli auth を実行してください」と促します
  • ファイルがない場合 → wacli doctor --json にフォールバックします
コマンド使用方法出力
wacli doctor --json認証/接続/ロック/FTS を確認{data: {authenticated, connected, lock_held, fts_enabled}}
wacli chats list --jsonすべてのチャット{data: [{JID, Name, Kind, LastMessageTS}]}
wacli messages list --chat "<JID>" --limit N --jsonチャットのメッセージ{data: {messages: [{FromMe, Text, Timestamp, SenderName, ChatName}]}}
wacli messages search --query "<text>" --jsonFTS 検索上記と同じ
wacli contacts --search "<name>" --json連絡先の検索連絡先オブジェクト
wacli send --to "<JID>" --message "<msg>"テキストを送信成功/エラー
wacli history backfill --chat="<JID>" --count=50 --requests=2 --wait=30s --idle-exit=5s --json古いメッセージを取得バックフィル結果
gog CLI(Gmail/Calendar)
コマンド使用方法出力
gog gmail search "in:inbox" --max 50 -j --results-only --no-input受信トレイ全体をスキャンスレッドの JSON 配列
gog gmail thread get <threadId> -jすべてのメッセージを含むスレッド全体を取得メッセージ全体の JSON
gog gmail get <messageId> -j単一のメッセージを取得メッセージ JSON
gog gmail archive <messageId> ... --no-input --forceメッセージをアーカイブ(受信トレイから削除)アーカイブ結果
gog gmail archive --query "<gmail-query>" --max N --forceクエリでアーカイブアーカイブ結果
gog gmail send --to "<email>" --subject "<subj>" --body "<body>"メールを送信送信結果
gog gmail send --reply-to-message-id <msgId> --reply-all --body "text"全員に返信送信結果
gog gmail mark-read <messageId> ... --no-input既読にする結果
gog gmail labels list -jすべてのラベルを一覧表示ラベル JSON

Agent Teams のサポート

CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 が設定されている場合は、「all channels」モードの処理に Agent Teams を使用してください。これにより、次のことが可能になります。

  • チャネルエージェントを並行して実行しながら、コンテキストを共有できます(例:WhatsApp エージェントがメールスレッドに言及するメッセージを見つけた場合、メールエージェントがそのスレッドを優先できます)
  • エージェントに指示を出せます:「今は WhatsApp をスキップして、まずメールに集中してください」
  • エージェントはチャネルごとに完了を報告するため、返信が届き次第処理できます

チームのセットアップ(フラグが有効で、「all channels」モードの場合のみ):

TeamCreate("inbox-channels")
Agent(team_name="inbox-channels", name="whatsapp-scanner", ...)
Agent(team_name="inbox-channels", name="email-scanner", ...)
Agent(team_name="inbox-channels", name="slack-scanner", ...)
Agent(team_name="inbox-channels", name="telegram-scanner", ...)
Agent(team_name="inbox-channels", name="notion-scanner", ...)

各エージェントが担当チャネルをスキャンし、分類した結果を報告します。その後、すべてのチャネルの NEEDS_REPLY 項目を優先順位順に処理します。

フラグが設定されていない場合は、チャネルを順番に処理するか、fire-and-forget サブエージェントを使用してください。

事前に収集されたデータ

${CLAUDE_PLUGIN_ROOT}/../../bin/ops-unread 2>/dev/null || echo '{}'

環境変数

すべてのチャネルの認証情報は環境変数または CLI 認証から取得し、ハードコードされたシークレットはありません。

変数デフォルト値用途
GMAIL_ACCOUNT自動検出gog CLI 用の Gmail アカウント
SLACK_MCP_ENABLEDfalseSlack MCP サーバーが設定されている場合は true に設定します
TELEGRAM_ENABLEDfalseTelegram ユーザー認証 MCP が設定されている場合は true に設定します
NOTION_MCP_ENABLEDfalseNotion MCP 統合が設定されている場合は true に設定します
WACLI_STORE~/.wacliwacli の保存ディレクトリ

基本原則:受信トレイ全体をスキャンする

未読だけを確認してはいけません。各チャネルの最近の受信トレイ全体をスキャンし、すべての会話を分類してください。

基本原則:完全なコンテキスト — 決して推測しない

重大な安全ルール — 内容を理解せずに送信してはいけません: いずれかのチャネルで返信を作成または送信する前に、会話履歴全体(20 件以上のメッセージ)を必ず読み、以下を要約して理解していることを示してください。

  1. 会話の内容
  2. 各当事者が述べたこと(ユーザーのメッセージと連絡相手のメッセージを区別する)
  3. 連絡相手が最後のメッセージで実際に何を尋ねているか、または述べているか
  4. 適切な返信で何に触れるべきか

このルールで防ぐ失敗例: エージェントが最後のメッセージ「je kan het toch uit Klaviyo halen?」だけを読み、「どのデータが必要ですか?」と返信してしまいます。連絡相手はデータを求めていたのではなく(2FA を持っているため)、ユーザー自身でデータを取得するよう伝えていたため、これは完全に的外れです。スレッド全体を読んでいなければ、返信は筋が通らず、連絡相手を困惑させていたでしょう。

絶対ルール:会話の流れを 2 文で要約できない場合、メッセージを十分に読めていません。戻ってさらに読んでください。

ユーザーはすべてのスレッドを覚えているわけではありません。提示するメッセージはすべて、表示する前に完全なコンテキストを把握してください。件名だけを見せて「どうしますか?」と尋ねてはいけません。まず、何についての会話なのかをユーザーが理解できるようにする必要があります。

返信が必要な各項目について、以下のコンテキストを自動的に収集してください:

  1. スレッド本文全体 — 最後のメッセージだけでなく、スレッド全体を読みます(gog gmail thread get / wacli messages list --limit 20)。会話の流れ全体を要約してください。
  2. 連絡相手のプロフィール — チャネルを横断して検索し、プロフィールカードを作成します。
    • gog gmail search "from:<contact_email>" --max 10 — 最近のメール履歴
    • wacli contacts --search "<name>" --json — WhatsApp での存在状況
    • wacli messages search --query "<name>" --json --limit 5 — 最近の WhatsApp での言及
    • Linear が設定されている場合:この連絡相手に割り当てられた課題、またはこの連絡相手に言及している課題を検索します
    • 提示する情報:相手が誰か、役職・会社、直近 N 件のやり取り、関係性の背景
  3. トピックのコンテキスト — 話題を特定し、関連するスレッドを検索します。
    • gog gmail search "subject:<keywords>" --max 5 — 関連するメールスレッド
    • wacli messages search --query "<topic keywords>" --json --limit 5 — 関連する WA メッセージ
    • 要約する内容:このトピックの概要、期限、保留中の判断事項
  4. ops-memories(利用可能な場合)— ~/.claude/plugins/data/ops-ops-marketplace/memories/ を確認し、この連絡相手やトピックについて保存されたコンテキストがないか調べます。

返信が必要な項目を提示する場合:

━━━ [Contact Name] — [Subject] ━━━
 Who: [role, company, relationship — from contact search]
 History: [last 3 interactions across channels]
 Thread: [2-3 sentence summary of full conversation arc]
 Last msg: [full body of their last message]
 Context: [related threads/decisions/deadlines found]
 
 Draft reply: "[contextually aware draft based on all above]"
 
 [Send] [Edit] [Read full thread] [Skip]

返信を作成する場合:

  • 会話の連続性を保つため、スレッドの全履歴を利用します

  • 相手のメッセージに含まれる具体的な点に触れます

  • 連絡相手のコミュニケーションスタイル(フォーマル/カジュアル、言語)に合わせます

  • ops-memories にこの連絡相手の好みがあれば、それを反映します

  • 汎用的な返信を作成してはいけません。すべての下書きで、スレッド全体を読んだことが分かるようにします

  • 返信が必要 — 相手側から最後のメッセージが届いており、あなたの返信を待っています

  • 返信待ち — あなたが最後にメッセージを送っており、相手の返信を待っています(対応不要)

  • 対応済み — 会話は終了しており、アーカイブできます

  • 参考情報 — ニュースレター、通知、自動メッセージ(一括アーカイブ)

チャネルの利用可否とフォールバック

各チャネルの利用可否を実行時に確認します。

  1. メール:まず gog CLI を試します。gog が利用できない場合は、mcp__gog__gmail_* MCP ツールを試します。どちらも利用できない場合は、利用不可と報告します。
  2. WhatsApp:まず ~/.wacli/.health でキープアライブデーモンの状態を確認します。status=needs_auth または status=needs_reauth の場合は、wacli コマンドを実行せず、代わりにユーザーに次のように案内します:"WhatsApp needs re-authentication. Run wacli auth in a separate terminal and scan the QR code, then type 'done'." AskUserQuestion を使います:[Done — re-paired]、[Skip WhatsApp]。Done の場合は、デーモンを再起動します:launchctl kickstart -k gui/$(id -u)/com.claude-ops.wacli-keepalive。5 秒待ってから、ヘルス状態を再確認します。ヘルスファイルがない場合は、認証/接続状態を確認するために wacli doctor にフォールバックします。古いバージョンの場合(405 エラー)は、ソースから再ビルドするよう案内します。
  3. Slack:MCP ツール(mcp__claude_ai_Slack__*)のみを使用します。SLACK_MCP_ENABLED 環境変数を確認します。
  4. Telegram:ユーザー認証 MCP(tdlib/MTProto)のみを使用します。TELEGRAM_ENABLED 環境変数を確認します。BotFather のボットは絶対に使用しないでください。
  5. Discord:${CLAUDE_PLUGIN_ROOT}/bin/ops-discord read <CHANNEL_ID> --limit 20 --json を使用します。DISCORD_BOT_TOKEN が必要です(v1 はチャネル単位で、DM/ゲートウェイにはまだ対応していません)。事前設定された読み取り対象リストは、${CLAUDE_PLUGIN_DATA_DIR}/preferences.json の discord.inbox_channels(チャネル ID の配列)にあります。ボットトークンも読み取り対象リストも設定されていない場合は、ユーザーに尋ねず、1 行のメモ(「Discord が設定されていません — /ops:setup discord を実行してください」)を添えて Discord をスキップします。ops-inbox はセットアップフローではありません。ルール 3 は /ops:setup に引き続き適用されます。
  6. Notion:MCP ツール(mcp__claude_ai_Notion__* またはセルフホストの Notion MCP)のみを使用します。NOTION_MCP_ENABLED 環境変数を確認します。ワークスペース内で最近のコメント、メンション、割り当てられたタスクを検索します。

タスク

  1. 初期件数を取得するために、事前収集済みデータを解析します(未読件数はあくまで開始時の目安です)。

  2. 各チャネルを全件スキャンします(未読のみではありません)。

    • メール:gog gmail search -a $GMAIL_ACCOUNT -j --results-only --no-input --max 30 "in:inbox" を使って is:unread ではなく in:inbox を検索します。各スレッドについて、最後のメッセージを読み、最後に送信した人を特定します。DRAFT または SENT ラベルがあるか確認します。下書きの送信を提案する前に、スレッド内ですでに返信が送信されていないことを確認してください。
    • WhatsApp:wacli chats list --json を実行して、すべてのチャットを取得します。アーカイブされておらず、LastMessageTS が過去 7 日以内のチャットに絞り込みます。それぞれについて、wacli messages list --chat <JID> --limit 20 --json で会話全体を取得します(5 件ではなく 20 件。スレッド全体が必要です)。FromMe、Text、Timestamp、ChatName フィールドを含む data.messages[] を解析します。どのメッセージがユーザー(FromMe: true)からのもので、どれが連絡先(FromMe: false)からのものかを把握します。最後のメッセージの FromMe フィールドで分類します。
    • Slack:Slack MCP ツールで検索します。各スレッドの最後のメッセージを送信した人を確認します。
    • Telegram:ユーザー認証 MCP(ボット API ではありません)を使って、最近の会話を読み取ります。
  3. 受信トレイ全体を表示します:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 OPS ► INBOX MANAGER
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

 📱 WhatsApp    [N need reply] | [N waiting] | [N archive]
 📧 Email       [N need reply] | [N waiting] | [N FYI]
 💬 Slack       [N need reply] | [N waiting]
 ✈️  Telegram   [N need reply] | [N waiting]

──────────────────────────────────────────────────────

AskUserQuestion の呼び出しはバッチ処理します(各呼び出しの選択肢は最大 4 つ)。設定済みでメッセージがあるチャネルのみを表示します。選択肢の合計が 4 以下の場合は、1 回の呼び出しを使います。

AskUserQuestion 呼び出し 1:

  [All channels (fastest — one pass)]
  [WhatsApp only]
  [Email only]
  [More...]

AskUserQuestion 呼び出し 2(「More...」の場合のみ):

  [Slack only]
  [Telegram only]
  [Skip — already done]

設定済みチャネルが 3 つのみの場合、「すべてのチャネル」+チャネルの選択肢 3 つで合計 4 つとなり、1 回の呼び出しに収まります。その後、選択されたチャネルを処理します。


各チャネルの処理

WhatsApp(全件スキャン+詳細なコンテキスト)

フェーズ 1 — 分類:

  1. すべてのチャットを取得します:wacli chats list --json
  2. LastMessageTS が過去 7 日以内のチャットに絞り込みます
  3. 各チャットについて、最近の会話をすべて取得します:wacli messages list --chat "<JID>" --limit 20 --json — メッセージを 20 件取得してください。5 件ではありません。文脈を理解するには、会話スレッド全体が必要です。
  4. data.messages[] を解析します — フィールド:FromMe、Text、Timestamp、ChatName、SenderName
  5. すべてのチャットについて、会話の内容を把握します:
    • すべてのメッセージを順番に読みます。FromMe: true(ユーザーが送信)と FromMe: false(連絡先が送信)のどちらかを確認します
    • 会話の話題、話し合われた内容、未解決の事項を理解します
    • ユーザーが送信したメッセージから、ユーザーの口調やスタイルを把握します
  6. 各チャットを分類します:
    • 返信が必要:最後のメッセージが FromMe: false(相手が最後に送信)
    • 返信待ち:最後のメッセージが FromMe: true(こちらが最後に送信)
    • アーカイブ:古い会話、最近のやり取りがない、または終了した会話

フェーズ 2 — 返信が必要なチャットのコンテキストを構築(並行して実行): 返信が必要なチャットごとに、次の手順を実行します:

  1. 会話全体の要約 — 20 件のメッセージをすべて読み、会話の流れを要約します。話し合われた内容、重要な決定事項、未解決の質問をまとめます
  2. 連絡先のプロフィール — この相手について検索します:
    • wacli messages search --query "<contact_name>" --json --limit 10 — 他のチャットでの言及を検索します
    • gog gmail search -j --results-only --no-input --max 5 "from:<name> OR to:<name>" — メールの履歴を検索します
    • 保存済みのプロフィールがある場合は、~/.claude/plugins/data/ops-ops-marketplace/memories/contact_*.md を確認します
    • その人の人物像、関係性、チャネルをまたいだコミュニケーション履歴をまとめます
  3. 話題のコンテキスト — 会話からキーワードを抽出して検索します:
    • wacli messages search --query "<topic keywords>" --json --limit 5 — 関連する WA メッセージを検索します
    • gog gmail search -j --results-only --no-input --max 3 "<topic keywords>" — 関連するメールを検索します
  4. ユーザーのメッセージスタイル — このチャット内の FromMe: true のメッセージから、言語(NL/EN)、フォーマル度、絵文字の使用、通常の返信の長さを確認します

フェーズ 3 — 全文脈を添えて提示:

📱 WHATSAPP — NEEDS REPLY (with context)

━━━ 1. [Contact Name] ━━━
 Who: [role, company, relationship — from contact search]
 History: [last 3 interactions across channels]
 Conversation: [2-3 sentence summary of the full chat thread]
 Their message: [full text of their last message(s)]
 Your last msg: [what you said before they replied]
 Context: [related threads/topics found]
 Language: [NL/EN — match the user's previous messages in this chat]

 Draft reply: "[context-aware draft matching user's style + language]"

 [Send] [Edit] [Read full thread] [More...]

If "More...":
 [Archive] [Skip]

📱 WHATSAPP — WAITING (no action needed)
 N. [Contact] — you said: "[your last message]" — [time ago]
    Thread: [1-line summary of what you're waiting for]

返信が必要なチャットごとに AskUserQuestion を使用します。

WhatsApp の返信を作成する際:

  • ユーザーの言語に合わせます(この相手にオランダ語で送っている場合は、オランダ語で下書きを作成します)
  • ユーザーのスタイル(カジュアル/フォーマル、絵文字の使用、メッセージの長さ)に合わせます
  • 連絡先のメッセージにある具体的な点に言及します
  • ops-memories にこの連絡先の設定がある場合は、それを適用します
  • 汎用的な返信は作成しません。下書きには、会話全体を理解していることが必ず伝わるようにします

返信するには:wacli send --to "<JID>" --message "<msg>"

wacli CLI リファレンス(v0.5.0):

コマンド使用方法備考
wacli doctorwacli doctor --json認証/接続/ロック/FTS の状態を確認します
wacli authwacli authQR ペアリング(対話形式 — ターミナルに QR を表示します)
wacli syncwacli sync --follow --refresh-contacts --refresh-groups同期を継続します(launchd keepalive によって管理されます)
wacli sync --oncewacli sync --once --idle-exit=10s同期を一度だけ実行し、アイドル状態になると終了します
wacli chats listwacli chats list --jsonJID、名前、種類、LastMessageTS を含むすべてのチャット
wacli messages listwacli messages list --chat "<JID>" --limit 5 --jsonメッセージ:ChatJID、FromMe、Text、Timestamp、SenderName
wacli messages searchwacli messages search --query "<text>" --jsonすべてのメッセージを対象に FTS5 検索を実行します
wacli contactswacli contacts --search "<name>" --json名前から連絡先を検索します
wacli sendwacli send --to "<JID>" --message "<msg>"テキストメッセージを送信します
wacli history backfillwacli history backfill --chat="<JID>" --count=50 --requests=2 --wait=30s --idle-exit=5s --json電話から古いメッセージを取得します(ストアのロックが必要です)

ヘルスファイルの仕様(~/.wacli/.health): いずれの wacli コマンドを実行する前にも、~/.wacli/.health を読み取ります:

  • status=connected → 通常どおり続行します
  • status=needs_auth → ユーザーに「ターミナルで wacli auth を実行し、QR コードをスキャンしてください」と促します
  • status=needs_reauth → ユーザーに「WhatsApp のセッションの有効期限が切れました。再ペアリングするには wacli auth を実行してください」と促します
  • ファイルがない → wacli doctor --json にフォールバックします

メッセージが空の @lid チャットについてバックフィルをリクエストする場合:

キープアライブデーモンがストアのロックを保持しているため、バックフィルを直接実行できません。代わりに:

  1. JID を ~/.wacli/.backfill_jids に書き込みます(1 行に 1 つ)
  2. デーモンを再起動します:launchctl kickstart -k gui/$(id -u)/com.claude-ops.wacli-keepalive
  3. デーモンは永続的な同期を開始する前にバックフィルを実行します

wacli のトラブルシューティング:

  • @lid JID(リンク済みデバイス形式)ではメッセージが空で返されることがあります → 上記の手順でデーモン経由のバックフィルをリクエストします
  • 「Client outdated (405)」→ ソースから再ビルドします:cd /tmp && git clone https://github.com/Lifecycle-Innovations-Limited/wacli.git && cd wacli && go build -o /usr/local/bin/wacli ./cmd/wacli/
  • 「store is locked」→ キープアライブデーモンがロックを保持しています。ロックを解除するには:launchctl bootout gui/$(id -u)/com.claude-ops.wacli-keepalive
  • 認証の有効期限切れ → デーモンはヘルスファイルに needs_auth を書き込みます。ユーザーに QR コードのスキャンを促します
  • キーの同期ずれ(同期済みメッセージが 0 件)→ デーモンは needs_reauth を書き込みます。ユーザーは wacli auth で再ペアリングする必要があります
メール(全件スキャン+詳細なコンテキスト)

フェーズ 1 — 分類:

  1. gog gmail search -a $GMAIL_ACCOUNT -j --results-only --no-input --max 30 "in:inbox" を使って in:inbox を検索します(is:unread は使用しません)
  2. 各スレッドについて、gog gmail thread get -a $GMAIL_ACCOUNT <threadId> -j を使ってスレッド全体を読み取ります。最後のメッセージだけでなく、すべてのメッセージを読みます
  3. 最後のメッセージの From ヘッダーと labelIds(SENT、DRAFT)を確認します
  4. 次のように分類します:
    • 返信が必要:最後の送信者が自分ではなく、未送信の下書きもない → 対応が必要です
    • 返信待ち:最後の送信者が自分(SENT ラベル)→ 返信待ちです
    • 下書き:未送信の下書きがある → すでに返信を送信していないことを確認してから、送信を提案します
    • 参考情報:ニュースレター、自動通知、領収書 → まとめてアーカイブします

フェーズ 2 — 返信が必要な項目のコンテキストを作成(並列で実行): 返信が必要な各スレッドについて、次の情報を収集します:

  1. スレッド全体の要約 — スレッド内のすべてのメッセージを読み、会話の流れ(誰が何を述べたか、重要な決定、未解決の質問)を要約します
  2. 連絡先プロフィール — 送信者について:
    • gog gmail search -j --results-only --no-input --max 10 "from:<sender_email>" — 相手から届いた最近のメール
    • wacli contacts --search "<sender_name>" --json — WhatsApp の連絡先
    • wacli messages search --query "<sender_name>" --json --limit 5 — WhatsApp での最近の言及
    • 名前、役職/会社、関係の履歴、直近の N 件のやり取りをまとめます
  3. トピック検索 — 件名と本文から重要な語句を抽出し、次を実行します:
    • gog gmail search -j --results-only --no-input --max 5 "subject:<keywords>" — 関連スレッド
    • 関連スレッドから、保留中の決定、期限、対応項目を特定します

フェーズ 3 — 詳細なコンテキストを添えて提示:

📧 EMAIL — NEEDS REPLY (with context)

━━━ 1. [Sender] — [Subject] ━━━
 Who: [sender's role, company — from contact search]
 History: [last 3 email exchanges with this person]
 Thread summary: [2-3 sentences covering the full conversation arc]
 Their message: [full body of their last message — NOT truncated]
 Related: [any related threads or pending decisions found]

 Draft reply: "[context-aware draft using full thread + contact history]"

 [Send draft] [Edit draft] [Read full thread] [More...]

If "More...":
 [Archive] [Skip]

📧 EMAIL — DRAFTS (unsent)
 N. [Recipient] — [Subject] (draft ready to send)

📧 EMAIL — FYI / ARCHIVE
 N. [Sender] — [Subject] (newsletter/notification)

  For each NEEDS REPLY:
  a) Read full thread + draft reply
  b) Archive (no reply needed)
  c) Skip

  For FYI section:
  x) Archive all FYI at once

返信が必要なメールごとに AskUserQuestion を使用し、[Read + Reply] / [Archive] / [Skip] の選択肢を提示します。

返信する場合は、返信の下書きを作成し、AskUserQuestion を使用して確認します:

Reply to [Sender] — [Subject]:
  "[drafted reply]"

  [Send]  [Edit]  [Skip]

参考情報をまとめてアーカイブする場合は、AskUserQuestion を使用します:

Archive N FYI/newsletter emails?
  [list of subjects]

  [Archive all N]  [Review each]  [Skip]

返信の下書きには gog gmail send を使用します。アーカイブには gog gmail archive <messageId> ... --no-input --force を使用します。

Slack

メンションには query: "in:*"(最近のアクティビティ全体をスキャンするため、is:unread は使用しません)を指定して Slack MCP ツールを使用します。 各結果について、チャンネル、送信者、プレビューを表示します。コンテキストを確認するため、スレッドを読み取ります。

  a) Read thread
  b) Reply
  c) Mark read / skip
Telegram(フルスキャン — ユーザーアカウント、ボットではありません)

Telegram 連携では、BotFather のボットではなく、ユーザーの個人アカウント(tdlib/MTProto によるユーザー認証)で認証する必要があります。目的は、wacli 経由の WhatsApp と同様に、実際の会話を管理することです。

利用可能な場合は、Telegram のユーザー認証 MCP サーバーを使用してください。

  1. 最近のダイアログ/会話を一覧表示します(過去 7 日間)
  2. それぞれについて、最後のメッセージを誰が送信したかを確認します
  3. 分類します:返信が必要/返信待ち/対応済み
✈️  TELEGRAM — NEEDS REPLY
 1. [Contact] — [preview] — [time ago]

  a) Read thread + reply
  b) Archive
  c) Skip

Telegram のユーザー認証ツールが利用できない場合は、「Telegram は未設定です — ユーザー認証 MCP サーバー(tdlib/MTProto)が必要です」と報告してください。

Notion(MCP — コメント、メンション、割り当てられたタスク)

Notion はナレッジベースおよびタスク管理チャネルとして機能します。メッセージングチャネルとは異なり、Notion の「受信トレイ」項目は次のとおりです。

  • 自分が所有するページ、または自分がメンションされたページへのコメント
  • 追跡対象のデータベースで自分に割り当てられたタスク
  • 監視対象のデータベース内で最近更新されたページ

フェーズ 1 — 検出とスキャン:

  1. mcp__claude_ai_Notion__notion-search を使用して最近のアクティビティを検索します:
    • query: ""(空文字列を指定すると最近のページが返されます)や、トピック固有の語句など、幅広いクエリを使用します
    • filter: {"property": "object", "value": "page"} を使用してページ(データベースではなく)に絞り込みます
    • 最近のアクティビティを見つけやすくするため、last_edited_time の降順で並べ替えます
    • 注:Notion の検索はタイトル/コンテンツを対象とする全文検索です。メンションに基づくクエリや日付範囲のフィルターには対応していません
  2. 各検索結果について、ページ URL/ID を指定して mcp__claude_ai_Notion__notion-fetch で全コンテンツを取得します
  3. アクティブなページのコメントを取得します:ページ ID を指定して mcp__claude_ai_Notion__notion-get-comments を使用し、コメントの作成者とタイムスタンプを確認して、返信が必要かどうかを判断します

フェーズ 2 — 分類:

コメントまたはメンションがある各ページを次のように分類します:

  • 返信が必要:誰かがコメントまたはあなたをメンションしており、まだ返信していません
  • 返信待ち:最後にコメントしたのがあなたで、他の人からの返信を待っています
  • 参考情報:ページは更新されていますが、直接のメンションや必要な対応はありません
  • タスク:データベース内であなたに割り当てられた項目です(ステータスプロパティを確認してください)

フェーズ 3 — コンテキストを添えて提示:

📓 NOTION — NEEDS REPLY

━━━ 1. [Page Title] — [Database Name] ━━━
 Page: [page URL]
 Comment by: [commenter name] — [time ago]
 Comment: "[full comment text]"
 Page context: [2-3 sentence summary of the page content]

 Draft reply: "[context-aware reply to the comment]"

 [Reply] [View page] [Skip] [More...]

If "More...":
 [Mark resolved] [Archive]

📓 NOTION — ASSIGNED TASKS

 N. [Task title] — [database] — Status: [status] — Due: [date]
    Context: [1-line summary]

📓 NOTION — RECENTLY UPDATED (FYI)

 N. [Page title] — updated by [person] — [time ago]

返信が必要な項目ごとに AskUserQuestion を使用してください。

Notion のコメントに返信する場合:

  • ページ ID と返信テキストを指定して mcp__claude_ai_Notion__notion-create-comment を使用します
  • 元のコメントの丁寧さに合わせます
  • 関連する場合は、ページ内の具体的な内容に言及します

タスクを更新する場合:

  • mcp__claude_ai_Notion__notion-update-page を使用して、ステータスの変更やメモの追加を行います
  • ユーザーが明示的に承認したプロパティのみを更新します

API へのフォールバック(MCP が停止している場合): Notion MCP ツールが失敗するか利用できず、NOTION_API_KEY が設定されている場合は、直接 API にフォールバックします:

curl -s -H "Authorization: Bearer $NOTION_API_KEY" -H "Notion-Version: 2022-06-28" \
  -H "Content-Type: application/json" \
  -X POST https://api.notion.com/v1/search \
  -d '{"sort":{"direction":"descending","timestamp":"last_edited_time"},"page_size":10}'

NOTION_MCP_ENABLED が設定されていない場合、または Notion MCP ツールが利用できない場合は、「Notion は未設定です — NOTION_MCP_ENABLED=true を設定し、claude.ai 経由で Notion 連携を追加するか、セルフホスト MCP を追加してください」と報告してください。

Discord(v1 — REST チャネルスキャン)

Discord v1 のサポート範囲はチャネル単位です(Webhook 送信 + REST 読み取り)。DM とゲートウェイは v2 の課題として延期されています。

  1. 読み取り対象を解決します:${CLAUDE_PLUGIN_DATA_DIR}/preferences.json の discord.inbox_channels[] を読み取ります。空で、DISCORD_GUILD_ID が設定されている場合は、bin/ops-discord channels --json にフォールバックします(サーバーのテキストチャネルを一覧表示し、AskUserQuestion を使用してユーザーに選択してもらいます。ルール 1 に従い最大 4 件とし、[More...] でページ送りします)。
  2. 各チャネル ID について:
    ${CLAUDE_PLUGIN_ROOT}/bin/ops-discord read "<CHANNEL_ID>" --limit 20 --json
    
  3. 各チャネルの最近のメッセージを分類します:
    • 返信が必要:最新のボット以外のメッセージがオペレーター(<@user-id>)にメンションしている、または直接の質問です。
    • 参考情報:ボットが投稿した通知(CI、アラート)です。件数を要約し、スキップします。
  4. 返信には、skills/ops-comms/SKILL.md → Discord 送信に記載されている send の手順を再利用します。

bin/ops-discord が終了コード 1 で {"error":"no discord credential configured — run /ops:setup discord"} を返した場合は、1 行のメモを出力して次のチャネルに進みます。受信トレイのフロー内でプロンプトを表示しないでください。

💬 DISCORD — activity (last 7d)
 #channel-name  [N messages] | [M need reply]

完了

選択したすべてのチャンネルを処理した後、次を表示します。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 INBOX ZERO ✓ — [timestamp]
 Processed: [N] messages | Replied: [N] | Archived: [N]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

$ARGUMENTS でチャンネル(例:whatsapp)が指定されている場合は、メニューをスキップして、そのチャンネルに直接移動します。


ネイティブツールの使用

タスク — 受信トレイの進捗状況

処理する各チャンネルに対して TaskCreate を使用します。メッセージへの返信/アーカイブ/スキップに応じて TaskUpdate で更新します。ユーザーに受信トレイをゼロにする進捗バーをリアルタイムで表示します。

Cron — 受信トレイの定期チェック

処理後、AskUserQuestion を使用して、受信トレイの定期チェックをスケジュールするかどうかを確認します。

  [Schedule inbox check every 2 hours]  [Schedule morning + evening]  [No schedule]

選択された場合は CronCreate を使用します。既存のスケジュールは CronList で表示します。

コメント