Agent SDK リファレンス - Python
Python Agent SDK の完全な API リファレンス。すべての関数、型、クラスを含みます。
インストール
仮想環境にパッケージをインストールしてください。最近の Debian、Ubuntu、Homebrew Python インストールでは、システム Python に対して pip install を実行すると error: externally-managed-environment で失敗します。
python3 -m venv .venv
source .venv/bin/activate
pip install claude-agent-sdk
uv、Windows PowerShell、API キーのセットアップについては、Agent SDK クイックスタートの「Setup」セクションを参照してください。
query() と ClaudeSDKClient の選択
Python SDK は Claude Code と対話するための 2 つの方法を提供します。
| 機能 | query() |
ClaudeSDKClient |
|---|---|---|
| セッション | デフォルトで新しいセッションを作成 | 同じセッションを再利用 |
| 会話 | 単一の交換 | 同じコンテキスト内の複数の交換 |
| 接続 | 自動的に管理 | 手動制御 |
| ストリーミング入力 | ✅ サポート | ✅ サポート |
| 割り込み | ❌ サポートなし | ✅ サポート |
| Hooks | ✅ サポート | ✅ サポート |
| カスタムツール | ✅ サポート | ✅ サポート |
| 会話を続ける | continue_conversation または resume で手動実行 |
✅ 自動 |
| ユースケース | 1 回限りのタスク | 継続的な会話 |
インタラクティブなアプリケーション(チャットインターフェースなど)や、次のアクションが Claude の応答に依存する場合は、ClaudeSDKClient を使用してください。
関数
[!NOTE]
このページの署名ブロックと裸の
async for/async withフラグメントは説明用です。実行するには、本体をasync def main(): ...でラップしてasyncio.run(main())を呼び出してください。
query()
デフォルトでは、Claude Code との各インタラクションのために新しいセッションを作成します。メッセージが到着するにつれて生成される非同期イテレータを返します。query() への各呼び出しは、continue_conversation=True または ClaudeAgentOptions の resume を渡さない限り、前のインタラクションのメモリなしで新しく開始します。セッション を参照してください。
async def query(
*,
prompt: str | AsyncIterable[dict[str, Any]],
options: ClaudeAgentOptions | None = None,
transport: Transport | None = None
) -> AsyncIterator[Message]
パラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
prompt |
str | AsyncIterable[dict] |
入力プロンプト(文字列またはストリーミングモード用の非同期イテレータ) |
options |
ClaudeAgentOptions | None |
オプションの設定オブジェクト(None の場合は ClaudeAgentOptions() がデフォルト) |
transport |
Transport | None |
CLI プロセスとの通信用のオプションのカスタムトランスポート |
戻り値
会話からのメッセージを生成する AsyncIterator[Message] を返します。
例 - オプション付き
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions
async def main():
options = ClaudeAgentOptions(
system_prompt="You are an expert Python developer",
permission_mode="acceptEdits",
)
async for message in query(prompt="Create a Python web server", options=options):
print(message)
asyncio.run(main())
tool()
型安全性を備えた MCP ツールを定義するためのデコレータ。
def tool(
name: str,
description: str,
input_schema: type | dict[str, Any],
annotations: ToolAnnotations | None = None
) -> Callable[[Callable[[Any], Awaitable[dict[str, Any]]]], SdkMcpTool[Any]]
パラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
name |
str |
ツールの一意の識別子 |
description |
str |
ツールが何をするかの人間が読める説明 |
input_schema |
type | dict[str, Any] |
ツールの入力パラメータを定義するスキーマ。入力スキーマオプション を参照してください |
annotations |
ToolAnnotations | None |
クライアントに動作ヒントを提供するオプションの MCP ツールアノテーション |
入力スキーマオプション
-
シンプルな型マッピング(推奨):
{"text": str, "count": int, "enabled": bool} -
JSON Schema 形式(複雑な検証用):
{ "type": "object", "properties": { "text": {"type": "string"}, "count": {"type": "integer", "minimum": 0}, }, "required": ["text"], } -
TypedDict クラス:
NotRequiredのキーがrequiredから除外される型付きスキーマ。- Python 3.11 以降:
typingからTypedDictとNotRequiredをインポートします。 - Python 3.10:
typingにはNotRequiredがありません。TypedDictとNotRequiredはtyping_extensionsからインポートしてください。SDK は Python 3.10 でtyping_extensionsをインストールします。
from typing import Annotated, Any, NotRequired, TypedDict from claude_agent_sdk import tool class ForecastArgs(TypedDict): latitude: Annotated[float, "Latitude coordinate"] hours: NotRequired[Annotated[int, "How many hours of forecast to return"]] @tool("get_forecast", "Get the hourly forecast for a location", ForecastArgs) async def get_forecast(args: dict[str, Any]) -> dict[str, Any]: hours = args.get("hours", 12) return {"content": [{"type": "text", "text": f"{hours}-hour forecast for {args['latitude']}"}]} - Python 3.11 以降:
シンプルなマッピング形式と TypedDict 形式では、型を Annotated[type, "description"] でラップすると、フィールドの説明を設定できます。
戻り値
ツール実装をラップし、SdkMcpTool インスタンスを返すデコレータ関数。
例
from claude_agent_sdk import tool
from typing import Any
@tool("greet", "Greet a user", {"name": str})
async def greet(args: dict[str, Any]) -> dict[str, Any]:
return {"content": [{"type": "text", "text": f"Hello, {args['name']}!"}]}
ToolAnnotations
ツールの動作ヒント。tool() の annotations 引数として渡されます。ToolAnnotations は MCP SDK の mcp.types.ToolAnnotations を maxResultSizeChars フィールドで拡張し、各ヒントを camelCase または snake_case で記述できます:ToolAnnotations(readOnlyHint=True) と ToolAnnotations(read_only_hint=True) は同等です。オブジェクトからヒントを読み取る際は、インストールされている mcp パッケージが宣言している表記を使用してください:mcp 1.x では .readOnlyHint、2.x では .read_only_hint を使用し、.maxResultSizeChars はどちらでも動作します。SDK がアノテーションを受け入れる場所であればどこでも、プレーンな mcp.types.ToolAnnotations を渡すこともできます。
snake_case 名と型付き maxResultSizeChars フィールドには Python Agent SDK 0.2.140 以降が必要です。バージョン 0.1.31 から 0.2.139 は mcp.types.ToolAnnotations を変更なしで再エクスポートします。バージョン 0.1.55 から 0.2.139 では、maxResultSizeChars をキーワード引数として渡すことができます:MCP クラスは追加フィールドを受け入れ、SDK は値を Claude Code に転送します。
すべてのフィールドはオプションです。クライアントはセキュリティ決定のためにこれらのヒントに依存すべきではありません。
| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
title |
str | None |
None |
ツールの人間が読める題名 |
readOnlyHint |
bool | None |
False |
True の場合、ツールはその環境を変更しません |
destructiveHint |
bool | None |
True |
True の場合、ツールは破壊的な更新を実行する可能性があります(readOnlyHint が False の場合のみ意味があります) |
idempotentHint |
bool | None |
False |
True の場合、同じ引数での繰り返し呼び出しは追加の効果がありません(readOnlyHint が False の場合のみ意味があります) |
openWorldHint |
bool | None |
True |
True の場合、ツールは外部エンティティと対話します(例:Web 検索)。False の場合、ツールのドメインは閉じています(例:メモリツール) |
maxResultSizeChars |
int | None |
None |
Claude Code がこのツールのテキスト結果をファイルに保存する代わりに会話内にインラインで保持する文字数(最大 500,000)。画像を含む結果は影響を受けません。MCP ヒントではなく Claude Code 設定:SDK はツールの _meta に anthropic/maxResultSizeChars として送信します。特定のツールの制限を引き上げる を参照してください |
from claude_agent_sdk import tool, ToolAnnotations
from typing import Any
@tool(
"search",
"Search the web",
{"query": str},
annotations=ToolAnnotations(readOnlyHint=True, openWorldHint=True),
)
async def search(args: dict[str, Any]) -> dict[str, Any]:
return {"content": [{"type": "text", "text": f"Results for: {args['query']}"}]}
create_sdk_mcp_server()
Python アプリケーション内で実行されるインプロセス MCP サーバーを作成します。
def create_sdk_mcp_server(
name: str,
version: str = "1.0.0",
tools: list[SdkMcpTool[Any]] | None = None
) -> McpSdkServerConfig
パラメータ
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
name |
str |
- | サーバーの一意の識別子 |
version |
str |
"1.0.0" |
サーバーバージョン文字列 |
tools |
list[SdkMcpTool[Any]] | None |
None |
@tool デコレータで作成されたツール関数のリスト |
戻り値
ClaudeAgentOptions.mcp_servers に渡すことができる McpSdkServerConfig オブジェクトを返します。
例
from claude_agent_sdk import tool, create_sdk_mcp_server, ClaudeAgentOptions
@tool("add", "Add two numbers", {"a": float, "b": float})
async def add(args):
return {"content": [{"type": "text", "text": f"Sum: {args['a'] + args['b']}"}]}
@tool("multiply", "Multiply two numbers", {"a": float, "b": float})
async def multiply(args):
return {"content": [{"type": "text", "text": f"Product: {args['a'] * args['b']}"}]}
calculator = create_sdk_mcp_server(
name="calculator",
version="2.0.0",
tools=[add, multiply], # Pass decorated functions
)
# Use with Claude
options = ClaudeAgentOptions(
mcp_servers={"calc": calculator},
allowed_tools=["mcp__calc__add", "mcp__calc__multiply"],
)
list_sessions()
メタデータを含む過去のセッションをリストします。プロジェクトディレクトリでフィルタするか、すべてのプロジェクト全体のセッションをリストします。同期的です。すぐに返します。
def list_sessions(
directory: str | None = None,
limit: int | None = None,
offset: int = 0,
include_worktrees: bool = True
) -> list[SDKSessionInfo]
パラメータ
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
directory |
str | None |
None |
セッションをリストするディレクトリ。省略した場合、すべてのプロジェクト全体のセッションを返します |
limit |
int | None |
None |
返すセッションの最大数 |
offset |
int |
0 |
ソート結果の開始からスキップするセッション数。limit と一緒に使用してページネーションを行います |
include_worktrees |
bool |
True |
directory が git リポジトリ内にある場合、すべての worktree パスからのセッションを含めます |
戻り値の型:SDKSessionInfo
| プロパティ | 型 | 説明 |
|---|---|---|
session_id |
str |
一意のセッション識別子 |
summary |
str |
表示タイトル:カスタムタイトル、最新のプロンプト、自動生成されたサマリー、または最初のプロンプト |
last_modified |
int |
エポック以降のミリ秒単位での最後の変更時刻 |
file_size |
int | None |
セッションファイルサイズ(バイト)(リモートストレージバックエンドの場合は None) |
custom_title |
str | None |
ユーザーが設定したセッションタイトル |
first_prompt |
str | None |
セッション内の最初の意味のあるユーザープロンプト |
git_branch |
str | None |
セッション終了時の Git ブランチ |
cwd |
str | None |
セッションの作業ディレクトリ |
tag |
str | None |
ユーザーが設定したセッションタグ(tag_session() を参照) |
created_at |
int | None |
エポック以降のミリ秒単位でのセッション作成時刻 |
例
プロジェクトの 10 個の最新セッションを出力します。結果は last_modified の降順でソートされるため、最初の項目が最新です。directory を省略するとすべてのプロジェクト全体を検索します。
from claude_agent_sdk import list_sessions
for session in list_sessions(directory="/path/to/project", limit=10):
print(f"{session.summary} ({session.session_id})")
get_session_messages()
過去のセッションからメッセージを取得します。同期的です。すぐに返します。
def get_session_messages(
session_id: str,
directory: str | None = None,
limit: int | None = None,
offset: int = 0
) -> list[SessionMessage]
パラメータ
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
session_id |
str |
必須 | メッセージを取得するセッション ID |
directory |
str | None |
None |
検索するプロジェクトディレクトリ。省略した場合、すべてのプロジェクトを検索します |
limit |
int | None |
None |
返すメッセージの最大数 |
offset |
int |
0 |
開始からスキップするメッセージ数 |
戻り値の型:SessionMessage
| プロパティ | 型 | 説明 |
|---|---|---|
type |
Literal["user", "assistant"] |
メッセージロール |
uuid |
str |
一意のメッセージ識別子 |
session_id |
str |
セッション識別子 |
message |
Any |
生のメッセージコンテンツ |
parent_tool_use_id |
str | None |
サブエージェントメッセージの場合、スポーニング Agent ツール使用ブロックの ID。メインセッションメッセージと古いセッションの場合は None |
parent_agent_id |
str | None |
ネストされたサブエージェント からのメッセージの場合、親サブエージェントのエージェント ID。メインセッションメッセージ、トップレベルのサブエージェントメッセージ、および古いセッションの場合は None。Python Agent SDK 0.2.140 以降が必要です |
例
from claude_agent_sdk import list_sessions, get_session_messages
sessions = list_sessions(limit=1)
if sessions:
messages = get_session_messages(sessions[0].session_id)
for msg in messages:
print(f"[{msg.type}] {msg.uuid}")
get_session_info()
プロジェクトディレクトリ全体をスキャンせずに、ID でシングルセッションのメタデータを読み取ります。同期的です。すぐに返します。
def get_session_info(
session_id: str,
directory: str | None = None,
) -> SDKSessionInfo | None
パラメータ
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
session_id |
str |
必須 | 検索するセッションの UUID |
directory |
str | None |
None |
プロジェクトディレクトリパス。省略した場合、すべてのプロジェクトディレクトリを検索します |
SDKSessionInfo を返すか、セッションが見つからない場合は None。
例
プロジェクトディレクトリをスキャンせずに、シングルセッションのメタデータを検索します。前の実行からセッション ID を既に持っている場合に便利です。
from claude_agent_sdk import get_session_info
info = get_session_info("550e8400-e29b-41d4-a716-446655440000")
if info:
print(f"{info.summary} (branch: {info.git_branch}, tag: {info.tag})")
rename_session()
カスタムタイトルエントリを追加することでセッションの名前を変更します。繰り返し呼び出しは安全です。最新のタイトルが優先されます。同期的です。
def rename_session(
session_id: str,
title: str,
directory: str | None = None,
) -> None
パラメータ
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
session_id |
str |
必須 | 名前を変更するセッションの UUID |
title |
str |
必須 | 新しいタイトル。空白をストリップした後、空でない必要があります |
directory |
str | None |
None |
プロジェクトディレクトリパス。省略した場合、すべてのプロジェクトディレクトリを検索します |
session_id が有効な UUID でない場合、または title が空の場合は ValueError を発生させます。セッションが見つからない場合は FileNotFoundError。
例
最新のセッションの名前を変更して、後で見つけやすくします。新しいタイトルは、その後の読み取りで SDKSessionInfo.custom_title に表示されます。
from claude_agent_sdk import list_sessions, rename_session
sessions = list_sessions(directory="/path/to/project", limit=1)
if sessions:
rename_session(sessions[0].session_id, "Refactor auth module")
tag_session()
セッションにタグを付けます。None を渡してタグをクリアします。繰り返し呼び出しは安全です。最新のタグが優先されます。同期的です。
def tag_session(
session_id: str,
tag: str | None,
directory: str | None = None,
) -> None
パラメータ
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
session_id |
str |
必須 | タグを付けるセッションの UUID |
tag |
str | None |
必須 | タグ文字列、またはクリアする場合は None。保存前に Unicode サニタイズされます |
directory |
str | None |
None |
プロジェクトディレクトリパス。省略した場合、すべてのプロジェクトディレクトリを検索します |
session_id が有効な UUID でない場合、またはサニタイズ後に tag が空の場合は ValueError を発生させます。セッションが見つからない場合は FileNotFoundError。
例
セッションにタグを付けてから、後の読み取りでそのタグでフィルタします。既存のタグをクリアするには None を渡します。
from claude_agent_sdk import list_sessions, tag_session
# Tag the most recent session
sessions = list_sessions(directory="/path/to/project", limit=1)
if sessions:
tag_session(sessions[0].session_id, "needs-review")
# Later: find all sessions with that tag
for session in list_sessions(directory="/path/to/project"):
if session.tag == "needs-review":
print(session.summary)
fork_session()
セッションのトランスクリプトを新しいセッションにコピーし、元のセッションを変更せずに会話を別の方向に進められるようにします。会話の途中の時点から分岐するには、up_to_message_id を渡します。同期的です。
def fork_session(
session_id: str,
directory: str | None = None,
up_to_message_id: str | None = None,
title: str | None = None,
) -> ForkSessionResult
パラメータ
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
session_id |
str |
必須 | フォークするセッションの UUID |
directory |
str | None |
None |
プロジェクトディレクトリパス。省略した場合、すべてのプロジェクトディレクトリを検索します |
up_to_message_id |
str | None |
None |
この UUID を持つメッセージまで(そのメッセージを含む)トランスクリプトをコピーします。UUID には get_session_messages() から取得した uuid などを指定します。省略した場合、トランスクリプト全体をコピーします |
title |
str | None |
None |
フォークのタイトル。省略した場合、SDK は元のセッションからタイトルを導出し、その後に (fork) を付けます |
session_id が新しいセッションの UUID である ForkSessionResult を返します。フォークを続行するには、これを resume として渡します。フォークには元のセッションのファイルチェックポイントが含まれないため、フォーク前に取得したチェックポイントまで巻き戻すことはできません。
fork_session() は次の例外を発生させます:
ValueError:session_idまたはup_to_message_idが有効な UUID ではないValueError:セッションにメッセージがない、またはup_to_message_idがトランスクリプト内のどのメッセージにも一致しないFileNotFoundError:セッションが見つからない
例
最新のセッションを新しいタイトルでフォークし、そのフォークを再開します。元のセッションは独自の履歴を保持します。
from claude_agent_sdk import fork_session, list_sessions
sessions = list_sessions(directory="/path/to/project", limit=1)
if sessions:
forked = fork_session(sessions[0].session_id, title="Try the OAuth approach")
print(forked.session_id) # pass as ClaudeAgentOptions(resume=...) to continue the fork
クラス
ClaudeSDKClient
複数の交換にわたってセッションを維持します。 これは TypeScript SDK の query() 関数が内部的にどのように機能するかの Python 同等物です。会話を続けることができるクライアントオブジェクトを作成します。query() との比較 を参照してください。
class ClaudeSDKClient:
def __init__(self, options: ClaudeAgentOptions | None = None, transport: Transport | None = None)
async def connect(self, prompt: str | AsyncIterable[dict] | None = None) -> None
async def query(self, prompt: str | AsyncIterable[dict], session_id: str = "default") -> None
async def receive_messages(self) -> AsyncIterator[Message]
async def receive_response(self) -> AsyncIterator[Message]
async def interrupt(self) -> None
async def set_permission_mode(self, mode: PermissionMode) -> None
async def set_model(self, model: str | None = None) -> None
async def rewind_files(self, user_message_id: str) -> None
async def get_mcp_status(self) -> McpStatusResponse
async def get_context_usage(self) -> ContextUsageResponse
async def reconnect_mcp_server(self, server_name: str) -> None
async def toggle_mcp_server(self, server_name: str, enabled: bool) -> None
async def stop_task(self, task_id: str) -> None
async def get_server_info(self) -> dict[str, Any] | None
async def disconnect(self) -> None
メソッド
| メソッド | 説明 |
|---|---|
__init__(options) |
オプションの設定でクライアントを初期化します |
connect(prompt) |
オプションの初期プロンプトまたはメッセージストリームで Claude に接続します |
query(prompt, session_id) |
ストリーミングモードで新しいリクエストを送信します |
receive_messages() |
Claude からのすべてのメッセージを非同期イテレータとして受け取ります |
receive_response() |
ResultMessage を含むまでのメッセージを受け取ります |
interrupt() |
割り込み信号を送信します(ストリーミングモードでのみ機能) |
set_permission_mode(mode) |
現在のセッションの権限モードを変更します |
set_model(model) |
現在のセッションのモデルを変更します。Claude Code のデフォルトモデル にリセットするには None を渡します。新しいモデルが auto モードをサポートしていない場合、auto モードのセッションは default モードに変更されます |
rewind_files(user_message_id) |
ファイルを指定されたユーザーメッセージの状態に復元します。enable_file_checkpointing=True が必要です。ファイルチェックポイント を参照 |
get_mcp_status() |
すべての設定済み MCP サーバーのステータスを取得します。McpStatusResponse を返します |
get_context_usage() |
カテゴリ、スキル、ツール別のコンテキストウィンドウ使用状況の内訳を取得します。インタラクティブセッションで /context が表示するデータを含みます。ContextUsageResponse を返します。内訳を計算するために、Claude Code はメッセージストリームに表示されないいくつかのトークンカウント API リクエストを行います。これらのリクエストがどのように処理されるかを参照 |
reconnect_mcp_server(server_name) |
失敗したか切断された MCP サーバーへの再接続を試みます |
toggle_mcp_server(server_name, enabled) |
セッション中に MCP サーバーを有効または無効にします。stdio、SSE、または HTTP サーバーを無効にするとそのツールが削除されます |
stop_task(task_id) |
実行中のバックグラウンドタスクを停止します。ステータス "stopped" の TaskNotificationMessage がメッセージストリームに続きます |
get_server_info() |
サーバーの初期化情報(利用可能なコマンドと出力スタイルを含む)を取得します |
disconnect() |
Claude から切断します |
コンテキストマネージャーサポート
クライアントは自動接続管理のための非同期コンテキストマネージャーとして使用できます:
import asyncio
from claude_agent_sdk import ClaudeSDKClient
async def main():
async with ClaudeSDKClient() as client:
await client.query("Hello Claude")
async for message in client.receive_response():
print(message)
asyncio.run(main())
重要: メッセージを反復処理する場合、早期に終了するために
breakを使用することは避けてください。これは asyncio クリーンアップの問題を引き起こす可能性があります。代わりに、反復を自然に完了させるか、フラグを使用して必要なものを見つけたときを追跡してください。
例 - 会話を続ける
import asyncio
from claude_agent_sdk import ClaudeSDKClient, AssistantMessage, TextBlock, ResultMessage
async def main():
async with ClaudeSDKClient() as client:
# First question
await client.query("What's the capital of France?")
# Process response
async for message in client.receive_response():
if isinstance(message, AssistantMessage):
for block in message.content:
if isinstance(block, TextBlock):
print(f"Claude: {block.text}")
# Follow-up question - the session retains the previous context
await client.query("What's the population of that city?")
async for message in client.receive_response():
if isinstance(message, AssistantMessage):
for block in message.content:
if isinstance(block, TextBlock):
print(f"Claude: {block.text}")
# Another follow-up - still in the same conversation
await client.query("What are some famous landmarks there?")
async for message in client.receive_response():
if isinstance(message, AssistantMessage):
for block in message.content:
if isinstance(block, TextBlock):
print(f"Claude: {block.text}")
asyncio.run(main())
例 - ClaudeSDKClient でのストリーミング入力
query() はユーザーメッセージ辞書の非同期イテレータも受け入れるため、送信時にプロンプトを組み立てたり、画像などのコンテンツブロックを含めたりできます。Claude Code は最初に生成されたメッセージが到着するとすぐに応答を開始し、イテレータが完了するのを待たず、receive_response() はそのレスポンスを終了する ResultMessage で停止します。Claude が回答する前に読むべきすべてのものを 1 つのメッセージに入れてください。このジェネレータが行うように、各 query() 呼び出しを独自の receive_response() ループとペアにしてください。
import asyncio
from claude_agent_sdk import ClaudeSDKClient
async def message_stream():
"""Assemble the prompt at send time and yield it as one user message."""
readings = {"Temperature": "25°C", "Humidity": "60%"}
data = ", ".join(f"{name}: {value}" for name, value in readings.items())
yield {
"type": "user",
"message": {
"role": "user",
"content": f"Analyze the following sensor data and describe any patterns you see: {data}",
},
}
async def main():
async with ClaudeSDKClient() as client:
# Stream input to Claude
await client.query(message_stream())
# Process response
async for message in client.receive_response():
print(message)
# Follow-up in same session
await client.query("Should we be concerned about these readings?")
async for message in client.receive_response():
print(message)
asyncio.run(main())
例 - 割り込みの使用
import asyncio
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions, ResultMessage
async def interruptible_task():
options = ClaudeAgentOptions(allowed_tools=["Bash"], permission_mode="acceptEdits")
async with ClaudeSDKClient(options=options) as client:
# Start a long-running task
await client.query("Count from 1 to 100 slowly, using the bash sleep command")
# Let it run for a bit
await asyncio.sleep(2)
# Interrupt the task
await client.interrupt()
print("Task interrupted!")
# Drain the interrupted task's messages (including its ResultMessage)
async for message in client.receive_response():
if isinstance(message, ResultMessage):
print(f"Interrupted task: terminal_reason={message.terminal_reason!r}")
# terminal_reason is "aborted_streaming" or "aborted_tools"
# for interrupted turns
# Send a new command
await client.query("Just say hello instead")
# Now receive the new response
async for message in client.receive_response():
if isinstance(message, ResultMessage) and message.subtype == "success":
print(f"New result: {message.result}")
asyncio.run(interruptible_task())
[!NOTE]
割り込み後のバッファ動作:
interrupt()は停止信号を送信しますが、メッセージバッファをクリアしません。割り込まれたタスクによって既に生成されたメッセージ(そのResultMessageを含む)はストリームに残ります。新しいクエリの応答を読む前に、receive_response()でそれらをドレインする必要があります。interrupt()の直後に新しいクエリを送信し、receive_response()を 1 回だけ呼び出すと、割り込まれたタスクのメッセージが受け取られ、新しいクエリの応答ではありません。
例 - 高度な権限制御
import asyncio
from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions
from claude_agent_sdk.types import (
PermissionResultAllow,
PermissionResultDeny,
ToolPermissionContext,
)
async def custom_permission_handler(
tool_name: str, input_data: dict, context: ToolPermissionContext
) -> PermissionResultAllow | PermissionResultDeny:
"""Custom logic for tool permissions."""
# Block writes to system directories
if tool_name == "Write" and input_data.get("file_path", "").startswith("/system/"):
return PermissionResultDeny(
message="System directory write not allowed", interrupt=True
)
# Redirect sensitive file operations
if tool_name in ["Write", "Edit"] and "config" in input_data.get("file_path", ""):
safe_path = f"./sandbox/{input_data['file_path']}"
return PermissionResultAllow(
updated_input={**input_data, "file_path": safe_path}
)
# Allow everything else
return PermissionResultAllow(updated_input=input_data)
async def main():
# ゲートされたツールを allowed_tools にも列挙しないでください:許可ルールは can_use_tool が実行される前に呼び出しを承認します
options = ClaudeAgentOptions(can_use_tool=custom_permission_handler)
async with ClaudeSDKClient(options=options) as client:
await client.query("Update the system config file")
async for message in client.receive_response():
# Will use sandbox path instead
print(message)
asyncio.run(main())
型
[!NOTE]
@dataclassとTypedDictの違い: この SDK では 2 種類の型を使用します。@dataclassでデコレートされたクラス(ResultMessage、AgentDefinition、TextBlockなど)は実行時にはオブジェクトインスタンスであり、属性アクセス(msg.result)をサポートします。TypedDictで定義されたクラス(ThinkingConfigEnabled、McpStdioServerConfig、SyncHookJSONOutputなど)は実行時にはプレーンな dict であり、キーによるアクセスが必要です。config.budget_tokensではなくconfig["budget_tokens"]と記述します。ClassName(field=value)の呼び出し構文はどちらでも使用できますが、属性を持つオブジェクトを生成するのは dataclass だけです。
SdkMcpTool
@tool デコレーターで作成される SDK MCP ツールの定義です。
@dataclass
class SdkMcpTool(Generic[T]):
name: str
description: str
input_schema: type[T] | dict[str, Any]
handler: Callable[[T], Awaitable[dict[str, Any]]]
annotations: ToolAnnotations | None = None
| プロパティ | 型 | 説明 |
|---|---|---|
name |
str |
ツールの一意な識別子 |
description |
str |
人間が読める説明 |
input_schema |
type[T] | dict[str, Any] |
入力検証用のスキーマ |
handler |
Callable[[T], Awaitable[dict[str, Any]]] |
ツールの実行を処理する非同期関数 |
annotations |
ToolAnnotations | None |
オプションのツールアノテーション(例:readOnlyHint、destructiveHint、openWorldHint、maxResultSizeChars) |
Transport
カスタムトランスポート実装用の抽象基底クラスです。カスタムチャネル(たとえば、ローカルのサブプロセスではなくリモート接続)を介して Claude プロセスと通信する場合に使用します。
[!WARNING]
これは低レベルの内部 API です。インターフェースは今後のリリースで変更される可能性があります。カスタム実装は、インターフェースの変更に合わせて更新する必要があります。
from abc import ABC, abstractmethod
from collections.abc import AsyncIterator
from typing import Any
class Transport(ABC):
@abstractmethod
async def connect(self) -> None: ...
@abstractmethod
async def write(self, data: str) -> None: ...
@abstractmethod
def read_messages(self) -> AsyncIterator[dict[str, Any]]: ...
@abstractmethod
async def close(self) -> None: ...
@abstractmethod
def is_ready(self) -> bool: ...
@abstractmethod
async def end_input(self) -> None: ...
| メソッド | 説明 |
|---|---|
connect() |
トランスポートを接続し、通信の準備をします |
write(data) |
生データ(JSON + 改行)をトランスポートに書き込みます |
read_messages() |
パース済みの JSON メッセージを yield する非同期イテレーター |
close() |
接続を閉じ、リソースをクリーンアップします |
is_ready() |
トランスポートが送受信可能な場合に True を返します |
end_input() |
入力ストリームを閉じます(たとえば、サブプロセストランスポートの場合は stdin を閉じます) |
インポート:from claude_agent_sdk import Transport
ClaudeAgentOptions
Claude Code クエリ用の設定 dataclass です。
@dataclass
class ClaudeAgentOptions:
tools: list[str] | ToolsPreset | None = None
allowed_tools: list[str] = field(default_factory=list)
system_prompt: str | SystemPromptPreset | SystemPromptCustom | SystemPromptFile | None = None
mcp_servers: dict[str, McpServerConfig] | str | Path = field(default_factory=dict)
strict_mcp_config: bool = False
permission_mode: PermissionMode | None = None
continue_conversation: bool = False
resume: str | None = None
session_id: str | None = None
max_turns: int | None = None
max_budget_usd: float | None = None
disallowed_tools: list[str] = field(default_factory=list)
model: str | None = None
fallback_model: str | None = None
betas: list[SdkBeta] = field(default_factory=list)
output_format: dict[str, Any] | None = None
permission_prompt_tool_name: str | None = None
cwd: str | Path | None = None
cli_path: str | Path | None = None
settings: str | None = None
add_dirs: list[str | Path] = field(default_factory=list)
env: dict[str, str] = field(default_factory=dict)
extra_args: dict[str, str | None] = field(default_factory=dict)
max_buffer_size: int | None = None
debug_stderr: Any = sys.stderr # Deprecated
stderr: Callable[[str], None] | None = None
can_use_tool: CanUseTool | None = None
hooks: dict[HookEvent, list[HookMatcher]] | None = None
user: str | None = None
include_partial_messages: bool = False
include_hook_events: bool = False
forward_subagent_text: bool = False
verbatim_prompts: bool = False
fork_session: bool = False
resume_session_at: str | None = None
resume_drops_turn: str | None = None
agents: dict[str, AgentDefinition] | None = None
setting_sources: list[SettingSource] | None = None
skills: list[str] | Literal["all"] | None = None
sandbox: SandboxSettings | None = None
plugins: list[SdkPluginConfig] = field(default_factory=list)
max_thinking_tokens: int | None = None # Deprecated: use thinking instead
thinking: ThinkingConfig | None = None
effort: EffortLevel | None = None
enable_file_checkpointing: bool = False
session_store: SessionStore | None = None
session_store_flush: SessionStoreFlushMode = "batched"
load_timeout_ms: int = 60_000
task_budget: TaskBudget | None = None
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
tools |
list[str] | ToolsPreset | None |
None |
ツールの設定。Claude Code のデフォルトツールを使用するには {"type": "preset", "preset": "claude_code"} を指定します |
allowed_tools |
list[str] |
[] |
確認を求めずに自動承認するツール(ネットワークパスからの読み取りを除く)。Claude をこれらのツールだけに制限するものではありません。ここでタスク追跡ツールのいずれかを指定すると、Claude Code はセッションのオプトインも行います。リストにないその他のツールは permission_mode と can_use_tool に委ねられます。ツールをブロックするには disallowed_tools を使用します。権限を参照してください |
system_prompt |
str | SystemPromptPreset | SystemPromptCustom | SystemPromptFile | None |
None |
システムプロンプトの設定。カスタムプロンプトには文字列を、オプションの "append" 付きで Claude Code のシステムプロンプトを使用するには {"type": "preset", "preset": "claude_code"} を、"snapshot" も設定できるカスタムプロンプトには {"type": "custom", "prompt": "..."} を、大きなプロンプトをディスクから読み込むには {"type": "file", "path": "..."} を渡します。SystemPromptPreset、SystemPromptCustom、SystemPromptFile を参照してください |
mcp_servers |
dict[str, McpServerConfig] | str | Path |
{} |
MCP サーバーの設定、または設定ファイルへのパス |
strict_mcp_config |
bool |
False |
True の場合、mcp_servers で渡されたサーバーのみを使用し、プロジェクトの .mcp.json、ユーザー設定、プラグインが提供する MCP サーバー、claude.ai コネクタを無視します。CLI の --strict-mcp-config フラグに対応します |
permission_mode |
PermissionMode | None |
None |
ツール使用時の権限モード |
continue_conversation |
bool |
False |
最新の会話を継続します |
resume |
str | None |
None |
再開するセッション ID |
session_id |
str | None |
None |
自動生成されたセッション ID の代わりに特定のセッション ID を使用します。有効な UUID である必要があります。fork_session も設定されていない限り、continue_conversation や resume と組み合わせることはできません |
max_turns |
int | None |
None |
エージェントのターンの最大数 |
max_budget_usd |
float | None |
None |
クライアント側のコスト見積もりがこの USD 値に達したときにクエリを停止します。見積もりはこの値を超えることがあるため、余裕を持たせてください。カウントされるのはその呼び出し自体の支出のみで、再開されたセッションから復元された合計はカウントされません。精度に関する注意点とリセット時の動作については、コストと使用量の追跡を参照してください |
disallowed_tools |
list[str] |
[] |
拒否するツール。"Bash" のような名前のみの指定では、そのツールが Claude のコンテキストから削除されます。"Bash(rm *)" のようなスコープ付きルールではツールは利用可能なままとなり、bypassPermissions を含むすべての権限モードで、記述されたとおりのコマンドに一致する呼び出しが拒否されます。権限を参照してください |
enable_file_checkpointing |
bool |
False |
巻き戻しのためのファイル変更追跡を有効にします。ファイルのチェックポイント機能を参照してください |
model |
str | None |
None |
Claude モデルのエイリアスまたは完全なモデル名。使用できる値とプロバイダー固有の ID を参照してください |
fallback_model |
str | None |
None |
プライマリモデルが失敗した場合に使用するフォールバックモデル。カンマ区切りのリストを指定できます。ガイダンスについては、モデルを選択するを参照してください |
betas |
list[SdkBeta] |
[] |
有効にするベータ機能。使用可能なオプションについては SdkBeta を参照してください |
output_format |
dict[str, Any] | None |
None |
構造化された応答の出力形式(例:{"type": "json_schema", "schema": {...}})。詳細については構造化出力を参照してください |
permission_prompt_tool_name |
str | None |
None |
権限プロンプト用の MCP ツール名 |
cwd |
str | Path | None |
None |
現在の作業ディレクトリ |
cli_path |
str | Path | None |
None |
Claude Code CLI 実行ファイルへのカスタムパス |
settings |
str | None |
None |
設定ファイルへのパス、またはインラインの JSON 文字列 |
add_dirs |
list[str | Path] |
[] |
Claude がアクセスできる追加のディレクトリ。SDK は各エントリを --add-dir として Claude Code に渡すため、project 設定ソースを使用している場合、Claude Code はそのディレクトリのスキル、コマンド、サブエージェントも読み込みます |
env |
dict[str, str] |
{} |
継承されたプロセス環境の上にマージされる環境変数。基盤となる CLI が読み取る変数については環境変数を、タイムアウト関連の変数については遅延または停止した API レスポンスへの対処を参照してください。User-Agent ヘッダーでアプリを識別するには CLAUDE_AGENT_SDK_CLIENT_APP を設定します |
extra_args |
dict[str, str | None] |
{} |
CLI に直接渡す追加の CLI 引数 |
max_buffer_size |
int | None |
None |
CLI の stdout をバッファリングする際の最大バイト数 |
debug_stderr |
Any |
sys.stderr |
非推奨 - SDK はこの値を無視します。CLI の stderr 出力には stderr コールバックを使用してください |
stderr |
Callable[[str], None] | None |
None |
CLI からの stderr 出力用のコールバック関数 |
can_use_tool |
CanUseTool | None |
None |
ツールの権限コールバック。権限フローがプロンプトに至った場合にのみ呼び出されます。allowed_tools、許可ルール、または permission_mode によって自動承認された呼び出しでは呼び出されません。許可ルールはどのモードでも自動承認されないアクションを事前承認しません。詳細については CanUseTool を参照してください |
hooks |
dict[HookEvent, list[HookMatcher]] | None |
None |
イベントをインターセプトするためのフック設定 |
user |
str | None |
None |
POSIX プラットフォームにおいて、Claude Code サブプロセスを実行する OS ユーザーアカウント。Claude Code は HOME を含む親プロセスの環境を維持し、cwd で実行されます |
include_partial_messages |
bool |
False |
部分メッセージのストリーミングイベントを含めます。有効にすると、StreamEvent メッセージが yield されます |
include_hook_events |
bool |
False |
フックのライフサイクルイベントを HookEventMessage オブジェクトとしてメッセージストリームに含めます |
forward_subagent_text |
bool |
False |
サブエージェントのテキストブロックと思考ブロックをメッセージストリームに転送します。このオプションを指定しない場合、Claude Code はフォアグラウンドで実行されるサブエージェントのテキストブロックと思考ブロックを省略します。ネストされたサブエージェント、context: fork を指定したスキル、およびそれぞれに必要な Claude Code のバージョンについては、サブエージェントのメッセージを追跡するを参照してください。Python Agent SDK 0.2.140 以降が必要です |
verbatim_prompts |
bool |
False |
すべてのプロンプトを記述されたとおりに送信します。SDK は各ユーザーメッセージを client_composed を True に設定して送信します。それらのメッセージで Claude Code が何をスキップするかについては、client_composed を参照してください。プロンプトのテキストにエンドユーザーが入力していないコンテンツが含まれる場合にこのオプションを使用します。ターンごとに制御するには、このオプションをオフのままにし、代わりに個々のストリーミングメッセージで "client_composed": True を設定します。このオプションがオンの間、SDK はユーザーが設定した client_composed の値を上書きします。Python Agent SDK 0.2.158 以降と Claude Code v2.1.248 以降が必要です。これらの SDK バージョンにバンドルされている CLI は Claude Code の要件を満たしています |
fork_session |
bool |
False |
resume で再開する際、元のセッションを継続する代わりに新しいセッション ID にフォークします |
resume_session_at |
str | None |
None |
再開時に、この UUID を持つメッセージまで(そのメッセージを含む)の会話のみを読み込みます。以前の時点から分岐するには、resume、そして通常は fork_session と組み合わせて使用します。Python Agent SDK 0.2.137 以降が必要です |
resume_drops_turn |
str | None |
None |
resume_session_at による切り詰めで破棄されるターンのユーザープロンプトの UUID。設定すると、破棄される範囲にそのターンに帰属しないエントリが含まれている場合、CLI は再開を拒否します。Python Agent SDK 0.2.137 以降と Claude Code v2.1.223 以降が必要です。これらの SDK バージョンにバンドルされている CLI は Claude Code の要件を満たしています |
agents |
dict[str, AgentDefinition] | None |
None |
プログラムで定義されたサブエージェント |
plugins |
list[SdkPluginConfig] |
[] |
ローカルパスからカスタムプラグインを読み込みます。詳細についてはプラグインを参照してください |
sandbox |
SandboxSettings | None |
None |
サンドボックスの動作をプログラムで設定します。詳細についてはサンドボックス設定を参照してください |
setting_sources |
list[SettingSource] | None |
None(CLI のデフォルト:すべてのソース) |
読み込むファイルシステム設定を制御します。ユーザー、プロジェクト、ローカルの設定を無効にするには [] を渡します。skills が設定されていてこのフィールドが設定されていない場合、ユーザーとプロジェクトのソースのみが読み込まれます。ローカル設定を維持するには setting_sources を明示的に設定します。エンドポイント管理ポリシーは常に読み込まれます。サーバー管理設定は、対象となる構成でセッションが組織の認証情報で認証されたときに取得されます。このオプションに関係なく読み取られる入力については、settingSources が制御しないものを参照してください |
skills |
list[str] | Literal["all"] | None |
None |
セッションで利用可能なスキル。検出されたすべてのスキルを有効にするには "all" を、またはスキル名のリストを渡します。正確な名前のみを渡してください。SDK は、Claude Code プロセスを起動する前に、不正な形式の名前やワイルドカード形式の名前を ValueError で拒否します。このチェックには Python Agent SDK 0.2.129 以降が必要です。設定すると、SDK は Skill ツールを allowed_tools に自動的に追加します。tools も渡す場合は、そのリストに "Skill" を含めてください。スキルを参照してください |
max_thinking_tokens |
int | None |
None |
非推奨 - 思考ブロックの最大トークン数。代わりに thinking を使用してください |
thinking |
ThinkingConfig | None |
None |
拡張思考の動作を制御します。max_thinking_tokens より優先されます |
effort |
EffortLevel | None |
None |
思考の深さを決める effort レベル。effort レベルを調整するを参照してください |
session_store |
SessionStore | None |
None |
セッションのトランスクリプトを外部バックエンドにミラーリングし、別のホストで再開できるようにします。セッションを外部ストレージに永続化するを参照してください |
session_store_flush |
Literal["batched", "eager"] |
"batched" |
ミラーリングされたトランスクリプトのエントリを session_store にフラッシュするタイミング。"batched" はターンごとに 1 回、またはバッファがいっぱいになったときにフラッシュします。"eager" はフレームごとにバックグラウンドでのフラッシュをトリガーします。session_store が None の場合は無視されます |
load_timeout_ms |
int |
60000 |
再開時のマテリアライズ中における session_store.load() と list_subkeys() の呼び出しごとのタイムアウト(ミリ秒) |
task_budget |
TaskBudget | None |
None |
API 側のトークン予算。task-budgets-2026-03-13 ベータヘッダーとともに output_config.task_budget として送信されます。{"total": <int>} を渡します。 |
遅延または停止した API レスポンスへの対処
CLI サブプロセスは、API のタイムアウトと停止検出を制御するいくつかの環境変数を読み取ります。これらは ClaudeAgentOptions.env を通じて渡します。
from claude_agent_sdk import ClaudeAgentOptions
options = ClaudeAgentOptions(
env={
"API_TIMEOUT_MS": "120000",
"CLAUDE_CODE_MAX_RETRIES": "2",
"CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS": "120000",
},
)
-
API_TIMEOUT_MS:各リクエストの試行がレスポンスヘッダーを待機できる時間(ミリ秒)。ヘッダーの到着後にストリーミングレスポンスが続く時間は制限しません。デフォルトは600000です。メインループとすべてのサブエージェントに適用されます。 -
CLAUDE_CODE_MAX_RETRIES:API の最大再試行回数。デフォルトは10で、上限は15です。各再試行にはそれぞれ独自のAPI_TIMEOUT_MSの時間枠が適用されます。より長い障害を待ち続ける必要がある無人実行では、
CLAUDE_CODE_RETRY_WATCHDOG=1を設定します。これにより、一時的な容量エラーが無期限に再試行され、Claude Code v2.1.199 以降では、その他の一時的なエラーのデフォルトが300に引き上げられ、この変数の上限が撤廃されます。 -
CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS:サブエージェント用の停止ウォッチドッグ。ストリームウォッチドッグがオンの間、デフォルトはCLAUDE_STREAM_IDLE_TIMEOUT_MSに 5 分を加えた値で、その変数を引き上げない限り600000になります。ストリームウォッチドッグがオフの場合、デフォルトは600000です。v2.1.257 より前は、デフォルトは常に600000でした。タイマーはストリームイベントごとにリセットされます。停止が発生すると、Claude Code はサブエージェントを中止し、停止を親に報告します。バックグラウンドのサブエージェントの場合は、タスクを失敗としてマークし、部分的な結果があればそれを添付します。
-
CLAUDE_ENABLE_STREAM_WATCHDOGとCLAUDE_STREAM_IDLE_TIMEOUT_MS:ヘッダーは到着したもののレスポンスボディのストリーミングが停止した場合にリクエストを中止するストリームウォッチドッグ。このウォッチドッグはすべてのプロバイダーでデフォルトでオンになっています。無効にするにはCLAUDE_ENABLE_STREAM_WATCHDOG=0を設定します。CLAUDE_STREAM_IDLE_TIMEOUT_MSのデフォルトは300000で、この値が最小値として適用されます。中止後に Claude Code が何を行うかは、レスポンスがどこまで進んでいたかに応じて自動再試行で説明しています。ANTHROPIC_BASE_URLの背後にあるゲートウェイがキープアライブの ping でレスポンスを開いたままにしている間、ウォッチドッグがそのレスポンスを待機していると、include_partial_messagesを設定しているホストはpingのStreamEventメッセージを受信し続けます。無応答を理由にセッションをタイムアウトさせるのではなく、これらのフレームを生存確認として扱ってください。v2.1.257 より前は、これらのフレームは最後の実際のストリームイベントから 5 分後に停止していました。
OutputFormat
構造化出力の検証用の設定です。これを dict として ClaudeAgentOptions の output_format フィールドに渡します。
# Expected dict shape for output_format
{
"type": "json_schema",
"schema": {...}, # Your JSON Schema definition
}
| フィールド | 必須 | 説明 |
|---|---|---|
type |
はい | JSON Schema による検証を行うには "json_schema" である必要があります |
schema |
はい | 出力検証用の JSON Schema 定義 |
SystemPromptPreset
Claude Code のプリセットシステムプロンプトを、オプションの追加内容とともに使用するための設定です。
class SystemPromptPreset(TypedDict):
type: Literal["preset"]
preset: Literal["claude_code"]
append: NotRequired[str]
exclude_dynamic_sections: NotRequired[bool]
snapshot: NotRequired[bool]
| フィールド | 必須 | 説明 |
|---|---|---|
type |
はい | プリセットのシステムプロンプトを使用するには "preset" である必要があります |
preset |
はい | Claude Code のシステムプロンプトを使用するには "claude_code" である必要があります |
append |
いいえ | プリセットのシステムプロンプトに追加する指示 |
exclude_dynamic_sections |
いいえ | 自動メモリの場所などのユーザーごとのコンテキストを、システムプロンプトから最初のユーザーメッセージに移動します。ユーザーやマシンをまたいだプロンプトキャッシュの再利用性が向上します。システムプロンプトの変更を参照してください |
snapshot |
いいえ | False に設定すると、セッションが最初のリクエストで記録したプロンプトを再利用する代わりに、リクエストごとにシステムプロンプトを再構築します。claude-agent-sdk v0.2.153 以降が必要です |
SystemPromptCustom
オブジェクト形式のカスタムシステムプロンプトで、system_prompt に文字列を渡すことと同等ですが、snapshot も設定できます。claude-agent-sdk v0.2.153 以降が必要です。
class SystemPromptCustom(TypedDict):
type: Literal["custom"]
prompt: str
snapshot: NotRequired[bool]
| フィールド | 必須 | 説明 |
|---|---|---|
type |
はい | "custom" である必要があります |
prompt |
はい | システムプロンプトのテキスト。コマンドライン引数として CLI に渡されるため、コマンドラインの長さ制限が適用されます |
snapshot |
いいえ | SystemPromptPreset.snapshot と同じで、prompt に適用されます |
SystemPromptFile
カスタムシステムプロンプトを文字列として渡す代わりに、ファイルから読み込むための設定です。SDK はこれを CLI の --system-prompt-file フラグに対応付けます。プロンプトが大きい場合はファイル形式を使用してください。SDK は文字列の system_prompt を CLI サブプロセスの argv で渡すため、SDK が API リクエストを送信する前に OS のコマンドライン長の制限を受けます。Linux では、約 128 KB を超える単一の引数はプロセスの起動時に Argument list too long で失敗します。Windows ではコマンドライン全体が約 32 KB に制限されるため、文字列形式はより低いしきい値で失敗します。
class SystemPromptFile(TypedDict):
type: Literal["file"]
path: str
| フィールド | 必須 | 説明 |
|---|---|---|
type |
はい | プロンプトをディスクから読み込むには "file" である必要があります |
path |
はい | システムプロンプトを含むファイルへのパス |
SettingSource
SDK が設定を読み込むファイルシステムベースの設定ソースを制御します。
SettingSource = Literal["user", "project", "local"]
| 値 | 説明 | 場所 |
|---|---|---|
"user" |
グローバルなユーザー設定 | ~/.claude/settings.json |
"project" |
共有プロジェクト設定(バージョン管理される) | .claude/settings.json |
"local" |
ローカルのプロジェクト設定。Claude Code が設定を保存する際に gitignore されます | .claude/settings.local.json |
デフォルトの動作
setting_sources が省略されているか None で、かつ skills が設定されていない場合、query() は Claude Code CLI と同じファイルシステム設定(ユーザー、プロジェクト、ローカル)を読み込みます。skills が設定されている場合の現在のデフォルトについては、setting_sources の行を参照してください。エンドポイント管理ポリシーはすべての場合に読み込まれます。サーバー管理設定は、対象となる構成でセッションが組織の認証情報で認証されたときに取得されます。詳細については、settingSources が制御しないものを参照してください。
setting_sources を使用する理由
ファイルシステム設定を無効にする:
# Do not load user, project, or local settings from disk
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions
async def main():
async for message in query(
prompt="Analyze this code",
options=ClaudeAgentOptions(
setting_sources=[]
),
):
print(message)
asyncio.run(main())
[!NOTE]
Python SDK 0.1.59 以前では、空のリストはオプションを省略した場合と同じように扱われていたため、
setting_sources=[]ではファイルシステム設定が無効になりませんでした。空のリストを有効にする必要がある場合は、新しいリリースにアップグレードしてください。TypeScript SDK は影響を受けません。
特定の設定ソースのみを読み込む:
# Load only project settings, ignore user and local
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions
async def main():
async for message in query(
prompt="Run CI checks",
options=ClaudeAgentOptions(
setting_sources=["project"] # Only .claude/settings.json
),
):
print(message)
asyncio.run(main())
SDK のみのアプリケーション:
# Define everything programmatically.
# Pass [] to opt out of filesystem setting sources.
import asyncio
from claude_agent_sdk import AgentDefinition, ClaudeAgentOptions, query
async def main():
async for message in query(
prompt="Review this PR",
options=ClaudeAgentOptions(
setting_sources=[],
agents={
"code-reviewer": AgentDefinition(
description="Reviews code changes",
prompt="You are a code reviewer. Report issues in the diff.",
),
},
allowed_tools=["Read", "Grep", "Glob"],
),
):
print(message)
asyncio.run(main())
CLAUDE.md のプロジェクト指示を読み込むには、setting_sources に "project" を含めます。CLAUDE.md の読み込みとシステムプロンプトのオプションがどのように相互作用するかについては、システムプロンプトの変更を参照してください。
設定の優先順位
複数のソースが読み込まれる場合、設定は次の優先順位(高い順)でマージされます。
- ローカル設定(
.claude/settings.local.json) - プロジェクト設定(
.claude/settings.json) - ユーザー設定(
~/.claude/settings.json)
agents、allowed_tools、settings などのプログラムによるオプションは、ユーザー、プロジェクト、ローカルのファイルシステム設定を上書きします。管理ポリシー設定はプログラムによるオプションより優先されます。
AgentDefinition
プログラムで定義されるサブエージェントの設定です。
@dataclass
class AgentDefinition:
description: str
prompt: str
tools: list[str] | None = None
disallowedTools: list[str] | None = None
model: str | None = None
skills: list[str] | None = None
memory: Literal["user", "project", "local"] | None = None
mcpServers: list[str | dict[str, Any]] | None = None
initialPrompt: str | None = None
maxTurns: int | None = None
background: bool | None = None
effort: EffortLevel | int | None = None
permissionMode: PermissionMode | None = None
| フィールド | 必須 | 説明 |
|---|---|---|
description |
はい | このエージェントをいつ使用するかを記述した自然言語の説明 |
prompt |
はい | エージェントのシステムプロンプト |
tools |
いいえ | 許可するツール名の配列。省略した場合、サブエージェントが利用可能なツールをすべて継承します |
disallowedTools |
いいえ | エージェントのツールセットから削除するツール名の配列。MCP サーバーレベルのパターンも使用できます。mcp__server または mcp__server__* はそのサーバーのすべてのツールを削除し、mcp__* はすべてのサーバーのすべての MCP ツールを削除します |
model |
いいえ | このエージェントのモデルの上書き。"sonnet"、"opus"、"haiku"、"inherit" などのエイリアス、または完全なモデル ID を指定できます。省略した場合、Claude Code はサブエージェントのモデルの順序に従ってモデルを選択します |
skills |
いいえ | 起動時にエージェントのコンテキストに事前に読み込むスキル名のリスト。リストにないスキルも Skill ツールを通じて呼び出すことができます |
memory |
いいえ | このエージェントのメモリソース:"user"、"project"、または "local" |
mcpServers |
いいえ | このエージェントが利用できる MCP サーバー。各エントリはサーバー名、またはインラインの {name: config} dict です |
initialPrompt |
いいえ | このエージェントがメインスレッドのエージェントとして実行される場合に、最初のユーザーターンとして自動送信されます |
maxTurns |
いいえ | エージェントが停止するまでのエージェントのターンの最大数 |
background |
いいえ | 呼び出されたときに、このエージェントをノンブロッキングのバックグラウンドタスクとして実行します |
effort |
いいえ | このエージェントの推論の effort レベル。名前付きのレベルまたは整数を指定できます。EffortLevel を参照してください |
permissionMode |
いいえ | このエージェント内でのツール実行の権限モード。適用されるタイミングはサブエージェントの継承ルールによって決まります。PermissionMode を参照してください |
[!NOTE]
AgentDefinitionのフィールド名には、disallowedTools、permissionMode、maxTurnsのように camelCase が使用されます。これらの名前は、TypeScript SDK と共有されるワイヤーフォーマットに直接対応しています。これは、同等のトップレベルフィールドにdisallowed_toolsやpermission_modeのような Python の snake_case を使用するClaudeAgentOptionsとは異なります。AgentDefinitionは dataclass であるため、snake_case のキーワードを渡すと、構築時にTypeErrorが発生します。
PermissionMode
ツールの実行を制御するための権限モードです。
PermissionMode = Literal[
"default", # Standard permission behavior
"acceptEdits", # Auto-accept file edits
"plan", # Planning mode - Claude explores and plans
"dontAsk", # Deny anything not pre-approved instead of prompting
"bypassPermissions", # Bypass permission checks; explicit ask rules still prompt (use with caution)
"auto", # A model classifier reviews actions such as shell commands and network requests
]
EffortLevel
思考の深さを導くための effort レベルです。
EffortLevel = Literal[
"low", # Minimal thinking, fastest responses
"medium", # Moderate thinking
"high", # Deep reasoning
"xhigh", # Extended reasoning; falls back to "high" on models that don't support it
"max", # Maximum effort
]
CanUseTool
ツールの権限コールバック関数の型エイリアスです。
CanUseTool = Callable[
[str, dict[str, Any], ToolPermissionContext], Awaitable[PermissionResult]
]
コールバックは次のものを受け取ります。
tool_name:呼び出されるツールの名前input_data:ツールの入力パラメーターcontext:追加情報を含むToolPermissionContext
PermissionResult(PermissionResultAllow または PermissionResultDeny のいずれか)を返します。
このコールバックは、対話型の権限プロンプトに代わるものです。SDK は、権限評価フローがプロンプトに至った場合に can_use_tool を呼び出します。次のいずれかの方法で承認された呼び出しは、can_use_tool を呼び出さずに実行されます。
allowed_toolsのエントリまたは設定の許可ルールによって承認された呼び出しacceptEditsモードでのファイル編集など、権限モードによって承認された呼び出し
これらの呼び出しを確認するには、これらに対しても実行される PreToolUse フックを使用してください。
許可ルールはどのモードでも自動承認されないアクションを事前承認しません。それらのうちどれがコールバックに到達するか、また dontAsk モードと auto モードで何が起こるかについては、権限の評価方法を参照してください。
ToolPermissionContext
ツールの権限コールバックに渡されるコンテキスト情報です。
@dataclass
class ToolPermissionContext:
signal: Any | None = None # Future: abort signal support
suggestions: list[PermissionUpdate] = field(default_factory=list)
tool_use_id: str | None = None
agent_id: str | None = None
blocked_path: str | None = None
decision_reason: str | None = None
title: str | None = None
display_name: str | None = None
description: str | None = None
| フィールド | 型 | 説明 |
|---|---|---|
signal |
Any | None |
将来の中止シグナルのサポートのために予約されています |
suggestions |
list[PermissionUpdate] |
CLI からの権限更新の提案。Bash のプロンプトには localSettings を宛先とする提案が含まれるため、それを updated_permissions で返すと、ルールが .claude/settings.local.json に書き込まれ、セッションをまたいで保持されます。 |
tool_use_id |
str | None |
このプロンプトの対象となる特定のツール呼び出しの識別子。can_use_tool に渡される際は常に設定されています |
agent_id |
str | None |
呼び出しがサブエージェントから発生した場合のサブエージェント ID。メインエージェントの場合は None |
blocked_path |
str | None |
該当する場合、権限リクエストのきっかけとなったファイルパス。たとえば、Bash コマンドが許可されたディレクトリ外のパスにアクセスしようとした場合など |
decision_reason |
str | None |
この権限リクエストがトリガーされた理由。PreToolUse フックが "ask" を返した場合、そのフックの permissionDecisionReason から転送されます |
title |
str | None |
Claude wants to read foo.txt のような完全な権限プロンプトの文。存在する場合は、主要なプロンプトテキストとして使用してください |
display_name |
str | None |
Read file のような、ツールのアクションを表す短い名詞句。ボタンのラベルに適しています |
description |
str | None |
権限 UI 用の人間が読めるサブタイトル |
PermissionResult
権限コールバックの結果のユニオン型です。
PermissionResult = PermissionResultAllow | PermissionResultDeny
PermissionResultAllow
ツール呼び出しを許可すべきであることを示す結果です。
@dataclass
class PermissionResultAllow:
behavior: Literal["allow"] = "allow"
updated_input: dict[str, Any] | None = None
updated_permissions: list[PermissionUpdate] | None = None
| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
behavior |
Literal["allow"] |
"allow" |
"allow" である必要があります |
updated_input |
dict[str, Any] | None |
None |
元の入力の代わりに使用する変更済みの入力 |
updated_permissions |
list[PermissionUpdate] | None |
None |
適用する権限の更新 |
updated_permissions に 4,096 個を超える項目を含む PermissionResultAllow を返すと、Claude Code はその結果を無効として扱い、ツール呼び出しを拒否します。各 PermissionUpdate は 1 項目としてカウントされ、その rules または directories リスト内の各エントリも同様に 1 項目としてカウントされます。拒否メッセージの末尾は updatedPermissions may hold at most 4096 updates, rules and directories in all. となります。拒否を避けるには、返す項目を 4,096 個以下にしてください。
PermissionResultDeny
ツール呼び出しを拒否すべきであることを示す結果です。
@dataclass
class PermissionResultDeny:
behavior: Literal["deny"] = "deny"
message: str = ""
interrupt: bool = False
| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
behavior |
Literal["deny"] |
"deny" |
"deny" である必要があります |
message |
str |
"" |
ツールが拒否された理由を説明するメッセージ |
interrupt |
bool |
False |
現在の実行を中断するかどうか |
PermissionUpdate
プログラムで権限を更新するための設定です。
@dataclass
class PermissionUpdate:
type: Literal[
"addRules",
"replaceRules",
"removeRules",
"setMode",
"addDirectories",
"removeDirectories",
]
rules: list[PermissionRuleValue] | None = None
behavior: Literal["allow", "deny", "ask"] | None = None
mode: PermissionMode | None = None
directories: list[str] | None = None
destination: (
Literal["userSettings", "projectSettings", "localSettings", "session"] | None
) = None
| フィールド | 型 | 説明 |
|---|---|---|
type |
Literal[...] |
権限更新操作の種類 |
rules |
list[PermissionRuleValue] | None |
追加/置換/削除操作のルール |
behavior |
Literal["allow", "deny", "ask"] | None |
ルールベースの操作の動作 |
mode |
PermissionMode | None |
setMode 操作のモード |
directories |
list[str] | None |
ディレクトリの追加/削除操作のディレクトリ |
destination |
Literal[...] | None |
権限の更新を適用する場所 |
PermissionRuleValue
権限の更新で追加、置換、または削除するルールです。
@dataclass
class PermissionRuleValue:
tool_name: str
rule_content: str | None = None
ToolsPreset
Claude Code のデフォルトのツールセットを使用するためのプリセットツール設定です。
class ToolsPreset(TypedDict):
type: Literal["preset"]
preset: Literal["claude_code"]
ThinkingConfig
拡張思考の動作を制御します。3 つの設定のユニオンです。
ThinkingDisplay = Literal["summarized", "omitted"]
class ThinkingConfigAdaptive(TypedDict):
type: Literal["adaptive"]
display: NotRequired[ThinkingDisplay]
class ThinkingConfigEnabled(TypedDict):
type: Literal["enabled"]
budget_tokens: int
display: NotRequired[ThinkingDisplay]
class ThinkingConfigDisabled(TypedDict):
type: Literal["disabled"]
ThinkingConfig = ThinkingConfigAdaptive | ThinkingConfigEnabled | ThinkingConfigDisabled
| バリアント | フィールド | 説明 |
|---|---|---|
adaptive |
type、display |
Claude がいつ思考するかを適応的に判断します |
enabled |
type、budget_tokens、display |
特定のトークン予算で思考を有効にします |
disabled |
type |
思考を無効にします |
オプションの display フィールドは、思考テキストを "summarized" と "omitted" のどちらで返すかを制御します。Claude Opus 4.7 以降では API のデフォルトが "omitted" であるため、ThinkingBlock の出力で思考内容を受け取るには "summarized" を設定してください。Claude Code は、Amazon Bedrock や Google Cloud の Agent Platform などの一部のプロバイダーには display の値を渡しません。それらのプロバイダーでは、display を "summarized" に設定した場合でも、Opus 4.7 以降は空の ThinkingBlock 出力を返します。
これらは TypedDict クラスであるため、実行時にはプレーンな dict です。dict リテラルとして構築することも、コンストラクターのようにクラスを呼び出すこともでき、どちらも dict を生成します。フィールドには config.budget_tokens ではなく config["budget_tokens"] でアクセスします。
from claude_agent_sdk import ClaudeAgentOptions, ThinkingConfigEnabled
# Option 1: dict literal (recommended, no import needed)
options = ClaudeAgentOptions(thinking={"type": "enabled", "budget_tokens": 20000})
# Option 2: constructor-style (returns a plain dict)
config = ThinkingConfigEnabled(type="enabled", budget_tokens=20000)
print(config["budget_tokens"]) # 20000
# config.budget_tokens would raise AttributeError
TaskBudget
API 側のタスク予算(トークン単位)で、ClaudeAgentOptions の task_budget フィールドで使用します。
class TaskBudget(TypedDict):
total: int
| フィールド | 型 | 説明 |
|---|---|---|
total |
int |
タスクの合計トークン予算 |
これは TypedDict であるため、ClaudeAgentOptions(task_budget={"total": 50000}) のようにプレーンな dict として渡します。
SdkBeta
SDK のベータ機能のリテラル型です。
SdkBeta = Literal["context-1m-2025-08-07"]
ベータ機能を有効にするには、ClaudeAgentOptions の betas フィールドとともに使用します。
[!WARNING]
Claude API では、
context-1m-2025-08-07ベータは Claude Sonnet 4.5 と Claude Sonnet 4 で提供終了しています。いずれかのモデルでこれをまだ渡している場合、標準の 200K トークンのコンテキストウィンドウを超えるリクエストはエラーを返すため、betasから削除してください。1M トークンのコンテキストウィンドウでセッションを実行するには、modelをclaude-sonnet-5-5やclaude-opus-5-5などのデフォルトで 1M のウィンドウで実行されるモデルに設定します。[1m]バリアントでのみ 1M に達するモデルの場合は、claude-opus-4-6[1m]のようにモデル ID にサフィックスを付加します。
McpSdkServerConfig
create_sdk_mcp_server() で作成される SDK MCP サーバーの設定です。
class McpSdkServerConfig(TypedDict):
type: Literal["sdk"]
name: str
instance: Any # MCP Server instance
McpServerConfig
MCP サーバー設定のユニオン型です。
McpServerConfig = (
McpStdioServerConfig | McpSSEServerConfig | McpHttpServerConfig | McpSdkServerConfig
)
McpStdioServerConfig
class McpStdioServerConfig(TypedDict):
type: NotRequired[Literal["stdio"]] # Optional for backwards compatibility
command: str
args: NotRequired[list[str]]
env: NotRequired[dict[str, str]]
McpSSEServerConfig
class McpSSEServerConfig(TypedDict):
type: Literal["sse"]
url: str
headers: NotRequired[dict[str, str]]
McpHttpServerConfig
class McpHttpServerConfig(TypedDict):
type: Literal["http"]
url: str
headers: NotRequired[dict[str, str]]
McpServerStatusConfig
get_mcp_status() によって報告される MCP サーバーの設定です。これは、すべての McpServerConfig トランスポートバリアントに、claude.ai を介してプロキシされるサーバー用の出力専用の claudeai-proxy バリアントを加えたユニオンです。
McpServerStatusConfig = (
McpStdioServerConfig
| McpSSEServerConfig
| McpHttpServerConfig
| McpSdkServerConfigStatus
| McpClaudeAIProxyServerConfig
)
McpSdkServerConfigStatus は McpSdkServerConfig のシリアライズ可能な形式で、type("sdk")と name(str)のフィールドのみを持ちます。プロセス内の instance は省略されます。McpClaudeAIProxyServerConfig は type("claudeai-proxy")、url(str)、id(str)のフィールドを持ちます。
McpStatusResponse
ClaudeSDKClient.get_mcp_status() からのレスポンスです。サーバーステータスのリストを mcpServers キーの下にラップします。
class McpStatusResponse(TypedDict):
mcpServers: list[McpServerStatus]
McpServerStatus
接続された MCP サーバーのステータスで、McpStatusResponse に含まれます。
class McpServerStatus(TypedDict):
name: str
status: McpServerConnectionStatus # "connected" | "failed" | "needs-auth" | "pending" | "disabled"
serverInfo: NotRequired[McpServerInfo]
error: NotRequired[str]
config: NotRequired[McpServerStatusConfig]
scope: NotRequired[str]
tools: NotRequired[list[McpToolInfo]]
| フィールド | 型 | 説明 |
|---|---|---|
name |
str |
サーバー名 |
status |
str |
"connected"、"failed"、"needs-auth"、"pending"、"disabled" のいずれか |
serverInfo |
dict(オプション) |
サーバー名とバージョン({"name": str, "version": str}) |
error |
str(オプション) |
サーバーの接続に失敗した場合のエラーメッセージ |
config |
McpServerStatusConfig(オプション) |
サーバーの設定。McpServerConfig(stdio、SSE、HTTP、または SDK)と同じ形式に加え、claude.ai を介して接続されたサーバー用の claudeai-proxy バリアントがあります |
scope |
str(オプション) |
設定のスコープ |
tools |
list(オプション) |
このサーバーが提供するツール。それぞれ name、description、annotations のフィールドを持ちます |
ContextUsageResponse
ClaudeSDKClient.get_context_usage() からのレスポンスです。このレスポンスには、対話型セッションで Claude Code が /context コマンドのために表示するペイロードが含まれます。このペイロードには、トークン数に加えて、Claude Code が /context の使用状況グリッドを描画するために使用する color や gridRows などの表示用フィールドも含まれます。
Claude Code は、トークンカウント API に複数のリクエストを送信してこのペイロードを構築します。これらのリクエストはメッセージストリームに表示されないため、ストリームを読み取るコスト追跡ではそれらを把握できません。Anthropic API では、トークンカウントは課金されません。
class ContextUsageResponse(TypedDict):
categories: list[ContextUsageCategory]
totalTokens: int
maxTokens: int
rawMaxTokens: int
percentage: float
model: str
isAutoCompactEnabled: bool
memoryFiles: list[dict[str, Any]]
mcpTools: list[dict[str, Any]]
agents: list[dict[str, Any]]
gridRows: list[list[dict[str, Any]]]
autoCompactThreshold: NotRequired[int]
deferredBuiltinTools: NotRequired[list[dict[str, Any]]]
systemTools: NotRequired[list[dict[str, Any]]]
systemPromptSections: NotRequired[list[dict[str, Any]]]
slashCommands: NotRequired[dict[str, Any]]
skills: NotRequired[dict[str, Any]] # skill usage with frontmatter breakdown
messageBreakdown: NotRequired[dict[str, Any]] # message tokens by type
apiUsage: NotRequired[dict[str, Any] | None]
各 ContextUsageCategory エントリは、name、tokens、color、およびオプションの isDeferred フラグを持ちます。totalTokens はセッションの現在のコンテキスト使用量で、maxTokens はその使用量を測定する基準となるウィンドウです。このウィンドウはモデルのコンテキストウィンドウ、または自動圧縮のウィンドウが適用される場合はそのより小さいウィンドウであり、rawMaxTokens は maxTokens と同じ値を持ちます。apiUsage は最新の API レスポンスからの使用量を保持するもので、セッションの累計ではありません。Claude Code はオプションの deferredBuiltinTools、systemTools、systemPromptSections のキーを設定しないため、型で宣言されていてもこれらは存在しないものと想定してください。
SdkPluginConfig
SDK でプラグインを読み込むための設定です。
class SdkPluginConfig(TypedDict):
type: Literal["local"]
path: str
| フィールド | 型 | 説明 |
|---|---|---|
type |
Literal["local"] |
"local" である必要があります(現在サポートされているのはローカルプラグインのみ) |
path |
str |
プラグインディレクトリへの絶対パスまたは相対パス |
例:
plugins = [
{"type": "local", "path": "./my-plugin"},
{"type": "local", "path": "/absolute/path/to/plugin"},
]
プラグインの作成と使用に関する詳細については、プラグインを参照してください。
メッセージ型
Message
すべての可能なメッセージの Union 型。
Message = (
UserMessage
| AssistantMessage
| SystemMessage
| ResultMessage
| StreamEvent
| RateLimitEvent
| ConversationResetMessage
)
UserMessage
ユーザー入力メッセージ。
@dataclass
class UserMessage:
content: str | list[ContentBlock]
uuid: str | None = None
parent_tool_use_id: str | None = None
tool_use_result: dict[str, Any] | None = None
origin: MessageOrigin | None = None
| フィールド | 型 | 説明 |
|---|---|---|
content |
str | list[ContentBlock] |
テキストまたはコンテンツブロックとしてのメッセージコンテンツ |
uuid |
str | None |
一意のメッセージ識別子 |
parent_tool_use_id |
str | None |
このメッセージがツール結果応答の場合のツール使用 ID |
tool_use_result |
dict[str, Any] | None |
該当する場合のツール結果データ |
origin |
MessageOrigin | None |
このメッセージの出所。タスク通知やピアメッセージなどの注入されたターンで入力されます。CLI がそれを属性付けしなかった場合は None。Python Agent SDK 0.2.137 以降が必要です |
SDK は tool_use_result を CLI から変更されずに渡します。結果に resource_link ブロックを含む外部 MCP サーバー上のツールの場合、dict は TypeScript SDKMcpResourceLink 型のキーを持つ dict のリストを保持する resourceLinks キーを持ちます。Claude は各リンクをツール結果内のテキスト行として受け取ります。サーバーが返したファイルをレンダリングするには、そのテキストを解析する代わりに resourceLinks を読み取ってください。resourceLinks キーには Python Agent SDK 0.2.150 以降と Claude Code v2.1.257 以降が必要です。そのバージョンの SDK にバンドルされている CLI は Claude Code の要件を満たしています。
CLI は結果にリンクがない場合と、サブエージェントからの結果の場合、キーを省略します。CLI は結果ごとに最大 50 個のリンクを保持し、リストがシリアル化された JSON の 64 KiB に達するとリンクの追加を停止します。tool() で定義したプロセス内ツールは、SDK がその resource_link ブロックを CLI が結果を見る前にテキストにフラット化するため、キーを生成しません。
AssistantMessage
コンテンツブロック付きのアシスタント応答メッセージ。
@dataclass
class AssistantMessage:
content: list[ContentBlock]
model: str
parent_tool_use_id: str | None = None
error: AssistantMessageError | None = None
usage: dict[str, Any] | None = None
message_id: str | None = None
stop_reason: str | None = None
session_id: str | None = None
uuid: str | None = None
| フィールド | 型 | 説明 |
|---|---|---|
content |
list[ContentBlock] |
応答内のコンテンツブロックのリスト |
model |
str |
応答を生成したモデル |
parent_tool_use_id |
str | None |
これがネストされた応答の場合のツール使用 ID |
error |
AssistantMessageError | None |
応答がエラーに遭遇した場合のエラー型 |
usage |
dict[str, Any] | None |
メッセージごとのトークン使用状況(ResultMessage.usage と同じキー) |
message_id |
str | None |
API メッセージ ID。1 つのターンからの複数のメッセージは同じ ID を共有します |
stop_reason |
str | None |
API からの停止理由(例:end_turn、tool_use) |
session_id |
str | None |
このメッセージが属するセッションの ID |
uuid |
str | None |
セッショントランスクリプト内の一意のメッセージ識別子 |
AssistantMessageError
アシスタントメッセージの可能なエラータイプ。
AssistantMessageError = Literal[
"authentication_failed",
"billing_error",
"rate_limit",
"invalid_request",
"server_error",
"unknown",
]
基になる CLI プロセスは、max_output_tokens などの Literal にリストされていないエラータイプを発行できます。SDK は値を変更されずに渡すため、このリストの外の文字列を unknown と同じ方法で扱ってください。TypeScript SDKAssistantMessageError 型は、CLI が発行できる値の完全なセットをリストしています。
SystemMessage
メタデータ付きのシステムメッセージ。
@dataclass
class SystemMessage:
subtype: str
data: dict[str, Any]
独自のデータクラスを持たないサブタイプは SystemMessage として届きます。ターン間のセッションを追跡するには、CLAUDE_CODE_EMIT_SESSION_STATE_EVENTS=1 を設定し、subtype が session_state_changed である各メッセージで message.data["state"] を読み取ってください。SDKSessionStateChangedMessage には、このメッセージが保持できる状態がリストされています。これらを読み取るには receive_messages() で反復処理してください。receive_response() は ResultMessage で停止し、session_state_changed メッセージはその結果の後に続く場合があるためです。
ResultMessage
コストと使用状況情報を含む最終結果メッセージ。
@dataclass
class ResultMessage:
subtype: str
duration_ms: int
duration_api_ms: int
is_error: bool
num_turns: int
session_id: str
stop_reason: str | None = None
total_cost_usd: float | None = None
usage: dict[str, Any] | None = None
result: str | None = None
structured_output: Any = None
model_usage: dict[str, ModelUsage] | None = None
permission_denials: list[Any] | None = None
deferred_tool_use: DeferredToolUse | None = None
errors: list[str] | None = None
api_error_status: int | None = None
uuid: str | None = None
terminal_reason: str | None = None
origin: MessageOrigin | None = None
subtype フィールドは、他のどのフィールドが入力されるかを決定します。これは "success"、"error_during_execution"、"error_max_turns"、"error_max_budget_usd"、または "error_max_structured_output_retries" のいずれかです。Python データクラスはすべてのバリアントを 1 つの形状にフラット化するため、返された subtype に適用されないフィールドは None です。
会話がどのように終了したかについての診断詳細を含むいくつかのフィールド:
is_error:会話がエラー状態で終了した場合はTrue。error_*サブタイプでは常にTrue。subtype="success"では、3 つのケースでTrueになります。それらを区別するにはstop_reasonを確認してください:"refusal":モデルが応答を拒否しました。拒否のテキストはresultで、resultが空の場合は直前のAssistantMessageで確認してください。"tool_deferred_unavailable":セッションを再開したときに、遅延されたツール が利用できなくなっていました。たとえば、その MCP サーバーが接続されていなかった場合です。以下の 2 つのケースでは、再開後に送信したプロンプトは、再開時に渡したプロンプトと同じ扱いになります:- プロンプトなし:呼び出しはまだ保留中です。ツールを利用可能にしてからプロンプトなしで再度再開すると、その呼び出しが最初に実行されます。
- プロンプトあり:Claude Code はツールの結果なしでプロンプトに応答し、遅延された呼び出しは破棄されます。引き続きツールの呼び出しが必要な場合は、新しいプロンプトを送信してください。
- その他の値:API エラーなど、Claude Code がモデルの応答の代わりに報告したエラーでターンが終了しました。原因は
terminal_reasonで、メッセージはresultで、API が HTTP ステータスを返した場合はそのステータスをapi_error_statusで確認してください。
api_error_status:終了する API エラーの HTTP ステータスコード。ターンがエラーなしで終了した場合はNone。subtype="success"でのみ入力されます。result:subtype="success"での最終アシスタントメッセージのテキスト、またはerror_*サブタイプではNone。subtype="success"でis_error=Trueの場合、これは利用可能な場合は API エラー文字列を保持しますが、空の場合もあるため、api_error_statusと前のAssistantMessageコンテンツで詳細を確認してください。errors:最大ターンメッセージなどのループレベルのエラー文字列。error_*サブタイプでのみ入力されます。terminal_reason:クエリループが終了した理由。例:"completed"、"max_turns"、"api_error"、"aborted_streaming"、または"aborted_tools"。"aborted_streaming"または"aborted_tools"の値は、ターンが完了する前に中止されたことを意味します。一般的な原因はinterrupt()と、interrupt=TrueでPermissionResultDenyを返すパーミッション コールバックです。CLI バージョンがフィールドより前の場合、/voiceや/usageなどのローカルコマンドの結果(クエリループをバイパス)、またはセッションが致命的に失敗したときに発行される合成エラー結果の場合はNone。TypeScript SDK のSDKResultMessage.terminal_reasonを反映しており、値の完全なセットをリストしています。origin:このターンをトリガーしたユーザーメッセージの出所。ストリーミング入力モード では、これをチェックして、originがNoneまたは{"kind": "human"}である独自のプロンプトの結果と、バックグラウンドタスク通知などの注入されたターンの結果を区別します。Python Agent SDK 0.2.137 以降が必要です。
複数のバックグラウンドタスクが近いタイミングで終了した場合、Claude Code はそれらの通知にそれぞれ 1 ターンずつではなく、1 つのターンでまとめて応答することがあります。その場合でも、通知ごとに 1 つの ResultMessage が順番に届き、それぞれの origin の kind は "task-notification" です。最後のもの以外は num_turns が 0 に設定され、result は空になります。最後のものが、すべての通知に応答したターンを保持します。
usage dict はメインエージェントループのみをカバーし、サブエージェントおよび他のネストされた、または補助的なモデル呼び出しを除外します。ストリーミング入力モード では、値はターンごとです。トークンとコストのアカウンティングについては model_usage を優先してください。usage dict は、存在する場合、以下のキーを含みます:
| キー | 型 | 説明 |
|---|---|---|
input_tokens |
int |
トップレベルエージェントループで消費された入力トークン。サブエージェントトークンは含まれません。全体のアカウンティングについては model_usage を使用してください。 |
output_tokens |
int |
トップレベルエージェントループで生成された出力トークン。サブエージェントトークンは含まれません。 |
cache_creation_input_tokens |
int |
新しいキャッシュエントリを作成するために使用されたトークン。 |
cache_read_input_tokens |
int |
既存のキャッシュエントリから読み取られたトークン。 |
model_usage dict はモデル名をモデルごとの使用状況にマップします。クエリパイプラインを通じて行われたすべてのモデル呼び出しをカバーします:メインループ、サブエージェント、および圧縮と Workflow エージェントなどの内部呼び出し。パーミッション分類器とトークンカウントリクエストなどのそのパイプラインの外のヘルパー呼び出しは、model_usage から除外されます。model_usage を推定値として扱い、請求書ではなく。
ストリーミング入力モード では、model_usage と total_cost_usd はターン全体で累積されるため、結果全体で合計するのではなく、最新の結果を読み取ってください。セッションの以前の呼び出しから復元された 合計を蓄積 も、呼び出しがセッションを再開する場合にカウントされます。リセットについては ストリーミング入力モードでコストを追跡 を、ゼロ化された結果については セッションクラッシュ後に合計を復旧 を参照してください。
model_usage の各値は ModelUsage TypedDict で、from claude_agent_sdk.types import ModelUsage でインポートされます。そのキーは camelCase を使用します。これは、基になる CLI プロセスから変更されずに渡される値であり、TypeScript ModelUsage 型と一致するためです:
| キー | 型 | 説明 |
|---|---|---|
inputTokens |
int |
このモデルの入力トークン。 |
outputTokens |
int |
このモデルの出力トークン。 |
cacheReadInputTokens |
int |
このモデルのキャッシュ読み取りトークン。 |
cacheCreationInputTokens |
int |
このモデルのキャッシュ作成トークン。 |
webSearchRequests |
int |
このモデルが行った Web 検索リクエスト。 |
thinkingTokens |
int |
このモデルで生成された思考トークン。既に outputTokens に含まれています。Claude Code バージョンがそれを記録するターンまで存在しません。TypedDict で宣言されていないため、.get() で読み取ってください。Python Agent SDK 0.2.150 以降が必要です。そのバンドルされた CLI がそれを記録します。 |
costUSD |
float |
このモデルの推定 USD コスト。クライアント側で計算されます。コストと使用状況を追跡 で請求の注意事項を参照してください。 |
contextWindow |
int |
このモデルのコンテキストウィンドウサイズ。 |
maxOutputTokens |
int |
このモデルの最大出力トークン制限。 |
canonicalModel |
str |
価格ルックアップに使用される正規モデル ID。エントリがキーとなっている生のモデル文字列(プロバイダー固有の ID またはエイリアスなど)と異なる場合があります。常に存在するわけではありません。 |
provider |
str |
このモデルを提供した API プロバイダー。例:firstParty、bedrock、vertex、foundry、anthropicAws、mantle、または gateway。常に存在するわけではありません。 |
costBasis |
str |
このモデルの最新リクエストの価格算出に使用された価格表。定価の場合は list、modelPricing テーブルの場合は managed、どちらもモデル ID に一致しなかった場合は unknown です。常に存在するわけではなく、TypedDict で宣言されていないため、.get() で読み取ってください。Claude Code v2.1.246 以降が必要です。 |
StreamEvent
ストリーミング中の部分的なメッセージ更新のためのストリームイベント。ClaudeAgentOptions で include_partial_messages=True の場合のみ受け取られます。from claude_agent_sdk.types import StreamEvent でインポートしてください。
@dataclass
class StreamEvent:
uuid: str
session_id: str
event: dict[str, Any] # The raw Claude API stream event
parent_tool_use_id: str | None = None
| フィールド | 型 | 説明 |
|---|---|---|
uuid |
str |
このイベントの一意の識別子 |
session_id |
str |
セッション識別子 |
event |
dict[str, Any] |
生の Claude API ストリームイベントデータ |
parent_tool_use_id |
str | None |
常に None。ストリームイベントはメインセッションのみに対して発行されます。サブエージェント属性については、AssistantMessage などの完全なメッセージを使用してください |
RateLimitEvent
レート制限ステータスが変更されたときに発行されます(例:"allowed" から "allowed_warning" へ)。ユーザーにハード制限に達する前に警告するか、ステータスが "rejected" の場合にバックオフするために使用します。
@dataclass
class RateLimitEvent:
rate_limit_info: RateLimitInfo
uuid: str
session_id: str
| フィールド | 型 | 説明 |
|---|---|---|
rate_limit_info |
RateLimitInfo |
現在のレート制限状態 |
uuid |
str |
一意のイベント識別子 |
session_id |
str |
セッション識別子 |
RateLimitInfo
RateLimitEvent によって運ばれるレート制限状態。
RateLimitStatus = Literal["allowed", "allowed_warning", "rejected"]
RateLimitType = Literal[
"five_hour", "seven_day", "seven_day_opus", "seven_day_sonnet", "overage"
]
@dataclass
class RateLimitInfo:
status: RateLimitStatus
resets_at: int | None = None
rate_limit_type: RateLimitType | None = None
utilization: float | None = None
overage_status: RateLimitStatus | None = None
overage_resets_at: int | None = None
overage_disabled_reason: str | None = None
raw: dict[str, Any] = field(default_factory=dict)
| フィールド | 型 | 説明 |
|---|---|---|
status |
RateLimitStatus |
現在のステータス。"allowed"、"allowed_warning"、または "rejected" のいずれかです。"allowed_warning" は制限に近づいていることを意味します。"rejected" は制限に達したことを意味します |
resets_at |
int | None |
レート制限ウィンドウがリセットされる Unix タイムスタンプ |
rate_limit_type |
RateLimitType | None |
どのレート制限ウィンドウが適用されるか |
utilization |
float | None |
消費されたレート制限の割合(0.0 から 1.0) |
overage_status |
RateLimitStatus | None |
該当する場合の従量課金超過使用のステータス |
overage_resets_at |
int | None |
超過ウィンドウがリセットされる Unix タイムスタンプ |
overage_disabled_reason |
str | None |
ステータスが "rejected" の場合、超過が利用できない理由 |
raw |
dict[str, Any] |
上記でモデル化されていないフィールドを含む、CLI からの完全な生 dict |
ConversationResetMessage
会話が接続を終了せずに置き換えられたときに発行されます。例:/clear の後。リセットが後の ResultMessage オブジェクトの実行中の合計にどのように影響するかについては、ストリーミング入力モードでコストを追跡 を参照してください。Python Agent SDK 0.2.137 以降が必要です。
@dataclass
class ConversationResetMessage:
new_conversation_id: str
uuid: str
session_id: str
| フィールド | 型 | 説明 |
|---|---|---|
new_conversation_id |
str |
新しい会話の不透明な識別子。後続のメッセージの session_id ではありません。次のメッセージからそれを読み取ってください |
uuid |
str |
一意のメッセージ識別子 |
session_id |
str |
リセットされたセッションの ID。リセット後のメッセージは新しい session_id を持ちます |
TaskStartedMessage
バックグラウンドタスクが開始されたときに発行されます。バックグラウンドタスクは、メインターンの外で追跡されるもの:バックグラウンド Bash コマンド、Monitor ウォッチ、Agent ツール経由で生成されたサブエージェント、またはリモートエージェント。task_type フィールドはどれであるかを示します。このネーミングは Task から Agent ツールへの名前変更とは無関係です。
@dataclass
class TaskStartedMessage(SystemMessage):
task_id: str
description: str
uuid: str
session_id: str
tool_use_id: str | None = None
task_type: str | None = None
| フィールド | 型 | 説明 |
|---|---|---|
task_id |
str |
タスクの一意の識別子 |
description |
str |
タスクの説明 |
uuid |
str |
一意のメッセージ識別子 |
session_id |
str |
セッション識別子 |
tool_use_id |
str | None |
関連するツール使用 ID |
task_type |
str | None |
バックグラウンドタスクの種類:バックグラウンド Bash と Monitor ウォッチの場合は "local_bash"、"local_agent"、または "remote_agent" |
TaskUsage
バックグラウンドタスクのトークンとタイミングデータ。
class TaskUsage(TypedDict):
total_tokens: int
tool_uses: int
duration_ms: int
TaskProgressMessage
実行中のバックグラウンドタスクの進捗更新で定期的に発行されます。
@dataclass
class TaskProgressMessage(SystemMessage):
task_id: str
description: str
usage: TaskUsage
uuid: str
session_id: str
tool_use_id: str | None = None
last_tool_name: str | None = None
| フィールド | 型 | 説明 |
|---|---|---|
task_id |
str |
タスクの一意の識別子 |
description |
str |
現在のステータス説明 |
usage |
TaskUsage |
これまでのこのタスクのトークン使用状況 |
uuid |
str |
一意のメッセージ識別子 |
session_id |
str |
セッション識別子 |
tool_use_id |
str | None |
関連するツール使用 ID |
last_tool_name |
str | None |
タスクが最後に使用したツールの名前 |
TaskNotificationMessage
バックグラウンドタスクが完了、失敗、または停止されたときに発行されます。バックグラウンドタスクには、run_in_background Bash コマンド、Monitor ウォッチ、バックグラウンドサブエージェントが含まれます。
@dataclass
class TaskNotificationMessage(SystemMessage):
task_id: str
status: TaskNotificationStatus # "completed" | "failed" | "stopped"
output_file: str
summary: str
uuid: str
session_id: str
tool_use_id: str | None = None
usage: TaskUsage | None = None
| フィールド | 型 | 説明 |
|---|---|---|
task_id |
str |
タスクの一意の識別子 |
status |
TaskNotificationStatus |
"completed"、"failed"、または "stopped" のいずれか |
output_file |
str |
タスク出力ファイルへのパス |
summary |
str |
タスク結果のサマリー |
uuid |
str |
一意のメッセージ識別子 |
session_id |
str |
セッション識別子 |
tool_use_id |
str | None |
関連するツール使用 ID |
usage |
TaskUsage | None |
タスクの最終トークン使用状況 |
CLI が 長い MCP ツール呼び出しをバックグラウンドに移動 する場合、その呼び出しのツール結果はプレースホルダーのみを保持し、呼び出しの実際の結果はこのメッセージに到着します。そのような呼び出しの "completed" 通知では、CLI は、ツールが参照によって返したファイルをリストする resource_links キーを追加します。UserMessage.tool_use_result の resourceLinks キーと同じエントリと制限があります。resource_links キーには Python Agent SDK 0.2.150 以降と Claude Code v2.1.257 以降が必要です。そのバージョンの SDK にバンドルされている CLI は Claude Code の要件を満たしています。
データクラスには resource_links のフィールドがありません。メッセージが SystemMessage から継承する data dict から読み取ってください:message.data.get("resource_links")。通知を tool_use_id で呼び出しと一致させてください。CLI は結果にリンクがない場合と、MCP ツール呼び出しではないタスクの通知の場合、キーを省略します。
コンテンツブロック型
ContentBlock
すべてのコンテンツブロックの Union 型。
ContentBlock = (
TextBlock
| ThinkingBlock
| ToolUseBlock
| ToolResultBlock
| ServerToolUseBlock
| ServerToolResultBlock
)
TextBlock
テキストコンテンツブロック。
@dataclass
class TextBlock:
text: str
ThinkingBlock
思考コンテンツブロック(思考機能を持つモデル用)。
@dataclass
class ThinkingBlock:
thinking: str
signature: str
ToolUseBlock
ツール使用リクエストブロック。
@dataclass
class ToolUseBlock:
id: str
name: str
input: dict[str, Any]
ToolResultBlock
ツール実行結果ブロック。
@dataclass
class ToolResultBlock:
tool_use_id: str
content: str | list[dict[str, Any]] | None = None
is_error: bool | None = None
エラー型
以下の型は、コードがキャッチするものを定義します。これらの型が発生させるエラーメッセージ、原因、および各々の修正方法については、トラブルシューティングを参照してください。
ClaudeSDKError
すべての SDK エラーの基本例外クラス。
class ClaudeSDKError(Exception):
"""Base error for Claude SDK."""
単一ショットの query() がエラー結果で終了した場合(例えば、ターン制限エラー)、SDK は ResultError を発生させます。
CLINotFoundError
Claude Code CLI がインストールされていないか見つからない場合に発生します。
class CLINotFoundError(CLIConnectionError):
def __init__(
self, message: str = "Claude Code not found", cli_path: str | None = None
):
"""
Args:
message: Error message (default: "Claude Code not found")
cli_path: Optional path to the CLI that was not found
"""
CLIConnectionError
Claude Code への接続に失敗した場合に発生します。
class CLIConnectionError(ClaudeSDKError):
"""Failed to connect to Claude Code."""
ProcessError
Claude Code プロセスが失敗した場合に発生します。
class ProcessError(ClaudeSDKError):
def __init__(
self, message: str, exit_code: int | None = None, stderr: str | None = None
):
self.exit_code = exit_code
self.stderr = stderr
ResultError
ターン制限エラーや API エラーなど、実行がエラーの結果メッセージで終了したために Claude Code プロセスが終了した場合に発生します。ResultError は ProcessError のサブクラスであるため、既存の except ProcessError ハンドラーもこれをキャッチします。その属性はその結果メッセージのフィールドを保持しているため、メッセージテキストを解析することなく、実行が失敗した理由に基づいて分岐できます。Python Agent SDK 0.2.140 以降が必要です。
class ResultError(ProcessError):
subtype: str | None # "error_max_turns", "error_during_execution", ...; "success" when the run ended on a failed request
errors: list[str] # an empty list when the result message reported none
result: str | None
api_error_status: int | None
terminal_reason: str | None # "max_turns", "api_error", ...; check after data["stop_reason"], before subtype
session_id: str | None
data: dict[str, Any] # the raw result message payload
失敗を区別するには、まず data["stop_reason"] を確認し、次に terminal_reason、最後に subtype を確認してください。拒否された応答は stop_reason が "refusal" で、通常は subtype が "success" です。この場合の terminal_reason では拒否を判別できず、"completed" または "api_error" となることがあります。最終リクエストが失敗した場合、subtype は "success" となり、原因は terminal_reason に記載されます(API エラーの場合は "api_error" など)。max_turns や max_budget_usd など、設定した制限に実行が達した場合は、error_* サブタイプが返されます。
CLIJSONDecodeError
JSON 解析に失敗した場合に発生します。
class CLIJSONDecodeError(ClaudeSDKError):
def __init__(self, line: str, original_error: Exception):
"""
Args:
line: The line that failed to parse
original_error: The original JSON decode exception
"""
self.line = line
self.original_error = original_error
Hook 型
hooks の使用に関する包括的なガイド、例、一般的なパターンについては、Hooks ガイド を参照してください。
HookEvent
サポートされている hook イベント型。
HookEvent = Literal[
"PreToolUse", # Called before tool execution
"PostToolUse", # Called after tool execution
"PostToolUseFailure", # Called when a tool execution fails
"UserPromptSubmit", # Called when a prompt is submitted
"Stop", # Called when stopping execution
"SubagentStop", # Called when a subagent stops
"PreCompact", # Called before message compaction
"Notification", # Called for notification events
"SubagentStart", # Called when a subagent starts
"PermissionRequest", # Called when a permission decision is needed
]
[!NOTE]
TypeScript SDK は、Python ではまだ利用できない追加の hook イベントをサポートしています。SDK ごとのサポートについては、hook 利用可能性テーブル を参照してください。
HookCallback
hook コールバック関数の型定義。
HookCallback = Callable[[HookInput, str | None, HookContext], Awaitable[HookJSONOutput]]
パラメータ:
input:hook_event_nameに基づいた判別 Union を持つ強く型付けされたフック入力(HookInputを参照)tool_use_id:オプションのツール使用識別子(ツール関連の hook 用)context:追加情報を含む hook コンテキスト
HookJSONOutput を返します。
HookContext
hook コールバックに渡されるコンテキスト情報。
class HookContext(TypedDict):
signal: Any | None # Future: abort signal support
HookMatcher
特定のイベントまたはツールに hook をマッチングするための設定。
@dataclass
class HookMatcher:
matcher: str | None = (
None # Tool name or pattern to match (e.g., "Bash", "Write|Edit")
)
hooks: list[HookCallback] = field(
default_factory=list
) # List of callbacks to execute
timeout: float | None = (
None # Timeout in seconds. When omitted, the per-event default applies:
# 600 for most events, 30 for UserPromptSubmit
)
on_failure: Literal["continue", "block"] | None = (
None # "block" blocks the action when a callback fails
)
on_failure の対象範囲を判断するには、コールバックが失敗したときにアクションをブロックする を参照してください。
HookInput
すべての hook 入力型の Union 型。実際の型は hook_event_name フィールドに依存します。
HookInput = (
PreToolUseHookInput
| PostToolUseHookInput
| PostToolUseFailureHookInput
| UserPromptSubmitHookInput
| StopHookInput
| SubagentStopHookInput
| PreCompactHookInput
| NotificationHookInput
| SubagentStartHookInput
| PermissionRequestHookInput
)
BaseHookInput
すべての hook 入力型に存在する基本フィールド。
class BaseHookInput(TypedDict):
session_id: str
transcript_path: str
cwd: str
permission_mode: NotRequired[str]
| フィールド | 型 | 説明 |
|---|---|---|
session_id |
str |
現在のセッション識別子 |
transcript_path |
str |
セッショントランスクリプトファイルへのパス |
cwd |
str |
現在の作業ディレクトリ |
permission_mode |
str(オプション) |
現在の権限モード |
PreToolUseHookInput
PreToolUse hook イベントの入力データ。
class PreToolUseHookInput(BaseHookInput):
hook_event_name: Literal["PreToolUse"]
tool_name: str
tool_input: dict[str, Any]
tool_use_id: str
agent_id: NotRequired[str]
agent_type: NotRequired[str]
| フィールド | 型 | 説明 |
|---|---|---|
hook_event_name |
Literal["PreToolUse"] |
常に "PreToolUse" |
tool_name |
str |
実行しようとしているツールの名前 |
tool_input |
dict[str, Any] |
ツールの入力パラメータ |
tool_use_id |
str |
このツール使用の一意の識別子 |
agent_id |
str(オプション) |
サブエージェント識別子。hook がサブエージェント内で発火する場合に存在 |
agent_type |
str(オプション) |
サブエージェント型。hook がサブエージェント内で発火する場合に存在 |
PostToolUseHookInput
PostToolUse hook イベントの入力データ。
class PostToolUseHookInput(BaseHookInput):
hook_event_name: Literal["PostToolUse"]
tool_name: str
tool_input: dict[str, Any]
tool_response: Any
tool_use_id: str
agent_id: NotRequired[str]
agent_type: NotRequired[str]
| フィールド | 型 | 説明 |
|---|---|---|
hook_event_name |
Literal["PostToolUse"] |
常に "PostToolUse" |
tool_name |
str |
実行されたツールの名前 |
tool_input |
dict[str, Any] |
使用された入力パラメータ |
tool_response |
Any |
ツール実行からの応答 |
tool_use_id |
str |
このツール使用の一意の識別子 |
agent_id |
str(オプション) |
サブエージェント識別子。hook がサブエージェント内で発火する場合に存在 |
agent_type |
str(オプション) |
サブエージェント型。hook がサブエージェント内で発火する場合に存在 |
PostToolUseFailureHookInput
PostToolUseFailure hook イベントの入力データ。ツール実行が失敗したときに呼び出されます。
class PostToolUseFailureHookInput(BaseHookInput):
hook_event_name: Literal["PostToolUseFailure"]
tool_name: str
tool_input: dict[str, Any]
tool_use_id: str
error: str
is_interrupt: NotRequired[bool]
agent_id: NotRequired[str]
agent_type: NotRequired[str]
| フィールド | 型 | 説明 |
|---|---|---|
hook_event_name |
Literal["PostToolUseFailure"] |
常に "PostToolUseFailure" |
tool_name |
str |
失敗したツールの名前 |
tool_input |
dict[str, Any] |
使用された入力パラメータ |
tool_use_id |
str |
このツール使用の一意の識別子 |
error |
str |
失敗した実行からのエラーメッセージ |
is_interrupt |
bool(オプション) |
失敗が Claude Code に中止として到達した場合は True。ツールが報告したエラーではなく、interrupt() で実行中のツールをキャンセルしてもこの hook は発火しません。ツール結果は代わりに中止メッセージを含みます |
agent_id |
str(オプション) |
サブエージェント識別子。hook がサブエージェント内で発火する場合に存在 |
agent_type |
str(オプション) |
サブエージェント型。hook がサブエージェント内で発火する場合に存在 |
UserPromptSubmitHookInput
UserPromptSubmit hook イベントの入力データ。
class UserPromptSubmitHookInput(BaseHookInput):
hook_event_name: Literal["UserPromptSubmit"]
prompt: str
| フィールド | 型 | 説明 |
|---|---|---|
hook_event_name |
Literal["UserPromptSubmit"] |
常に "UserPromptSubmit" |
prompt |
str |
送信されたプロンプト |
StopHookInput
Stop hook イベントの入力データ。
class StopHookInput(BaseHookInput):
hook_event_name: Literal["Stop"]
stop_hook_active: bool
| フィールド | 型 | 説明 |
|---|---|---|
hook_event_name |
Literal["Stop"] |
常に "Stop" |
stop_hook_active |
bool |
stop hook がアクティブかどうか |
SubagentStopHookInput
SubagentStop hook イベントの入力データ。
class SubagentStopHookInput(BaseHookInput):
hook_event_name: Literal["SubagentStop"]
stop_hook_active: bool
agent_id: str
agent_transcript_path: str
agent_type: str
| フィールド | 型 | 説明 |
|---|---|---|
hook_event_name |
Literal["SubagentStop"] |
常に "SubagentStop" |
stop_hook_active |
bool |
stop hook がアクティブかどうか |
agent_id |
str |
サブエージェントの一意の識別子 |
agent_transcript_path |
str |
サブエージェントのトランスクリプトファイルへのパス |
agent_type |
str |
サブエージェントの型 |
PreCompactHookInput
PreCompact hook イベントの入力データ。
class PreCompactHookInput(BaseHookInput):
hook_event_name: Literal["PreCompact"]
trigger: Literal["manual", "auto"]
custom_instructions: str | None
| フィールド | 型 | 説明 |
|---|---|---|
hook_event_name |
Literal["PreCompact"] |
常に "PreCompact" |
trigger |
Literal["manual", "auto"] |
コンパクションをトリガーしたもの |
custom_instructions |
str | None |
コンパクション用のカスタム指示 |
NotificationHookInput
Notification hook イベントの入力データ。
class NotificationHookInput(BaseHookInput):
hook_event_name: Literal["Notification"]
message: str
title: NotRequired[str]
notification_type: str
| フィールド | 型 | 説明 |
|---|---|---|
hook_event_name |
Literal["Notification"] |
常に "Notification" |
message |
str |
通知メッセージコンテンツ |
title |
str(オプション) |
通知タイトル |
notification_type |
str |
通知の型 |
SubagentStartHookInput
SubagentStart hook イベントの入力データ。
class SubagentStartHookInput(BaseHookInput):
hook_event_name: Literal["SubagentStart"]
agent_id: str
agent_type: str
| フィールド | 型 | 説明 |
|---|---|---|
hook_event_name |
Literal["SubagentStart"] |
常に "SubagentStart" |
agent_id |
str |
サブエージェントの一意の識別子 |
agent_type |
str |
サブエージェントの型 |
PermissionRequestHookInput
PermissionRequest hook イベントの入力データ。hooks がパーミッション決定をプログラムで処理できるようにします。
class PermissionRequestHookInput(BaseHookInput):
hook_event_name: Literal["PermissionRequest"]
tool_name: str
tool_input: dict[str, Any]
permission_suggestions: NotRequired[list[Any]]
agent_id: NotRequired[str]
agent_type: NotRequired[str]
| フィールド | 型 | 説明 |
|---|---|---|
hook_event_name |
Literal["PermissionRequest"] |
常に "PermissionRequest" |
tool_name |
str |
パーミッションをリクエストするツールの名前 |
tool_input |
dict[str, Any] |
ツールの入力パラメータ |
permission_suggestions |
list[Any](オプション) |
CLI からの提案されたパーミッション更新 |
agent_id |
str(オプション) |
サブエージェント識別子。hook がサブエージェント内で発火する場合に存在 |
agent_type |
str(オプション) |
サブエージェント型。hook がサブエージェント内で発火する場合に存在 |
HookJSONOutput
hook コールバック戻り値の Union 型。
HookJSONOutput = AsyncHookJSONOutput | SyncHookJSONOutput
SyncHookJSONOutput
制御フィールドと決定フィールドを持つ同期 hook 出力。
class SyncHookJSONOutput(TypedDict):
# Control fields
continue_: NotRequired[bool] # Whether to proceed (default: True)
suppressOutput: NotRequired[bool] # Hide stdout from transcript
stopReason: NotRequired[str] # Message when continue is False
# Decision fields
decision: NotRequired[Literal["block"]]
systemMessage: NotRequired[str] # Warning message for user
reason: NotRequired[str] # Feedback for Claude
# Hook-specific output
hookSpecificOutput: NotRequired[HookSpecificOutput]
[!NOTE]
Python コードで
continue_(アンダースコア付き)を使用してください。CLI に送信されるときに自動的にcontinueに変換されます。
HookSpecificOutput
イベント固有の TypedDict 出力型の判別 union。hookEventName フィールドはどのフィールドが有効かを決定します。hook イベントごとに利用可能なフィールドの詳細については、hooks で実行を制御 を参照してください。
class PreToolUseHookSpecificOutput(TypedDict):
hookEventName: Literal["PreToolUse"]
permissionDecision: NotRequired[Literal["allow", "deny", "ask", "defer"]]
permissionDecisionReason: NotRequired[str]
updatedInput: NotRequired[dict[str, Any]]
additionalContext: NotRequired[str]
class PostToolUseHookSpecificOutput(TypedDict):
hookEventName: Literal["PostToolUse"]
additionalContext: NotRequired[str]
updatedToolOutput: NotRequired[Any]
updatedMCPToolOutput: NotRequired[Any] # MCP tools only. Prefer updatedToolOutput, which works for all tools
class PostToolUseFailureHookSpecificOutput(TypedDict):
hookEventName: Literal["PostToolUseFailure"]
additionalContext: NotRequired[str]
class UserPromptSubmitHookSpecificOutput(TypedDict):
hookEventName: Literal["UserPromptSubmit"]
additionalContext: NotRequired[str]
class NotificationHookSpecificOutput(TypedDict):
hookEventName: Literal["Notification"]
additionalContext: NotRequired[str]
class SubagentStartHookSpecificOutput(TypedDict):
hookEventName: Literal["SubagentStart"]
additionalContext: NotRequired[str]
class PermissionRequestHookSpecificOutput(TypedDict):
hookEventName: Literal["PermissionRequest"]
decision: dict[str, Any]
HookSpecificOutput = (
PreToolUseHookSpecificOutput
| PostToolUseHookSpecificOutput
| PostToolUseFailureHookSpecificOutput
| UserPromptSubmitHookSpecificOutput
| NotificationHookSpecificOutput
| SubagentStartHookSpecificOutput
| PermissionRequestHookSpecificOutput
)
AsyncHookJSONOutput
hook 実行を遅延させる非同期 hook 出力。
class AsyncHookJSONOutput(TypedDict):
async_: Literal[True] # Set to True to defer execution
asyncTimeout: NotRequired[int] # Timeout in milliseconds
[!NOTE]
Python コードで
async_(アンダースコア付き)を使用してください。CLI に送信されるときに自動的にasyncに変換されます。
Hook 使用例
この例は 2 つの hook を登録します:1 つは rm -rf / のような危険な bash コマンドをブロックし、もう 1 つは監査のためにすべてのツール使用をログします。セキュリティ hook は matcher を介して Bash コマンドでのみ実行され、ログ hook はすべてのツールで実行されます。
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions, HookMatcher, HookContext
from typing import Any
async def validate_bash_command(
input_data: dict[str, Any], tool_use_id: str | None, context: HookContext
) -> dict[str, Any]:
"""Validate and potentially block dangerous bash commands."""
if input_data["tool_name"] == "Bash":
command = input_data["tool_input"].get("command", "")
if "rm -rf /" in command:
return {
"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "deny",
"permissionDecisionReason": "Dangerous command blocked",
}
}
return {}
async def log_tool_use(
input_data: dict[str, Any], tool_use_id: str | None, context: HookContext
) -> dict[str, Any]:
"""Log all tool usage for auditing."""
print(f"Tool used: {input_data.get('tool_name')}")
return {}
options = ClaudeAgentOptions(
hooks={
"PreToolUse": [
HookMatcher(
matcher="Bash", hooks=[validate_bash_command], timeout=120
), # 2 min for validation
HookMatcher(
hooks=[log_tool_use]
), # Applies to all tools (per-event default timeout)
],
"PostToolUse": [HookMatcher(hooks=[log_tool_use])],
}
)
async def main():
async for message in query(prompt="Analyze this codebase", options=options):
print(message)
asyncio.run(main())
ツール入出力型
組み込み Claude Code ツールの入出力スキーマのドキュメント。Python SDK はこれらを型としてエクスポートしませんが、メッセージ内のツール入出力の構造を表します。
各出力は、そのツールの UserMessage.tool_use_result から読み込む値です。キー名は Claude Code が発行する通りに表示されます。「存在する場合」または「オプション」というコメント付きで | None と注釈が付けられたキーは、適用されない場合は省略されます。
Agent
ツール名: Agent。このツールがセッションで利用可能な場合、以前の名前 Task はまだエイリアスとして受け入れられます。
初期化時の SystemMessage 内の tools リストは、後方互換性のためこのツールを Task として報告します。
入力:
{
"description": str, # タスクの短い説明(3~5 語)
"prompt": str, # エージェントが実行するタスク
"subagent_type": str | None, # 使用する特化したエージェントのタイプ
"model": "sonnet" | "opus" | "haiku" | "fable" | None, # このエージェントのモデルの上書き
"effort": "low" | "medium" | "high" | "xhigh" | "max" | None, # このエージェントの推論エフォート
"run_in_background": bool | None, # 省略時のデフォルト:メインエージェントの呼び出しでは新しいエージェントがバックグラウンドで実行され、サブエージェントの呼び出しではその完了を待ちます
"name": str | None, # スポーンされたエージェントの名前
"team_name": str | None, # 非推奨。無視されます
"mode": "acceptEdits" | "auto" | "bypassPermissions" | "default" | "dontAsk" | "plan" | None, # 非推奨。無視されます。サブエージェント継承ルールがサブエージェントの権限モードを決定します
"isolation": "worktree" | "remote" | None, # エージェントの変更の分離モード
}
複雑なマルチステップタスクを自律的に処理するための新しいエージェントを起動します。
Claude が Agent 呼び出しで run_in_background を省略した場合、デフォルトではメインエージェントは新しいエージェントを待たず、サブエージェントは待ちます。
- メインエージェントから:新しいエージェントはバックグラウンドで実行され、結果は
status: "async_launched"になります。代わりにメインエージェントが新しいエージェントを待つようにするには、Claude がサブエージェントを待つかどうかを選択する を参照してください。 - サブエージェントのいずれかから:呼び出し元のサブエージェントは 新しいエージェントを待ちます。新しいエージェントの定義で
backgroundがTrueに設定されている場合、またはCLAUDE_CODE_FORK_SUBAGENTを0に設定して フォークモードをオフにした 場合は、代わりに新しいエージェントがバックグラウンドで実行されます。
Python SDK v0.2.169 より前では、サブエージェントが開始したエージェントもデフォルトでバックグラウンドで実行されていました。このリリースは、Claude Code v2.1.302 以降をバンドルする最初のリリースです。
出力(ステータス:"completed"):
{
"status": "completed",
"agentId": str, # 実行されたエージェントの ID
"agentType": str | None, # タスクを処理したサブエージェントタイプ
"content": [ # 結果コンテンツブロック
{
"type": "text",
"text": str,
"citations": list | None,
}
],
"resolvedModel": str | None, # サブエージェントが開始したモデル
"modelsUsed": list[str] | None, # 使用されたモデルの順序。連続する繰り返しは折りたたまれます
"totalToolUseCount": int, # エージェントが実行したツール呼び出しの数
"totalDurationMs": int, # 実行時間(ミリ秒)
"totalTokens": int, # 最終 API リクエストからのトークン数。実行全体ではありません
"usage": { # トークン使用統計
"input_tokens": int,
"output_tokens": int,
"cache_creation_input_tokens": int | None,
"cache_read_input_tokens": int | None,
"server_tool_use": {"web_search_requests": int, "web_fetch_requests": int} | None,
"service_tier": str | None,
"cache_creation": {"ephemeral_1h_input_tokens": int, "ephemeral_5m_input_tokens": int} | None,
"inference_geo": str | None,
"speed": str | None,
"iterations": Any | None,
"output_tokens_details": {"thinking_tokens": int | None} | None,
"fallback_credit": Any | None,
},
"toolStats": { # 実行のための集計ツール活動
"readCount": int,
"searchCount": int,
"bashCount": int,
"editFileCount": int,
"linesAdded": int,
"linesRemoved": int,
"otherToolCount": int,
"frameCount": int | None,
} | None,
"prompt": str, # エージェントが実行したプロンプト
"worktreePath": str | None, # Claude Code がサブエージェントの worktree を保持した場合に存在
"worktreeBranch": str | None, # Claude Code がその worktree を git で作成した場合に存在
}
出力(ステータス:"async_launched"):
{
"status": "async_launched",
"isAsync": bool | None, # バックグラウンド起動時は True
"agentId": str, # 起動されたエージェントの ID
"description": str, # タスクの説明
"resolvedModel": str | None, # バックグラウンド化の遷移時に使用中のモデル
"modelsUsed": list[str] | None, # バックグラウンド化前に使用されたモデル。順序で、連続する繰り返しは折りたたまれます
"prompt": str, # エージェントが実行するプロンプト
"outputFile": str, # エージェントの出力が書き込まれるファイルパス
"canReadOutputFile": bool | None, # 出力ファイルを直接読み込めるかどうか
}
出力(ステータス:"remote_launched"):
{
"status": "remote_launched",
"taskId": str, # ディスパッチされたタスクの ID
"sessionUrl": str, # クラウドセッションへのリンク
"description": str, # タスクの説明
"prompt": str, # エージェントが実行するプロンプト
"outputFile": str, # エージェントの出力が書き込まれるファイルパス
}
サブエージェントからの結果を返します。出力は status フィールドで判別されます。完了したタスクの場合は "completed"、バックグラウンドタスクの場合は "async_launched"、Claude Code がクラウドセッションにディスパッチしたタスクの場合は "remote_launched"。sessionUrl はそのセッションにリンクし、taskId がそれを識別します。Claude Code が サブエージェントの分離 worktree を保持した 場合、completed バリアントの worktreePath はそれを見つける場所であり、worktreeBranch は Claude Code が git で worktree を作成した場合のそのブランチです。
completed バリアントでは、resolvedModel はサブエージェントが開始したモデルを名付けます。これは availableModels または別の上書きが適用される場合、リクエストされた model 入力と異なる場合があります。このフィールドには Claude Code v2.1.174 以降が必要です。async_launched バリアントでは、resolvedModel はエージェントがバックグラウンドに移動したときに使用中のモデルを名付けるため、バックグラウンド化前に発生したスワップがそこに反映されます。両方のバリアントの modelsUsed フィールドは、使用されたモデルを順序で列挙し、連続する繰り返しは折りたたまれます。モデルが実行中にスワップされた場合にのみ設定されます。modelsUsed とバックグラウンド化時の resolvedModel 動作には Claude Code v2.1.212 以降が必要です。
Claude Code は usage と totalTokens をサブエージェントの最終 API リクエストから入力します。実行全体からではありません。存在する場合、usage 内の output_tokens_details の下の thinking_tokens はそのリクエストの出力トークンのうち思考トークンであった数です。output_tokens_details キーには Python SDK v0.2.136 以降が必要です。これは Claude Code v2.1.228 をバンドルしています。fallback_credit キーには Python SDK v0.2.162 以降が必要です。これは Claude Code v2.1.285 をバンドルしています。
AskUserQuestion
ツール名: AskUserQuestion
実行中にユーザーに明確化の質問をします。使用の詳細については 承認とユーザー入力を処理 を参照してください。
入力:
{
"questions": [ # ユーザーに質問する質問(1~4 個の質問)
{
"question": str, # ユーザーに質問する完全な質問
"header": str, # チップ/タグとして表示される非常に短いラベル(最大 12 文字)
"options": [ # 利用可能な選択肢(2~4 個のオプション)
{
"label": str, # このオプションの表示テキスト(1~5 語)
"description": str, # このオプションが何を意味するかの説明
"preview": str | None, # オプションがフォーカスされたときにレンダリングされるプレビューコンテンツ
}
],
"multiSelect": bool, # 複数選択を許可する場合は true に設定
}
],
"answers": dict[str, str] | None,
# 権限システムによって入力されたユーザーの回答。マルチセレクト
# 回答は選択されたラベルのカンマ区切り文字列です。入力時はラベルのリストが受け入れられ、その形式に強制されます
"annotations": dict[str, dict] | None,
# 質問テキストでキーされたユーザーからの質問ごとのアノテーション。
# 各値は「preview」(選択されたオプションのプレビュー
# コンテンツ)と「notes」(選択に関する自由形式のメモ)を含むことができます
"metadata": dict | None, # {"source": "remember"} などの分析メタデータ。ユーザーには表示されません
}
出力:
{
"questions": [ # 質問された質問
{
"question": str,
"header": str,
"options": [{"label": str, "description": str, "preview": str | None}],
"multiSelect": bool,
}
],
"answers": dict[str, str], # 質問テキストを回答文字列にマップ
# マルチセレクト回答はカンマ区切り
"response": str | None,
# 質問に答える代わりに入力された自由形式の返信。設定されている場合、
# Claude は回答リストの代わりに「ユーザーが応答しました:...」を受け取ります
"annotations": dict[str, dict] | None, # ユーザーの選択からの質問ごとの「preview」と「notes」
"afkTimeoutMs": int | None, # ユーザーの非アクティブ状態がこれだけミリ秒続いた後にダイアログが自動解決されたときに設定。ユーザーが回答したときは存在しません
}
Bash
ツール名: Bash
フォアグラウンドの上限については、タイムアウトと出力制限 を参照してください。バックグラウンド時間制限については、バックグラウンドコマンドの時間制限 を参照してください。
入力:
{
"command": str, # 実行するコマンド
"timeout": int | None, # ミリ秒。フォアグラウンド:デフォルトで 600000 でキャップされ、より高い値はクランプされます。run_in_background を使用する場合(Claude Code v2.1.285 以降):バックグラウンド時間制限。省略時は 1800000、上限は 7200000(引き上げない限り)
"description": str | None, # 明確で簡潔な説明(5~10 語)
"run_in_background": bool | None, # バックグラウンドで実行する場合は true に設定
}
出力:
{
"stdout": str, # コマンドの出力。stdout と stderr はこの 1 つのインターリーブされたストリームにマージされて到着
"stderr": str, # ツール自体が追加する通知。コマンドの stderr ではありません
"interrupted": bool, # コマンドが中断されたかどうか
"isImage": bool | None, # stdout に画像データが含まれているかどうか
"backgroundTaskId": str | None, # コマンドがバックグラウンドで実行されている場合のバックグラウンドタスクの ID
}
Monitor
ツール名: Monitor
バックグラウンドソースを実行し、各イベントを Claude に配信して、ポーリングなしで反応できるようにします。command はスクリプトを実行し、stdout 行ごとに 1 つのイベントを発行し、ws は WebSocket を開き、テキストフレームごとに 1 つのイベントを発行します。command または ws のいずれか 1 つを正確に指定してください。
Monitor がコマンドを実行する場合、Bash と同じ権限ルールに従います。WebSocket ウォッチは別途承認を求めます。ws ソースには Claude Code v2.1.195 以降が必要です。動作とプロバイダーの可用性については、Monitor ツールリファレンス を参照してください。
入力:
{
"command": str | None, # シェルスクリプト。各 stdout 行はイベント、終了はウォッチを終了
"ws": dict | None, # WebSocket ソース:{"url": str, "protocols": list[str] | None}。各テキストフレームはイベント
"description": str, # 通知に表示される短い説明
"timeout_ms": int | None, # 期限(ミリ秒)(デフォルト 300000、最大 3600000。有効な期限は最大 1800000)
}
出力:
{
"taskId": str, # バックグラウンド監視タスクの ID
"timeoutMs": int, # ウォッチの有効な期限(ミリ秒)
"persistent": bool | None, # False:すべてのウォッチに期限があります
}
Edit
ツール名: Edit
入力:
{
"file_path": str, # 変更するファイルの絶対パス
"old_string": str, # 置換するテキスト
"new_string": str, # 置換後のテキスト
"replace_all": bool | None, # すべての出現を置換(デフォルト False)
}
出力:
{
"filePath": str, # 編集されたファイル
"oldString": str, # 置換されたテキスト
"newString": str, # それを置換したテキスト
"originalFile": str | None, # 編集前のファイルコンテンツ
"structuredPatch": [ # 変更の差分ハンク
{
"oldStart": int,
"oldLines": int,
"newStart": int,
"newLines": int,
"lines": list[str],
}
],
"userModified": bool, # ユーザーが提案された編集を受け入れる前に変更したかどうか
"replaceAll": bool, # すべての出現が置換されたかどうか
"gitDiff": { # ファイルのオプションの git 差分サマリー
"filename": str,
"status": "modified" | "added",
"additions": int,
"deletions": int,
"changes": int,
"patch": str,
"repository": str | None, # 利用可能な場合は GitHub owner/repo
} | None,
}
Read
ツール名: Read
入力:
{
"file_path": str, # 読み込むファイルの絶対パス
"offset": int | None, # 読み込みを開始する行番号
"limit": int | None, # 読み込む行数
}
出力は Claude が読み込んだ内容に応じて、以下の形状のいずれかを取ります。type キーをチェックして区別してください。
出力(type:"text"):
{
"type": "text",
"file": {
"filePath": str, # 読み込まれたファイル
"content": str, # 返されたコンテンツ
"numLines": int, # 返されたコンテンツの行数
"startLine": int, # コンテンツが開始する行番号
"totalLines": int, # ファイルの総行数
"truncatedByTokenCap": bool | None, # 全ファイル読み込みがトークン上限を超えた場合に存在し True。コンテンツは最初のページ
},
}
出力(type:"image"):
{
"type": "image",
"file": {
"base64": str, # Base64 エンコードされた画像データ
"type": "image/jpeg" | "image/png" | "image/gif" | "image/webp", # 画像 MIME タイプ
"originalSize": int, # 元のファイルサイズ(バイト)
"dimensions": { # 座標マッピング用のオプションのサイジング情報
"originalWidth": int | None, # オプション。元の幅(ピクセル)
"originalHeight": int | None, # オプション。元の高さ(ピクセル)
"displayWidth": int | None, # オプション。リサイズ後の幅
"displayHeight": int | None, # オプション。リサイズ後の高さ
} | None,
},
}
出力(type:"notebook"):
{
"type": "notebook",
"file": {
"filePath": str, # 読み込まれたノートブック
"cells": list, # ノートブックセル
},
}
出力(type:"pdf"):
{
"type": "pdf",
"file": {
"filePath": str, # 読み込まれた PDF
"base64": str, # Base64 エンコードされた PDF データ
"originalSize": int, # ファイルサイズ(バイト)
},
}
出力(type:"parts"):
{
"type": "parts",
"file": {
"filePath": str, # 読み込まれた PDF
"originalSize": int, # ファイルサイズ(バイト)
"count": int, # 画像として抽出されたページ数
"outputDir": str, # 抽出されたページ画像を含むディレクトリ
},
"firstPage": int | None, # オプション。最初に抽出されたページのドキュメントページ番号
}
出力(type:"file_unchanged"):
{
"type": "file_unchanged", # ファイルはこのセッションで Claude が最後に読み込んだ以降変更されていないため、コンテンツは繰り返されません
"file": {
"filePath": str,
},
"source": "seeded" | None, # 以前のコピーが起動時に読み込まれた CLAUDE.md またはメモリファイルから来た場合に存在
}
Write
ツール名: Write
入力:
{
"file_path": str, # 書き込むファイルの絶対パス
"content": str, # ファイルに書き込むコンテンツ
}
出力:
{
"type": "create" | "update", # 書き込みが新しいファイルを作成したか、既存のファイルを上書きしたか
"filePath": str, # 書き込まれたファイル
"content": str, # 書き込まれたコンテンツ
"structuredPatch": [ # 差分ハンク。新しいファイル、何も変更されなかった場合、または Claude Code が差分をスキップした場合は空
{
"oldStart": int,
"oldLines": int,
"newStart": int,
"newLines": int,
"lines": list[str],
}
],
"originalFile": str | None, # 以前のコンテンツ。新しいファイルの場合または以前のコンテンツが大きすぎて含められない場合は None
"gitDiff": { # ファイルのオプションの git 差分サマリー
"filename": str,
"status": "modified" | "added",
"additions": int,
"deletions": int,
"changes": int,
"patch": str,
"repository": str | None, # 利用可能な場合は GitHub owner/repo
} | None,
"userModified": bool | None, # オプション。ユーザーが受け入れる前に提案されたコンテンツを編集したかどうか
}
Glob
ツール名: Glob
入力:
{
"pattern": str, # ファイルにマッチさせるグロブパターン
"path": str | None, # 検索するディレクトリ(デフォルトは cwd)
}
出力:
{
"durationMs": int, # 検索の実行に要した時間(ミリ秒)
"numFiles": int, # 返されたパスの数。切り詰め後
"filenames": list[str], # マッチしたファイルパス
"truncated": bool, # 結果が 100 ファイルの上限で切り詰められたかどうか
"totalMatches": int | None, # オプション。切り詰め前のマッチするファイルの総数。countIsComplete が False の場合は下限
"countIsComplete": bool | None, # オプション。totalMatches が正確かどうか
}
totalMatches と countIsComplete には Claude Code v2.1.191 以降が必要です。
Grep
ツール名: Grep
入力:
{
"pattern": str, # 正規表現パターン
"path": str | None, # 検索するファイルまたはディレクトリ
"glob": str | None, # ファイルをフィルタリングするグロブパターン
"type": str | None, # 検索するファイルタイプ
"output_mode": str | None, # 「content」、「files_with_matches」、または「count」
"-i": bool | None, # 大文字小文字を区別しない検索
"-n": bool | None, # 行番号を表示
"-B": int | None, # 各マッチの前に表示する行
"-A": int | None, # 各マッチの後に表示する行
"-C": int | None, # 前後に表示する行
"context": int | None, # 前後に表示する行。-C はエイリアス
"-o": bool | None, # 各行のマッチした部分のみを出力
"head_limit": int | None, # 出力を最初の N 行/エントリに制限
"offset": int | None, # head_limit を適用する前に最初の N 行/エントリをスキップ
"multiline": bool | None, # マルチラインモードを有効化
}
出力:
{
"mode": "content" | "files_with_matches" | "count" | None, # 使用された出力モード
"numFiles": int, # 結果内のファイル数。content モードでは常に 0
"filenames": list[str], # files_with_matches モードのマッチするファイル。他のモードでは空
"content": str | None, # content モードのマッチする行、または count モードのファイルごとのカウント
"numLines": int | None, # コンテンツ内の行数。content モードに存在
"numMatches": int | None, # 総マッチ数。count モードに存在
"totalFiles": int | None, # オプション。files_with_matches モードで head_limit と offset の前の総数
"totalLines": int | None, # オプション。content モードで head_limit と offset の前の総数
"appliedLimit": int | None, # head_limit が結果を切り詰めた場合に存在
"appliedOffset": int | None, # オフセットが適用された場合に存在
}
Grep は各出力モードでこの dict 形状を返します。どのオプションキーが存在するかは output_mode に依存します。
totalFiles には Claude Code v2.1.208 以降が必要です。totalLines には Claude Code v2.1.210 以降が必要です。
NotebookEdit
ツール名: NotebookEdit
入力:
{
"notebook_path": str, # Jupyter ノートブックの絶対パス
"cell_id": str | None, # 編集するセルの ID
"new_source": str, # セルの新しいソース
"cell_type": "code" | "markdown" | None, # セルのタイプ
"edit_mode": "replace" | "insert" | "delete" | None, # 編集操作のタイプ
}
出力:
{
"new_source": str, # セルに書き込まれたソース
"old_source": str | None, # 以前のセルソース。replace と delete に存在
"cell_id": str | None, # 編集されたセルの ID。利用可能な場合
"cell_type": "code" | "markdown", # セルタイプ
"language": str, # ノートブックのプログラミング言語
"edit_mode": str, # 使用された編集モード
"error": str | None, # 操作が失敗した場合のエラーメッセージ
"notebook_path": str, # ノートブックファイル
"original_file": str, # 編集前のノートブックコンテンツ
"updated_file": str, # 編集後のノートブックコンテンツ
}
WebFetch
ツール名: WebFetch
入力:
{
"url": str, # コンテンツを取得する URL
"prompt": str, # 取得したコンテンツで実行するプロンプト
"offset": int | None, # ページの先頭からスキップする文字数。Python Agent SDK 0.2.164 以降が必要
}
出力:
{
"bytes": int, # 取得したコンテンツのサイズ(バイト)
"code": int, # HTTP レスポンスコード
"codeText": str, # HTTP レスポンスコードテキスト
"result": str, # コンテンツにプロンプトを適用した処理結果
"durationMs": int, # コンテンツを取得して処理するのにかかった時間(ミリ秒)
"url": str, # 取得された URL
}
WebSearch
ツール名: WebSearch
入力:
{
"query": str, # 使用する検索クエリ
"allowed_domains": list[str] | None, # これらのドメインからのみ結果を含める
"blocked_domains": list[str] | None, # これらのドメインからの結果は決して含めない
}
出力:
{
"query": str, # 検索クエリ
"results": list[str | {"tool_use_id": str, "content": list[{"title": str, "url": str}]}],
"durationSeconds": float, # 検索時間(秒)
}
TodoWrite
ツール名: TodoWrite
[!NOTE]
以下のツールは、デフォルトでは Claude Opus 4.7、Claude Sonnet 4.6、Claude Haiku 4.5、およびそれ以前のモデルでのみ利用可能です。その他のすべてのモデル(Claude Code が認識しないモデル ID を含む)では、オプトインしない限り利用できません。
TodoWriteTaskCreateTaskGetTaskUpdateTaskListツールが利用可能な場所では、Claude Code は 4 つの Task ツールを提供します。
CLAUDE_CODE_ENABLE_TASKS=0を設定した場合は、代わりにTodoWriteを提供します。このデフォルトセットは Claude Code v2.1.268 以降に適用されます。これは TypeScript Agent SDK が v0.3.268 からバンドルしています。
モデルの可用性 を参照してオプトインしてください。
入力:
{
"todos": [
{
"content": str, # タスクの説明
"status": "pending" | "in_progress" | "completed", # タスクのステータス
"activeForm": str, # 説明のアクティブな形式
}
]
}
出力:
{
"oldTodos": [ # 更新前の todo リスト
{
"content": str,
"status": "pending" | "in_progress" | "completed",
"activeForm": str,
}
],
"newTodos": [ # 更新後の todo リスト
{
"content": str,
"status": "pending" | "in_progress" | "completed",
"activeForm": str,
}
],
}
TaskCreate
ツール名: TaskCreate
入力:
{
"subject": str, # 短いタスクタイトル
"description": str, # 詳細なタスク本文
"activeForm": str | None, # 進行中に表示される現在形ラベル
"metadata": dict | None, # 任意の呼び出し元メタデータ
}
出力:
{
"task": {"id": str, "subject": str}, # 割り当てられた ID を持つ作成されたタスク
}
TaskUpdate
ツール名: TaskUpdate
入力:
{
"taskId": str, # パッチするタスクの ID
"status": Literal["pending", "in_progress", "completed", "deleted"] | None,
"subject": str | None,
"description": str | None,
"activeForm": str | None,
"addBlocks": list[str] | None, # このタスクが現在ブロックするタスク ID
"addBlockedBy": list[str] | None, # 現在このタスクをブロックするタスク ID
"owner": str | None,
"metadata": dict | None,
}
出力:
{
"success": bool,
"taskId": str,
"updatedFields": list[str], # 変更されたフィールドの名前
"error": str | None,
"statusChange": {"from": str, "to": str} | None,
}
TaskGet
ツール名: TaskGet
入力:
{
"taskId": str, # 読み込むタスクの ID
}
出力:
{
"task": {
"id": str,
"subject": str,
"description": str,
"status": Literal["pending", "in_progress", "completed"],
"blocks": list[str],
"blockedBy": list[str],
} | None, # ID が見つからない場合は None
}
TaskList
ツール名: TaskList
入力:
{}
出力:
{
"tasks": [
{
"id": str,
"subject": str,
"status": Literal["pending", "in_progress", "completed"],
"owner": str | None,
"blockedBy": list[str],
}
],
}
TaskOutput
Claude Code v2.1.277 で削除されました。以前は実行中または完了したバックグラウンドタスクから出力を取得し、BashOutput はエイリアスとして受け入れられていました。Claude はバックグラウンドタスクの出力ファイルを Read で読み込みます。
disallowed_tools エントリまたはいずれかの名前をまだ指定している拒否ルールは、警告なしに無視されます。
TaskStop
ツール名: TaskStop。以前の名前 KillShell と KillBash は、権限ルール、フックの matcher、および tools、allowed_tools、disallowed_tools オプションで引き続き使用できます。
入力:
{
"task_id": str | None, # 停止するバックグラウンドタスクの ID
"shell_id": str | None, # 非推奨:代わりに task_id を使用してください
}
出力:
{
"message": str, # 操作に関するステータスメッセージ
"task_id": str, # 停止されたタスクの ID
"task_type": str, # 停止されたタスクのタイプ
"command": str | None, # 停止されたタスクのコマンドまたは説明
}
ExitPlanMode
ツール名: ExitPlanMode
入力:
{
"plan": str # ユーザーが承認するために実行するプラン
}
出力:
{
"plan": str | None, # ユーザーに提示されたプラン
"isAgent": bool, # サブエージェントがツールを呼び出した場合は True
"filePath": str | None, # プランがファイルに保存された場合に存在
"hasTaskTool": bool | None, # オプション。現在のコンテキストで Agent ツールが利用可能かどうか
"planWasEdited": bool | None, # ユーザーが承認する前にプランを編集した場合に存在し True
"awaitingLeaderApproval": bool | None, # チームメイトがプランをチームリーダーに承認を求めて送信した場合に存在し True
"requestId": str | None, # その承認リクエストのオプション ID
}
ListMcpResources
ツール名: ListMcpResourcesTool
入力:
{
"server": str | None # リソースをフィルタリングするオプションのサーバー名
}
結果は dict ではなくリストであるため、tool_use_result はこのツールに対して list を保持します。
出力:
[ # リソースごとに 1 つのエントリ
{
"uri": str, # リソース URI
"name": str, # リソース名
"mimeType": str | None, # オプション。MIME タイプ
"description": str | None, # オプション。説明
"server": str, # このリソースを提供するサーバー
}
]
ReadMcpResource
ツール名: ReadMcpResourceTool
入力:
{
"server": str, # MCP サーバー名
"uri": str, # 読み込むリソース URI
}
出力:
{
"contents": [
{
"uri": str, # リソース URI
"mimeType": str | None, # オプション。MIME タイプ
"text": str | None, # テキストコンテンツ、またはバイナリコンテンツに関する注記
"blobSavedTo": str | None, # Claude Code がバイナリコンテンツをディスクに保存した場合に存在。保存されたファイルのパス
}
],
"error": str | None, # サーバーがリソースを読み込めなかった場合に存在
}
継続的な会話インターフェースの構築
以下の例では、1 つの ClaudeSDKClient をターン全体で接続したままにするため、Claude は以前のメッセージを覚えています。new と入力して切断して再接続し、新しいセッションを開始するか、exit と入力して会話を終了します。
from claude_agent_sdk import (
ClaudeSDKClient,
ClaudeAgentOptions,
AssistantMessage,
TextBlock,
)
import asyncio
class ConversationSession:
"""Maintains a single conversation session with Claude."""
def __init__(self, options: ClaudeAgentOptions | None = None):
self.client = ClaudeSDKClient(options)
self.turn_count = 0
async def start(self):
await self.client.connect()
print("Starting conversation session. Claude will remember context.")
print(
"Commands: 'exit' to quit, 'interrupt' to stop current task, 'new' for new session"
)
while True:
user_input = input(f"\n[Turn {self.turn_count + 1}] You: ")
if user_input.lower() == "exit":
break
elif user_input.lower() == "interrupt":
await self.client.interrupt()
print("Task interrupted!")
continue
elif user_input.lower() == "new":
# Disconnect and reconnect for a fresh session
await self.client.disconnect()
await self.client.connect()
self.turn_count = 0
print("Started new conversation session (previous context cleared)")
continue
# Send message - the session retains all previous messages
await self.client.query(user_input)
self.turn_count += 1
# Process response
print(f"[Turn {self.turn_count}] Claude: ", end="")
async for message in self.client.receive_response():
if isinstance(message, AssistantMessage):
for block in message.content:
if isinstance(block, TextBlock):
print(block.text, end="")
print() # New line after response
await self.client.disconnect()
print(f"Conversation ended after {self.turn_count} turns.")
async def main():
options = ClaudeAgentOptions(
allowed_tools=["Read", "Write", "Bash"], permission_mode="acceptEdits"
)
session = ConversationSession(options)
await session.start()
# Example conversation:
# Turn 1 - You: "Create a file called hello.py"
# Turn 1 - Claude: "I'll create a hello.py file for you..."
# Turn 2 - You: "What's in that file?"
# Turn 2 - Claude: "The hello.py file I just created contains..." (remembers!)
# Turn 3 - You: "Add a main function to it"
# Turn 3 - Claude: "I'll add a main function to hello.py..." (knows which file!)
asyncio.run(main())
エラー処理
以下の例は、query() 呼び出しを SDK が発生させる エラータイプ の 4 つのハンドラーでラップしています。
この例は ResultError をキャッチします。これには Python Agent SDK 0.2.140 以降が必要です。
import asyncio
from claude_agent_sdk import (
query,
CLINotFoundError,
ProcessError,
ResultError,
CLIJSONDecodeError,
)
async def main():
try:
async for message in query(prompt="Hello"):
print(message)
except CLINotFoundError:
print(
"Claude Code CLI not found. Try reinstalling: pip install --force-reinstall claude-agent-sdk"
)
# Catch ResultError before ProcessError, which it subclasses. Its message
# carries the error text. A refusal and a failed final request both usually
# arrive with subtype "success", so check stop_reason, then terminal_reason.
except ResultError as e:
if e.data.get("stop_reason") == "refusal":
print(f"Model declined to respond: {e}")
elif e.terminal_reason == "api_error":
print(f"API request failed: {e}")
else:
print(f"Query ended with an error result ({e.terminal_reason or e.subtype}): {e}")
except ProcessError as e:
print(f"Process failed with exit code: {e.exit_code}")
except CLIJSONDecodeError as e:
print(f"Failed to parse response: {e}")
asyncio.run(main())
サンドボックス設定
SandboxSettings
サンドボックス動作の設定。これを使用してコマンドサンドボックスを有効にし、ネットワーク制限をプログラムで設定します。
class SandboxSettings(TypedDict, total=False):
enabled: bool
autoAllowBashIfSandboxed: bool
excludedCommands: list[str]
allowUnsandboxedCommands: bool
network: SandboxNetworkConfig
ignoreViolations: SandboxIgnoreViolations
enableWeakerNestedSandbox: bool
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
enabled |
bool |
False |
コマンド実行のサンドボックスモードを有効にします |
autoAllowBashIfSandboxed |
bool |
True |
サンドボックスが有効な場合、bash コマンドを自動承認します |
excludedCommands |
list[str] |
[] |
サンドボックス制限をバイパスするコマンド(例:["docker *"])。これらはモデルの関与なしに自動的にサンドボックスなしで実行されます。sandbox.excludedCommands は、エントリが適用される場合をカバーしています |
allowUnsandboxedCommands |
bool |
True |
モデルがサンドボックスの外でコマンドを実行するようにリクエストすることを許可します。True の場合、モデルはツール入力で dangerouslyDisableSandbox を設定でき、パーミッションシステム にフォールバックします |
network |
SandboxNetworkConfig |
None |
ネットワーク固有のサンドボックス設定 |
ignoreViolations |
SandboxIgnoreViolations |
None |
無視するサンドボックス違反を設定します |
enableWeakerNestedSandbox |
bool |
False |
互換性のためにより弱いネストされたサンドボックスを有効にします |
[!NOTE]
サンドボックスはプラットフォームサポートに依存し、Linux では
bubblewrapやsocatなどのツールが必要です。デフォルトでは、enabledがTrueでもサンドボックスが起動できない場合、コマンドはサンドボックスなしで実行され、stderr に警告が表示されます。このデフォルト動作は TypeScript SDK とは異なり、TypeScript SDK ではfailIfUnavailableがデフォルトでtrueです。サンドボックス設定で
"failIfUnavailable": Trueを設定して、代わりに停止するようにしてください。SDK は、宣言されたSandboxSettingsフィールドとともにfailIfUnavailableを Claude Code に転送します。その後、query()はsubtype="error_during_execution"のResultMessageを報告し、理由はerrorsに含まれます。これは単一ショットのquery()呼び出しであるため、SDK はそのエラー結果を生成した後に例外を発生させます。そのため、ループを try ブロックでラップして、それを超えて続行してください。エラーの仕様については 結果を処理する を参照してください。
サンドボックス化されたコマンドがファイルに書き込まないようにするには、サンドボックス設定の denyWrite にその絶対パスを記載します(例:"filesystem": {"denyWrite": ["/home/user/project/.env"]})。SDK は、宣言された SandboxSettings フィールドとともに filesystem を Claude Code に転送します。サンドボックスが起動すると、記載された各絶対パスへの書き込みがブロックされます。
使用例
import asyncio
from claude_agent_sdk import query, ClaudeAgentOptions
sandbox_settings = {
"enabled": True,
"autoAllowBashIfSandboxed": True,
"failIfUnavailable": True,
"network": {"allowLocalBinding": True},
}
async def main():
try:
async for message in query(
prompt="Build and test my project",
options=ClaudeAgentOptions(sandbox=sandbox_settings),
):
print(message)
except Exception as error:
# A single-shot query() raises after yielding an error result,
# such as when failIfUnavailable is set and the sandbox can't start.
print(f"Session ended with an error: {error}")
asyncio.run(main())
[!WARNING]
Unix ソケットセキュリティ:
allowUnixSocketsオプションは、サンドボックスの外に到達するシステムサービスへのアクセスを許可できます。例えば、/var/run/docker.sockを許可すると、Docker API を通じてホストシステムへの完全なアクセスが効果的に許可され、サンドボックス分離がバイパスされます。厳密に必要な Unix ソケットのみを許可し、各ソケットのセキュリティへの影響を理解してください。
SandboxNetworkConfig
サンドボックスモード用のネットワーク固有の設定。これらの設定は、親の SandboxSettings で enabled が True の場合、サンドボックス化された Bash コマンドに適用されます。WebFetch ツールには適用されず、WebFetch ツールは代わりに パーミッションルール を使用します。
class SandboxNetworkConfig(TypedDict, total=False):
allowedDomains: list[str]
deniedDomains: list[str]
allowManagedDomainsOnly: bool
allowUnixSockets: list[str]
allowAllUnixSockets: bool
allowLocalBinding: bool
allowMachLookup: list[str]
httpProxyPort: int
socksProxyPort: int
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
allowedDomains |
list[str] |
[] |
サンドボックス化されたプロセスがアクセスできるドメイン名 |
deniedDomains |
list[str] |
[] |
サンドボックス化されたプロセスがアクセスできないドメイン名。allowedDomains より優先されます |
allowManagedDomainsOnly |
bool |
False |
マネージド設定のみ:マネージド設定で設定されている場合、allowedDomains と非マネージド設定ソースからの WebFetch(domain:...) 許可ルールを無視します。SDK オプションで設定された場合は効果がありません |
allowUnixSockets |
list[str] |
[] |
macOS のみ:プロセスがアクセスできる Unix ソケットパス(例:Docker ソケット)。Linux では無視されます |
allowAllUnixSockets |
bool |
False |
すべての Unix ソケット、および Linux では VM ソケット(AF_VSOCK)へのアクセスを許可します |
allowLocalBinding |
bool |
False |
プロセスがローカルポートにバインドすることを許可します(例:dev サーバー用) |
allowMachLookup |
list[str] |
[] |
macOS のみ:許可する XPC/Mach サービス名。末尾のワイルドカードをサポートします |
httpProxyPort |
int |
None |
ネットワークリクエスト用の HTTP プロキシポート |
socksProxyPort |
int |
None |
ネットワークリクエスト用の SOCKS プロキシポート |
[!NOTE]
組み込みサンドボックスプロキシは、リクエストされたホスト名に基づいてネットワーク許可リストを強制します。デフォルトでは、プロキシは TLS トラフィックを終了または検査しないため、ドメインフロンティング などの技術によって許可リストがバイパスされる可能性があります。詳細は サンドボックスセキュリティの制限事項 を参照し、TLS 終了プロキシの設定については セキュアなデプロイ を参照してください。
SandboxIgnoreViolations
特定のサンドボックス違反を無視するための設定。
class SandboxIgnoreViolations(TypedDict, total=False):
file: list[str]
network: list[str]
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
file |
list[str] |
[] |
違反を無視するファイルパスパターン |
network |
list[str] |
[] |
違反を無視するネットワークパターン |
サンドボックスなしコマンドのパーミッションフォールバック
allowUnsandboxedCommands が有効な場合、モデルはツール入力で dangerouslyDisableSandbox: True を設定することでサンドボックスの外でコマンドを実行するようにリクエストできます。これらのリクエストは既存のパーミッションシステムにフォールバックします。つまり、can_use_tool ハンドラーが呼び出され、カスタム認可ロジックを実装できます。
excludedCommands エントリは代わりにサンドボックスを自動的にバイパスし、モデルの関与がありません。sandbox.excludedCommands は、エントリが適用される場合をカバーしています。
次の例は、各サンドボックスなしリクエストをログし、独自の認可ロジックが許可しない限りそれを拒否します:
import asyncio
from claude_agent_sdk import (
query,
ClaudeAgentOptions,
HookMatcher,
PermissionResultAllow,
PermissionResultDeny,
ToolPermissionContext,
)
def is_command_authorized(command: str | None) -> bool:
# Replace with your own authorization logic
return False
async def can_use_tool(
tool: str, input: dict, context: ToolPermissionContext
) -> PermissionResultAllow | PermissionResultDeny:
# Check if the model is requesting to bypass the sandbox
if tool == "Bash" and input.get("dangerouslyDisableSandbox"):
# The model is requesting to run this command outside the sandbox
print(f"Unsandboxed command requested: {input.get('command')}")
if is_command_authorized(input.get("command")):
return PermissionResultAllow()
return PermissionResultDeny(
message="Command not authorized for unsandboxed execution"
)
return PermissionResultAllow()
# Required: dummy hook keeps the stream open for can_use_tool
async def dummy_hook(input_data, tool_use_id, context):
return {"continue_": True}
async def prompt_stream():
yield {
"type": "user",
"message": {"role": "user", "content": "Deploy my application"},
}
async def main():
async for message in query(
prompt=prompt_stream(),
options=ClaudeAgentOptions(
sandbox={
"enabled": True,
"allowUnsandboxedCommands": True, # Model can request unsandboxed execution
},
permission_mode="default",
can_use_tool=can_use_tool,
hooks={"PreToolUse": [HookMatcher(matcher=None, hooks=[dummy_hook])]},
),
):
print(message)
asyncio.run(main())
[!WARNING]
dangerouslyDisableSandbox: Trueで実行されるコマンドはシステムへの完全なアクセスを持ちます。can_use_toolハンドラーがこれらのリクエストを慎重に検証することを確認してください。
permission_modeがbypassPermissionsに設定され、allowUnsandboxedCommandsが有効な場合、モデルは どのモードも自動承認しないアクション を除き、承認プロンプトなしにサンドボックスの外でコマンドを自律的に実行できます。この組み合わせは、モデルがサンドボックス分離をサイレントに逃れることを効果的に許可します。
関連項目
- SDK 概要 - 一般的な SDK 概念
- TypeScript SDK リファレンス - TypeScript SDK ドキュメント
- カスタムツール - Claude が呼び出すためのインプロセス MCP ツールを定義する
- CLI リファレンス - コマンドラインインターフェース
- 一般的なワークフロー - ステップバイステップガイド