
Slackを使ってmacのclaude codeを遠隔で操作してみた
こんにちは、せーのです。今日は 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 App で User Token(xoxp-)を用意します。この構成で必要なスコープは次のとおりです。
- User Token の OAuth スコープ:
groups:read(プライベートチャンネル一覧)、groups:history(プライベートチャンネルのメッセージ閲覧)、chat:write(返信投稿) - Settings → Socket Mode を有効にし、App-level Token(
xapp-)を 1 つ発行 - Event Subscriptions を有効にし、Subscribe to bot events に
message.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 に「最後のユーザー指示に対して回答してください」と渡す
subprocessでclaude -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 で読み込みました。KeepAlive を true にしておくと、プロセスが落ちたときに自動で再起動してくれます。
また、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 がスレッドで返信(処理時間と @メンション付き)している様子のスクリーンショットです。

まとめ
Slack を使って Mac の Claude Code を遠隔で操作してみて、感じたのは次のような点です。
- きっかけは「Discord × Antigravity」のような遠隔操作の話で、Slack × Claude Code でも同じことができそうだと思ったこと。
- claude.ai/code に寄せる案は、ローカル MCP が使えなくなるため却下し、ローカル Mac を Slack から叩く形にしたこと。
- Socket Mode にすると、ngrok などの管理者承認なしで即時反応する Bot が作れること。
!ghostでトリガーし、スレッドで会話履歴を渡すことで、追加指示にも対応できること。- launchd と caffeinate -i で常時起動・スリープ対策をしておくと、外出先からも安定して使えること。
Claude Code の MCP がそのまま使えるので、カレンダー確認や Backlog チケット確認、Toggl の記録など、普段 PC でやっていることをスマホの Slack から指示する、という運用ができるようになりました。同じように「ローカルの Claude Code を遠隔で触りたい」という方の参考になれば幸いです。
参考資料
- X: Discord Bot が自宅PCの Antigravity を遠隔操作する話(きっかけになったポスト)
- Slack Socket Mode
- Slack API: auth.test
- Claude Code (claude.ai/code)(MCP はローカル接続のみのため、今回の構成では Web 版は未使用)








