The Agent SDK gives you the same tools, agent loop, and context management that power Claude Code. It’s available as a CLI for scripts and CI/CD, or as Python and TypeScript packages for full programmatic control.Documentation Index
Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt
Use this file to discover all available pages before exploring further.
The CLI was previously called “headless mode.” The
-p flag and all CLI options work the same way.-p with your prompt and any CLI options:
claude -p). For the Python and TypeScript SDK packages with structured outputs, tool approval callbacks, and native message objects, see the full Agent SDK documentation.
Basic usage
Add the-p (or --print) flag to any claude command to run it non-interactively. All CLI options work with -p, including:
--continuefor continuing conversations--allowedToolsfor auto-approving tools--output-formatfor structured output
Start faster with bare mode
Add--bare to reduce startup time by skipping auto-discovery of hooks, skills, plugins, MCP servers, auto memory, and CLAUDE.md. Without it, claude -p loads the same context an interactive session would, including anything configured in the working directory or ~/.claude.
Bare mode is useful for CI and scripts where you need the same result on every machine. A hook in a teammate’s ~/.claude or an MCP server in the project’s .mcp.json won’t run, because bare mode never reads them. Only flags you pass explicitly take effect.
This example runs a one-off summarize task in bare mode and pre-approves the Read tool so the call completes without a permission prompt:
| To load | Use |
|---|---|
| System prompt additions | --append-system-prompt, --append-system-prompt-file |
| Settings | --settings <file-or-json> |
| MCP servers | --mcp-config <file-or-json> |
| Custom agents | --agents <json> |
| A plugin | --plugin-dir <path>, --plugin-url <url> |
ANTHROPIC_API_KEY or an apiKeyHelper in the JSON passed to --settings. Bedrock, Vertex, and Foundry use their usual provider credentials.
--bare is the recommended mode for scripted and SDK calls, and will become the default for -p in a future release.Examples
These examples highlight common CLI patterns. For CI and other scripted calls, add--bare so they don’t pick up whatever happens to be configured locally.
Pipe data through Claude
Non-interactive mode reads stdin, so you can pipe data in and redirect the response out like any other command-line tool. This example pipes a build log into Claude and writes the explanation to a file:--output-format json, the response payload includes total_cost_usd and a per-model cost breakdown, so scripted callers can track spend per invocation without consulting the usage dashboard.
As of Claude Code v2.1.128, piped stdin is capped at 10MB. If you exceed the cap, Claude Code exits with a clear error and a non-zero status. To work with larger inputs, write the content to a file and reference the file path in your prompt instead of piping it.
Add Claude to a build script
You can wrap a non-interactive call in a script to use Claude as a project-specific linter or reviewer. Thispackage.json script pipes the diff against main into Claude and asks it to report typos. Piping the diff means Claude doesn’t need Bash permission to read it, and the escaped double quotes keep the script portable to Windows:
Get structured output
Use--output-format to control how responses are returned:
text(default): plain text outputjson: structured JSON with result, session ID, and metadatastream-json: newline-delimited JSON for real-time streaming
result field:
--output-format json with --json-schema and a JSON Schema definition. The response includes metadata about the request (session ID, usage, etc.) with the structured output in the structured_output field.
This example extracts function names and returns them as an array of strings:
Stream responses
Use--output-format stream-json with --verbose and --include-partial-messages to receive tokens as they’re generated. Each line is a JSON object representing an event:
-r flag outputs raw strings (no quotes) and -j joins without newlines so tokens stream continuously:
system/api_retry event before retrying. You can use this to surface retry progress or implement custom backoff logic.
| Field | Type | Description |
|---|---|---|
type | "system" | message type |
subtype | "api_retry" | identifies this as a retry event |
attempt | integer | current attempt number, starting at 1 |
max_retries | integer | total retries permitted |
retry_delay_ms | integer | milliseconds until the next attempt |
error_status | integer or null | HTTP status code, or null for connection errors with no HTTP response |
error | string | error category: authentication_failed, oauth_org_not_allowed, billing_error, rate_limit, invalid_request, server_error, max_output_tokens, or unknown |
uuid | string | unique event identifier |
session_id | string | session the event belongs to |
system/init event reports session metadata including the model, tools, MCP servers, and loaded plugins. It is the first event in the stream unless CLAUDE_CODE_SYNC_PLUGIN_INSTALL is set, in which case plugin_install events precede it. Use the plugin fields to fail CI when a plugin did not load:
| Field | Type | Description |
|---|---|---|
plugins | array | plugins that loaded successfully, each with name and path |
plugin_errors | array | plugin load-time errors, each with plugin, type, and message. Includes unsatisfied dependency versions and --plugin-dir load failures such as a missing path or invalid archive. Affected plugins are demoted and absent from plugins. The key is omitted when there are no errors |
CLAUDE_CODE_SYNC_PLUGIN_INSTALL is set, Claude Code emits system/plugin_install events while marketplace plugins install before the first turn. Use these to surface install progress in your own UI.
| Field | Type | Description |
|---|---|---|
type | "system" | message type |
subtype | "plugin_install" | identifies this as a plugin install event |
status | "started", "installed", "failed", or "completed" | started and completed bracket the overall install; installed and failed report individual marketplaces |
name | string, optional | marketplace name, present on installed and failed |
error | string, optional | failure message, present on failed |
uuid | string | unique event identifier |
session_id | string | session the event belongs to |
Auto-approve tools
Use--allowedTools to let Claude use certain tools without prompting. This example runs a test suite and fixes failures, allowing Claude to execute Bash commands and read/edit files without asking for permission:
dontAsk denies anything not in your permissions.allow rules or the read-only command set, which is useful for locked-down CI runs. acceptEdits lets Claude write files without prompting and also auto-approves common filesystem commands such as mkdir, touch, mv, and cp. Other shell commands and network requests still need an --allowedTools entry or a permissions.allow rule, otherwise the run aborts when one is attempted:
Create a commit
This example reviews staged changes and creates a commit with an appropriate message:--allowedTools flag uses permission rule syntax. The trailing * enables prefix matching, so Bash(git diff *) allows any command starting with git diff. The space before * is important: without it, Bash(git diff*) would also match git diff-index.
User-invoked skills like
/commit and built-in commands are only available in interactive mode. In -p mode, describe the task you want to accomplish instead.Customize the system prompt
Use--append-system-prompt to add instructions while keeping Claude Code’s default behavior. This example pipes a PR diff to Claude and instructs it to review for security vulnerabilities:
--system-prompt to fully replace the default prompt.
Continue conversations
Use--continue to continue the most recent conversation, or --resume with a session ID to continue a specific conversation. This example runs a review, then sends follow-up prompts:
Next steps
- Agent SDK quickstart: build your first agent with Python or TypeScript
- CLI reference: all CLI flags and options
- GitHub Actions: use the Agent SDK in GitHub workflows
- GitLab CI/CD: use the Agent SDK in GitLab pipelines