claude-code-sdk-rust 0.2.0

Async Rust SDK for the Claude Code CLI: streaming agent turns, tool use, and sessions.
Documentation
use claude_code_sdk_rust::{
    create_sdk_mcp_server, create_sdk_mcp_server_with_version, delete_session,
    delete_session_via_store, fork_session, fork_session_via_store, get_session_info,
    get_session_info_from_store, get_session_messages, get_session_messages_from_store,
    get_subagent_messages, get_subagent_messages_from_store, initialize_server, list_sessions,
    list_sessions_from_store, list_subagents, list_subagents_from_store, query_messages,
    rename_session, rename_session_via_store, tag_session, tag_session_via_store,
    tool_with_annotations, ClaudeSDKClient, ContextUsageCategory, ContextUsageResponse,
    ForkSessionResult, ListSessionsOptions, LocalForkSessionResult, MCPToolAnnotations,
    McpServerInfo, McpServerStatus, McpStatusResponse, McpToolAnnotations, McpToolInfo,
    SDKSessionInfo, SDKSessionMessage, SdkMcpTool, SessionInfo, SessionMessage,
    SessionMutationOptions, SessionQueryOptions, SimpleMCPServer, StderrCallback, VERSION,
};

#[test]
fn session_helpers_are_exported_at_crate_root() {
    let _ = list_sessions;
    let _ = get_session_info;
    let _ = get_session_messages;
    let _ = list_subagents;
    let _ = get_subagent_messages;
    let _ = rename_session;
    let _ = tag_session;
    let _ = delete_session;
    let _ = fork_session;
    let _query_messages_future = query_messages("hello", None);
    let _server = initialize_server("server");
    let _annotated_tool = tool_with_annotations(
        "tool",
        "description",
        serde_json::json!({"type": "object"}),
        MCPToolAnnotations {
            title: None,
            read_only_hint: true,
            destructive_hint: false,
            idempotent_hint: true,
            open_world_hint: false,
            max_result_size_chars: None,
        },
        |_| Ok(Vec::<claude_code_sdk_rust::MCPContent>::new()),
    );
    let _sdk_server = create_sdk_mcp_server("sdk-server", Vec::new());
    let _versioned_sdk_server =
        create_sdk_mcp_server_with_version("sdk-server", "2.0.0", Vec::new());
    let http_config = claude_code_sdk_rust::mcp::MCPServerConfig::Http {
        url: "https://example.com/mcp".to_string(),
        headers: std::collections::HashMap::new(),
    };
    assert_eq!(serde_json::to_value(&http_config).unwrap()["type"], "http");
    let _ = list_sessions_from_store;
    let _ = get_session_info_from_store;
    let _ = get_session_messages_from_store;
    let _ = list_subagents_from_store;
    let _ = get_subagent_messages_from_store;
    let _ = rename_session_via_store;
    let _ = tag_session_via_store;
    let _ = delete_session_via_store;
    let _ = fork_session_via_store;
    let _ = std::mem::size_of::<ListSessionsOptions>();
    let _ = std::mem::size_of::<SessionQueryOptions>();
    let _ = std::mem::size_of::<SessionMutationOptions>();
    let _ = std::mem::size_of::<SessionInfo>();
    let _ = std::mem::size_of::<SessionMessage>();
    let _ = std::mem::size_of::<LocalForkSessionResult>();
    let _ = std::mem::size_of::<ForkSessionResult>();
    let _ = std::mem::size_of::<SDKSessionInfo>();
    let _ = std::mem::size_of::<SDKSessionMessage>();
    let _ = std::mem::size_of::<SimpleMCPServer>();
    let _ = std::mem::size_of::<SdkMcpTool>();
    let _ = std::mem::size_of::<StderrCallback>();
    let _ = std::mem::size_of::<ClaudeSDKClient>();
    let _ = std::mem::size_of::<McpServerStatus>();
    let _ = std::mem::size_of::<McpServerInfo>();
    let _ = std::mem::size_of::<McpStatusResponse>();
    let _ = std::mem::size_of::<McpToolInfo>();
    let status_annotations = McpToolAnnotations {
        read_only: Some(true),
        destructive: Some(false),
        open_world: Some(false),
    };
    let status_payload = serde_json::to_value(&status_annotations).unwrap();
    assert_eq!(status_payload["readOnly"], true);
    assert!(status_payload.get("read_only").is_none());
    let usage = ContextUsageResponse {
        categories: vec![ContextUsageCategory {
            name: "messages".to_string(),
            tokens: 12,
            color: "blue".to_string(),
            is_deferred: Some(false),
        }],
        total_tokens: 12,
        max_tokens: 200_000,
        raw_max_tokens: 200_000,
        percentage: 0.01,
        model: "claude-sonnet-4-5".to_string(),
        is_auto_compact_enabled: true,
        memory_files: Vec::new(),
        mcp_tools: Vec::new(),
        agents: Vec::new(),
        grid_rows: Vec::new(),
        auto_compact_threshold: Some(160_000),
        deferred_builtin_tools: Some(Vec::new()),
        system_tools: Some(Vec::new()),
        system_prompt_sections: Some(Vec::new()),
        slash_commands: Some(serde_json::json!({})),
        skills: Some(serde_json::json!({})),
    };
    assert_eq!(usage.categories[0].name, "messages");
    let payload = serde_json::to_value(&usage).unwrap();
    assert_eq!(payload["isAutoCompactEnabled"], true);
    assert_eq!(payload["deferredBuiltinTools"], serde_json::json!([]));
    assert!(!VERSION.is_empty());
}