はじめに
Claude Codeを動かして長時間のタスクを実行していると、完了したタイミングをすぐに把握したい場面が増えてきます。 毎回ターミナルを確認しに行くのは手間なため、Slackへの通知連携を試みました。
Claude CodeはMCP(Model Context Protocol)経由でSlackと連携できます。 公式ドキュメントの手順通りに進めたところ、WSLやホームサーバーというリモート環境特有のOAuth認証の問題で詰まりました。 本記事では、ssh -L(ローカルポートフォワーディング)を使ったこの問題の解決手順を紹介します。
使用環境 / 前提
- WSL、ホームサーバー上にClaude Codeがインストール済み
- ローカルマシンからSSH接続可能
- Slackワークスペースへのアプリ追加権限がある
公式手順で詰まった点
callbackPortとは
Slack MCPサーバーのOAuth認証フローでは、認証完了後にSlackがローカルの特定ポート(デフォルト: 3118)へコールバックします。Claude Codeの設定ファイルには以下のように記述します。
{
"mcpServers": {
"slack": {
"type": "http",
"url": "https://mcp.slack.com/mcp",
"oauth": {
"clientId": "SLACK_CLIENT_ID", # 公式サイトのコードに記載されているクライアントID
"callbackPort": 3118
}
}
}
}ローカルマシン上でClaude Codeを動かしている場合、ブラウザからのコールバックとClaude Codeが同じマシン上にいるため問題ありません。
WSLやホームサーバーでの問題
WSLやホームサーバー上でClaude Codeを動かしている場合、以下の構成になります。
- Claude Codeが動いている場所: リモートサーバー(
port 3118をリッスン) - OAuth認証URLを開く場所: ローカルマシンのブラウザ
- Slackのコールバック先: ブラウザが動いているローカルマシンの
localhost:3118
ローカルマシンのポート3118はホームサーバーには繋がっていないため、コールバックが届かずOAuth認証が失敗します。
ssh -L による解決方法
ssh -L(ローカルポートフォワーディング)を使うことで、ローカルマシンのポートへのアクセスをSSHトンネル経由でリモートサーバーに転送できます。
ssh -L [ローカルポート]:[リモートホスト]:[リモートポート] [接続先サーバー]今回の場合は以下のコマンドになります。
ssh -L 3118:localhost:3118 user@home-server
ssh -L 3118:localhost:3118 user@home-serverこれにより「ローカルマシンのlocalhost:3118へのアクセス」が「ホームサーバーのlocalhost:3118」に転送されます。Slackからのコールバックがトンネルを通ってClaude Codeに届くようになります。
注意:
ssh -R(リモートポートフォワーディング)とは転送の方向が逆です。-Lはローカル側のポートをリモートに転送します。ssh -Rについては「ssh -R を利用してWSLからWindowsのローカルサーバーに接続する」をご覧ください。
手順
1. Slack MCPの認証情報を取得する
以下の公式ドキュメントを参考に、SlackワークスペースでMCPアプリを作成し、クライアントIDを取得します。
参考: Slack MCP Server – Connect to Claude
2. Claude Codeの設定ファイルを編集する
ホームサーバー上の~/.claude.jsonのmcpServersに以下の内容を追加します。
{
"mcpServers": {
"slack": {
"type": "http",
"url": "https://mcp.slack.com/mcp",
"oauth": {
"clientId": "YOUR_CLIENT_ID_HERE", # 公式サイトのコードに記載されているクライアントID
"callbackPort": 3118
}
}
}
}3. ssh -Lトンネルを開く
ローカルマシンから以下のコマンドを実行します。
ssh -L 3118:localhost:3118 user@home-serverSSHセッションが確立されたらターミナルはそのままにして、次のステップへ進みます。
4. Claude Codeを起動して認証する
ホームサーバー上で別のターミナルを開き、Claude Codeを起動します。
claude起動後に /mcpコマンドを実行し、Slack MCPの認証フローを開始します。URLが表示されるのでブラウザで開き、Slackアカウントで認証を完了します。
注意:
ssh -Lトンネルが有効な状態であれば、Slackからのコールバックがトンネルを通ってホームサーバーのClaude Codeに届き、認証が正常に完了します。
認証完了後、Claude Codeにタスクを依頼する際に「完了したらSlackの #general に通知して」と伝えることで、タスク完了の通知をSlackで受け取れるようになります。
まとめ
ssh -Lを使ってポートを転送することで、WSLやホームサーバーなどのリモート環境上のClaude CodeにSlack MCPを連携させることができます。 これにより、長時間タスクの完了をSlack通知で受け取れるようになり、作業の効率が上がります。参考になれば幸いです。


コメント