mcpField
S
slack-bot-builder

slack-bot-builder

github.com/davila7開発33.1k205 回インストール今日更新
リポジトリ

slack-bot-builder について

slack-bot-builderは、Bolt、Block Kit、OAuthによるインストールのパターンを扱うSlackアプリ開発スキルです。Slack連携を開発する人を対象としています。

主な機能

  1. 01Python、JavaScript、JavaでのBoltアプリ構築
  2. 02インタラクティブなBlock Kitメッセージレイアウト
  3. 03OAuthによる複数ワークスペースへのインストール
  4. 04トークン、スコープ、リクエスト処理の指針

活用シーン

  1. 01新しいSlackアプリの開始
  2. 02操作可能なフォームやメッセージの追加
  3. 03複数ワークスペースへのアプリ配布

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/davila7/claude-code-templates --skill slack-bot-builder

インストール後、Claude Code で/slack-bot-builderを入力して読み込まれたか確認します。

詳細

Slack Bot Builder

パターン

Bolt アプリ基盤パターン

Bolt フレームワークは、Slack が推奨するアプリ構築のアプローチです。 認証、イベントルーティング、リクエストの検証、HTTP リクエストの処理を担うため、アプリのロジックに集中できます。

主な利点:

  • 数行のコードでイベント処理を実装できる
  • セキュリティチェックとペイロードの検証が組み込まれている
  • 整理された一貫性のあるパターン
  • 実験用途と本番環境の両方で使用できる

対応言語: Python、JavaScript (Node.js)、Java

使用するタイミング: ['新しい Slack アプリを作成するとき', 'レガシーな Slack API から移行するとき', '本番環境向けの Slack 連携を構築するとき']

# Python Bolt App
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
import os

# Initialize with tokens from environment
app = App(
    token=os.environ["SLACK_BOT_TOKEN"],
    signing_secret=os.environ["SLACK_SIGNING_SECRET"]
)

# Handle messages containing "hello"
@app.message("hello")
def handle_hello(message, say):
    """Respond to messages containing 'hello'."""
    user = message["user"]
    say(f"Hey there <@{user}>!")

# Handle slash command
@app.command("/ticket")
def handle_ticket_command(ack, body, client):
    """Handle /ticket slash command."""
    # Acknowledge immediately (within 3 seconds)
    ack()

    # Open a modal for ticket creation
    client.views_open(
        trigger_id=body["trigger_id"],
        view={
            "type": "modal",
            "callback_id": "ticket_modal",
            "title": {"type": "plain_text", "text": "Create Ticket"},
            "submit": {"type": "plain_text", "text": "Submit"},
            "blocks": [
                {
                    "type": "input",
                    "block_id": "title_block",
                    "element": {
                        "type": "plain_text_input",
                        "action_id": "title_input"
                    },
                    "label": {"type": "plain_text", "text": "Title"}
                },
                {
                    "type": "input",
                    "block_id": "desc_block",
                    "element": {
                        "type": "plain_text_input",
                        "multiline": True,
                        "action_id": "desc_input"
                    },
                    "label": {"type": "plain_text", "text": "Description"}
                },
                {
                    "type": "input",
                    "block_id": "priority_block",
                    "element": {
                        "type": "static_select",
                        "action_id": "priority_select",
   
Block Kit UI パターン

Block Kit は、リッチでインタラクティブなメッセージを構築するための Slack の UI フレームワークです。 ブロック (セクション、アクション、入力) と要素 (ボタン、メニュー、テキスト入力) を組み合わせてメッセージを構成します。

制限:

  • メッセージあたり最大 50 ブロック
  • モーダルやホームタブでは最大 100 ブロック
  • ブロックのテキストは 3000 文字まで

プロトタイプの作成には Block Kit Builder を使用してください: https://app.slack.com/block-kit-builder

使用するタイミング: ['リッチなメッセージレイアウトを構築するとき', 'メッセージにインタラクティブなコンポーネントを追加するとき', 'モーダルでフォームを作成するとき', 'ホームタブの体験を構築するとき']

from slack_bolt import App
import os

app = App(token=os.environ["SLACK_BOT_TOKEN"])

def build_notification_blocks(incident: dict) -> list:
    """Build Block Kit blocks for incident notification."""
    severity_emoji = {
        "critical": ":red_circle:",
        "high": ":large_orange_circle:",
        "medium": ":large_yellow_circle:",
        "low": ":white_circle:"
    }

    return [
        # Header
        {
            "type": "header",
            "text": {
                "type": "plain_text",
                "text": f"{severity_emoji.get(incident['severity'], '')} Incident Alert"
            }
        },
        # Details section
        {
            "type": "section",
            "fields": [
                {
                    "type": "mrkdwn",
                    "text": f"*Incident:*\n{incident['title']}"
                },
                {
                    "type": "mrkdwn",
                    "text": f"*Severity:*\n{incident['severity'].upper()}"
                },
                {
                    "type": "mrkdwn",
                    "text": f"*Service:*\n{incident['service']}"
                },
                {
                    "type": "mrkdwn",
                    "text": f"*Reported:*\n<!date^{incident['timestamp']}^{date_short} {time}|{incident['timestamp']}>"
                }
            ]
        },
        # Description
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": f"*Description:*\n{incident['description'][:2000]}"
            }
        },
        # Divider
        {"type": "divider"},
        # Action buttons
        {
            "type": "actions",
            "block_id": f"incident_actions_{incident['id']}",
            "elements": [
                {
                    "type": "button",
                    "text": {"type": "plain_text", "text": "Acknowledge"},
                    "style": "primary",
                    "action_id": "acknowle
OAuth インストールパターン

OAuth 2.0 を介して、ユーザーが自分のワークスペースにアプリをインストールできるようにします。 Bolt が OAuth フローの大部分を処理しますが、設定を行い、トークンを安全に保存する必要があります。

OAuth の主な概念:

  • スコープは権限を定義します (必要最小限を要求してください)
  • トークンはワークスペースごとに固有です
  • インストールデータは永続的に保存する必要があります
  • ユーザーは後からスコープを追加できます (追加方式)

過剰な権限要求に直面すると、70% のユーザーがインストールを中止します。必要なものだけを要求してください!

使用するタイミング: ['アプリを複数のワークスペースに配布するとき', '公開 Slack アプリを構築するとき', 'エンタープライズグレードの連携を構築するとき']

from slack_bolt import App
from slack_bolt.oauth.oauth_settings import OAuthSettings
from slack_sdk.oauth.installation_store import FileInstallationStore
from slack_sdk.oauth.state_store import FileOAuthStateStore
import os

# For production, use database-backed stores
# For example: PostgreSQL, MongoDB, Redis

class DatabaseInstallationStore:
    """Store installation data in your database."""

    async def save(self, installation):
        """Save installation when user completes OAuth."""
        await db.installations.upsert({
            "team_id": installation.team_id,
            "enterprise_id": installation.enterprise_id,
            "bot_token": encrypt(installation.bot_token),
            "bot_user_id": installation.bot_user_id,
            "bot_scopes": installation.bot_scopes,
            "user_id": installation.user_id,
            "installed_at": installation.installed_at
        })

    async def find_installation(self, *, enterprise_id, team_id, user_id=None, is_enterprise_install=False):
        """Find installation for a workspace."""
        record = await db.installations.find_one({
            "team_id": team_id,
            "enterprise_id": enterprise_id
        })

        if record:
            return Installation(
                bot_token=decrypt(record["bot_token"]),
                # ... other fields
            )
        return None

# Initialize OAuth-enabled app
app = App(
    signing_secret=os.environ["SLACK_SIGNING_SECRET"],
    oauth_settings=OAuthSettings(
        client_id=os.environ["SLACK_CLIENT_ID"],
        client_secret=os.environ["SLACK_CLIENT_SECRET"],
        scopes=[
            "channels:history",
            "channels:read",
            "chat:write",
            "commands",
            "users:read"
        ],
        user_scopes=[],  # User token scopes if needed
        installation_store=DatabaseInstallationStore(),
        state_store=FileOAuthStateStore(expiration_seconds=600)
    )
)

# OAuth routes are handled a

⚠️ 注意すべき点

問題重大度解決策
問題critical## 即座に応答し、後で処理する
問題critical## 適切な state の検証を行う
問題critical## トークンをハードコードしたりログに出力したりしない
問題high## 必要最小限のスコープを要求する
問題medium## 制限を把握し、遵守する
問題high## Socket Mode は開発用途のみに使用する
問題critical## Bolt が自動的に処理する

コメント