mcpField
O
ops-comms

ops-comms

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

ops-comms について

ops-comms は、WhatsApp、メール、Slack、Telegram、Discord、Notion の連絡を扱う Claude スキルです。チャネルに応じて処理を振り分け、送信前にメッセージをプレビューします。

主な機能

  1. 01チャネル別のメッセージ振り分け
  2. 02最近のチャットやスレッドの表示
  3. 03連絡先や会話の検索
  4. 04送信前のプレビューと確認

活用シーン

  1. 01各メッセージチャネルの最近の動向を確認
  2. 02連絡先へのメッセージを作成して送信
  3. 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

実行時コンテキスト

実行する前に、利用可能なコンテキストを読み込みます。

  1. デーモンのヘルス状態:${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/daemon-health.json を読み取ります

    • WhatsApp の操作を行う前に、wacli-sync のステータスを確認します
    • ~/.wacli/.health も確認し、status=connected でない場合は、続行する前に認証の問題を提示します
  2. Ops のメモリー:メッセージを作成する前に、${CLAUDE_PLUGIN_DATA_DIR}/memories/ を確認します。

    • contact_*.md — 受信者のプロフィールを読み込みます
    • preferences.md — ユーザーのコミュニケーションスタイル、言語、トーンに合わせます
    • donts.md — 作成するメッセージに含めてはならない制約を確認します
  3. 設定:${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>" --jsonFTS 検索上記と同じ
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 を解析し、直ちに振り分けます。

振り分け表

パターンアクション
whatsappWhatsApp の最近のチャットを表示し、読み取りまたは送信を選べるようにする
emailGmail MCP 経由で最近のメールスレッドを表示
slack最近の Slack アクティビティを表示
telegramTelegram の最近のチャットを表示
discord最近の Discord チャンネルのアクティビティを表示(bin/ops-discord 経由)
notionNotion ワークスペースを検索 — ページ、コメント、タスク
send * to *メッセージと連絡先を解析し、最適なチャンネルを決定して送信
read *指定されたチャンネルまたは連絡先のメッセージを読み取る
(空)チャンネル選択メニューを表示

自然言語の解析:send "deploy done" to #general on discord や to #ops-alerts on Discord のようなフレーズは、以下の discord 分岐に振り分けます。チャンネルトークン(# の後に続く単語。大文字と小文字は区別しません)を抽出し、bin/ops-discord send の最初の引数として渡します。


送信フロー:send [message] to [contact]

  1. $ARGUMENTSから連絡先名とメッセージを解析します。
  2. 連絡先を検索してチャネルを特定します:
    • WhatsAppを確認:wacli contacts --search "[contact]" --json 2>/dev/null
    • Slackを確認:query: "[contact]"を指定してmcp__claude_ai_Slack__slack_search_users
    • メールを確認:コンテキストから特定するか、質問します。
  3. 複数のチャネルが見つかった場合は、AskUserQuestionを使用します:[WhatsApp]/[Slack]/[メール]
  4. 送信前に必ずプレビューします。 AskUserQuestionを使用して確認します:
Ready to send via [channel]:
  To: [contact name] ([identifier])
  Message: "[full message text]"

  [Send now]  [Edit message]  [Cancel]

ユーザーが「メッセージを編集」を選んだ場合は、AskUserQuestionで自由入力の修正メッセージを求めてから、再度プレビューします。

  1. 選択したチャネルで送信します。次の形式で確認します:Sent to [contact] via [channel] ✓
WhatsAppで送信

重要 — 送信前に読むこと: WhatsAppの返信を作成する前に、必ず次の手順を実行してください。

  1. 会話全体を読みます:wacli messages list --chat "<JID>" --limit 20 --json
  2. どのメッセージがユーザーからのもの(FromMe: true)で、どれが連絡先からのものかを把握します。
  3. 会話の内容と連絡先からの質問を要約します。
  4. その後に限り、連絡先が実際に述べた内容に対応する返信を作成します。

単一のメッセージだけを根拠に返信してはいけません。 「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 回の呼び出しで提示できます。

選択したアクションを実行します。

コメント