このレッスンで学ぶこと
- Agent SDKとは何か、Claude Code CLIとの違い・関係性を理解する
- TypeScript / Pythonそれぞれの環境でAgent SDKをインストールし、基本構成を整える
- 最小構成のエージェント(Hello World的なサンプル)を実際に動かす
- 実行結果の確認方法と、つまずいたときの基本的なデバッグ手順を身につける
前提条件
- 入門コース Lesson 1〜3を修了し、Claude Code CLIの基本操作に慣れていること
- Node.js(TypeScriptの場合)またはPython 3.10以上(Pythonの場合)がインストールされていること
- 応用コース Lesson 7(サブエージェント)を読んでいると、後半の理解がスムーズです
Agent SDKとは何か
これまでのレッスンで使ってきたClaude Codeは、ターミナルで対話的に操作するCLIツールでした。一方Agent SDKは、Claude Codeを支えているのと同じエージェントループ・ツール実行・コンテキスト管理の仕組みを、プログラムから呼び出せるライブラリとして提供するものです。
つまり、「Claude Codeというアプリケーションを使う」のではなく、「Claude Codeを動かしているエンジンを自分のコードに組み込む」というのがAgent SDKの位置づけです。TypeScriptとPythonの両方で提供されています。
graph TD
subgraph "共通基盤"
E["エージェントループ<br/>ツール実行・コンテキスト管理"]
end
CLI["Claude Code CLI<br/>(ターミナルで対話的に操作)"]
SDK["Agent SDK<br/>(コードからプログラム的に呼び出す)"]
E --> CLI
E --> SDK
style E fill:#e8f4fd,stroke:#1a73e8
style CLI fill:#fff3e0,stroke:#e65100
style SDK fill:#e8f5e9,stroke:#2e7d32CLIとSDK、どちらを使うべきか
両者は対立する選択肢ではなく、用途によって使い分けるものです。
| ユースケース | 向いている選択 |
|---|---|
| インタラクティブな日常の開発作業 | CLI |
| 1回限りの調査・修正タスク | CLI |
| CI/CDパイプラインへの組み込み | SDK |
| 自社サービスにエージェント機能を組み込む | SDK |
| 本番環境での定期的な自動化処理 | SDK |
多くのチームは両方を併用します。日常の開発はCLIで行い、その過程で固まったワークフローをSDKでプログラム化して自動化する、という流れが自然です。実際、ワークフローの考え方そのもの(ツールへの権限付与、サブエージェントへの委譲など)はCLIとSDKの間でほぼそのまま通用します。
「Claude APIを直接叩くClient SDK」と「Agent SDK」は別物です。Client SDKではツール呼び出しのループ(モデルがツール使用を要求 → 自分でツールを実行 → 結果をモデルに返す、を繰り返す処理)を自分で実装する必要があります。Agent SDKはこのループ自体をライブラリが引き受けてくれるため、ファイル読み書きやコマンド実行を行うエージェントを、ループ処理を書かずに構築できます。
インストールと基本構成
TypeScriptとPython、どちらの環境でも数分でセットアップできます。
SDKをインストールする
使用する言語に応じてパッケージをインストールします。
# TypeScript
npm install @anthropic-ai/claude-agent-sdk# Python(Python 3.10以上が必要)
pip install claude-agent-sdkpipが No matching distribution found for claude-agent-sdk と報告する場合、インタープリターが3.10より古い可能性があります。python3 --version(Windowsではpy --version)でバージョンを確認しましょう。
APIキーを設定する
Anthropic ConsoleでAPIキーを取得し、環境変数として設定します。
export ANTHROPIC_API_KEY=your-api-keyAmazon Bedrock・Google Vertex AI・Microsoft Azure経由での認証もサポートされています。詳細は各プラットフォームのセットアップガイドを参照してください。
最小構成のスクリプトを作成する
プロジェクトディレクトリに、次のステップで示すサンプルコードを保存します。
TypeScript版のAgent SDKは、各プラットフォーム用のネイティブClaude Codeバイナリをオプションの依存関係としてバンドルしています。そのため、Agent SDKを使うために別途Claude Code CLIをインストールする必要はありません。
最小構成のサンプル: Hello Worldエージェント
まずは「カレントディレクトリのファイル一覧を確認する」だけの、最小構成のエージェントを動かしてみます。
# agent_hello.py
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions
async def main():
async for message in query(
prompt="このディレクトリにどんなファイルがありますか?",
options=ClaudeAgentOptions(allowed_tools=["Bash", "Glob"]),
):
if hasattr(message, "result"):
print(message.result)
asyncio.run(main())// agent-hello.ts
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "このディレクトリにどんなファイルがありますか?",
options: { allowedTools: ["Bash", "Glob"] }
})) {
if ("result" in message) console.log(message.result);
}ここで起きていることを分解すると、次のようになります。
query()にプロンプトと、許可するツール(allowed_tools/allowedTools)を渡す- SDKがエージェントループを内部で実行する。「ファイル一覧を見るにはBashかGlobが必要」とモデルが判断し、ツールを呼び出す
- ツールの実行結果がモデルに返され、最終的な回答がまとまる
query()は処理の過程で発生する複数のmessageを順番に返す(ストリーミング)。最終結果を含むメッセージにresultが含まれる
allowed_toolsで許可していないツール(たとえばWriteやEdit)をモデルが使おうとした場合は拒否されます。これにより、「ファイルを読むだけのエージェント」「ファイルを書き換えられるエージェント」を明確に区別して構築できます。
少し発展させる: TODOコメントを集計するエージェント
実用に近づけた例として、コードベース内のTODOコメントを検索して要約するエージェントを見てみましょう。
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions
async def main():
async for message in query(
prompt="すべてのTODOコメントを探して要約を作成して",
options=ClaudeAgentOptions(allowed_tools=["Read", "Glob", "Grep"]),
):
if hasattr(message, "result"):
print(message.result)
asyncio.run(main())import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "すべてのTODOコメントを探して要約を作成して",
options: { allowedTools: ["Read", "Glob", "Grep"] }
})) {
if ("result" in message) console.log(message.result);
}Bashを許可せずRead Glob Grepに絞っているため、このエージェントはファイルを検索・閲覧することしかできません。CLAUDE.mdの禁止事項にある「TODO/FIXMEを残したままコミットしない」という方針を、定期的にチェックする仕組みの土台としても応用できそうです。
実行・デバッグの基本
実行する
通常のスクリプトと同じように実行します。
python agent_hello.pynpx tsx agent-hello.tsメッセージの種類を理解する
query()が返すmessageには複数の種類があり、最終結果以外にも、ツール呼び出しの過程を表すメッセージが含まれます。デバッグ時はすべてのメッセージを出力してみると、エージェントが何をしているかを追跡できます。
async for message in query(
prompt="このディレクトリにどんなファイルがありますか?",
options=ClaudeAgentOptions(allowed_tools=["Bash", "Glob"]),
):
print(type(message).__name__, message) # すべてのメッセージ種別を出力セッション開始時にはSystemMessage(subtypeが"init"のもの)が流れ、ここにセッションIDなど後続処理で使える情報が含まれます。最終的な結果はResultMessage相当のオブジェクトに含まれます。
「ツールが使えない」と感じたら、まずallowed_tools / allowedToolsに必要なツールが含まれているかを確認しましょう。SDKはデフォルトで安全側に倒されており、明示的に許可していないツールは使えません。CLIで動いていたプロンプトがSDKで動かない場合の多くは、このツール許可リストの不足が原因です。
よくあるつまずきポイント
| 症状 | 主な原因 | 対処 |
|---|---|---|
ANTHROPIC_API_KEY関連のエラー | 環境変数が未設定、またはシェルの再起動で消えている | echo $ANTHROPIC_API_KEYで値が出るか確認する |
| ツールが呼ばれない・拒否される | allowed_toolsに必要なツールが含まれていない | エラーメッセージに出るツール名を確認し、リストに追加する |
Pythonでpip installが失敗する | Python 3.10未満の環境を使っている | python3 --versionを確認し、必要なら仮想環境を作り直す |
| 結果が空・途中で終わる | result属性を持つメッセージだけを拾うフィルタが厳しすぎる | 一度すべてのメッセージを出力し、どこで止まっているか確認する |
Claude Code CLIの設定資産はそのまま使える
Agent SDKは、デフォルトでは作業ディレクトリの.claude/と~/.claude/から設定を読み込みます。つまり、これまでのレッスンで作成してきたCLAUDE.md・Skills・サブエージェントの定義は、SDK経由で動かすエージェントでもそのまま活用できます。
| 機能 | 読み込まれる場所 |
|---|---|
| Skills | .claude/skills/*/SKILL.md |
| Memory(CLAUDE.md) | CLAUDE.md または .claude/CLAUDE.md |
| Plugins | agentsオプション経由でプログラム的に指定 |
どのソースを読み込むかはsetting_sources(Python)/ settingSources(TypeScript)オプションで制限できます。たとえば「CLAUDE.mdは読み込みたいが個人のグローバル設定は無視したい」といった制御が可能です。
まとめ
このレッスンでは、Agent SDKがClaude Code CLIと同じエンジンをプログラムから扱うためのライブラリであることを理解し、TypeScript / Python両方での最小構成のエージェントを実際に動かしました。
- Agent SDKはCLIの代替ではなく、CI/CDや自社サービスへの組み込みなど「プログラムから呼び出したい」場面で使い分けるもの
query()にプロンプトと許可ツールを渡すだけで、ツール実行ループを自分で実装せずにエージェントを動かせるallowed_tools/allowedToolsに許可されていないツールは拒否されるため、権限エラーの多くはここを確認すれば解決する- CLAUDE.mdやSkillsなど、CLIで育てた設定資産はSDK経由のエージェントでもそのまま活用できる
最小構成のエージェントが動かせるようになったら、次はこれを実用的なツールとして拡張していきます。Lesson 9: Agent SDKでカスタムエージェントを構築するでは、独自ツールの定義、状態管理、エラーハンドリングを組み込んだ実践的なエージェントを作ります。