Claude Code CLI - Complete Reference
Main Command: claude [prompt]
Start interactive session (default) or non-interactive with -p/--print
All Options (Including Hidden)
| Option | Type | Description |
|---|---|---|
-h, --help |
flag | Display help for command |
-d, --debug [filter] |
optional | Enable debug mode with optional category filtering (e.g., “api,hooks” or “!statsig,!file”) |
-d2e, --debug-to-stderr |
flag | Enable debug mode (to stderr) [HIDDEN] |
--verbose |
flag | Override verbose mode setting from config |
-p, --print |
flag | Print response and exit (useful for pipes). Skips workspace trust dialog - only use in trusted dirs |
--output-format <format> |
choice | Output format (with –print): text (default), json, stream-json |
--include-partial-messages |
flag | Include partial message chunks as they arrive (with –print and –output-format=stream-json) |
--input-format <format> |
choice | Input format (with –print): text (default), stream-json |
--mcp-debug |
flag | [DEPRECATED] Use –debug instead. Enable MCP debug mode |
--dangerously-skip-permissions |
flag | Bypass all permission checks. Recommended only for sandboxes with no internet access |
--max-thinking-tokens <tokens> |
number | Maximum number of thinking tokens (with –print) [HIDDEN] |
--max-turns <turns> |
number | Maximum agentic turns in non-interactive mode (with –print) [HIDDEN] |
--replay-user-messages |
flag | Re-emit user messages from stdin on stdout (with –input-format=stream-json and –output-format=stream-json) |
--allowedTools, --allowed-tools <tools...> |
array | Comma/space-separated tool names to allow (e.g. “Bash(git:*) Edit”) |
--disallowedTools, --disallowed-tools <tools...> |
array | Comma/space-separated tool names to deny |
--mcp-config <configs...> |
array | Load MCP servers from JSON files or strings (space-separated) |
--permission-prompt-tool <tool> |
string | MCP tool to use for permission prompts (with –print) [HIDDEN] |
--system-prompt <prompt> |
string | System prompt to use for the session [HIDDEN] |
--system-prompt-file <file> |
string | Read system prompt from a file [HIDDEN] |
--append-system-prompt <prompt> |
string | Append a system prompt to the default system prompt |
--permission-mode <mode> |
choice | Permission mode to use for the session |
-c, --continue |
flag | Continue the most recent conversation |
-r, --resume [sessionId] |
optional | Resume a conversation - provide session ID or interactively select |
--fork-session |
flag | When resuming, create new session ID instead of reusing original (with –resume or –continue) |
--resume-session-at <message id> |
string | When resuming, only messages up to and including assistant message with <message.id> (with –resume in print mode) [HIDDEN] |
--model <model> |
string | Model for current session. Alias (e.g. ‘sonnet’ or ‘opus’) or full name (e.g. ‘claude-sonnet-4-5-20250929’) |
--fallback-model <model> |
string | Enable automatic fallback to specified model when default model is overloaded (with –print) |
--settings <file-or-json> |
string | Path to a settings JSON file or a JSON string to load additional settings from |
--add-dir <directories...> |
array | Additional directories to allow tool access to |
--ide |
flag | Automatically connect to IDE on startup if exactly one valid IDE is available |
--strict-mcp-config |
flag | Only use MCP servers from –mcp-config, ignoring all other MCP configurations |
--session-id <uuid> |
string | Use a specific session ID for the conversation (must be a valid UUID) |
--agents <json> |
string | JSON object defining custom agents (e.g. ‘{“reviewer”: {“description”: “Reviews code”, “prompt”: “You are a code reviewer”}}’) |
--setting-sources <sources> |
string | Comma-separated list of setting sources to load (user, project, local) |
MCP Commands: claude mcp <subcommand>
Configure and manage MCP servers
claude mcp serve
Start the Claude Code MCP server
Options:
-h, --help- Display help-d, --debug- Enable debug mode--verbose- Override verbose mode setting from config
claude mcp add <name> <commandOrUrl> [args...]
Add an MCP server
Arguments:
<name>- Server name (required)<commandOrUrl>- Command to run or URL (required)[args...]- Additional arguments (optional)
Options:
-h, --help- Display help-s, --scope <scope>- Configuration scope:local(default),user,project-t, --transport <transport>- Transport type:stdio(default),sse,http-e, --env <env...>- Set environment variables (e.g.-e KEY=value)-H, --header <header...>- Set WebSocket headers (e.g.-H "X-Api-Key: abc123")
claude mcp remove <name>
Remove an MCP server
Arguments:
<name>- Server name (required)
Options:
-h, --help- Display help-s, --scope <scope>- Configuration scope (local, user, or project) - if not specified, removes from whichever scope it exists in
claude mcp list
List configured MCP servers with health status
Options:
-h, --help- Display help
claude mcp get <name>
Get details about an MCP server
Arguments:
<name>- Server name (required)
Options:
-h, --help- Display help
claude mcp add-json <name> <json>
Add an MCP server (stdio or SSE) with a JSON string
Arguments:
<name>- Server name (required)<json>- JSON configuration string (required)
Options:
-h, --help- Display help-s, --scope <scope>- Configuration scope:local(default),user,project
claude mcp add-from-claude-desktop
Import MCP servers from Claude Desktop (Mac and WSL only)
Options:
-h, --help- Display help-s, --scope <scope>- Configuration scope:local(default),user,project
claude mcp reset-project-choices
Reset all approved and rejected project-scoped (.mcp.json) servers within this project
Options:
-h, --help- Display help
Plugin Commands: claude plugin <subcommand>
Manage Claude Code plugins
claude plugin validate <path>
Validate a plugin or marketplace manifest
Arguments:
<path>- Path to plugin/manifest file (required)
Options:
-h, --help- Display help
Utility Commands
claude migrate-installer
Migrate from global npm installation to local installation
Options:
-h, --help- Display help
claude setup-token
Set up a long-lived authentication token (requires Claude subscription)
Options:
-h, --help- Display help
claude doctor
Check the health of your Claude Code auto-updater
Options:
-h, --help- Display help
claude update
Check for updates and install if available
Options:
-h, --help- Display help
claude install [target]
Install Claude Code native build. Use [target] to specify version (stable, latest, or specific version)
Arguments:
[target]- Version target (optional):stable,latest, or specific version number
Options:
-h, --help- Display help--force- Force installation even if already installed
Examples
# Basic interactive session
claude "explain this code"
# Non-interactive with custom system prompt
claude -p --system-prompt "You are a Python expert" "review this code"
# Load system prompt from file
claude -p --system-prompt-file ./prompts/reviewer.txt "check main.py"
# Continue last conversation
claude -c
# Resume specific session
claude -r abc-123-def-456
# Fork session when resuming
claude -r abc-123-def-456 --fork-session
# Use specific model with fallback
claude -p --model opus --fallback-model sonnet "complex analysis task"
# Limit agentic turns (hidden option)
claude -p --max-turns 5 "implement feature X"
# Control thinking tokens (hidden option)
claude -p --max-thinking-tokens 2000 "solve this problem"
# JSON output with streaming
claude -p --output-format stream-json "analyze codebase"
# JSON input and output
claude -p --input-format stream-json --output-format stream-json
# Whitelist specific tools
claude -p --allowed-tools "Bash(git:*) Read Write" "commit changes"
# Blacklist tools
claude -p --disallowed-tools "Bash WebFetch" "safe operations only"
# Add custom agents
claude --agents '{"reviewer":{"description":"Code reviewer","prompt":"Review for bugs"}}' "review app.js"
# Load MCP config dynamically
claude --mcp-config /path/to/mcp.json --strict-mcp-config "use these servers only"
# Add stdio MCP server to user scope
claude mcp add my-server npx my-mcp-package -s user -e API_KEY=secret123
# Add SSE MCP server with headers
claude mcp add sse-srv https://api.example.com/mcp -t sse -s user -H "X-Api-Key: key123" -H "X-Custom: value"
# Add HTTP MCP server
claude mcp add http-srv https://mcp.example.com -t http -s project
# List all MCP servers and their health
claude mcp list
# Get details about specific server
claude mcp get my-server
# Remove MCP server (auto-detect scope)
claude mcp remove my-server
# Remove from specific scope
claude mcp remove my-server -s user
# Import MCP servers from Claude Desktop
claude mcp add-from-claude-desktop -s user
# Reset project MCP approvals
claude mcp reset-project-choices
# Validate plugin manifest
claude plugin validate ./my-plugin/manifest.json
# Setup OAuth token
claude setup-token
# Check updater health
claude doctor
# Update to latest
claude update
# Install specific version
claude install 1.2.3 --force
Notes
- Hidden options (marked with
[HIDDEN]) are not shown in--helpoutput but are fully functional - Deprecated options (marked with
[DEPRECATED]) still work but should not be used for new code - MCP server scopes:
local(project .claude/),user(~/.claude/),project(.mcp.json) - MCP transports:
stdio(stdin/stdout),sse(Server-Sent Events),http(HTTP polling) - Permission modes vary by configuration - check docs for available modes
- Session IDs must be valid UUIDs (e.g.
550e8400-e29b-41d4-a716-446655440000) - The
--printmode skips workspace trust dialog - only use in directories you trust
Deep Dive: Thinking Mode
Architecture Overview
Claude Code has a three-layer system for thinking mode:
1. Settings File (~/.claude/settings.json)
└─ "alwaysThinkingEnabled": true/false
2. App State (UI Layer)
└─ thinkingEnabled: boolean (Tab toggle)
3. Runtime Config (Calculation Layer)
└─ IL1().alwaysThinking (used for actual token calculation)
Maximum thinking tokens: 31,999 (cli.js:143446)
How to Enable Always-Think Mode
✅ Method 1: Environment Variable (RECOMMENDED - Always Works)
# Add to ~/.bashrc or ~/.zshrc
export MAX_THINKING_TOKENS=31999
# Or prefix each command
MAX_THINKING_TOKENS=31999 claude "your prompt"
Result: Every turn gets 31,999 thinking tokens automatically, no keyword needed.
✅ Method 2: Settings File (Fixed in v2.0.14)
Add to ~/.claude/settings.json:
{
"alwaysThinkingEnabled": true
}
Status: ✅ Fixed in version 2.0.14 (2025-10-11)
The sync issue between the settings file and runtime calculation layer has been fixed. The tab toggle and alwaysThinkingEnabled setting now properly sync to FL1().alwaysThinking, enabling thinking tokens without requiring the environment variable or “ultrathink” keyword.
Previous Issue (v2.0.13 and earlier): This setting was read and displayed in the UI, but didn’t sync to the runtime calculation layer (IL1().alwaysThinking). The sync code between pA().alwaysThinkingEnabled and dLA.alwaysThinking was missing (cli.js:82291).
✅ Method 3: Per-Message Keyword
Type any of these in your message:
ultrathinkthink ultra hardthink ultrahard
Result: That specific turn gets 31,999 thinking tokens.
✅ Method 4: Command-line Flag (Print Mode Only)
claude -p --max-thinking-tokens 31999 "your prompt"
Priority Hierarchy
When calculating thinking tokens (cli.js:143365-143377):
MAX_THINKING_TOKENSenv var ← Highest priority (overrides everything)--max-thinking-tokensflag (print mode only)- “ultrathink” keyword in message content
IL1().alwaysThinking(from runtime config, not settings file)- Default: 0 (no thinking)
Token Calculation Flow
function hS(A, B, Q) {
// 1. Check environment variable first
if (process.env.MAX_THINKING_TOKENS) {
return parseInt(process.env.MAX_THINKING_TOKENS, 10);
}
// 2. Check runtime config (broken: doesn't sync from settings)
if (Q === "repl_main_thread") {
if (IL1().alwaysThinking) return 31999;
}
// 3. Check for "ultrathink" keyword in messages
return Math.max(
...A.filter((Z) => Z.type === "user" && !Z.isMeta).map(Ww4),
B ?? 0,
);
}
Tab Toggle Behavior
What it does:
- Controls UI display (“Thinking on” / “Thinking off”)
- Saves to settings file when changed (
cli.js:456481) - Initialized from settings on startup (
cli.js:143417)
What it doesn’t do:
- Doesn’t directly enable thinking tokens
- Only enables detection of “ultrathink” keyword in messages
- Without keyword in message: 0 thinking tokens (even when toggle is ON)
API Implementation
When MAX_THINKING_TOKENS=31999 or “ultrathink” is detected:
// cli.js:442607, 442622
{
model: "claude-sonnet-4-5-20250929",
messages: [...],
thinking: {
type: "enabled",
budget_tokens: 31999 // ← Sent to API
},
max_tokens: 8192,
...
}
Comparison Table
| Method | Works? | Every Turn? | Persistence | Code Location |
|---|---|---|---|---|
MAX_THINKING_TOKENS=31999 |
✅ Yes | ✅ Yes | Shell session | cli.js:143366-143369 |
~/.claude/settings.json |
✅ Yes (v2.0.14+) | ✅ Yes | Permanent | Fixed in v2.0.14 |
| “ultrathink” keyword | ✅ Yes | ❌ No (per-message) | Per message | cli.js:143402-143405 |
--max-thinking-tokens 31999 |
✅ Yes | ✅ Yes | Per command | cli.js:143366-143369 |
| Tab toggle | ✅ Yes (v2.0.14+) | ✅ Yes | Session | Fixed in v2.0.14 |
Additional Technical Details
- WebFetch HTML conversion: Uses hardcoded 512 tokens (
cli.js:443019) - Thinking blocks streaming:
content_block_startwithtype: "thinking"(cli.js:442684-442685) - Settings load:
pA()→gh()→pD8()(cli.js:449461-449489) - Runtime config init:
JL1()initializesdLAto{alwaysThinking: false}(cli.js:82291) - Missing sync: No code converts
pA().alwaysThinkingEnabled→dLA.alwaysThinking
Recommended Setup
Add to your shell profile (~/.bashrc or ~/.zshrc):
# Enable extended thinking mode for all Claude Code sessions
export MAX_THINKING_TOKENS=31999
This is the most reliable method and works for all use cases.
Version History
Version 2.0.14 (2025-10-11)
Thinking Mode Fix: Fixed ultrathink + thinking toggle sync issue
The critical sync issue between the thinking mode UI toggle and the runtime calculation layer has been resolved:
What was fixed:
- The settings file
alwaysThinkingEnablednow properly syncs to the runtime config (FL1().alwaysThinking) - The tab toggle now actually enables thinking mode without requiring environment variables or keywords
- Missing sync code between
pA().alwaysThinkingEnabledanddLA.alwaysThinkinghas been implemented
Impact:
- ✅ Settings file method (
~/.claude/settings.jsonwith"alwaysThinkingEnabled": true) now works correctly - ✅ Tab toggle in UI now properly enables thinking tokens for all subsequent turns
- ✅ No longer need to use
MAX_THINKING_TOKENSenvironment variable as a workaround - ✅ No longer need to type “ultrathink” keyword in every message
Other changes in 2.0.14:
- Fix @-mentioning MCP servers to toggle them on/off
- Improve permission checks for bash with inline env vars
- Reduce unnecessary logins
- Document –system-prompt
- Several improvements to rendering
- Plugins UI polish
References:
- Release notes: https://docs.claude.com/en/release-notes/changelog
- Previous analysis: Deep Dive: Thinking Mode