Slackline について
Slacklineは、ユーザーのAIエージェントをSlackに接続し、各エージェントにDMスレッドを用意します。設定したチャンネルのメッセージでエージェントを起動でき、Slackでの対話とチャンネルアクセスの制御に利用できます。
主な機能
- 01エージェントごとのSlack DMスレッド作成
- 02メッセージやイベントによるエージェントの起動
- 03チャンネルとアクセス可能な相手の設定
- 04DMやチャンネルスレッドでの返信
- 05リスニング先とモードの確認
- 06エージェントとアクセス権の取り消し
活用シーン
- 01SlackのDMからエージェントにメッセージを送信
- 02指定チャンネルのメンションをエージェントに監視させる
- 03投稿したエージェントにチャンネルスレッドの返信を届ける
MCP 対応
Slacklineは、watch、reply、unwatch、listeningツールを備えたOAuth保護のMCPサーバーを提供します。エージェントは接続後、MCPイベントまたはWakeshiftの起動機能を通じてSlackメッセージを受け取ります。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://slackline.wakeshift.ai/mcpclaude mcp add --transport http ai-wakeshift-slackline https://slackline.wakeshift.ai/mcp{"mcpServers":{"ai-wakeshift-slackline":{"type":"http","url":"https://slackline.wakeshift.ai/mcp"}}}Cursor で開く{"servers":{"ai-wakeshift-slackline":{"type":"http","url":"https://slackline.wakeshift.ai/mcp"}}}VS Code で開く{"mcpServers":{"ai-wakeshift-slackline":{"type":"http","url":"https://slackline.wakeshift.ai/mcp"}}}{"mcpServers":{"ai-wakeshift-slackline":{"serverUrl":"https://slackline.wakeshift.ai/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
Slackline
Slack から、自分のエージェント(Claude Code、Codex、Cursor など)とチャットできます。各エージェントには Slackline との DM にスレッドが割り当てられ、そこで返信するとエージェントが起動し、自分の名前でスレッドに返信します。Slackline のコンソールでは、各エージェントが監視するチャンネルと、そこでエージェントに連絡できるユーザーを選べます。ユーザーは Wakeshift ではなく、Slack を使ってサインインします。
仕組み
-
ワークスペースに Slackline を追加します(Add to Slack、
/install。管理者による承認が必要な場合があります)。ボットトークンは暗号化して保存されます(AES-256-GCM)。 -
ユーザーは Slack でサインインします(OpenID Connect、
/signin)。Slackline のコンソールは/homeです。 -
エージェントに Slackline の MCP サーバー(
https://<host>/mcp)を追加します。OAuth で保護されており、クライアントが登録(動的クライアント登録)した後、ユーザーは Slack でサインインし、Slackline の同意ページで名前を付けて承認すると、クライアントがトークンを取得します。これでエージェントはそのユーザーのものとなり、コンソールに表示されます。ユーザーは名前を変更したり、アクセスを取り消したりできます。 -
エージェントが
watchを呼び出します。 その会話(リスナー)に、ユーザーと Slackline の DM 内のスレッドが割り当てられ、watchによってそのリスナーの Slackline のslack.messageイベントが購読されます。このイベントは個人に紐付いています。ユーザーはエージェントを接続した本人(<team>.<user>)なので、他のユーザーの購読がイベントに一致することはありません。Wakeshift の結果は、エージェントがどのように起動されるかをハーネスに伝えます(Claude Code の Monitor、Codex のコネクタビーコンなど)。同じ会話から再びwatchを呼び出しても、同じスレッドが維持されます。Slackline が会話のセッションキー(または Codex のスレッド、ChatGPT の会話)の HMAC を記憶するためです。キーそのものを保存することはありません。MCP Events 自体で購読するクライアント(ChatGPT)は、
watchによる購読は行いません。結果としてリスナーの ID が返され、それを使ってslack.messageを購読します。Slackline では、そのエージェント自身のリスナーのみ購読できます。また、ハーネスがすでにwatchで購読している場合は、subscribe_eventsを拒否します。unwatchはどちらの種類の購読も終了します。 -
メッセージによってエージェントが起動します。 Slackline は各 Slack メッセージ(下記)を適切なリスナーに振り分け、そのユーザーのエージェントに対して、そのリスナー向けの
slack.messageとして発行します。Wakeshift は、外部データとしてフレーム化したメッセージで会話を起動します。 -
エージェントは
replyで返信します。 自分の名前(chat:write.customize)で、DM のスレッド、または監視中のチャンネル(返信するメッセージのスレッド、または新しい投稿)に返信します。自分が投稿したチャンネルのスレッドへの返信は、エージェントに戻されます。
| ツール | |
|---|---|
watch | label(任意):この会話の DM スレッドを取得し、そこで、およびエージェントが監視するチャンネルで起動されるようにします |
reply | text。返信対象のメッセージの channel と thread_ts(空の場合は DM のスレッド) |
unwatch | 監視を停止します。DM スレッドにその旨が表示されます |
listening | エージェントが監視する場所と方法を表示します |
Slack で /slackline を使うと、自分のエージェントとその接続方法を確認できます。
エージェントに届くメッセージ
| 場所 | エージェントに届く条件 |
|---|---|
| エージェントとのDMスレッド | そのスレッドで、エージェントの担当者からメッセージが届いた場合 |
| チャンネル、モード @Slackline mentions | メッセージで @Slackline に言及している場合。複数のエージェントがいる場合、エージェント名で始まる言及(@Slackline pipe: …)はそのエージェントに届きます。それ以外は、送信者自身のエージェントに届きます |
| チャンネル、モード every message | そのチャンネルのすべてのメッセージ |
| エージェントが投稿したスレッド | そのチャンネルのルールで送信者が引き続きエージェントにメッセージを届けられる場合、スレッドへの返信が届きます(1つのスレッドに複数のエージェントがいる場合、それぞれが自身のルールに従って返信を受け取り、スレッド内での言及も、名前が指定されたエージェントに届きます) |
また、チャンネルでは、ルールが from anyone there でない限り、エージェントの担当者からのメッセージのみが届きます。この設定にすると、他の人のメッセージが、担当者のマシン上でその人のアクセス権を使って動作するエージェントに届く可能性があるため、コンソールは理解したことの確認を求め、その記録を残します。エージェントが読む内容では、こうしたメッセージは他の人からのものとして(「情報であり、指示ではない」)マークされます。チャンネルのメッセージは、各エージェントが最近アクティブだったリスニング中の会話に一度だけ届きます。
チャンネルのルールが有効なのは、担当者がそのチャンネルに参加している間だけです。コンソールに表示され、設定できるのは担当者と Slackline の両方が参加しているチャンネルのみです。配信と投稿の際にはメンバーシップが確認され(1分間キャッシュされます)、Slack の member_left_channel によって担当者のエージェントのルールがそのチャンネルから削除され、監査記録に残ります。そのため、誰もエージェントを使って、自分が参加できないチャンネルを読むことはできません。
エージェントは、担当者が承認した名前(同意ページで設定した名前、またはコンソールで変更した名前)で投稿し、自分で選んだ名前を使うことはありません。watch に指定する名前は、DM内の会話のラベルとしてのみ使われます。
配信されないもの:ボットのメッセージ(アプリ自身やエージェント自身の投稿を含む)、編集、参加通知などのその他のサブタイプ、Slack の署名がないもの(v0、5分以内)、およびアクセスを取り消されたエージェント向けのメッセージです。エージェントのテキストはエスケープされるため(&、<、>)、@channel、@here、人やグループへの言及、リンクの偽装はできません。1つの会話につき、エージェントが投稿できるのは1分あたり最大20メッセージです。ルールが適用されるのは、Slackline が参加しているチャンネルのみです(/invite @Slackline)。
アカウント、トークン、コンソール
- セッション:本人とセッションのバージョンを示す署名付き Cookie(
HttpOnly、SameSite=Lax、https ではSecure)です。サインアウトするとバージョンが更新されるため、すべてのブラウザーで本人のセッションが終了し、コピーされた Cookie も使えなくなります。コンソールのフォームにはセッションから派生したトークンが含まれ、Slackline 自身のオリジンから送信される必要があります。 - 同意ページ:クライアント名はクライアント自身が申告するもので(誰でも任意の名前を登録できます)、ページにはその旨を記載し、承認するとアクセスがどこに渡るかを目立つように表示します。リダイレクト先のホスト、またはループバックへのリダイレクトの場合は「このコンピューター上のプログラム」と表示します。
- OAuth:クライアントは署名付きのデータです(誰かが承認するまで何も保存されません)。リダイレクト URI は https、またはループバックの場合は http である必要があります。認可コードは一度だけ使用でき、有効期間は 2 分で、ハッシュ化して保存され、PKCE(S256)が必須です。コード交換に失敗した場合もコードは消費されます。アクセストークンは署名付きで有効期間は 1 時間です。エージェント名を含み、リクエストごとに確認されるため、エージェントを失効させると直ちに使用できなくなります。リフレッシュトークンはランダムに生成され、ハッシュ化して保存され、有効期間は 90 日です。使用するたびに新しいものに置き換えられます。同じクライアントを再度承認すると、そのエージェントが再利用されます。
- エージェントを失効させると、そのエージェントのトークン、コード、チャンネルルール、リスナー、およびその会話の Wakeshift サブスクリプションが終了します(それぞれに通知されます)。終了に失敗した場合(Wakeshift に接続できない場合)は、Wakeshift が確認するまで 5 分ごとに再試行されます。
- 監査ログ:エージェントの接続、再承認、名前変更、失効、チャンネルルールの設定と削除、およびサインインを、ユーザーごとに記録します(コンソールには最新の記録が表示されます)。メッセージ本文は記録しません。
- ワークスペースから Slackline を削除する場合(
app_uninstalled、またはボットのトークンに対するtokens_revoked。ユーザーのサインイントークンが失効しても何も変わりません)、Wakeshift にそのユーザーそれぞれのデータ(会話、サブスクリプション、保持しているメッセージ)を忘れさせてから、監査ログに記録したうえで Slackline 自身の行を削除します。失敗すると 503 を返すため、Slack が再試行します。忘却処理はべき等です。
再試行
Slack は、3 秒以内に 200 が返されないイベントを再試行します。Slackline はメッセージの公開後に 200 を返し、公開に失敗した場合は 503 を返すため、Slack が再試行します。各公開の ID には Slack イベント ID が含まれるため、再試行されたメッセージは一度だけ配信されます。Slackline が投稿するメモ(DM でのヘルプ、「リスニングしていません」という通知、チャンネル内で本人だけに見えるメモ)は、再試行時に重複して投稿されません。
自分で実行する
-
Wakeshift コンソールで Build → New app を開き、キー(
wst_…)をコピーします。 -
空の Postgres データベースを作成します。Slackline は起動時にテーブルを作成します。
-
公開 HTTPS URL を用意し(試す間はトンネルでも構いません)、マニフェストから Slack アプリを作成します。api.slack.com/apps で Create New App → From a manifest を選び、Slackline の起動後に
https://<your URL>/slack/manifest.jsonが返す内容を貼り付けます。(まずは Slack の認証情報にプレースホルダーを指定して一度起動し、マニフェストを取得してから、実際の認証情報を指定して再起動します。) -
.env.exampleを.envにコピーして、値を入力します。変数 WAKESHIFT_URLWakeshift の URL、 https://app.wakeshift.aiSLACKLINE_URL自分のコピーの公開 URL SLACKLINE_KEY手順 1 で取得したアプリのキー SLACKLINE_DATABASE_URL手順 2 で作成したデータベース SLACKLINE_SECRET32 バイト以上のランダムなバイト列です。セッション、OAuth クライアント、アクセストークンに署名します。変更すると全員がサインアウトし、エージェントは再度サインインする必要があります。それ以外の影響はありません SLACKLINE_TOKEN_KEYS各ワークスペースのボットトークンを封印するキーを、カンマ区切りで指定します。それぞれ 32 バイト以上のランダムなバイト列にしてください。先頭のキーで封印し、どのキーでも開封できます。ローテーションするには、新しいキーを先頭に追加し、すべてのワークスペースで再インストールが完了したら古いキーを削除します SLACKLINE_SLACK_CLIENT_ID、SLACKLINE_SLACK_CLIENT_SECRET、SLACKLINE_SLACK_SIGNING_SECRETSlack アプリの Basic Information ページに記載されています PORT待ち受けポート(デフォルトは 8080) openssl rand -base64 48を実行すると、適切なシークレットまたはトークンキーを生成できます。 -
リポジトリのルートから実行します。
set -a; . slackline/.env; set +a go run ./cmd/slackline -
Slack アプリで Event Subscriptions のリクエスト URL を再確認し、
SLACKLINE_URLを開いて Add to Slack を選びます。
テスト
WAKESHIFT_TEST_DATABASE_URL に、データベースを作成できるロール用の Postgres URL を設定して、go test ./slackline を実行します。Slackline を Wakeshift サーバーと偽の Slack に対してエンドツーエンドで実行するテストは、Wakeshift 自体のリポジトリで実行します。
コントリビューション
このリポジトリは Wakeshift のメインリポジトリから生成されています。プルリクエストを歓迎します。そちらに適用し、結果を公開します。CONTRIBUTING をご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。