Slackを使ってmacのclaude codeを遠隔で操作してみた

Slackを使ってmacのclaude codeを遠隔で操作してみた

2026.02.20

こんにちは、せーのです。今日は Slack を使って Mac の Claude Code を遠隔で操作してみましたので、共有します。

やりたかったこと

きっかけはXでのあるポストでした。Discord Bot が自宅 PC の Antigravity を遠隔操作する、というアーキテクチャの話を見て、「Discord × Antigravity ができるなら、Slack × Claude Code もできるはずだ」と思ったのです。

普段から Claude Code(Cursor 内の Claude Code セッション)で、Slack や Backlog、Google Calendar などの MCP を使って作業しています。外出先から「今日のカレンダー確認して」「〇〇プロジェクトの Backlog チケットを確認して」といった指示を、スマホの Slack から送れたら便利だろうな、というのがやりたかったことです。

方針の検討

まず、Web の claude.ai/code に寄せて、スマホの Claude アプリから操作する方法を考えました。が、調べてみると、そちらではローカルで接続している MCP が全て使えなくなるということでした。Backlog や Toggl、Google Calendar などはすべてローカル依存の MCP なので、ブラウザ版では動きません。

それであれば、ローカルの Mac を Slack から動かすという方法を取ろう、と方針を決めました。Mac 上で Claude Code を起動するので、いつも使っている MCP をそのまま使えます。

Slack のリアルタイム通信方式

Slack で「メッセージが来たら即反応する」には、いくつか方式があります。

方式 リアルタイム 管理者承認
RTM API 即時 不要(レガシー)
Socket Mode 即時 不要(自分のアプリなら)
Event Subscriptions + Webhook 即時 要(ngrok 等が必要)
ポーリング 最大 N 秒 不要

既存の Slack Bot Token(User Token: xoxp-)のスコープを確認したところ、RTM API は missing_scope で使えないことが判明しました。そこで Socket Mode(WebSocket)で実装することにしました。

完成形のイメージ

次のような流れです。

スマホ Slack
  ↓ !ghost <指示>
#ghost-commands(プライベートチャンネル・例)
  ↑↓ WebSocket(Socket Mode・即時)
Mac(launchd 常時起動)
  → ghost_socket.py → claude -p "<指示>"(permission で許可済みのツールを実行)
  → Claude Code(Slack / Backlog / Toggl 等の MCP が全て使える)
  → 結果をスレッドに返信 + @メンションで通知

スマホに通知 → 結果を確認

プライベートチャンネルに !ghost 今日のカレンダーを見て と送ると、Mac 上の Claude Code が実行され、結果がスレッドに返ってきます。スレッドで追加の指示を送れば、会話の流れを踏まえて回答してくれるようにもしました。

やってみた

Slack App の準備

Slack AppUser Tokenxoxp-)を用意します。この構成で必要なスコープは次のとおりです。

  • User Token の OAuth スコープ: groups:read(プライベートチャンネル一覧)、groups:history(プライベートチャンネルのメッセージ閲覧)、chat:write(返信投稿)
  • Settings → Socket Mode を有効にし、App-level Token(xapp-)を 1 つ発行
  • Event Subscriptions を有効にし、Subscribe to bot eventsmessage.groups を追加

Slack 上でプライベートチャンネルを 1 つ作り、そのチャンネルで使う Bot を招待します。Bot がメンバーでないと message.groups のイベントが届きません。セキュリティのため、このチャンネルには自分だけ(または必要最小限のメンバー)を招待することをおすすめします。 ここに投稿できる人が、実質的に Ghost に指示を出せる対象になります。

実装の要点

スクリプトは Python で、slack_sdk の Socket Mode クライアントを使っています。

pip install slack_sdk

メインの流れは次のとおりです。

  • Socket Mode で WebSocket 接続し、message.groups のイベントを受け取る
  • メッセージが !ghost で始まっていれば、その後の文字列を「指示」として取り出す
  • スレッドの 2 通目以降の場合は、会話履歴を「最初のリクエスト」「Ghost の回答」「ユーザーの追加指示」……の形でまとめ、Claude に「最後のユーザー指示に対して回答してください」と渡す
  • subprocessclaude -p "<指示>" --output-format text を実行(permission で事前に許可したツールのみ実行される)
  • 標準出力を取得し、スレッドに返信(先頭に @自分のユーザーID を付けてメンション通知)

Claude 実行時には、現在のシェルに CLAUDECODE が設定されていると「Claude Code は別の Claude Code セッション内から起動できません」というエラーになるので、subprocess を呼ぶ前に環境変数から CLAUDECODE を削除しています。

env = os.environ.copy()
env.pop("CLAUDECODE", None)  # ネストセッションエラーを防ぐ

バックグラウンドでは対話的な「ツール実行を許可しますか?」に応じられないため、Claude Code の permission 設定であらかじめ実行を許可するツール(カレンダー・Backlog・Toggl など)を指定しておく形にしています。トリガー用チャンネルに投稿できる人=実質的にあなたの Mac 上でそれらの MCP を動かせる人になります。利用は自己責任で、プライベートチャンネルのメンバーを自分だけにする、トークンや設定ファイルを他者と共有しないなど、信頼できる環境に限定して使いましょう。

常時起動とスリープ対策

Mac 上でずっと動かすために、~/Library/LaunchAgents/ に plist を置き、launchctl load で読み込みました。KeepAlivetrue にしておくと、プロセスが落ちたときに自動で再起動してくれます。

また、Mac がスリープするとプロセスが止まるので、別の plist で caffeinate -i を常時起動し、アイドルスリープを防いでいます(画面は消えてよい設定です)。

ハマりポイントと解決策

① トリガーを /ghost にすると Slack がコマンド扱いする

Slack では / で始まるメッセージはスラッシュコマンドとして処理されます。そのため、トリガーは !ghost にしました。

② ツール実行の確認で止まる

「カレンダーへのアクセス許可が必要です。ツールの実行を許可してください。」のように対話的な確認が求められると、バックグラウンドでは応答できません。Claude Code の permission で、あらかじめ実行を許可するツールを設定しておくことで、確認なしで実行できるようにしました。

③ Bot がチャンネルにいないとイベントが届かない

Socket Mode と message.groups では、Bot がそのプライベートチャンネルのメンバーでないとイベントが届きません。チャンネルで使う Bot を /invite で招待しておく必要があります。

動作確認

実際にスマホの Slack から試した例です。

  • シンプルなテスト: !ghost 今日の日付を教えて を送ると、十数秒後にスレッドで「今日の日付は 2026年2月20日 です。」のような返答が届きます。
  • MCP を使うテスト: !ghost 今日のカレンダーを見て を送ると、Google Calendar の MCP 経由で今日の予定が返ってきます。
  • スレッドで追加指示: 例として「〇〇プロジェクトの Backlog チケットを確認して」を送ったあと、スレッドで「別のプロジェクトでした。△△プロジェクトでお願いします」と追加送信すると、会話履歴をコンテキストに含めて再度実行され、正しいプロジェクトのチケット一覧が返ってきます。

以下は、スマホから !ghost 今日の日付は? を送り、Ghost がスレッドで返信(処理時間と @メンション付き)している様子のスクリーンショットです。

cellphone_slack1.png

まとめ

Slack を使って Mac の Claude Code を遠隔で操作してみて、感じたのは次のような点です。

  • きっかけは「Discord × Antigravity」のような遠隔操作の話で、Slack × Claude Code でも同じことができそうだと思ったこと。
  • claude.ai/code に寄せる案は、ローカル MCP が使えなくなるため却下し、ローカル Mac を Slack から叩く形にしたこと。
  • Socket Mode にすると、ngrok などの管理者承認なしで即時反応する Bot が作れること。
  • !ghost でトリガーし、スレッドで会話履歴を渡すことで、追加指示にも対応できること。
  • launchdcaffeinate -i で常時起動・スリープ対策をしておくと、外出先からも安定して使えること。

Claude Code の MCP がそのまま使えるので、カレンダー確認や Backlog チケット確認、Toggl の記録など、普段 PC でやっていることをスマホの Slack から指示する、という運用ができるようになりました。同じように「ローカルの Claude Code を遠隔で触りたい」という方の参考になれば幸いです。

参考資料

この記事をシェアする

FacebookHatena blogX

関連記事