機能を学ぶ · COURSE
Agent SDK で本格アプリを 90 分で構築
Slack 連携の AI アシスタント Bot を、SDK の最小構成から立ち上げる。
audience
アプリ開発者・SDK 利用者
duration
90分
lessons
6 章
reviewed
2026.05
2 分でコース概要を見る
このコースで作るもの
- 01Slack に常駐する Bot のソース一式(SDK 最小構成)
- 02セッション維持 + カスタムツール実装サンプル
- 03デプロイ手順書(本番運用に乗せる前提)
達成目安
全 6 レッスンを読み、コース完了マークを付ける
未完了
クイズ 6 問に挑戦し、正答率 80% 以上
未挑戦
成果物 3 個を実際に手元に作る
自己チェック
コース構成
このコースで学ぶこと
- 01
なぜ SDK を直接使うのか
Claude Code は対話用。製品に組み込むなら Agent SDK で完全制御を取る。
Claude Code は『あなたが対話する』ためのツールです。一方、製品の中で『ユーザーが Claude に話しかける』を実現するには Agent SDK が必要。
例:Slack ボット、社内向け Q&A アプリ、文書要約サービス。SDK ならセッション管理・ストリーミング・カスタムツール定義まで全部できます。
- TypeScript / Python の両方サポート
- ストリーミング応答でリアルタイム表示
- カスタムツール定義で社内 API 接続
- 完全なセッション制御(永続化・再開)
理解度チェック
Q1.「Claude Code」と「Agent SDK」の最も本質的な違いは?
- 02
プロジェクト初期化(10 分)
TypeScript + Node.js + @anthropic-ai/sdk で最小構成を作る。
bashmkdir my-slack-ai && cd my-slack-ai pnpm init -y pnpm add @anthropic-ai/sdk @slack/bolt dotenv pnpm add -D typescript @types/node tsx # tsconfig.json (最小) cat > tsconfig.json <<EOF { "compilerOptions": { "target": "ES2022", "module": "NodeNext", "moduleResolution": "NodeNext", "strict": true, "esModuleInterop": true } } EOF # .env ANTHROPIC_API_KEY=sk-ant-... SLACK_BOT_TOKEN=xoxb-... SLACK_APP_TOKEN=xapp-...理解度チェック
Q1.ANTHROPIC_API_KEY / SLACK_BOT_TOKEN を .env で管理する理由は?
- 03
Slack Bolt + Anthropic SDK 最小実装(30 分)
100 行未満で Slack のメンション → Claude → 返信、が動く。
typescriptimport { App } from "@slack/bolt"; import Anthropic from "@anthropic-ai/sdk"; import "dotenv/config"; const slack = new App({ token: process.env.SLACK_BOT_TOKEN!, appToken: process.env.SLACK_APP_TOKEN!, socketMode: true, }); const anthropic = new Anthropic({ apiKey: process.env.ANTHROPIC_API_KEY!, }); slack.event("app_mention", async ({ event, say }) => { const userMessage = event.text.replace(/<@.+?>/g, "").trim(); if (!userMessage) return; const response = await anthropic.messages.create({ model: "claude-sonnet-4-6", max_tokens: 1024, system: "あなたは弊社の社内アシスタントです。簡潔に答えてください。", messages: [{ role: "user", content: userMessage }], }); const text = response.content .filter((block) => block.type === "text") .map((block) => (block as { type: "text"; text: string }).text) .join(""); await say({ thread_ts: event.ts, text }); }); (async () => { await slack.start(); console.log("⚡️ Slack AI bot is running"); })();src/index.ts — 100 行未満で完成 理解度チェック
Q1.Anthropic SDK の `response.content` から本文テキストを取り出すときの注意点は?
- 04
セッション維持で会話を続ける(20 分)
スレッド内の過去メッセージを取得 → 文脈を維持した会話に進化。
typescriptslack.event("app_mention", async ({ event, client, say }) => { // スレッドの過去メッセージを取得 const thread = await client.conversations.replies({ channel: event.channel, ts: event.thread_ts || event.ts, }); // Anthropic 形式に変換 const messages = (thread.messages || []).map((m) => ({ role: m.bot_id ? ("assistant" as const) : ("user" as const), content: m.text || "", })); const response = await anthropic.messages.create({ model: "claude-sonnet-4-6", max_tokens: 1024, system: "あなたは弊社の社内アシスタントです。", messages, }); // ... 同上で返信 });理解度チェック
Q1.Slack スレッドで“文脈を維持した会話”を実現する Anthropic SDK 側の鍵は?
- 05
カスタムツールで社内 DB 接続(20 分)
tool_use で『社内ナレッジ DB を検索する』機能を追加。
typescriptconst response = await anthropic.messages.create({ model: "claude-sonnet-4-6", max_tokens: 1024, tools: [ { name: "search_company_kb", description: "社内ナレッジ DB を検索する", input_schema: { type: "object", properties: { query: { type: "string", description: "検索クエリ" }, }, required: ["query"], }, }, ], messages, }); // tool_use ブロックを処理 for (const block of response.content) { if (block.type === "tool_use" && block.name === "search_company_kb") { const query = (block.input as { query: string }).query; const results = await searchCompanyKB(query); // 自社 DB 検索 // 結果を含めて再度 Claude を呼ぶ(agentic loop) } }理解度チェック
Q1.Anthropic SDK の tool_use(agentic loop)で暴走を防ぐ最低限の設計は?
- 06
デプロイと運用
ローカルで動いたら本番に。Cloud Run / Fly.io / Vercel Functions など。


