Agent SDK の基本
Agent SDK の位置づけ、導入、エージェントループ、オプションの組み立て、設定ファイルの読み込み、移行、エラーの対処をまとめます。
Agent SDK は、Claude Code と同じツール・エージェントループ・コンテキスト管理を Python と TypeScript のライブラリとして使えるようにしたものです。自分のアプリの中でエージェントを動かすときの入口になるページです。
- 組み込みツール・フック・サブエージェント・MCP・権限・セッションなど、Claude Code の機能をコードから使えます
query()が返すメッセージのストリームを読んで、進捗や最終結果を取り出しますsettingSourcesで、CLAUDE.md・スキル・フックなどのファイルベースの設定を読み込むかを決めます- ターン数と費用の上限、モデル、環境変数、作業ディレクトリは
optionsで指定します - セッションは SDK のセッションと入出力、ツールと権限は SDK のツール・権限・拡張、運用は SDK の本番運用、型の一覧は SDK の API リファレンス を見てください
ほかの Claude の道具との違い#
| 目的 | 使うもの | 内容 |
|---|---|---|
| 自分で運用するプロセスに Claude Code のエージェントを組み込む | Agent SDK | Claude Code のバイナリを動かすライブラリ。組み込みツール・権限・セッション・フックが使える |
| 端末で対話的に開発する・単発の作業をする | Claude Code CLI | 日常の対話向けの端末 UI(Claude Code の全体像) |
| Claude API を自分のコードから直接呼ぶ | Client SDK | ツールのループは自分で書く(ベータの tool runner に任せる方法もある) |
| Anthropic にエージェントを動かしてもらう | Managed Agents | ホスト型のエージェント基盤。クラウドのサンドボックスか自前のサンドボックスで動く |
Python と TypeScript 以外の言語から同じループを使うには、CLI を -p と --output-format json 付きでサブプロセスとして起動します(ヘッドレス実行)。
Claude Code から使える機能#
| 機能 | できること |
|---|---|
| 組み込みツール | ファイルの読み書き・編集、コマンド実行、Web 検索(ツール一覧) |
| フック | エージェントの動作の節目で自作のコードを動かす(SDK のツール・権限・拡張) |
| サブエージェント | 小さな作業ごとに専用のエージェントを起こす |
| MCP | 外部のツールやデータにつなぐ |
| 権限 | どのツールを自動で動かし、どれに承認を求めるかを決める |
| セッション | 文脈を保ち、あとで再開・分岐する(SDK のセッションと入出力) |
| スキル・コマンド・メモリ | プロジェクトの .claude/ と ~/.claude/ から自動で読み込む |
| プラグイン | スキル・エージェント・フック・MCP サーバーをまとめ、ローカルのパスで読み込む |
補足
事前の承認がない限り、サードパーティの開発者が Claude Agent SDK 製のエージェントを含む自社製品で claude.ai のログインやレート制限を提供することは認められていません。認証には API キーを使います。
導入する#
必要なのは Node.js 18 以上、または Python 3.10 以上と、Anthropic のアカウントです。
# TypeScript
npm install @anthropic-ai/claude-agent-sdk
# Python(uv)
uv add claude-agent-sdk
# Python(pip。仮想環境を有効にしてから)
pip install claude-agent-sdk
どちらの SDK も Claude Code のネイティブバイナリを同梱するので、通常は Claude Code を別に入れる必要はありません。例外は次のとおりです。
- pip がプラットフォーム別の wheel でなくソース配布物を入れた場合(例:ARM64 の Windows)は、バイナリが同梱されません。Claude Code を別途インストールします(インストールとログイン)。Python SDK は
PATHから見つけます - TypeScript SDK はバイナリを npm の optional dependencies で入れます。
npm ci --omit=optionalのように省くとバイナリが入りません。省かずに入れ直すか、ネイティブ版を入れてpathToClaudeCodeExecutableにパスを指定します
API キーは、エージェントを動かすシェルの環境変数 ANTHROPIC_API_KEY に入れます。SDK は .env を自動では読まないので、必要なら dotenv などで先に読み込みます。
export ANTHROPIC_API_KEY=your-api-key
サードパーティのプロバイダー経由でも認証できます(詳しくは Bedrock・Vertex AI・Foundry)。
| プロバイダー | 設定 |
|---|---|
| Amazon Bedrock | CLAUDE_CODE_USE_BEDROCK=1 と AWS の認証情報 |
| Claude Platform on AWS | CLAUDE_CODE_USE_ANTHROPIC_AWS=1 と ANTHROPIC_AWS_WORKSPACE_ID、AWS の認証情報 |
| Google Cloud の Agent Platform | CLAUDE_CODE_USE_VERTEX=1 と Google Cloud の認証情報 |
| Microsoft Foundry | CLAUDE_CODE_USE_FOUNDRY=1 と Azure の認証情報 |
Not logged in や Invalid API key が出たら、エージェントを動かすシェルで ANTHROPIC_API_KEY が設定されているかを確かめます(エラー一覧)。
最初のエージェント#
query() はエージェントループを起動する入口です。非同期イテレーターを返すので、Claude が作業するあいだのメッセージを順に受け取れます。
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, AssistantMessage, ResultMessage
async def main():
async for message in query(
prompt="utils.py をレビューし、クラッシュするバグを直して",
options=ClaudeAgentOptions(
allowed_tools=["Read", "Edit", "Glob"], # 自動承認するツール
permission_mode="acceptEdits", # ファイル編集を自動承認
),
):
if isinstance(message, AssistantMessage):
for block in message.content:
if hasattr(block, "text"):
print(block.text)
elif hasattr(block, "name"):
print(f"Tool: {block.name}")
elif isinstance(message, ResultMessage):
print(f"Done: {message.subtype}")
asyncio.run(main())
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "utils.py をレビューし、クラッシュするバグを直して",
options: {
allowedTools: ["Read", "Edit", "Glob"], // 自動承認するツール
permissionMode: "acceptEdits", // ファイル編集を自動承認
},
})) {
if (message.type === "assistant" && message.message?.content) {
for (const block of message.message.content) {
if ("text" in block) console.log(block.text);
else if ("name" in block) console.log(`Tool: ${block.name}`);
}
} else if (message.type === "result") {
console.log(`Done: ${message.subtype}`);
}
}
実行は TypeScript なら npx tsx agent.ts、Python なら uv run agent.py か python agent.py です。既存の CommonJS プロジェクトでは、トップレベルの await を使うためファイル名を agent.mts にします。
- 絞り込まずに全メッセージを見ると、初期化メッセージや内部状態も含まれます(デバッグ向け)
- ライブ表示が要らない用途(バックグラウンドジョブや CI)は、メッセージをまとめて受け取れます(SDK のセッションと入出力)
ツールの組み合わせの目安です。
| ツール | できること |
|---|---|
Read、Glob、Grep |
読み取り専用の分析 |
Read、Edit、Glob |
コードの分析と修正 |
Read、Edit、Bash、Glob、Grep |
フル自動 |
エージェントループの仕組み#
プロンプトを受けた Claude が、ツールを呼び、結果を受け取り、ツール呼び出しのない応答を出すまで繰り返します。この1周が1ターンです。ターンの間は呼び出し側にメッセージが流れるだけで、制御は戻りません。
- SDK がプロンプトを送り、セッション情報の
SystemMessageを返す - Claude がツールを呼ぶ応答を出す(
AssistantMessage) - SDK がツールを実行し、結果を
UserMessageとして返す - 2〜3 を繰り返し、ツール呼び出しのない応答が出たらループが終わる
- 最後の
AssistantMessageに続けて、最終結果のResultMessageが来る
メッセージの種類#
| 種類 | いつ出るか |
|---|---|
SystemMessage |
セッションの節目。subtype が init(セッション情報)、compact_boundary(圧縮の直後)、informational(状態の表示)、worker_shutting_down(ホストの終了や Remote Control の切断)を区別する |
AssistantMessage |
Claude の応答のコンテンツブロックごとに1つ。テキストやツール呼び出し |
UserMessage |
ツール実行後の結果。ループの途中で流し込んだ入力にも出る |
StreamEvent |
部分メッセージを有効にしたときだけ。API のストリーミングイベントそのもの |
ResultMessage |
ループの終わり。最終テキスト・トークン使用量・費用・セッション ID |
init以外のSystemMessageは、TypeScript ではSDKMessageの中で別々の型になりますSessionStartやSetupのフックが走ると、そのライフサイクルメッセージがinitより前に届きますResultMessageのあとにprompt_suggestionなどのシステムイベントが少し届くことがあるので、結果でbreakせず最後まで読みます- 判定は、Python は
isinstance()、TypeScript はtype文字列です。TypeScript のAssistantMessageとUserMessageは API のメッセージを.messageに持つので、内容はmessage.message.contentにあります - 進捗は
AssistantMessage、最終結果だけならResultMessage、リアルタイム表示はinclude_partial_messages/includePartialMessagesを有効にしてStreamEventを使います
ツールの実行と権限#
組み込みツールは Claude Code と同じです。
| 分類 | ツール |
|---|---|
| ファイル操作 | Read、Edit、Write |
| 検索 | Glob、Grep |
| 実行 | Bash |
| Web | WebSearch、WebFetch |
| 検出 | ToolSearch(ツールを必要なときに探して読み込む) |
| 連携 | Agent、Skill、AskUserQuestion、TaskCreate、TaskUpdate |
タスク管理のツールが標準で付かないモデルでは、TaskCreate と TaskUpdate は有効にしたときだけ使えます。
許可は3つのオプションで決まります。
| オプション | 働き |
|---|---|
allowed_tools / allowedTools |
列挙したツールを自動承認する。列挙しないツールも使えるが、承認が要る呼び出しは権限モードと canUseTool に回る |
disallowed_tools / disallowedTools |
列挙したツールを、ほかの設定にかかわらず禁止する |
permission_mode / permissionMode |
承認の求め方を決める |
"Bash(npm *)" のようなルールで、特定のコマンドだけを許可することもできます。拒否されたツールは、拒否のメッセージがツール結果として Claude に返り、Claude は別の手を試すか、できないと報告します。
読み取り専用のツール(Read・Glob・Grep・読み取り専用と印を付けた MCP ツール)は並列に動き、状態を変えるもの(Edit・Write・Bash)は順番に動きます。自作ツールは既定で順番です。並列にするにはアノテーションの readOnlyHint を設定します。
権限モード#
| モード | 動き | 向く場面 |
|---|---|---|
"default" |
承認が要り許可ルールに当たらない呼び出しは canUseTool に回る。コールバックが無ければ拒否 |
承認コールバックを持つ対話アプリ |
"acceptEdits" |
ファイル編集と mkdir・touch・mv・cp などの基本的なファイル操作を自動承認。ほかの Bash は通常のルール |
試作や隔離したディレクトリでの作業 |
"plan" |
ソースを編集せずに調べて計画する。編集は自動承認されず canUseTool に回る |
変更前に承認したいとき |
"dontAsk" |
確認しない。許可ルールで承認済みのものと、default で承認不要の呼び出し(作業ディレクトリ内の読み取りなど)は動き、承認が要るものはすべて拒否。AskUserQuestion なども、許可していても拒否される |
ヘッドレスで、使えるツールを固定したいとき |
"auto" |
モデルの分類器がシェルコマンドやネットワーク要求を審査して許可・拒否する(権限モード) | 安全策を残した自律エージェント |
"bypassPermissions" |
許可済みのツールを確認なしで動かす。ask ルール・組織が ask にしたコネクタ・ユーザー操作が要るツールは除く。TypeScript では allowDangerouslySkipPermissions: true も必要。Unix の root では使えない |
CI・コンテナなど隔離した環境 |
注意
bypassPermissions は、エージェントの操作が大事なシステムに届かない隔離環境でだけ使います。
ターンと費用の上限#
| オプション | 内容 | 既定 |
|---|---|---|
max_turns / maxTurns |
ツールを使う往復の上限 | 上限なし |
max_budget_usd / maxBudgetUsd |
止まるまでの費用の上限 | 上限なし |
- 上限に達すると、
ResultMessageのsubtypeがerror_max_turnsかerror_max_budget_usdになります - 費用の上限はサブエージェントの分も数えます。上限に達すると新しいサブエージェントは
Budget limit reachedで失敗し、動いているバックグラウンドのサブエージェントも止まります(この動作は Claude Code v2.1.217 以降) - ストリーミング入力では、ターンが上限で終わっても待機中のメッセージは新しいターンで処理され、ターン数は数え直されます。費用の合計はメッセージをまたいで積算され、
/clearで数え直されます max_turnsの0は上限なしと同じです。max_budget_usdの0は CLI が起動時に不正な値として拒否します
effort#
effort は推論の深さの指定です。対応していないモデルもあります。未指定なら Claude Code が決めます(モデル・effort・fast mode)。
| 値 | 内容 | 向く作業 |
|---|---|---|
"low" |
最小限の推論で速い | ファイルの検索、ディレクトリの一覧 |
"medium" |
中程度 | 通常の編集 |
"high" |
丁寧に分析 | リファクタリング、デバッグ |
"xhigh" |
推論をさらに深く | 対応モデルでのコーディングとエージェント作業 |
"max" |
最大の深さ | 深い分析が要る多段階の問題 |
effort は拡張思考(extended thinking)とは別の機能で、片方だけを使うことも両方を使うこともできます。サブエージェントごとに上書きするには AgentDefinition の effort を使います。
コンテキストと圧縮#
コンテキストはターンをまたいで積み上がります。システムプロンプト・ツール定義・会話履歴・ツールの入出力が含まれ、変わらない部分はプロンプトキャッシュされます(コンテキストとプロンプトキャッシュ)。
| 要素 | 読み込み | 影響 |
|---|---|---|
| システムプロンプト | 毎リクエスト | 小さな固定費 |
CLAUDE.md |
セッション開始時(settingSources 経由) |
毎リクエストに全文が入る(キャッシュされる) |
| ツール定義 | 毎リクエスト | 組み込みツールのスキーマは毎回読み込む。MCP のスキーマは既定でツール検索により遅延読み込み(非対応のモデルや環境では先に全部読み込む) |
| 会話履歴 | ターンごとに増える | 入出力が積み上がる |
| スキルの説明 | セッション開始時 | 短い要約だけ。本文は使うときに読み込む |
- 上限に近づくと自動で圧縮され、古い履歴が要約されます。
systemでsubtypeがcompact_boundaryのメッセージが流れます - 圧縮で初期のプロンプトの指示は失われうるので、守らせたい規則は
CLAUDE.mdに書きます - 圧縮の動きは、
CLAUDE.mdに要約時に残すものを書く、PreCompactフック(triggerはmanualかauto)でトランスクリプトを保存する、/compactをプロンプトとして送って手動で起こす、の3通りで調整できます
# Summary instructions
When summarizing this conversation, always preserve:
- The current task objective and acceptance criteria
- File paths that have been read or modified
- Test results and error messages
長く動かすときの工夫です。
- サブエージェントに小作業を任せる。親のコンテキストは要約の分しか増えない
- ツールを絞る。サブエージェントの
toolsで最小限にする - MCP サーバーの費用に注意する。ツール検索が無効、または先読みに戻った場合は、全ツールのスキーマが毎リクエストに入る
- 単純な作業は
effortを"low"にする
結果の扱い#
subtype |
内容 | result |
|---|---|---|
success |
正常に完了 | あり |
error_max_turns |
maxTurns に達した |
なし |
error_max_budget_usd |
maxBudgetUsd に達した |
なし |
error_during_execution |
中断するエラー(例:リクエストの取り消し) | なし |
error_max_structured_output_retries |
再試行の上限内に正しい構造化出力が得られなかった | なし |
resultはsuccessのときだけあるので、先にsubtypeを見ます- どの
subtypeもtotal_cost_usd・usage・num_turns・session_idを持ちます。Python ではtotal_cost_usd・usage・model_usageが省略可能な型なのでNoneを確かめます - セッションがクラッシュすると、費用が 0 のままの
error_during_executionが最後に出てプロセスが終わります。stop_reasonはnullです usageはメインのループだけです。サブエージェントを含む全体の集計はmodelUsage(Python はmodel_usage)を使います(SDK の本番運用)stop_reasonはend_turn・max_tokens・refusalなどです。拒否の検出はstop_reasonが"refusal"かどうかで見ます
補足
単発の query() はエラーの結果を返したあとで例外を送出し、Claude Code のプロセスも 0 以外の終了コードで終わります。続行したいならループを try で囲みます。ストリーミング入力のセッションは、クラッシュしない限り生きたままで、メッセージを送り続けられます。
ループに使えるフック#
| フック | いつ動くか | 使い道 |
|---|---|---|
PreToolUse |
ツール実行前 | 入力の検査、危険なコマンドの拒否 |
PostToolUse |
ツールが返ったあと | 出力の監査、副作用の起動 |
UserPromptSubmit |
プロンプトを送るとき | 文脈の追加 |
Stop |
エージェントが終わるとき | 結果の検証、状態の保存 |
SubagentStart / SubagentStop |
サブエージェントの開始と終了 | 並列タスクの結果の集約 |
PreCompact |
圧縮の前 | 全文の保存 |
フックは自分のアプリのプロセスで動くので、コンテキストを消費しません。PreToolUse で拒否するとツールは実行されず、Claude に拒否のメッセージが返ります。Python に無いイベントが TypeScript にはあります(SDK のツール・権限・拡張)。
まとめの例#
import { query } from "@anthropic-ai/claude-agent-sdk";
let sessionId: string | undefined;
try {
for await (const message of query({
prompt: "auth モジュールのテスト失敗の原因を見つけて直して",
options: {
allowedTools: ["Read", "Edit", "Bash", "Glob", "Grep"],
settingSources: ["project"], // CLAUDE.md・スキル・フックを読み込む
maxTurns: 30, // 暴走の防止
effort: "high",
},
})) {
if (message.type === "system" && message.subtype === "init") {
sessionId = message.session_id; // 再開用に保存
}
if (message.type === "result") {
if (message.subtype === "success") console.log(message.result);
else console.log(`Stopped: ${message.subtype}`);
console.log(`Cost: $${message.total_cost_usd.toFixed(4)}`);
}
}
} catch (error) {
console.log(`Session ended with an error: ${error}`);
}
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage
async def run_agent():
try:
async for message in query(
prompt="auth モジュールのテスト失敗の原因を見つけて直して",
options=ClaudeAgentOptions(
allowed_tools=["Read", "Edit", "Bash", "Glob", "Grep"],
setting_sources=["project"],
max_turns=30,
effort="high",
),
):
if isinstance(message, ResultMessage):
if message.subtype == "success":
print(message.result)
else:
print(f"Stopped: {message.subtype}")
if message.total_cost_usd is not None:
print(f"Cost: ${message.total_cost_usd:.4f}")
except Exception as error:
print(f"Session ended with an error: {error}")
asyncio.run(run_agent())
オプションを組み立てる#
query() は options を受け取ります(TypeScript は Options、Python は ClaudeAgentOptions)。どのフィールドも省略可能で、省略した分は SDK の既定で動きます。全フィールドは SDK の API リファレンス にあります。
import { query } from "@anthropic-ai/claude-agent-sdk";
for await (const message of query({
prompt: "このリポジトリの未完了の TODO を要約して",
options: {
model: "claude-sonnet-5",
allowedTools: ["Read", "Glob", "Grep"],
maxTurns: 8,
cwd: "/path/to/repo",
},
})) {
if (message.type === "result" && message.subtype === "success" && !message.is_error) {
console.log(message.result);
}
}
import asyncio
from claude_agent_sdk import ClaudeAgentOptions, ResultMessage, query
async def main():
options = ClaudeAgentOptions(
model="claude-sonnet-5",
allowed_tools=["Read", "Glob", "Grep"],
max_turns=8,
cwd="/path/to/repo",
)
async for message in query(prompt="このリポジトリの未完了の TODO を要約して", options=options):
if isinstance(message, ResultMessage) and not message.is_error:
print(message.result)
asyncio.run(main())
設定ファイルの読み込み#
| オプション | 内容 |
|---|---|
settingSources / setting_sources |
user・project・local のどれを読むか。設定ファイルと CLAUDE.md はここから届く。[] なら読まない |
settings |
設定ファイルのパスか JSON 文字列(TypeScript は設定オブジェクトも可)。user・project・local の設定を上書きし、これより強いのは管理ポリシーだけ |
モデル#
modelを指定しないと、設定や環境変数で決まるモデル、なければ Claude Code の既定のモデルで始まります(モデル・effort・fast mode)。値はエイリアスでも完全なモデル名でも構いませんfallbackModel/fallback_modelに予備のモデルを指定すると、本命が過負荷や利用不可のときに切り替わります。各ユーザーターンの頭で本命を再試行します。カンマ区切りで複数指定でき、TypeScript ではmodelと同じ値を指定すると起動時にエラーになりますtemperature・top_p・max_tokensに相当するフィールドはありません。代わりに effort や費用の上限を使います
環境変数#
env は、セッションを動かす Claude Code プロセスの環境変数です。
| 言語 | env の効き方 |
|---|---|
| TypeScript | サブプロセスの環境を置き換える。PATH・HOME・ANTHROPIC_API_KEY を残すには process.env を展開して渡す |
| Python | 継承した環境の上に値を重ねる。指定した値が優先 |
env を指定しなければ、どちらも自分の環境を引き継ぎます。
const options = {
env: { ...process.env, ANTHROPIC_BASE_URL: "https://gateway.example.com" },
};
options = ClaudeAgentOptions(
env={"ANTHROPIC_BASE_URL": "https://gateway.example.com"},
)
Claude Code が読む変数は 環境変数一覧 にあります。
作業ディレクトリ#
cwdを指定すると、そのディレクトリでセッションが動きます。未指定ならプロセスの作業ディレクトリですcwdを変える API はありません。別のディレクトリで動かすには、別のセッションを始めます- Claude Code は
cwdから、読み込むプロジェクトの設定とフック、スキルの探索先、セッションの保存先を決めます - 作業ディレクトリの外のファイルに触らせるには
additionalDirectories(Python はadd_dirs)を使います。許可されるのはファイルへのアクセスで、設定の読み込みではありません
セッション中の設定変更#
ストリーミング入力で始めたセッションは、動いている間にモデルと権限モードを切り替えられます。TypeScript は query() が返すオブジェクトのメソッド、Python は ClaudeSDKClient のメソッドです。
| TypeScript | Python | 内容 |
|---|---|---|
setModel() |
set_model() |
モデルを切り替える。引数なしなら Claude Code の既定のモデルに戻る |
setPermissionMode() |
set_permission_mode() |
権限モードを切り替える |
applyFlagSettings() |
なし | 設定ファイルのキーを実行時に適用する(例:{ effortLevel: "high" })。効くキーはリファレンスで確認する |
updateSettings() |
なし | 許可リストにある1つのキーを設定ファイルへ書く。"localSettings" はプロジェクトのローカル設定に書き次のリクエストから効く。"userSettings" で書けるのは effortLevel だけで、実行中のセッションの effort は変わらない |
補足
モデルごとにプロンプトキャッシュが別なので、途中で切り替えた直後のリクエストは、新しいモデルの料金で会話全体をキャッシュなしで計算し直します。
機能ごとのオプション#
| TypeScript | Python | 内容 |
|---|---|---|
permissionMode |
permission_mode |
承認なしでできること |
allowedTools |
allowed_tools |
事前承認するツール |
canUseTool |
can_use_tool |
ツール呼び出しの承認コールバック |
systemPrompt |
system_prompt |
エージェントへの指示 |
settingSources |
setting_sources |
読み込むファイルベースの設定 |
mcpServers |
mcp_servers |
外部ツールのサーバー |
agents |
agents |
サブエージェントの定義 |
hooks |
hooks |
ライフサイクルのコールバック |
skills |
skills |
読み込むスキル |
plugins |
plugins |
読み込むプラグイン |
outputFormat |
output_format |
構造化出力のスキーマ |
resume |
resume |
保存したセッションの再開 |
forkSession |
fork_session |
セッションの分岐 |
sessionStore |
session_store |
外部へのセッション保存 |
enableFileCheckpointing |
enable_file_checkpointing |
ファイル編集の巻き戻し |
effort |
effort |
応答にかける労力 |
sandbox |
sandbox |
ツール実行のサンドボックス |
関連は SDK のセッションと入出力(resume・forkSession・sessionStore・outputFormat・enableFileCheckpointing)と SDK のツール・権限・拡張(そのほか)です。
Claude Code の機能を読み込む#
settingSources を省略すると、query() は Claude Code の CLI と同じファイルベースの設定を読みます。user・project・local の設定、CLAUDE.md、.claude/ のスキル・エージェント・コマンドです。何も読ませたくないときは settingSources: [] を渡し、プログラムで指定したものだけで動かします。
for await (const message of query({
prompt: "auth モジュールをリファクタリングして",
options: {
settingSources: ["user", "project"], // ~/.claude/ と <cwd>/.claude/
allowedTools: ["Read", "Edit", "Bash"],
},
})) { /* ... */ }
options = ClaudeAgentOptions(
setting_sources=["user", "project"],
allowed_tools=["Read", "Edit", "Bash"],
)
| ソース | 読み込むもの | 場所 |
|---|---|---|
"project" |
プロジェクトの settings.json とフック、CLAUDE.md、.claude/rules/*.md、スキル・コマンド・サブエージェント |
settings.json とフックは <cwd>/.claude/。CLAUDE.md とルールは <cwd> と上位のディレクトリ。スキル・コマンド・サブエージェントは <cwd> からリポジトリのルートまでと、additionalDirectories の各ディレクトリの .claude/ |
"user" |
ユーザーの settings.json、CLAUDE.md、rules、スキル・コマンド・サブエージェント |
~/.claude/ 以下 |
"local" |
CLAUDE.local.md、.claude/settings.local.json |
settings.local.json は <cwd>/.claude/。CLAUDE.local.md は <cwd> と上位のディレクトリ |
省略は ["user", "project", "local"] と同じです。プロジェクトの settings.json とフックは <cwd>/.claude/ だけから読み、親ディレクトリへはさかのぼりません。
settingSources が制御しないもの#
| 入力 | 動き | 無効にする方法 |
|---|---|---|
| 管理ポリシーの設定 | ホストの MDM・レジストリ・管理設定ファイルは常に読む。サーバー管理設定は、組織の認証情報などで認証したときに取得する | ホスト側のポリシーを消す。サーバー管理設定は SDK からは無効にできない(組織の Owner が管理) |
~/.claude.json |
常に読む | env の CLAUDE_CONFIG_DIR で場所を変える |
~/.claude/projects/<project>/memory/ の自動メモリ |
セッション開始時にシステムプロンプトへ入る。保存は Write と Edit で行うので、有効でないと保存されない |
設定の autoMemoryEnabled: false、または env の CLAUDE_CODE_DISABLE_AUTO_MEMORY=1 |
| claude.ai の MCP コネクタ | claude.ai のログインで認証したとき読み込む。claude setup-token のトークン(CLAUDE_CODE_OAUTH_TOKEN)では読み込まない。mcpServers: {} では抑えられない |
strictMcpConfig: true、設定の disableClaudeAiConnectors: true、env の ENABLE_CLAUDEAI_MCP_SERVERS=false |
~/.claude/settings.json の sandbox.credentials の deny と mask |
コマンドのサンドボックスが動くとき、user 設定を除いても制限として適用される | 該当の項目を ~/.claude/settings.json から消す |
注意
マルチテナントの分離を既定の query() に頼らないでください。上の入力はホストの設定やディレクトリごとのメモリを拾います。テナントごとに別のファイルシステムで動かし、settingSources: [] と env の CLAUDE_CODE_DISABLE_AUTO_MEMORY=1 を指定します。サーバー管理設定は、組織の認証情報で認証すればファイルシステムを分けても取得されます(SDK の本番運用)。
CLAUDE.md の読み込み場所#
| レベル | 場所 | 読み込まれる条件 |
|---|---|---|
| プロジェクト(ルート) | <cwd>/CLAUDE.md か <cwd>/.claude/CLAUDE.md |
settingSources に "project" |
| プロジェクトのルール | <cwd>/.claude/rules/*.md と、上位の各ディレクトリの .claude/rules/*.md |
"project" |
| プロジェクト(上位) | cwd より上のディレクトリの CLAUDE.md |
"project"。セッション開始時 |
| プロジェクト(下位) | cwd の下のサブディレクトリの CLAUDE.md |
"project"。そのサブツリーのファイルを読んだときに読み込む |
| ローカル | <cwd>/CLAUDE.local.md と上位の各ディレクトリの CLAUDE.local.md |
"local" |
| ユーザー | ~/.claude/CLAUDE.md |
"user" |
| ユーザーのルール | ~/.claude/rules/*.md |
"user" |
全レベルが加算で効き、優先順位の決まりはありません。矛盾すると Claude の解釈次第なので、矛盾しない書き方にするか、特定のファイルに優先を明記します。CLAUDE.md を使わずに systemPrompt で文脈を渡すこともできます。対話の Claude Code と SDK で同じ文脈を共有したいときに CLAUDE.md が向きます(CLAUDE.md とメモリ)。
スキルとフック#
- スキルは
settingSources経由でファイルシステムから見つかります。skillsを省略すると、見つかったユーザーとプロジェクトのスキルが有効で、Skill ツールが使えます。"all"・スキル名のリスト・[](全部無効)を渡せます。skillsを指定すると Skill ツールがallowedToolsに自動で加わります。toolsを明示するなら"Skill"を含めます - スキルは
.claude/skills/<name>/SKILL.mdのファイルとして作ります。プログラムから登録する API はありません(スキル) - フックには、
settings.jsonに書くファイルシステムのフックと、query()に渡すコールバック(プログラム)の2種類があり、並んで動きます
| フックの種類 | 向くもの |
|---|---|
ファイルシステム(settings.json) |
CLI と SDK で共有する。"command"・"http"・"mcp_tool"・"prompt"・"agent" が使え、メインのエージェントとサブエージェントの両方で動く |
プログラム(query() のコールバック) |
アプリ固有の処理、構造化された判断、プロセス内の連携。サブエージェントでも動き、入力の agent_id と agent_type でどのエージェントかが分かる |
コールバックは {} を返すと許可です。拒否するには hookSpecificOutput に permissionDecision: "deny" と permissionDecisionReason を入れます。理由は Claude にツール結果として返ります。SessionStart・SessionEnd・TeammateIdle・TaskCompleted などは TypeScript だけのイベントです。
async def audit_bash(input_data, tool_use_id, context):
command = input_data.get("tool_input", {}).get("command", "")
if "rm -rf" in command:
return {
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "Destructive command blocked",
}
}
return {}
目的から機能を選ぶ#
| やりたいこと | 使うもの | SDK での指定 |
|---|---|---|
| プロジェクトの規約を常に守らせる | CLAUDE.md |
settingSources: ["project"] |
| 必要なときだけ読む参考資料を渡す | スキル | settingSources と skills |
| デプロイやレビューなどの定型作業 | ユーザーが呼ぶスキル | settingSources と skills |
| 独立した小作業を新しい文脈に任せる | サブエージェント | agents と allowedTools: ["Agent"] |
| 共有のタスクリストと相互のメッセージで複数の Claude Code を連携 | エージェントチーム | SDK のオプションでは設定しない(CLI の機能)(エージェントチーム) |
| ツール呼び出しに決まった処理を挟む | フック | hooks、または settingSources 経由のシェルスクリプト |
| 外部サービスへ構造化されたアクセスを与える | MCP | mcpServers |
有効にした機能は、どれもコンテキストを使います。
旧 Claude Code SDK からの移行#
Claude Code SDK は Claude Agent SDK に改名されました。
| 項目 | 旧 | 新 |
|---|---|---|
| npm のパッケージ名 | @anthropic-ai/claude-code |
@anthropic-ai/claude-agent-sdk |
| Python のパッケージ名 | claude-code-sdk |
claude-agent-sdk |
手順は、旧パッケージをアンインストールし(npm uninstall @anthropic-ai/claude-code、pip uninstall -y claude-code-sdk)、新しいものを入れ、インポートを書き換えます。package.json・requirements.txt・pyproject.toml に旧名が残っていれば置き換えます(package.json はバージョン範囲も更新します)。
// 旧: import { query, tool, createSdkMcpServer } from "@anthropic-ai/claude-code";
import { query, tool, createSdkMcpServer } from "@anthropic-ai/claude-agent-sdk";
# 旧: from claude_code_sdk import query, ClaudeCodeOptions
from claude_agent_sdk import query, ClaudeAgentOptions
v0.1.0 からの破壊的変更です。
- Python の
ClaudeCodeOptionsはClaudeAgentOptionsに改名されました - SDK は、既定では Claude Code のシステムプロンプトを使いません(最小のシステムプロンプトで動きます)。以前の動きにするには
systemPrompt: { type: "preset", preset: "claude_code" }(Python はsystem_prompt={"type": "preset", "preset": "claude_code"})を指定します。自作の文字列を渡すこともできます(システムプロンプトの変更) settingSourcesの既定は、v0.1.0 で一時的にファイルシステム設定を読まない形に変わったあと元に戻っているので、移行の作業は要りません。現在は省略すると user・project・local を読みます。分離するなら[]を渡します。CI/CD・デプロイしたアプリ・テスト環境・マルチテナントでは分離が特に重要です
補足
Python SDK 0.1.59 以前は、setting_sources の空リストを省略と同じに扱っていました。setting_sources=[] を当てにするなら、先に更新します。
エラーの対処#
機能ごとの症状は各機能のページにあります。ここでは CLI の起動と終了、構造化出力のエラーを扱います。次の表は、症状の行き先です。
| 症状 | 見る場所 |
|---|---|
Not logged in、Invalid API key、API Error、429、There's an issue with the selected model |
エラー一覧 |
MCP サーバーが failed と出る、ツールが呼ばれない、SDK の MCP サーバーのツールが見当たらない、接続がタイムアウトする、ツールの出力が許される最大トークンを超える |
SDK のツール・権限・拡張の MCP のトラブルシューティング |
| スキル・MCP・プラグイン・サブエージェント・フック・チェックポイントの不具合 | それぞれの機能のトラブルシューティング(SDK のツール・権限・拡張、SDK のセッションと入出力) |
| 手元で動くエージェントがデプロイ先で失敗する | SDK の本番運用 |
CLI の起動#
| エラー・メッセージ | SDK | 原因と対処 |
|---|---|---|
CLINotFoundError: Claude Code not found at: <path> |
Python | claude が見つからない。未導入なら導入する。cli_path を指定したなら実在する claude か確かめる。PATH に頼るなら、アプリを動かす環境で claude --version が通るか確かめる(IDE やサービスマネージャーは別の PATH のことがある) |
Native CLI binary for <platform>-<arch> not found |
TypeScript | 同梱のプラットフォームパッケージが無い。多くは optional dependencies を省いた導入。省かずに入れ直すか、ネイティブ版を入れて pathToClaudeCodeExecutable を指定する。bun build --compile の単一実行ファイルでは原因と対処が違う |
Claude Code native binary not found at <path>、Claude Code executable not found at <path>. Is options.pathToClaudeCodeExecutable set? |
TypeScript | 解決したパスのファイルが無いか、プロセスがアクセスできない。パスとアクセス権を確かめる |
CLIConnectionError: Refusing to execute batch script ... |
Python(Windows) | .bat・.cmd(npm の claude.cmd を含む)は、cmd.exe が引数を再解釈して任意のコマンドを実行されうるため、意図的に拒否される。cli_path を claude.exe にするか外す(cli_path があると探索が省かれる)。PowerShell で irm https://claude.ai/install.ps1 | iex を実行してネイティブ版を入れる。x64 の Windows なら claude.exe を同梱した wheel を使う。claude-agent-sdk 0.2.124 より前は、この検査なしで cmd.exe 経由で動かしていた |
Failed to start Claude Code: <detail> |
Python | 見つけたファイルを起動できない。<detail> は OS のエラー |
Claude Code executable at <path> exists but failed to launch |
TypeScript | 指定のパスのスクリプトが動かない |
Claude Code native binary at <path> exists but failed to launch |
TypeScript | バイナリが動かない。libc についての提案が付く |
Failed to spawn Claude Code process: <detail> |
TypeScript | そのほかの起動失敗 |
Not connected. Call connect() first. |
Python | ClaudeSDKClient を接続前か切断後に呼んだ。先に await client.connect() するか、async with ClaudeSDKClient() as client: を使う |
起動できない場合の共通の対処です。
- パスが
claudeの実行ファイルそのものを指し、実行権限があるか確かめる - 独自のパスが要らなければ
cli_path(Python)かpathToClaudeCodeExecutable(TypeScript)を外し、同梱のものを使わせる - 同梱のバイナリがコンテナで失敗するなら、イメージのビルド時に SDK を入れ直すか、実行するアーキテクチャ用にイメージを作り直す(アーキテクチャや libc の不一致、実行権限の欠落が多い)
CLI の終了#
| エラー | SDK | 内容 |
|---|---|---|
ProcessError: Command failed with exit code N |
Python | CLI が 0 以外で終了し、エラーの結果を報告しなかった。Error output の行は固定の文面で、stderr 属性も同じ。終了コードは exit_code 属性。実際の stderr を取るには ClaudeAgentOptions に stderr コールバックを渡す |
Claude Code process exited with code N. stderr: <tail> |
TypeScript | 0 以外の終了で、for await のループが普通の Error で拒否される。SDK のエラークラスは無いので、try/catch でメッセージを見る。全文は stderr コールバックで取る。シグナルで落ちたときは Claude Code process terminated by signal <name> |
Claude Code returned an error result: <CLI の報告> |
両方 | CLI がエラーの結果を報告してから終了した。コロンのあとが原因。Python は ResultError(data に結果の全体)、TypeScript は同じ形のメッセージの Error |
ResultError は ProcessError のサブクラスなので、別々に扱うなら except ResultError を先に書きます。claude-agent-sdk 0.2.140 より前は、エラー結果での終了を普通の Exception として送出していました。
構造化出力が空#
subtype が success でも、structured_output が Python で None、TypeScript で undefined になることがあります。実行は終わっても、検証済みの出力が無い状態です(例:満たせないスキーマ)。アプリ側では失敗として扱い、subtype が success であることと structured_output があることの両方を確かめてから使います。スキーマが正しいはずなのに繰り返すなら、充足可能かを確かめ、単純にして通してから、制約を1つずつ戻します(SDK のセッションと入出力)。
例とデモ#
- クイックスタートで、バグを見つけて直すエージェントを作れます
claude-agent-sdk-demosのリポジトリに、最小の Hello World から、メールクライアントやマルチエージェントの調査システムまで、手元で動かせるデモがあります- Claude Cookbook の Agent SDK シリーズは、1行の調査エージェントから多段のマルチエージェントへ進む Python ノートブックの連続した教材です。OpenAI Agents SDK からの移行レシピもあります
補足
Claude の名前を自社の製品に使う場合、「Claude Agent」「Claude」(「Agents」と題したメニューの中)「{YourAgentName} Powered by Claude」は使えます。「Claude Code」「Claude Code Agent」や Claude Code を真似た ASCII アートなどの表現は使えません。SDK の利用は Anthropic の商用利用規約に従います。
公式ドキュメント(英語)
- Agent SDK overview
- Quickstart
- How the agent loop works
- Configure your agent
- Use Claude Code features in the SDK
- Migrate to Claude Agent SDK
- Troubleshoot the Agent SDK
- Examples
2026年10月5日時点の内容をもとに、日本語でまとめています。