Anthropic Agent SDKでSlack常駐botを作る — 実装30分のミニチュートリアル
Anthropic Agent SDK(TypeScript)を使って、Slackに常駐してメンション応答するbotを30分で実装する手順。Claude Codeの代わりに自前Agentを立ち上げる入門編としても使えます。
はじめに
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を作る
- api.slack.com/apps にアクセス、
Create New App→From scratch - App名(
claude-bot等)とworkspaceを選択 - 左メニュー
Socket ModeをEnable(WebSocketで受け取る形式、外部URLが不要で楽) App-Level Tokensでconnections:writescopeを持つtokenを生成 → メモ(xapp-1-...)OAuth & Permissionsで以下のBot Token Scopesを追加:app_mentions:readchat:writechannels:history
Event SubscriptionsをEnable、Subscribe to bot eventsでapp_mentionを追加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 devSlackで対象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:readchat: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: メモリリーク
sessionsMapにチャンネル数だけ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起動経路の選び方が広がります。
関連する記事
Claude Code をもっと見る →Agent SDK入門 — Python / TypeScriptで最小エージェントを組む
Managed Agentsの設計思想 — セッション/ハーネス/サンドボックスを分離した長時間エージェントのつくり方
AnthropicのContext Engineering論 — 長時間エージェントを動かす4つの実装戦略
Claudeを学ぶ1週間ロードマップ — 初日から実戦投入までの7日ガイド
MCPサーバを自作してClaude Codeにつなぐ — TypeScript実装の完全手順
Claude Codeでよくあるエラー10選 — 起動失敗から認証・MCP・権限まで実機で踏みやすい順に対処
Claude CodeのPro / Max / API従量、どれを選ぶか — コスト試算と選び方の判断ガイド
Claude CodeをGitHub Actionsに組み込む実用ガイド — claude-code-action v1とheadless実行の使い分け