ops-comms について
ops-comms は、WhatsApp、メール、Slack、Telegram、Discord、Notion の連絡を扱う Claude スキルです。チャネルに応じて処理を振り分け、送信前にメッセージをプレビューします。
主な機能
- 01チャネル別のメッセージ振り分け
- 02最近のチャットやスレッドの表示
- 03連絡先や会話の検索
- 04送信前のプレビューと確認
活用シーン
- 01各メッセージチャネルの最近の動向を確認
- 02連絡先へのメッセージを作成して送信
- 03Notion のページやコメントを検索
MCP 対応
設定済みの MCP ツールで Slack、Gmail、Telegram、Notion の操作を行います。WhatsApp と Discord の処理には CLI を使用します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ davepoon/ buildwithclaude --skill ops-commsインストール後、Claude Code で/ops-commsを入力して読み込まれたか確認します。
詳細
OPS ► COMMS
実行時コンテキスト
実行する前に、利用可能なコンテキストを読み込みます。
-
デーモンのヘルス状態:
${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/daemon-health.jsonを読み取ります- WhatsApp の操作を行う前に、
wacli-syncのステータスを確認します ~/.wacli/.healthも確認し、status=connectedでない場合は、続行する前に認証の問題を提示します
- WhatsApp の操作を行う前に、
-
Ops のメモリー:メッセージを作成する前に、
${CLAUDE_PLUGIN_DATA_DIR}/memories/を確認します。contact_*.md— 受信者のプロフィールを読み込みますpreferences.md— ユーザーのコミュニケーションスタイル、言語、トーンに合わせますdonts.md— 作成するメッセージに含めてはならない制約を確認します
-
設定:
${CLAUDE_PLUGIN_DATA_DIR}/preferences.jsonのdefault_channelsを読み取り、連絡先に複数のチャンネルが利用可能な場合に、優先するチャンネルを決定します。
CLI/API リファレンス
wacli(WhatsApp)
ヘルスファイル — wacli コマンドを実行する前に、~/.wacli/.health を確認します。
status=connected→ 続行しますstatus=needs_authまたはstatus=needs_reauth→ ユーザーに QR コードのスキャンを求め、wacli コマンドは実行しません
| コマンド | 用途 | 出力 |
|---|---|---|
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>" --json | FTS 検索 | 上記と同じ |
wacli contacts --search "<name>" --json | 連絡先の検索 | 連絡先オブジェクト |
wacli send --to "<JID>" --message "<msg>" | テキストを送信 | 成功/エラー |
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 send --to "[email protected]" --subject "subj" --body "text" | 新しいメールを送信 | 送信結果 |
gog gmail send --reply-to-message-id <msgId> --reply-all --body "text" | 全員に返信 | 送信結果 |
gog gmail send --to "[email protected]" --subject "subj" --body "text" --attach /path/file | 添付ファイル付きで送信 | 送信結果 |
gog gmail archive <messageId> ... --no-input --force | メッセージをアーカイブ | アーカイブ結果 |
$ARGUMENTS を解析し、直ちに振り分けます。
振り分け表
| パターン | アクション |
|---|---|
whatsapp | WhatsApp の最近のチャットを表示し、読み取りまたは送信を選べるようにする |
email | Gmail MCP 経由で最近のメールスレッドを表示 |
slack | 最近の Slack アクティビティを表示 |
telegram | Telegram の最近のチャットを表示 |
discord | 最近の Discord チャンネルのアクティビティを表示(bin/ops-discord 経由) |
notion | Notion ワークスペースを検索 — ページ、コメント、タスク |
send * to * | メッセージと連絡先を解析し、最適なチャンネルを決定して送信 |
read * | 指定されたチャンネルまたは連絡先のメッセージを読み取る |
| (空) | チャンネル選択メニューを表示 |
自然言語の解析:send "deploy done" to #general on discord や to #ops-alerts on Discord のようなフレーズは、以下の discord 分岐に振り分けます。チャンネルトークン(# の後に続く単語。大文字と小文字は区別しません)を抽出し、bin/ops-discord send の最初の引数として渡します。
送信フロー:send [message] to [contact]
$ARGUMENTSから連絡先名とメッセージを解析します。- 連絡先を検索してチャネルを特定します:
- WhatsAppを確認:
wacli contacts --search "[contact]" --json 2>/dev/null - Slackを確認:
query: "[contact]"を指定してmcp__claude_ai_Slack__slack_search_users - メールを確認:コンテキストから特定するか、質問します。
- WhatsAppを確認:
- 複数のチャネルが見つかった場合は、
AskUserQuestionを使用します:[WhatsApp]/[Slack]/[メール] - 送信前に必ずプレビューします。
AskUserQuestionを使用して確認します:
Ready to send via [channel]:
To: [contact name] ([identifier])
Message: "[full message text]"
[Send now] [Edit message] [Cancel]
ユーザーが「メッセージを編集」を選んだ場合は、AskUserQuestionで自由入力の修正メッセージを求めてから、再度プレビューします。
- 選択したチャネルで送信します。次の形式で確認します:
Sent to [contact] via [channel] ✓
WhatsAppで送信
重要 — 送信前に読むこと: WhatsAppの返信を作成する前に、必ず次の手順を実行してください。
- 会話全体を読みます:
wacli messages list --chat "<JID>" --limit 20 --json - どのメッセージがユーザーからのもの(
FromMe: true)で、どれが連絡先からのものかを把握します。 - 会話の内容と連絡先からの質問を要約します。
- その後に限り、連絡先が実際に述べた内容に対応する返信を作成します。
単一のメッセージだけを根拠に返信してはいけません。 「Klaviyoから取得してもらえますか?」のようなメッセージは、それ以前のメッセージを確認して「それ」が何を指すのか把握しない限り、意味が分かりません。
事前確認: wacliのコマンドを実行する前に、~/.wacli/.healthを確認します。status=needs_authまたはstatus=needs_reauthの場合は、ユーザーに「WhatsAppの再認証が必要です。別のターミナルでwacli authを実行してQRコードをスキャンし、完了したら「done」と入力してください。」と案内します。AskUserQuestionを使用します:[完了 — 再ペアリング済み]、[WhatsAppをスキップ]。完了を選んだ場合は、デーモンを再起動します:launchctl kickstart -k gui/$(id -u)/com.claude-ops.wacli-keepalive。5秒待ちます。
wacli send --to "[contact]" --message "[message]"
Slackで送信
解決済みのチャネルID/ユーザーIDを指定して、mcp__claude_ai_Slack__slack_send_messageを使用します。
メールを送信(下書き)
mcp__claude_ai_Gmail__create_draftを使用します。必ず最初に下書きを作成します。その後、AskUserQuestionを使用します:
Draft created for [recipient]:
Subject: [subject]
Body: [preview]
[Send now] [Keep as draft] [Edit]
読み取りフロー:read [channel]
WhatsApp:
wacli chats --limit 10 --json 2>/dev/null
送信者、プレビュー、タイムスタンプを含む直近10件のチャットを表示します。
メール:
query: "in:inbox"を指定してmcp__claude_ai_Gmail__search_threadsを使用し(is:unreadは使用せず、既読メッセージも含めて受信トレイ全体を確認します)、スレッドの一覧を表示します。
Slack:
query: "in:channel"を指定してmcp__claude_ai_Slack__slack_search_public_and_privateを使用します(is:unreadは使用せず、最近のアクティビティ全体を確認します)。
Telegram:
mcp__claude_ops_telegram__get_updates(limit: 20)とmcp__claude_ops_telegram__list_chatsを使用します。
次のコマンドにフォールバックします:telegram-cli --exec "dialog_list" 2>/dev/null || echo "Telegram MCP not configured"
Discord:
${CLAUDE_PLUGIN_ROOT}/bin/ops-discord read "<CHANNEL_ID>" --limit 20 --json。DISCORD_BOT_TOKEN(またはcredential-storeのdiscord/bot-token)が必要です。ユーザーがチャネルIDを知らず、DISCORD_GUILD_IDが設定されている場合は、bin/ops-discord channels --jsonにフォールバックします。
Notion:
ユーザーのクエリを指定してmcp__claude_ai_Notion__notion-searchを使用します(一般的な閲覧の場合はquery: ""を指定し、last_edited_timeで並べ替えます)。結果ごとに次の処理を行います。
- 検索結果のページURL/IDを使用して
mcp__claude_ai_Notion__notion-fetchでページの全文を取得します。 mcp__claude_ai_Notion__notion-get-commentsでコメントを取得します。- ページタイトル、データベース名、最終編集者、最近のコメントを表示します。
Notion APIへのフォールバック: MCPツールが失敗し、NOTION_API_KEYが設定されている場合は、次を使用します:curl -s -H "Authorization: Bearer $NOTION_API_KEY" -H "Notion-Version: 2022-06-28" -X POST https://api.notion.com/v1/search -d '{"query":"<QUERY>","page_size":10}'
Notionのコメント/返信
コメントスレッドへの返信には、ページIDを指定してmcp__claude_ai_Notion__notion-create-commentを使用します。データベースに新しいページを作成する場合は、mcp__claude_ai_Notion__notion-create-pagesを使用します。
コメントを投稿する前に、必ずプレビューします:
Ready to comment on Notion page:
Page: [page title]
Comment: "[comment text]"
[Post comment] [Edit] [Cancel]
Telegramで送信
chat_id(list_chatsから取得)とtextを指定してmcp__claude_ops_telegram__send_messageを使用します。
Discord 送信
bin/ops-discord send を呼び出します。呼び出し形式は3種類です。
# By channel alias (resolves DISCORD_WEBHOOK_<UPPER> or DISCORD_WEBHOOK_URL)
${CLAUDE_PLUGIN_ROOT}/bin/ops-discord send "<channel-alias>" "<message>" --json
# By channel snowflake (17-20 digit ID, routed through bot token)
${CLAUDE_PLUGIN_ROOT}/bin/ops-discord send "<CHANNEL_ID>" "<message>" --json
# By full webhook URL (useful when the URL is stored per-project)
${CLAUDE_PLUGIN_ROOT}/bin/ops-discord send "https://discord.com/api/webhooks/<ID>/<TOKEN>" "<message>" --json
スクリプトが {"error":"no discord credential configured — run /ops:setup discord"} を返して終了コード 1 で終了した場合は、AskUserQuestion を使ってユーザーに確認します(ルール 1 に従い、選択肢は最大 4 個):[Run /ops:setup discord] / [Paste webhook URL now] / [Skip]。黙ってスキップしてはいけません。これはルール 3 に違反します。
注:DISCORD_WEBHOOK_URL は ops-fires 通知シンク(scripts/ops-notify.sh)と共有されています。すでに設定されている場合は、ユーザーに別の値を設定するよう求めず、/ops:comms discord send のデフォルトとして使用してください。
引数が空の場合 — チャンネル選択
ヘッダーを表示してから、AskUserQuestion を複数回に分けて呼び出します(各回の選択肢は最大 4 個):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPS ► COMMS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
選択肢を提示する前に、${CLAUDE_PLUGIN_DATA_DIR}/preferences.json を読み込み、設定済みのチャンネルを確認します。設定済みのチャンネルのみを表示します。選択肢の合計(設定済みチャンネル + 「メッセージを送信」)が 4 個以下の場合は、1 回の呼び出しで提示します。4 個を超える場合は、分けて呼び出します。
AskUserQuestion の呼び出し 1 — チャンネルを読み込む:
[Read WhatsApp]
[Read Email]
[Read Slack]
[More...]
AskUserQuestion の呼び出し 2(「More...」の場合のみ):
[Read Telegram]
[Send a message]
すべてのチャンネルが設定済みの場合、選択肢は 5 個になるため、必ず分けて呼び出します。チャンネルが 3 個だけ設定されている場合は、「Read X」+「Read Y」+「Read Z」+「メッセージを送信」= 4 個となり、1 回の呼び出しで提示できます。
選択したアクションを実行します。