SDK for building AI agents with Claude Code's capabilities to programmatically interact with Claude and build autonomous agents that can understand codebases, edit files, and execute workflows.
Complete TypeScript type definitions for the Claude Agent SDK.
interface Query extends AsyncGenerator<SDKMessage, void> {
interrupt(): Promise<void>;
setPermissionMode(mode: PermissionMode): Promise<void>;
setModel(model?: string): Promise<void>;
setMaxThinkingTokens(maxThinkingTokens: number | null): Promise<void>;
supportedCommands(): Promise<SlashCommand[]>;
supportedModels(): Promise<ModelInfo[]>;
mcpServerStatus(): Promise<McpServerStatus[]>;
accountInfo(): Promise<AccountInfo>;
streamInput(stream: AsyncIterable<SDKUserMessage>): Promise<void>;
}
interface SDKSession {
send(message: string | SDKUserMessage): Promise<void>;
receive(): AsyncGenerator<SDKMessage, void>;
close(): void;
[Symbol.asyncDispose](): Promise<void>;
}
interface SDKSessionOptions {
model: string;
pathToClaudeCodeExecutable?: string;
executable?: 'node' | 'bun' | 'deno';
executableArgs?: string[];
}type SDKMessage =
| SDKAssistantMessage
| SDKUserMessage
| SDKUserMessageReplay
| SDKResultMessage
| SDKSystemMessage
| SDKPartialAssistantMessage
| SDKCompactBoundaryMessage
| SDKStatusMessage
| SDKHookResponseMessage
| SDKToolProgressMessage
| SDKAuthStatusMessage;
interface SDKAssistantMessage {
type: 'assistant';
message: APIAssistantMessage;
parent_tool_use_id: string | null;
error?: 'authentication_failed' | 'billing_error' | 'rate_limit' | 'invalid_request' | 'server_error' | 'unknown';
uuid: UUID;
session_id: string;
}
interface SDKUserMessage {
type: 'user';
message: APIUserMessage;
parent_tool_use_id: string | null;
isSynthetic?: boolean;
tool_use_result?: unknown;
uuid?: UUID;
session_id: string;
}
interface SDKResultMessageSuccess {
type: 'result';
subtype: 'success';
duration_ms: number;
duration_api_ms: number;
is_error: boolean;
num_turns: number;
result: string;
total_cost_usd: number;
usage: NonNullableUsage;
modelUsage: {[modelName: string]: ModelUsage};
permission_denials: SDKPermissionDenial[];
structured_output?: unknown;
uuid: UUID;
session_id: string;
}
interface SDKResultMessageError {
type: 'result';
subtype: 'error_during_execution' | 'error_max_turns' | 'error_max_budget_usd' | 'error_max_structured_output_retries';
duration_ms: number;
duration_api_ms: number;
is_error: boolean;
num_turns: number;
total_cost_usd: number;
usage: NonNullableUsage;
modelUsage: {[modelName: string]: ModelUsage};
permission_denials: SDKPermissionDenial[];
errors: string[];
uuid: UUID;
session_id: string;
}
type SDKResultMessage = SDKResultMessageSuccess | SDKResultMessageError;
interface SDKSystemMessage {
type: 'system';
subtype: 'init';
agents?: string[];
apiKeySource: ApiKeySource;
betas?: string[];
claude_code_version: string;
cwd: string;
tools: string[];
mcp_servers: {name: string; status: string}[];
model: string;
permissionMode: PermissionMode;
slash_commands: string[];
output_style: string;
skills: string[];
plugins: {name: string; path: string}[];
uuid: UUID;
session_id: string;
}
interface SDKToolProgressMessage {
type: 'tool_progress';
tool_use_id: string;
tool_name: string;
parent_tool_use_id: string | null;
elapsed_time_seconds: number;
uuid: UUID;
session_id: string;
}
interface SDKAuthStatusMessage {
type: 'auth_status';
isAuthenticating: boolean;
output: string[];
error?: string;
uuid: UUID;
session_id: string;
}
interface SDKPartialAssistantMessage {
type: 'stream_event';
event: RawMessageStreamEvent;
parent_tool_use_id: string | null;
uuid: UUID;
session_id: string;
}
interface SDKUserMessageReplay {
type: 'user';
message: APIUserMessage;
parent_tool_use_id: string | null;
isSynthetic?: boolean;
tool_use_result?: unknown;
uuid: UUID;
session_id: string;
isReplay: true;
}
interface SDKCompactBoundaryMessage {
type: 'system';
subtype: 'compact_boundary';
compact_metadata: {trigger: 'manual' | 'auto'; pre_tokens: number};
uuid: UUID;
session_id: string;
}
interface SDKStatusMessage {
type: 'system';
subtype: 'status';
status: 'compacting' | null;
uuid: UUID;
session_id: string;
}
interface SDKHookResponseMessage {
type: 'system';
subtype: 'hook_response';
hook_name: string;
hook_event: string;
stdout: string;
stderr: string;
exit_code?: number;
uuid: UUID;
session_id: string;
}interface Options {
abortController?: AbortController;
additionalDirectories?: string[];
agents?: Record<string, AgentDefinition>;
allowedTools?: string[];
disallowedTools?: string[];
tools?: string[] | {type: 'preset'; preset: 'claude_code'};
model?: string;
fallbackModel?: string;
cwd?: string;
env?: {[envVar: string]: string | undefined};
executable?: 'bun' | 'deno' | 'node';
executableArgs?: string[];
pathToClaudeCodeExecutable?: string;
extraArgs?: Record<string, string | null>;
permissionMode?: PermissionMode;
allowDangerouslySkipPermissions?: boolean;
canUseTool?: CanUseTool;
permissionPromptToolName?: string;
maxTurns?: number;
maxBudgetUsd?: number;
maxThinkingTokens?: number;
hooks?: Partial<Record<HookEvent, HookCallbackMatcher[]>>;
mcpServers?: Record<string, McpServerConfig>;
strictMcpConfig?: boolean;
systemPrompt?: string | {type: 'preset'; preset: 'claude_code'; append?: string};
outputFormat?: OutputFormat;
includePartialMessages?: boolean;
continue?: boolean;
resume?: string;
resumeSessionAt?: string;
forkSession?: boolean;
settingSources?: SettingSource[];
plugins?: SdkPluginConfig[];
sandbox?: SandboxSettings;
betas?: SdkBeta[];
stderr?: (data: string) => void;
}type PermissionMode = 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan' | 'dontAsk';
type CanUseTool = (
toolName: string,
input: Record<string, unknown>,
options: {
signal: AbortSignal;
suggestions?: PermissionUpdate[];
blockedPath?: string;
decisionReason?: string;
toolUseID: string;
agentID?: string;
}
) => Promise<PermissionResult>;
type PermissionResult =
| {behavior: 'allow'; updatedInput: Record<string, unknown>; updatedPermissions?: PermissionUpdate[]; toolUseID?: string}
| {behavior: 'deny'; message: string; interrupt?: boolean; toolUseID?: string};
type PermissionUpdate =
| {type: 'addRules'; rules: PermissionRuleValue[]; behavior: PermissionBehavior; destination: PermissionUpdateDestination}
| {type: 'replaceRules'; rules: PermissionRuleValue[]; behavior: PermissionBehavior; destination: PermissionUpdateDestination}
| {type: 'removeRules'; rules: PermissionRuleValue[]; behavior: PermissionBehavior; destination: PermissionUpdateDestination}
| {type: 'setMode'; mode: PermissionMode; destination: PermissionUpdateDestination}
| {type: 'addDirectories'; directories: string[]; destination: PermissionUpdateDestination}
| {type: 'removeDirectories'; directories: string[]; destination: PermissionUpdateDestination};
interface PermissionRuleValue {
toolName: string;
ruleContent?: string;
}
type PermissionBehavior = 'allow' | 'deny' | 'ask';
type PermissionUpdateDestination = 'userSettings' | 'projectSettings' | 'localSettings' | 'session' | 'cliArg';
interface SDKPermissionDenial {
tool_name: string;
tool_use_id: string;
tool_input: Record<string, unknown>;
}type HookEvent = 'PreToolUse' | 'PostToolUse' | 'PostToolUseFailure' | 'PermissionRequest'
| 'UserPromptSubmit' | 'SessionStart' | 'SessionEnd' | 'Stop'
| 'SubagentStart' | 'SubagentStop' | 'PreCompact' | 'Notification';
type HookCallback = (
input: HookInput,
toolUseID: string | undefined,
options: {signal: AbortSignal}
) => Promise<HookJSONOutput>;
interface HookCallbackMatcher {
matcher?: string;
hooks: HookCallback[];
timeout?: number;
}
interface BaseHookInput {
session_id: string;
transcript_path: string;
cwd: string;
permission_mode?: string;
}
interface PreToolUseHookInput extends BaseHookInput {
hook_event_name: 'PreToolUse';
tool_name: string;
tool_input: unknown;
tool_use_id: string;
}
interface PostToolUseHookInput extends BaseHookInput {
hook_event_name: 'PostToolUse';
tool_name: string;
tool_input: unknown;
tool_response: unknown;
tool_use_id: string;
}
interface PostToolUseFailureHookInput extends BaseHookInput {
hook_event_name: 'PostToolUseFailure';
tool_name: string;
tool_input: unknown;
tool_use_id: string;
error: string;
is_interrupt?: boolean;
}
interface PermissionRequestHookInput extends BaseHookInput {
hook_event_name: 'PermissionRequest';
tool_name: string;
tool_input: unknown;
permission_suggestions?: PermissionUpdate[];
}
interface UserPromptSubmitHookInput extends BaseHookInput {
hook_event_name: 'UserPromptSubmit';
prompt: string;
}
interface SessionStartHookInput extends BaseHookInput {
hook_event_name: 'SessionStart';
source: 'startup' | 'resume' | 'clear' | 'compact';
}
interface SessionEndHookInput extends BaseHookInput {
hook_event_name: 'SessionEnd';
reason: ExitReason;
}
interface SubagentStartHookInput extends BaseHookInput {
hook_event_name: 'SubagentStart';
agent_id: string;
agent_type: string;
}
interface SubagentStopHookInput extends BaseHookInput {
hook_event_name: 'SubagentStop';
stop_hook_active: boolean;
agent_id: string;
agent_transcript_path: string;
}
type HookInput = PreToolUseHookInput | PostToolUseHookInput | PostToolUseFailureHookInput
| PermissionRequestHookInput | UserPromptSubmitHookInput | SessionStartHookInput
| SessionEndHookInput | SubagentStartHookInput | SubagentStopHookInput
| NotificationHookInput | StopHookInput | PreCompactHookInput;
interface SyncHookJSONOutput {
continue?: boolean;
suppressOutput?: boolean;
stopReason?: string;
decision?: 'approve' | 'block';
systemMessage?: string;
reason?: string;
hookSpecificOutput?:
| {hookEventName: 'PreToolUse'; permissionDecision?: 'allow' | 'deny' | 'ask'; permissionDecisionReason?: string; updatedInput?: Record<string, unknown>}
| {hookEventName: 'UserPromptSubmit'; additionalContext?: string}
| {hookEventName: 'SessionStart'; additionalContext?: string}
| {hookEventName: 'SubagentStart'; additionalContext?: string}
| {hookEventName: 'PostToolUse'; additionalContext?: string; updatedMCPToolOutput?: unknown}
| {hookEventName: 'PostToolUseFailure'; additionalContext?: string}
| {hookEventName: 'PermissionRequest'; decision: {behavior: 'allow'; updatedInput?: Record<string, unknown>; updatedPermissions?: PermissionUpdate[]} | {behavior: 'deny'; message?: string; interrupt?: boolean}};
}
interface AsyncHookJSONOutput {
async: true;
asyncTimeout?: number;
}
type HookJSONOutput = SyncHookJSONOutput | AsyncHookJSONOutput;
const HOOK_EVENTS: readonly ["PreToolUse", "PostToolUse", "PostToolUseFailure", "Notification", "UserPromptSubmit", "SessionStart", "SessionEnd", "Stop", "SubagentStart", "SubagentStop", "PreCompact", "PermissionRequest"];
const EXIT_REASONS: string[];
type ExitReason = typeof EXIT_REASONS[number];interface AgentDefinition {
description: string;
tools?: string[];
disallowedTools?: string[];
prompt: string;
model?: 'sonnet' | 'opus' | 'haiku' | 'inherit';
criticalSystemReminder_EXPERIMENTAL?: string;
}type McpServerConfig =
| McpStdioServerConfig
| McpSSEServerConfig
| McpHttpServerConfig
| McpSdkServerConfigWithInstance;
interface McpStdioServerConfig {
type?: 'stdio';
command: string;
args?: string[];
env?: Record<string, string>;
}
interface McpSSEServerConfig {
type: 'sse';
url: string;
headers?: Record<string, string>;
}
interface McpHttpServerConfig {
type: 'http';
url: string;
headers?: Record<string, string>;
}
interface McpSdkServerConfigWithInstance {
type: 'sdk';
name: string;
instance: McpServer;
}
interface McpServerStatus {
name: string;
status: 'connected' | 'failed' | 'needs-auth' | 'pending';
serverInfo?: {name: string; version: string};
}interface SandboxSettings {
enabled?: boolean;
autoAllowBashIfSandboxed?: boolean;
allowUnsandboxedCommands?: boolean;
network?: SandboxNetworkConfig;
ignoreViolations?: Record<string, string[]>;
enableWeakerNestedSandbox?: boolean;
excludedCommands?: string[];
ripgrep?: {command: string; args?: string[]};
}
interface SandboxNetworkConfig {
allowUnixSockets?: string[];
allowAllUnixSockets?: boolean;
allowLocalBinding?: boolean;
httpProxyPort?: number;
socksProxyPort?: number;
}type ToolInputSchemas = AgentInput | BashInput | BashOutputInput | FileReadInput
| FileEditInput | FileWriteInput | GlobInput | GrepInput | WebFetchInput
| WebSearchInput | TodoWriteInput | NotebookEditInput | McpInput
| ListMcpResourcesInput | ReadMcpResourceInput | KillShellInput
| ExitPlanModeInput | AskUserQuestionInput;
interface FileReadInput {
file_path: string;
offset?: number;
limit?: number;
}
interface FileEditInput {
file_path: string;
old_string: string;
new_string: string;
replace_all?: boolean;
}
interface FileWriteInput {
file_path: string;
content: string;
}
interface GlobInput {
pattern: string;
path?: string;
}
interface GrepInput {
pattern: string;
path?: string;
glob?: string;
output_mode?: 'content' | 'files_with_matches' | 'count';
'-B'?: number;
'-A'?: number;
'-C'?: number;
'-n'?: boolean;
'-i'?: boolean;
type?: string;
head_limit?: number;
offset?: number;
multiline?: boolean;
}
interface BashInput {
command: string;
timeout?: number;
description?: string;
run_in_background?: boolean;
dangerouslyDisableSandbox?: boolean;
}
interface BashOutputInput {
bash_id: string;
filter?: string;
}
interface KillShellInput {
shell_id: string;
}
interface WebFetchInput {
url: string;
prompt: string;
}
interface WebSearchInput {
query: string;
allowed_domains?: string[];
blocked_domains?: string[];
}
interface AgentInput {
description: string;
prompt: string;
subagent_type: string;
model?: 'sonnet' | 'opus' | 'haiku';
resume?: string;
}
interface NotebookEditInput {
notebook_path: string;
cell_id?: string;
new_source: string;
cell_type?: 'code' | 'markdown';
edit_mode?: 'replace' | 'insert' | 'delete';
}
interface TodoWriteInput {
todos: Array<{content: string; status: 'pending' | 'in_progress' | 'completed'; activeForm: string}>;
}
interface ListMcpResourcesInput {
server?: string;
}
interface ReadMcpResourceInput {
server: string;
uri: string;
}
interface McpInput {
[k: string]: unknown;
}
interface ExitPlanModeInput {
[k: string]: unknown;
}
interface AskUserQuestionInput {
questions: Array<{
question: string;
header: string;
options: Array<{label: string; description: string}>;
multiSelect: boolean;
}>;
answers?: {[k: string]: string};
}interface ModelUsage {
inputTokens: number;
outputTokens: number;
cacheReadInputTokens: number;
cacheCreationInputTokens: number;
webSearchRequests: number;
costUSD: number;
contextWindow: number;
}
interface AccountInfo {
email?: string;
organization?: string;
subscriptionType?: string;
tokenSource?: string;
apiKeySource?: string;
}
interface ModelInfo {
value: string;
displayName: string;
description: string;
}
interface SlashCommand {
name: string;
description: string;
argumentHint: string;
}
interface OutputFormat {
type: 'json_schema';
schema: Record<string, unknown>;
}
interface SdkPluginConfig {
type: 'local';
path: string;
}
type NonNullableUsage = {[K in keyof Usage]: NonNullable<Usage[K]>};
type ApiKeySource = 'user' | 'project' | 'org' | 'temporary';
type ConfigScope = 'local' | 'user' | 'project';
type SdkBeta = 'context-1m-2025-08-07';
type SettingSource = 'user' | 'project' | 'local';
type UUID = string;
class AbortError extends Error {}Install with Tessl CLI
npx tessl i tessl/npm-anthropic-ai--claude-agent-sdk