claude_code/lib.rs
1//! # Claude Code SDK for Rust
2//!
3//! A Rust implementation of the Claude Code Agent SDK, providing programmatic access
4//! to Claude Code as a subprocess. This crate is a port of the official
5//! [Python Claude Code SDK](https://platform.claude.com/docs/en/agent-sdk/python).
6//!
7//! ## Overview
8//!
9//! The SDK provides two main ways to interact with Claude Code:
10//!
11//! - **[`query()`]** — Creates a new session for each interaction. Best for one-off tasks,
12//! independent operations, and simple automation scripts.
13//! - **[`ClaudeSdkClient`]** — Maintains a conversation session across multiple exchanges.
14//! Best for continuing conversations, follow-up questions, interactive applications, and
15//! session lifecycle management.
16//!
17//! ## Quick Comparison
18//!
19//! | Feature | `query()` | `ClaudeSdkClient` |
20//! |---------|-----------|-------------------|
21//! | Session | New session each time | Reuses same session |
22//! | Conversation | Single exchange | Multiple exchanges in same context |
23//! | Connection | Managed automatically | Manual control |
24//! | Interrupts | Not supported | Supported |
25//! | Custom Tools | Supported | Supported |
26//! | Use Case | One-off tasks | Continuous conversations |
27//!
28//! ## Example — One-off query
29//!
30//! ```rust,no_run
31//! use claude_code::{query, ClaudeAgentOptions, InputPrompt, Message};
32//!
33//! # async fn example() -> claude_code::Result<()> {
34//! let messages = query(
35//! InputPrompt::Text("What is 2 + 2?".to_string()),
36//! Some(ClaudeAgentOptions {
37//! permission_mode: Some(claude_code::PermissionMode::BypassPermissions),
38//! ..Default::default()
39//! }),
40//! None,
41//! ).await?;
42//!
43//! for msg in messages {
44//! if let Message::Assistant(assistant) = msg {
45//! println!("{:?}", assistant.content);
46//! }
47//! }
48//! # Ok(())
49//! # }
50//! ```
51//!
52//! ## Example — Continuous conversation with `ClaudeSdkClient`
53//!
54//! ```rust,no_run
55//! use claude_code::{ClaudeSdkClient, InputPrompt};
56//!
57//! # async fn example() -> claude_code::Result<()> {
58//! let mut client = ClaudeSdkClient::new(None, None);
59//! client.connect(None).await?;
60//!
61//! // First question
62//! client.query(InputPrompt::Text("What's the capital of France?".into()), "default").await?;
63//! let response = client.receive_response().await?;
64//!
65//! // Follow-up — session retains context
66//! client.query(InputPrompt::Text("What's the population of that city?".into()), "default").await?;
67//! let follow_up = client.receive_response().await?;
68//!
69//! client.disconnect().await?;
70//! # Ok(())
71//! # }
72//! ```
73
74pub mod client;
75pub mod errors;
76pub mod internal_client;
77pub mod message_parser;
78pub mod query;
79pub mod query_fn;
80pub mod sdk_mcp;
81pub mod sessions;
82pub mod transport;
83pub mod types;
84
85pub use client::{ClaudeSdkClient, InputPrompt};
86pub use errors::{
87 CLIConnectionError, CLIJSONDecodeError, CLINotFoundError, ClaudeSDKError, Error,
88 MessageParseError, ProcessError, Result,
89};
90pub use message_parser::parse_message;
91pub use query::{Query, handle_sdk_mcp_request};
92pub use query_fn::{query, query_from_stream, query_stream, query_stream_from_stream};
93pub use sdk_mcp::{McpSdkServer, SdkMcpTool, create_sdk_mcp_server, tool};
94pub use sessions::{get_session_messages, list_sessions};
95pub use transport::subprocess_cli::{
96 DEFAULT_MAX_BUFFER_SIZE, JsonStreamBuffer, Prompt, SubprocessCliTransport,
97};
98pub use transport::{
99 SplitAdapter, Transport, TransportCloseHandle, TransportFactory, TransportReader,
100 TransportSplitResult, TransportWriter, split_with_adapter,
101};
102pub use types::{
103 AgentDefinition, AssistantMessage, ClaudeAgentOptions, ContentBlock, HookCallback, HookContext,
104 HookInput, HookJSONOutput, HookMatcher, McpHttpServerConfig, McpSSEServerConfig,
105 McpSdkServerConfig, McpServerConfig, McpServerConnectionStatus, McpServerInfo, McpServerStatus,
106 McpServerStatusConfig, McpServersOption, McpStatusResponse, McpStdioServerConfig,
107 McpToolAnnotations, McpToolInfo, Message, PermissionMode, PermissionResult,
108 PermissionResultAllow, PermissionResultDeny, PermissionUpdate, ResultMessage, SDKSessionInfo,
109 SandboxIgnoreViolations, SandboxNetworkConfig, SandboxSettings, SdkPluginConfig,
110 SessionMessage, SettingSource, StderrCallback, StreamEvent, SystemMessage, SystemPrompt,
111 SystemPromptPreset, TaskNotificationMessage, TaskNotificationStatus, TaskProgressMessage,
112 TaskStartedMessage, TaskUsage, TextBlock, ThinkingBlock, ThinkingConfig, ToolAnnotations,
113 ToolPermissionContext, ToolResultBlock, ToolUseBlock, ToolsOption, ToolsPreset, UserContent,
114 UserMessage,
115};
116
117/// The version of the Claude Code Rust SDK, sourced from `Cargo.toml`.
118pub const SDK_VERSION: &str = env!("CARGO_PKG_VERSION");