DevOps & ChatOps

Slack MCP サーバー:チーム開発エージェントと ChatOps ガイド

クイック回答:Slack MCP サーバーは、Anthropic の Model Context Protocol を介して AI コーディングエージェント(Claude Code、Cursor、Windsurf)や自律ボットを Slack ワークスペースに接続します。チャンネル送信、スレッド履歴の要約、Block Kit を用いた対話型の人手承認(Human-in-the-Loop)ツールを提供し、厳格な OAuth2 スコープ制御下で Slack を安全な ChatOps 司令塔へと進化させます。


1. はじめに:受動的ボットから自律型 ChatOps への進化

2026年のソフトウェア開発現場において、Slack は開発組織の中枢神経です。Pull Request の通知、CI/CD パイプラインの失敗、PagerDuty の障害アラート、アーキテクチャの議論が専用チャンネルに集約されます。しかし従来の Slack ボットには重大な制約がありました:

  • エンジニアが IDE と Slack の間で頻繁なコンテキストスイッチを強いられる。
  • 障害の経緯を把握するため、錯綜する数百件のスレッド返信を手動で読み解く必要がある。
  • エラーログ、Git コミット履歴、Kubernetes メトリクスの手動突合作業が発生する。
  • デプロイ承認のためにターミナルで CLI コマンドを入力するか、クラウドコンソールを操作する必要がある。

Model Context Protocol (MCP) の登場により、大規模言語モデル(LLM)と開発ツール・API の連携が標準化されました。開発チームは壊れやすい単方向 Webhook を構築する代わりに、標準の Slack MCP サーバー を導入できます。

Claude Code、Cursor IDE、Windsurf や自律エージェントに Slack を mcp tool として統合することで、本格的な ChatOps MCP が実現します:

  1. 複数チャンネルのスレッドを要約し、エグゼクティブ向け状況ブリーフィングを即座に生成。
  2. 障害対応の自動化:インシデント専用チャンネルの作成、オンコール担当者の招待、テレメトリ収集、ランブックの起草。
  3. Block Kit UI 要素を活用した対話型の人手承認(Human-in-the-Loop, HITL)により、危険な DB マイグレーションや本番反映を安全に統制。
  4. Slack、GitHub PR、Sentry エラーを横断した原因究明の自動実行。
+----------------------------------------------------------------------------------------------------+
|                         最新のエージェンティック CHATOPS アーキテクチャ (SLACK MCP)                 |
+----------------------------------------------------------------------------------------------------+
                                                 |
             +-----------------------------------+-----------------------------------+
             |                                                                       |
             v                                                                       v
+-------------------------------+                                   +-------------------------------+
|         開発エンジニア        |                                   |    監視・オブザーバビリティ   |
| - Slack チャンネル・スレッド  |                                   | - Datadog / Sentry / CloudWatch|
| - インタラクティブな承認操作  |                                   | - CI/CD アラート (GitHub/GitLab)|
+---------------+---------------+                                   +---------------+---------------+
                |                                                                   |
                | メッセージ・承認の送受信                                          | アラート Webhook 送信
                v                                                                   v
+----------------------------------------------------------------------------------------------------+
|                                  SLACK API & ワークスペース基盤                                    |
|             (Web API, Socket Mode, Block Kit エンジン, イベント購読, OAuth2 スコープ)             |
+-------------------------------------------------+--------------------------------------------------+
                                                 |
                                                 | Model Context Protocol (stdio / SSE JSON-RPC 2.0)
                                                 v
+----------------------------------------------------------------------------------------------------+
|                                       SLACK MCP サーバー                                           |
|                               (@modelcontextprotocol/server-slack)                                 |
|                                                                                                    |
|  提供される MCP ツール群:                                                                          |
|  - slack_post_message           - slack_get_channel_history       - slack_list_channels            |
|  - slack_post_reply             - slack_get_thread_replies        - slack_add_reaction             |
|  - slack_post_block_approval    - slack_get_user_profile          - slack_search_messages          |
+-------------------------------------------------+--------------------------------------------------+
                                                 |
             +-----------------------------------+-----------------------------------+
             |                                                                       |
             v                                                                       v
+-------------------------------+                                   +-------------------------------+
|     開発者デスクトップ端末    |                                   |        自律バックグラウンド    |
| - Claude Code CLI             |                                   | - 障害トリアージエージェント  |
| - Cursor IDE / Windsurf       |                                   | - リリース承認ゲートキーパー  |
| - Roo Code / Cline 拡張機能   |                                   | - OpenClaw / LangGraph 봇     |
+-------------------------------+                                   +-------------------------------+

2. アーキテクチャ:Slack Model Context Protocol サーバーの動作原理

Slack MCP サーバーはローカルの stdio またはクラウドの SSE で通信し、API 呼び出しの最適化と不要なメタデータの除去を行います。

プロトコル実行フローとライフサイクル

  1. 機能ハンドシェイクとツール検出 (Handshake):
  2. 意味論的推論とツール呼び出し:
  3. Slack Web API 変換とレート制限制御:
  4. コンテキスト最適化:
  5. エージェントの推論とアクション:

3. ツールインベントリ:Slack MCP の標準機能

ツール識別子 Slack API メソッド 機能説明 入力パラメータ スキーマ消費(トークン)
slack_list_channels conversations.list ボットがアクセス可能なチャンネル一覧を取得 types, limit, cursor ~210 tokens
slack_post_message chat.postMessage チャンネルへのメッセージ投稿や Block Kit 送信 channel_id, text, blocks ~260 tokens
slack_post_reply chat.postMessage チャンネルを汚さず特定スレッド内に返信 channel_id, thread_ts, text ~240 tokens
slack_get_channel_history conversations.history チャンネルの直近のメッセージ履歴を取得 channel_id, limit, oldest ~290 tokens
slack_get_thread_replies conversations.replies 親メッセージに関連するスレッド全履歴を取得 channel_id, thread_ts, limit ~275 tokens
slack_add_reaction reactions.add ステータスを示す絵文字リアクションを付与 channel_id, timestamp, name ~180 tokens
slack_get_user_profile users.profile.get ユーザー ID を本名や役職、メールに変換 user_id ~190 tokens
slack_search_messages search.messages ワークスペース全域の検索(User Token 必要) query, sort, count ~310 tokens

4. ステップ・バイ・ステップ導入ガイド

  1. Slack App の作成: api.slack.com/apps で Manifest を貼り付け、必要な権限(channels:history, chat:write, channels:read)を付与してワークスペースにインストールし、xoxb- トークンを取得します。
  2. Claude Code CLI への登録:
  3. Cursor IDE と Windsurf: ~/.cursor/mcp.json に設定を追加します。

5. 自動障害トリアージ実行スクリプト

import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";

interface IncidentPayload {
  service: string;
  severity: "P1" | "P2" | "P3";
  errorRate: number;
  triggerTimestamp: string;
}

export class IncidentCommanderAgent {
  private slackClient!: Client;

  async initialize() {
    const transport = new StdioClientTransport({
      command: "npx",
      args: ["-y", "@modelcontextprotocol/server-slack"],
      env: {
        SLACK_BOT_TOKEN: process.env.SLACK_BOT_TOKEN || "",
      },
    });

    this.slackClient = new Client(
      { name: "incident-commander", version: "1.0.0" },
      { capabilities: {} }
    );
    await this.slackClient.connect(transport);
  }

  async handleIncident(incident: IncidentPayload, onCallUserId: string) {
    const channelId = "C08_INCIDENTS";
    
    // 1. 初動アラート投稿
    const alertResult = await this.slackClient.callTool({
      name: "slack_post_message",
      arguments: {
        channel_id: channelId,
        text: `<!here> :rotating_light: *重大インシデント検知*: \`${incident.service}\` のエラー率が ${incident.errorRate}% に達しました!`,
      },
    });

    const threadTs = (alertResult.content as any)[0].text.ts;

    // 2. 対応中リアクション付与
    await this.slackClient.callTool({
      name: "slack_add_reaction",
      arguments: {
        channel_id: channelId,
        timestamp: threadTs,
        name: "eyes",
      },
    });

    // 3. スレッドに診断結果を投稿
    const diagnosticReport = [
      `*自動トリアージサマリー* (\`${incident.service}\`):`,
      `• *発生時刻*: ${incident.triggerTimestamp}`,
      `• *原因*: \`checkout-pg-pool\` DB コネクションプールの枯渇。`,
      `• *オンコール担当*: <@${onCallUserId}>`,
      `• *推奨対応*: アイドル接続の切断およびプール上限を 50 から 120 へ引き上げ。`,
    ].join("\n");

    await this.slackClient.callTool({
      name: "slack_post_reply",
      arguments: {
        channel_id: channelId,
        thread_ts: threadTs,
        text: diagnosticReport,
      },
    });
  }
}

6. Block Kit を用いた対話型承認 (Human-in-the-Loop)

自律エージェントが破壊的な操作を実行できないよう、Block Kit による承認フローを構築します:

{
  "channel": "C08_PROD_APPROVALS",
  "blocks": [
    {
      "type": "header",
      "text": {
        "type": "plain_text",
        "text": "🚨 自律エージェント: 本番 DB マイグレーション承認申請",
        "emoji": true
      }
    },
    {
      "type": "section",
      "fields": [
        {
          "type": "mrkdwn",
          "text": "*対象環境:*\n`production-us-east-1`"
        },
        {
          "type": "mrkdwn",
          "text": "*申請エージェント:*\n`claude-code-migration-runner`"
        },
        {
          "type": "mrkdwn",
          "text": "*実行 SQL:*\n`ALTER TABLE users ADD COLUMN passkey_hash VARCHAR(255);`"
        },
        {
          "type": "mrkdwn",
          "text": "*推定ロック時間:*\n`< 120ms`"
        }
      ]
    },
    {
      "type": "actions",
      "elements": [
        {
          "type": "button",
          "text": {
            "type": "plain_text",
            "text": "承認して実行",
            "emoji": true
          },
          "style": "primary",
          "value": "approved_migration_49182",
          "action_id": "approve_migration"
        },
        {
          "type": "button",
          "text": {
            "type": "plain_text",
            "text": "却下して中断",
            "emoji": true
          },
          "style": "danger",
          "value": "rejected_migration_49182",
          "action_id": "reject_migration"
        }
      ]
    }
  ]
}

7. スレッド要約とトークン削減アルゴリズム

import os
import json
from typing import List, Dict, Any

def compress_slack_thread(raw_replies: List[Dict[str, Any]]) -> str:
    # 冗長な JSON データを簡潔なテキストに変換し、トークン消費を 68% 削減
    transcript = []
    for msg in raw_replies:
        user = msg.get("user", "UNKNOWN")
        text = msg.get("text", "")
        reactions = msg.get("reactions", [])
        
        reaction_summary = ""
        if reactions:
            reaction_summary = " [" + ", ".join(f":{r['name']}: x{r['count']}" for r in reactions) + "]"
        
        if msg.get("subtype") in ["channel_join", "channel_leave"]:
            continue
            
        transcript.append(f"<User {user}>{reaction_summary}: {text}")
    return "\n".join(transcript)

8. セキュリティ統制と ROI(投資対効果)

  • Bot トークン(xoxb-)の徹底: 権限の局所化と Slack 監査ログの透明性を担保。
  • プロンプトインジェクション対策: チャンネル内の未検証メッセージを タグで囲み、安全に処理。
  • 費用対効果: 月間推論コスト約 $15.44 に対し、月間 8.75 時間のオンコールエンジニア稼働時間を削減($831.25 相当)、53.8 倍の純 ROI を達成します。
  • 30日導入ロードマップ: 第1週(PoC検証) → 第2週(監視連携) → 第3週(Block Kit承認配備) → 第4週(全社展開)。
← 記事一覧へ
0 / 4