Claude Code SDK for Rust
A Rust SDK for interacting with Claude Code CLI, providing both simple query interfaces and full interactive client capabilities.
Features
- 🚀 Simple Query Interface - One-shot queries with the
query()function - 💬 Interactive Client - Stateful conversations with context retention
- 🔄 Streaming Support - Real-time message streaming
- 🛑 Interrupt Capability - Cancel ongoing operations
- 🔧 Full Configuration - Comprehensive options for Claude Code
- 📦 Type Safety - Strongly typed with serde support
- ⚡ Async/Await - Built on Tokio for async operations
- 🔒 Control Protocol - Full support for permissions, hooks, and MCP servers (v0.1.11+)
- 💰 Token Optimization - Built-in tools to minimize costs and track usage (v0.1.12+)
Token Optimization (New in v0.1.12)
Minimize token consumption and control costs with built-in optimization tools:
use ;
use BudgetLimit;
use ModelRecommendation;
// 1. Choose cost-effective model
let recommender = default;
let model = recommender.suggest.unwrap; // → Haiku (cheapest)
// 2. Configure for minimal token usage
let options = builder
.model
.max_turns // Limit conversation length
.max_output_tokens // Cap response size (NEW)
.allowed_tools // Restrict tools
.permission_mode
.build;
let mut client = new;
// 3. Set budget with alerts
client.set_budget_limit.await;
// ... run your queries ...
// 4. Monitor usage
let usage = client.get_usage_stats.await;
println!;
Key Features:
- ✅
max_output_tokens- Precise output control (1-32000, overrides env var) - ✅
TokenUsageTracker- Real-time token and cost monitoring - ✅
BudgetLimit- Set cost/token caps with 80% warning threshold - ✅
ModelRecommendation- Smart model selection (Haiku/Sonnet/Opus) - ✅ Automatic usage tracking from
ResultMessage
Model Cost Comparison:
- Haiku: 1x (baseline, cheapest)
- Sonnet: ~5x more expensive
- Opus: ~15x more expensive
See Token Optimization Guide for complete strategies and examples.
Complete Feature Set
This Rust SDK provides comprehensive functionality for Claude Code interactions:
- ✅ Client methods:
query(),send_message(),receive_response(),interrupt() - ✅ Interactive sessions: Full stateful conversation support
- ✅ Message streaming: Real-time async message handling
- ✅ Configuration options: System prompts, models, permissions, tools, etc.
- ✅ Message types: User, Assistant, System, Result messages
- ✅ Error handling: Comprehensive error types with detailed diagnostics
- ✅ Session management: Multi-session support with context isolation
- ✅ Type safety: Leveraging Rust's type system for reliable code
- ✅ Control Protocol: Permission callbacks, hook system, MCP servers (SDK type)
- ✅ CLI Compatibility: Configurable protocol format for maximum compatibility
Installation
Add this to your Cargo.toml:
[]
= "0.2.0"
= { = "1.0", = ["full"] }
= "0.3"
Prerequisites
Install Claude Code CLI:
Supported Models (2025)
The SDK supports the latest Claude models available in 2025:
Latest Models
-
Opus 4.1 - Most capable model
- Full name:
"claude-opus-4-1-20250805" - Alias:
"opus"(recommended - uses latest Opus)
- Full name:
-
Sonnet 4 - Balanced performance
- Full name:
"claude-sonnet-4-20250514" - Alias:
"sonnet"(recommended - uses latest Sonnet)
- Full name:
Previous Generation
- Claude 3.5 Sonnet -
"claude-3-5-sonnet-20241022" - Claude 3.5 Haiku -
"claude-3-5-haiku-20241022"(fastest)
Using Models in Code
use ;
// Using Opus 4.1 (recommended: use alias)
let options = builder
.model // or "claude-opus-4-1-20250805" for specific version
.build;
// Using Sonnet 4 (recommended: use alias)
let options = builder
.model // or "claude-sonnet-4-20250514" for specific version
.build;
let mut messages = query.await?;
Quick Start
Simple Query (One-shot)
use ;
use StreamExt;
async
Interactive Client
use ;
async
Streaming Output (Since v0.1.8)
use ;
use StreamExt;
async
Advanced Usage
use ;
async
Configuration Options
use ;
let options = builder
.system_prompt
.model
.permission_mode
.max_turns
.max_thinking_tokens
.allowed_tools
.cwd
// New in v0.1.6
.settings // Use custom settings file
.add_dir // Add additional working directories
.add_dirs // Add multiple dirs
// New in v0.1.11: Control protocol format configuration
.control_protocol_format // Default: maximum compatibility
.build;
Control Protocol (v0.1.12+)
New request helpers and options aligned with the Python SDK:
Query::set_permission_mode("acceptEdits" | "default" | "plan" | "bypassPermissions")Query::set_model(Some("sonnet"))orset_model(None)to clearClaudeCodeOptions::builder().include_partial_messages(true)to include partial assistant chunksQuery::stream_input(stream)automatically calls end_input when finished
Example:
use ;
use SubprocessTransport;
use ;
use Mutex;
# async
Advanced flags mapped to CLI:
fork_session(true)→--fork-sessionsetting_sources(vec![User, Project, Local])→--setting-sources user,project,localagents(map)→--agents '<json>'
Agent Tools & MCP
- Tools whitelist/blacklist: set
allowed_tools/disallowed_toolsinClaudeCodeOptions. - Permission mode:
PermissionMode::{Default, AcceptEdits, Plan, BypassPermissions}. - Runtime approvals: implement
CanUseTooland returnPermissionResult::{Allow,Deny}. - MCP servers: configure via
options.mcp_servers(stdio/http/sse/sdk), SDK packs JSON for--mcp-config.
use ;
use ;
use Mutex;
;
# async
Control Protocol Compatibility (v0.1.11+)
The SDK supports configurable control protocol formats for CLI compatibility:
- Legacy (default): Uses
sdk_control_request/responseformat - works with all CLI versions - Control: Uses new
type=controlformat - for newer CLI versions - Auto: Currently defaults to Legacy, will auto-negotiate in future
// Use environment variable to override (useful for testing)
// export CLAUDE_CODE_CONTROL_FORMAT=legacy # or "control"
// Or configure programmatically
let options = builder
.control_protocol_format
.build;
See CONTROL_PROTOCOL_COMPATIBILITY.md for detailed information.
API Reference
query()
Simple, stateless query function for one-shot interactions.
pub async
InteractiveClient
Main client for stateful, interactive conversations.
Methods
new(options: ClaudeCodeOptions) -> Result<Self>- Create a new clientconnect() -> Result<()>- Connect to Claude CLIsend_and_receive(prompt: String) -> Result<Vec<Message>>- Send message and wait for complete responsesend_message(prompt: String) -> Result<()>- Send message without waitingreceive_response() -> Result<Vec<Message>>- Receive messages until Result messageinterrupt() -> Result<()>- Cancel ongoing operationdisconnect() -> Result<()>- Disconnect from Claude CLI
Message Types
UserMessage- User input messagesAssistantMessage- Claude's responsesSystemMessage- System notificationsResultMessage- Operation results with timing and cost info
Error Handling
The SDK provides comprehensive error types:
CLINotFoundError- Claude Code CLI not installedCLIConnectionError- Connection failuresProcessError- CLI process errorsInvalidState- Invalid operation state
Examples
Check the examples/ directory for more usage examples:
interactive_demo.rs- Interactive conversation demoquery_simple.rs- Simple query examplefile_operations.rs- File manipulation example
New Features (v0.1.6)
Test the latest features with these examples:
test_settings.rs- Using custom settings filestest_settings_safe.rs- Safe settings file handling with path detectiontest_add_dirs.rs- Adding multiple working directoriestest_combined_features.rs- Combining settings and add_dirstest_new_options.rs- Testing the new builder methods
Example settings files are provided:
examples/claude-settings.json- Basic settings configurationexamples/custom-claude-settings.json- Advanced settings with MCP servers
Note: When running examples from the project root, use:
The settings files use relative paths from the project root (e.g., examples/claude-settings.json)
License
This project is licensed under the MIT License - see the LICENSE file for details.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.