本文へ移動
Claude Tips

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 のアカウントです。

bash
# 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 などで先に読み込みます。

bash
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 が作業するあいだのメッセージを順に受け取れます。

python
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())
typescript
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ターンです。ターンの間は呼び出し側にメッセージが流れるだけで、制御は戻りません。

  1. SDK がプロンプトを送り、セッション情報の SystemMessage を返す
  2. Claude がツールを呼ぶ応答を出す(AssistantMessage)
  3. SDK がツールを実行し、結果を UserMessage として返す
  4. 2〜3 を繰り返し、ツール呼び出しのない応答が出たらループが終わる
  5. 最後の 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通りで調整できます
markdown
# 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 のツール・権限・拡張)。

まとめの例#

typescript
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}`);
}
python
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 リファレンス にあります。

typescript
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);
  }
}
python
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 を指定しなければ、どちらも自分の環境を引き継ぎます。

typescript
const options = {
  env: { ...process.env, ANTHROPIC_BASE_URL: "https://gateway.example.com" },
};
python
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: [] を渡し、プログラムで指定したものだけで動かします。

typescript
for await (const message of query({
  prompt: "auth モジュールをリファクタリングして",
  options: {
    settingSources: ["user", "project"], // ~/.claude/ と <cwd>/.claude/
    allowedTools: ["Read", "Edit", "Bash"],
  },
})) { /* ... */ }
python
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 だけのイベントです。

python
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 はバージョン範囲も更新します)。

typescript
// 旧: import { query, tool, createSdkMcpServer } from "@anthropic-ai/claude-code";
import { query, tool, createSdkMcpServer } from "@anthropic-ai/claude-agent-sdk";
python
# 旧: 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 の商用利用規約に従います。

公式ドキュメント(英語)

2026年10月5日時点の内容をもとに、日本語でまとめています。

ページの一覧