SlackでAIを強化する | 第1章：メッセージデータの第一歩

## はじめに

**Slack**は、チームコミュニケーションを効率化する人気のプラットフォームです。チャンネル、ダイレクトメッセージ、アプリ連携を通じて、プロジェクト管理やコラボレーションをサポートします。強力なAPIとWebhookにより、メッセージの取得やボットの構築が可能です。一方、**Model Context Protocol（MCP）**は、AI（例：Claude）を外部データやツールと標準化された方法で接続するプロトコルです。このシリーズでは、SlackとMCPを統合し、メッセージやチャンネルデータを活用するエージェントAIを構築する方法を学びます。たとえば、AIがチームの会話からインサイトを抽出したり、自動応答したりできます。

第1章では、SlackとMCPの基本を理解し、Slackからメッセージデータを取得するシンプルなMCPサーバーを構築します。Claude Desktopと接続して、コミュニケーション管理の第一歩を踏み出しましょう。

## SlackとMCPの概要

### Slackとは？
Slackは、以下のような特徴を持つコミュニケーションツールです：
- **チャンネルベース**：プロジェクトやトピックごとにチャンネルを整理。
- **強力なAPI**：REST APIでメッセージ、チャンネル、ユーザーデータにアクセス。
- **Webhookサポート**：リアルタイムイベント（メッセージ投稿など）を検知。
- **多用途**：チームコラボレーション、タスク通知、アプリ統合に対応。

### MCPの役割
MCPは、AIにSlackのデータを提供する橋渡し役です。MCPサーバーを通じて、AIは以下を行えます：
- **データ取得**：メッセージやチャンネル情報を取得。
- **アクション実行**：メッセージ送信、チャンネル作成、ボット応答。
- **分析**：会話パターンやチームのエンゲージメントを評価。

### なぜSlackとMCPを組み合わせる？
この組み合わせは、以下のようなシナリオで強力です：
- 自動応答：AIがFAQに答えるボットを運営。
- 会話分析：AIがチームのコミュニケーション頻度やトピックを分析。
- 通知最適化：AIが重要なメッセージを要約し、Notionやメールに送信。

## 開発環境の準備

MCPサーバーとSlackを統合するには、以下の環境を準備します：
- **Python 3.8以降**：サーバー開発用。
- **mcpライブラリ**：JSON-RPC通信を処理（仮定のライブラリ、公式ドキュメントを参照）。
- **requestsライブラリ**：Slack APIとの通信用。
- **Claude Desktop**：MCP対応のAIクライアント。
- **テキストエディタ**：VS Code推奨。

インストールコマンド：
```bash
pip install mcp jsonrpcserver requests python-dotenv
```

### Slackのセットアップ
1. **Slackアプリ作成**：
   - [Slack API](https://api.slack.com/apps)にアクセスし、新しいアプリを作成（例：`MCP-Bot`）。
   - スコープを設定（例：`channels:history`、`channels:read`でメッセージとチャンネルデータにアクセス）。
   - Bot User OAuth Tokenを生成（`xoxb-`で始まるトークン）。
   - アプリをワークスペースにインストールし、チャンネル（例：`#mcp-project`）に追加。
2. **チャンネル準備**：
   - テスト用チャンネル（例：`#mcp-project`）を作成。
   - メッセージをいくつか投稿（例：「プロジェクト計画を議論」）。
   - チャンネルIDを記録（Slack APIの`channels.list`で取得可能）。
3. **環境変数の設定**：
   `.env`ファイルに以下を追加：
   ```bash
   SLACK_TOKEN=your_bot_token
   SLACK_CHANNEL_ID=your_channel_id
   ```

## コード例：Slack用MCPサーバー

```python
from mcp import MCPServer
import os
from dotenv import load_dotenv
import requests

class SlackServer(MCPServer):
    def __init__(self, host, port, token, channel_id):
        super().__init__(host, port)
        self.token = token
        self.channel_id = channel_id
        self.base_url = "https://slack.com/api"
        self.headers = {
            "Authorization": f"Bearer {token}",
            "Content-Type": "application/json"
        }
        self.register_resource("get_messages", self.get_messages)

    def get_messages(self, params):
        try:
            url = f"{self.base_url}/conversations.history"
            query = {"channel": self.channel_id, "limit": params.get("limit", 10)}
            response = requests.get(url, headers=self.headers, params=query)
            response.raise_for_status()
            messages = response.json()["messages"]
            message_list = [
                {
                    "text": msg["text"],
                    "user": msg.get("user", "unknown"),
                    "timestamp": msg["ts"]
                }
                for msg in messages
            ]
            return {"status": "success", "messages": message_list}
        except Exception as e:
            return {"status": "error", "message": str(e)}

if __name__ == "__main__":
    load_dotenv()
    server = SlackServer(
        host="localhost",
        port=8122,
        token=os.getenv("SLACK_TOKEN"),
        channel_id=os.getenv("SLACK_CHANNEL_ID")
    )
    print("Slack MCPサーバーを起動中: http://localhost:8122")
    server.start()
```

### コードの説明
- **requests**：Slack APIにGETリクエストを送信し、チャンネルのメッセージを取得。
- **get_messages**：指定したチャンネルの最新メッセージ（テキスト、ユーザー、タイムスタンプ）を取得。
- **register_resource**：メッセージ取得をリソースとして登録。
- **start()**：サーバーを起動。

### 前提条件
- Slackアプリがワークスペースにインストール済み。
- チャンネルが存在し、メッセージが投稿されている。
- `.env`ファイルに正しい`SLACK_TOKEN`と`SLACK_CHANNEL_ID`が設定済み。
- アプリに`channels:history`と`channels:read`スコープが付与されている。

## サーバーのテスト

サーバーが正しく動作するか確認します：

1. **サーバー起動**：
   ```bash
   python slack_server.py
   ```
   コンソールに「Slack MCPサーバーを起動中: http://localhost:8122」と表示。

2. **メッセージ取得のテスト**：
   Pythonでリクエストを送信：
   ```python
   import requests
   import json

   url = "http://localhost:8122"
   payload = {
       "jsonrpc": "2.0",
       "method": "get_messages",
       "params": {"limit": 5},
       "id": 1
   }
   response = requests.post(url, json=payload)
   print(json.dumps(response.json(), indent=2, ensure_ascii=False))
   ```
   期待されるレスポンス：
   ```json
   {
     "jsonrpc": "2.0",
     "result": {
       "status": "success",
       "messages": [
         {
           "text": "プロジェクト計画を議論",
           "user": "U123456",
           "timestamp": "1617187200.000100"
         },
         {
           "text": "タスク割り当てを確認",
           "user": "U789012",
           "timestamp": "1617187100.000200"
         }
       ]
     },
     "id": 1
   }
   ```

## Claude Desktopとの接続

サーバーをClaude Desktopに接続します：

1. **設定ファイルの編集**：
   Claude Desktopの設定ファイル（例：`claude_desktop_config.json`）に以下を追加：
   ```json
   {
     "mcp_servers": [
       {
         "name": "SlackServer",
         "url": "http://localhost:8122",
         "auth": "none"
       }
     ]
   }
   ```

2. **Claudeでテスト**：
   Claude Desktopを起動し、プロンプトを入力：
   ```
   チャンネルの最新メッセージを教えてください。
   ```
   レスポンス例：
   ```
   チャンネル #mcp-project の最新メッセージ：
   - ユーザー U123456: プロジェクト計画を議論
   - ユーザー U789012: タスク割り当てを確認
   ```

## 次のステップ

このMCPサーバーは、SlackとAIの連携の基礎です。次の第2章では、Slackにメッセージを送信したり、ボットを介して自動応答したりする機能を実装し、コミュニケーションを自動化するエージェントを構築します。たとえば、AIが特定のキーワードに反応して返信したり、Notionにタスクを追加したりできます。

## まとめ

この第1章では、SlackとMCPの基本を学び、シンプルなMCPサーバーを構築してメッセージデータを取得しました。Slackの強力なAPIとMCPの柔軟性を組み合わせることで、AIをチームコミュニケーションの強力なアシスタントに変えられます。次章以降では、メッセージ送信、会話分析、リアルタイム管理へと進化させます。

---

役に立ったと思ったら、「いいね」や「ストック」をしていただけると嬉しいです！次の章でまたお会いしましょう！