本文へスキップ
Claude Media
Anthropic Agent SDKでSlack常駐botを作る — 実装30分のミニチュートリアル

Anthropic Agent SDKでSlack常駐botを作る — 実装30分のミニチュートリアル

Anthropic Agent SDK(TypeScript)を使って、Slackに常駐してメンション応答するbotを30分で実装する手順。Claude Codeの代わりに自前Agentを立ち上げる入門編としても使えます。

読了目安 約21

はじめに

Anthropic Agent SDKは、Claude Codeが内部で使っているのと同じ「LLM + ツール + 制御ループ」の機構を、自分のアプリケーションに組み込めるSDKです。CLI形式のClaude Codeが肌に合わない場合や、独自UI / 独自配信先(Slack / Discord / Web)でagentを動かしたい場合に使います。

本チュートリアルは、Slackに常駐してメンションに応答するClaude botを30分で実装する手順です。完成品は次のように動きます。

  • Slackで @claude-bot コードレビューして とメンションすると、botが応答
  • botはRead / Edit / Bash等のツールを内部で使い、複数ターン応答できる
  • Channelごとの会話contextを保持

完成品はそのまま社内向けbotのテンプレートとして使えます。

前提条件

  • Node.js 20以上
  • TypeScriptの基本知識
  • Anthropic API key(console.anthropic.com で取得)
  • Slack workspaceの管理権限(botをinstallできること)

手順1: Slack Appを作る

  1. api.slack.com/apps にアクセス、Create New AppFrom scratch
  2. App名(claude-bot 等)とworkspaceを選択
  3. 左メニュー Socket Mode をEnable(WebSocketで受け取る形式、外部URLが不要で楽)
  4. App-Level Tokensconnections:write scopeを持つtokenを生成 → メモ(xapp-1-...)
  5. OAuth & Permissions で以下のBot Token Scopesを追加:
    • app_mentions:read
    • chat:write
    • channels:history
  6. Event Subscriptions をEnable、Subscribe to bot eventsapp_mention を追加
  7. Install to Workspace → 生成されたBot User OAuth Tokenをメモ(xoxb-...)

手順2: プロジェクト初期化

mkdir claude-slack-bot && cd claude-slack-bot
npm init -y
npm install @anthropic-ai/agent-sdk @slack/bolt
npm install -D typescript @types/node tsx
npx tsc --init

.env を作成:

ANTHROPIC_API_KEY=sk-ant-...
SLACK_BOT_TOKEN=xoxb-...
SLACK_APP_TOKEN=xapp-1-...

.gitignore:

node_modules
.env

手順3: 最小実装

src/bot.ts:

import "dotenv/config";
import { App } from "@slack/bolt";
import { Agent } from "@anthropic-ai/agent-sdk";
 
const slack = new App({
  token: process.env.SLACK_BOT_TOKEN,
  appToken: process.env.SLACK_APP_TOKEN,
  socketMode: true,
});
 
// Channel ごとに会話 context を保持(本格運用なら Redis 等に永続化)
const sessions = new Map<string, ReturnType<typeof createAgent>>();
 
function createAgent() {
  return new Agent({
    apiKey: process.env.ANTHROPIC_API_KEY!,
    model: "claude-opus-4-7",
    systemPrompt: `あなたは Slack に常駐する Claude bot です。
丁寧な敬語で答えてください。
コードに関する質問にはコードブロックを使って具体的に答えてください。`,
  });
}
 
slack.event("app_mention", async ({ event, say }) => {
  const channelId = event.channel;
  const userQuery = event.text.replace(/<@[^>]+>/g, "").trim();
 
  if (!sessions.has(channelId)) {
    sessions.set(channelId, createAgent());
  }
  const agent = sessions.get(channelId)!;
 
  try {
    const response = await agent.run(userQuery);
    await say({
      text: response,
      thread_ts: event.ts,
    });
  } catch (err) {
    await say({
      text: `エラーが発生しました: ${err instanceof Error ? err.message : String(err)}`,
      thread_ts: event.ts,
    });
  }
});
 
(async () => {
  await slack.start();
  console.log("Claude Slack bot is running");
})();

package.json のscriptsに追加:

{
  "scripts": {
    "dev": "tsx watch src/bot.ts"
  }
}

手順4: 起動と動作確認

npm run dev

Slackで対象channelを開き、botをinviteしてから:

@claude-bot こんにちは。今の Claude Code の最新版を教えてください。

botがthreadで返答すれば動作確認OKです。

手順5: ツールを追加(Bash実行を許可)

LLM単体だけではClaude Code相当にはなりません。実際にコマンドを実行できるように、Agent SDKのツールを追加します。

import { Agent, tool } from "@anthropic-ai/agent-sdk";
import { exec } from "node:child_process";
import { promisify } from "node:util";
const execAsync = promisify(exec);
 
const bashTool = tool({
  name: "bash",
  description: "シェルコマンドを実行して結果を返す",
  inputSchema: {
    type: "object",
    properties: {
      command: { type: "string", description: "実行するコマンド" },
    },
    required: ["command"],
  },
  async execute({ command }) {
    // ⚠️ 安全のため許可リスト方式
    const allowed = ["ls", "cat", "git log", "npm test"];
    if (!allowed.some((prefix) => command.startsWith(prefix))) {
      return { error: `Command not allowed: ${command}` };
    }
    try {
      const { stdout, stderr } = await execAsync(command, {
        timeout: 10_000,
      });
      return { stdout, stderr };
    } catch (err) {
      return { error: String(err) };
    }
  },
});
 
function createAgent() {
  return new Agent({
    apiKey: process.env.ANTHROPIC_API_KEY!,
    model: "claude-opus-4-7",
    systemPrompt: "...",
    tools: [bashTool],
  });
}

これで @claude-bot リポジトリの直近 commit 教えて 等のクエリで、botが git log を実行して結果を踏まえた応答を返します。

よくあるつまずき

症状1: botが反応しない

  • Slack AppのEvent Subscriptionsで app_mention が登録されているか
  • Bot Token Scopesに app_mentions:read chat:write があるか
  • botがchannelにinviteされているか(/invite @claude-bot)

症状2: Error: invalid_auth

  • .env のtokenが正しいか(Bot Tokenは xoxb- で始まる、App-Level Tokenは xapp- で始まる)
  • Tokenをコピペ時に空白が混入していないか

症状3: Agentの応答が遅い

  • claude-opus-4-7 は重いモデル。応答時間が気になる場合は claude-sonnet-4-6 に切り替え
  • Slackのthread内なら遅延は気になりにくい(待機ローダーが出る)

症状4: コマンド実行が失敗

  • 許可リストにコマンドが含まれているか確認
  • timeout(10秒)を超えていないか確認
  • botプロセスの実行ユーザーがそのコマンドを実行する権限を持っているか

症状5: メモリリーク

  • sessions Mapにチャンネル数だけAgentが溜まる
  • 本格運用ならRedis等に外部化、またはLRUで容量制限する

拡張アイデア

ベース実装ができたら、次の拡張で社内ユースに耐えるbotに育てられます。

拡張概要
Read / Write tool追加botがリポジトリのファイルを読み書きできる(権限注意)
MCP server接続既存の社内API / DBをMCP経由で繋ぐ
会話履歴のRedis永続化再起動で会話が消えなくなる
監査ログbotが実行したコマンドを別channelに逐次投稿
権限ロール特定ユーザーだけがBash系を呼べる構成

まとめ

Anthropic Agent SDK + Slack Boltの組み合わせで、Claude Code相当のbotを30分で立ち上げられます。Claude CodeのCLI体験では届かないユースケース(Slack常駐 / 社内ナレッジ連携 / 複数人同時利用)を、自前で組める強力な選択肢です。

関連記事としてClaude Codeでメディア運営する1日では、Claude Codeを中枢にしたワークフロー設計を扱っています。Agent SDKで立ち上げたbotもこの中に組み込めるので、両記事を併せて読むと「Claudeを業務 / メディアにどう統合するか」の設計選択肢が見えてきます。

関連:Subagents並列実行パターンClaude Code Routines完全実践ガイドを読むと、Bot起動経路の選び方が広がります。

この記事を共有:XLinkedIn