claude process over a structured JSON message stream. The host process sends user messages and control requests; the CLI process streams back assistant messages, tool progress events, and result payloads.
The TypeScript types described on this page are exported from
@anthropic-ai/claude-code under the agentSdkTypes entry point. Control protocol types (prefixed SDKControl) are @alpha and subject to change.How it works
Spawn a Claude Code process
Start For a persistent session that accepts multiple prompts over time, omit
claude with --output-format stream-json and --print (non-interactive mode). Pipe its stdin and stdout into your host process.--print and instead send SDKUserMessage objects to stdin after the session initializes.Send an initialize request
Write a
control_request with subtype: "initialize" to stdin. The CLI responds with an SDKControlInitializeResponse containing available commands, models, agents, and account information.Stream messages from stdout
Read newline-delimited JSON from stdout. Each line is one of the
SDKMessage union types — assistant turns, tool progress, system events, and result summaries.Output formats
Pass--output-format to control what Claude Code writes to stdout.
| Format | Description |
|---|---|
text | Plain text responses only. Default for interactive mode. |
json | Single JSON object written at completion. Suitable for one-shot scripts. |
stream-json | Newline-delimited JSON stream. One message per line, emitted as events occur. Required for SDK use. |
Control protocol messages
The control protocol uses two top-level envelope types that flow bidirectionally over stdin/stdout.SDKControlRequest
Sent to the CLI process to configure the session or issue commands.
Always
"control_request".Unique identifier for this request. The CLI echoes it back in the corresponding
control_response.The request payload.
subtype identifies which operation to perform.SDKControlResponse
Emitted from the CLI process in response to a control_request.
subtype is "error" and the error field contains a human-readable message.
Initialize request and response
Theinitialize request is the first control message you must send. It configures the session and returns available capabilities.
SDKControlInitializeRequest
Identifies this as an initialize request.
Replaces the default system prompt for this session.
Appended to the system prompt without replacing it. Use this to add context while keeping the default behavior.
Registers SDK-side hook callbacks. The CLI calls back into the SDK process when hook events fire. See Hooks reference.
Names of in-process SDK MCP servers (created with
createSdkMcpServer) to connect to this session.Custom subagent definitions available to the
Agent tool during this session.SDKControlInitializeResponse
The CLI responds with the session’s current capabilities.
Available slash commands (e.g.,
/compact, /cost). Each entry has name, description, and argumentHint.Available subagent types. Each has
name, description, and an optional model.The active output format (
"stream-json", "json", "text").Available models for this account.
Logged-in account details.
User messages
Send user messages to stdin to drive the conversation forward.SDKUserMessage
Always
"user".An Anthropic API-compatible user message.
content can be a string or a content block array (for images and other media).Tool use ID this message is responding to, or
null for top-level user messages.Optional UUID to track this message. Echoed back in related events.
Scheduling hint for async message queuing.
SDK message stream types
Claude Code emits a stream of JSON messages to stdout. Thetype field identifies each message.
system — session initialization
system — session initialization
Emitted once at session start with
subtype: "init". Contains the active model, tool list, MCP server statuses, permission mode, and session ID.assistant — model response
assistant — model response
Emitted when the model produces a turn. Contains the full Anthropic API response object, including any
tool_use blocks.stream_event — partial streaming tokens
stream_event — partial streaming tokens
Emitted during streaming with
RawMessageStreamEvent payloads. Use these to render incremental output.tool_progress — long-running tool status
tool_progress — long-running tool status
Emitted periodically for tools that take more than a few seconds (e.g., Bash commands). Contains
tool_name, tool_use_id, and elapsed time.result — final turn summary
result — final turn summary
Emitted at the end of each turn. Error subtypes:
subtype is "success" or one of the error subtypes."error_during_execution", "error_max_turns", "error_max_budget_usd", "error_max_structured_output_retries".system — status updates
system — status updates
Emitted with
subtype: "status" when the permission mode or session status changes (e.g., "compacting").Other control requests
Beyondinitialize, the control protocol exposes these operations.
subtype | Direction | Description |
|---|---|---|
interrupt | host → CLI | Interrupt the current turn. |
set_permission_mode | host → CLI | Change the active permission mode. |
set_model | host → CLI | Switch to a different model mid-session. |
can_use_tool | CLI → host | Permission request for a tool call (requires SDK permission handler). |
mcp_status | host → CLI | Get MCP server connection statuses. |
mcp_set_servers | host → CLI | Replace dynamically managed MCP servers. |
get_context_usage | host → CLI | Get context window usage breakdown. |
get_settings | host → CLI | Read the effective merged settings. |
apply_flag_settings | host → CLI | Merge settings into the flag settings layer. |
rewind_files | host → CLI | Revert file changes made since a given message. |
hook_callback | CLI → host | Deliver a hook event for an SDK-registered hook callback. |
reload_plugins | host → CLI | Reload plugins from disk. |
Session management API
For scripting scenarios, the SDK exports functions that operate on saved session transcripts stored in~/.claude/.
query — run a prompt
query — run a prompt
The primary SDK entry point. Accepts a
prompt string or AsyncIterable<SDKUserMessage> and returns an async iterable of SDKMessage.listSessions — list saved sessions
listSessions — list saved sessions
Returns session metadata for a project directory. Pass
dir to scope to a specific project, or omit to list all sessions.getSessionMessages — read a transcript
getSessionMessages — read a transcript
Parses the JSONL transcript file for a session and returns messages in chronological order.
forkSession — branch a conversation
forkSession — branch a conversation
Copies a session’s transcript into a new session with remapped UUIDs. Supports
upToMessageId to fork from a specific point.renameSession and tagSession
renameSession and tagSession
Use cases
- IDE integration
- CI/CD automation
- Headless agents
IDEs can spawn a persistent Claude Code process and route messages through the control protocol. Send the
initialize request with a custom systemPrompt that describes the IDE context, then forward user messages from the editor’s chat panel. Use PreToolUse hook callbacks to intercept file edits and display diffs in the IDE’s native UI before they are applied.