claude-codes
A typed Rust interface for the Claude Code JSON protocol.
Part of the rust-code-agent-sdks workspace.
Overview
This library provides type-safe bindings for communicating with the Claude CLI via its JSON Lines protocol. It handles message serialization, streaming responses, and session management.
Note: The Claude CLI protocol is unstable and may change between versions. This crate tracks protocol changes and will warn if you're using an untested CLI version.
Installation
Default (All Features)
Requires the Claude CLI (claude binary) to be installed and available in PATH.
Feature Flags
| Feature | Description | WASM-compatible |
|---|---|---|
types |
Core message types only (minimal dependencies) | Yes |
sync-client |
Synchronous client with blocking I/O | No |
async-client |
Asynchronous client with tokio runtime | No |
All features are enabled by default.
Types Only (WASM-compatible)
[]
= { = "2", = false, = ["types"] }
This gives you access to all typed message structures (ClaudeInput, ClaudeOutput, ContentBlock, etc.) without pulling in tokio or other native-only dependencies. Useful for frontend apps, shared type definitions, or any WASM context needing Claude protocol types.
Sync Client Only
[]
= { = "2", = false, = ["sync-client"] }
Async Client Only
[]
= { = "2", = false, = ["async-client"] }
Usage
Async Client
use AsyncClient;
async
Sync Client
use ;
use Uuid;
Sending Images
use ;
use ;
async
Raw Protocol Access
Use RawAsyncClient when the caller owns protocol interpretation and only
needs newline framing. Neither method decodes JSON.
use ;
# async
Typed protocol parsing remains available separately:
use ;
let json_line = r#"{"type":"assistant","message":{...}}"#;
let output: ClaudeOutput = deserialize?;
let serialized = serialize?;
Compatibility
Login tooling (auth feature)
The CLI's login flows are interactive Ink TUIs (they hang on a pipe), so the
auth module drives them under a pseudo-terminal:
use ;
let mut flow = start?;
let url = flow.auth_url?; // show to the user
// … user authorizes in a browser, brings back a code …
let outcome = flow.submit_code_and_wait?;
// outcome.token = Some("sk-ant-oat01-…") — recovered via screen text,
// OSC 52 clipboard escapes, or the credentials-file watch.
Rejected codes keep the flow alive: call retry_new_url() for a fresh
authorize URL (the CLI rotates the PKCE challenge; the old code is dead).
Every failure self-describes — timeouts and child exits carry a channel
line naming what each detection source saw. auth_status() types
claude auth status --json (email, org, plan). Enable with
features = ["auth"].
Tested against: Claude CLI 2.1.232
The crate version tracks the Claude CLI version. If you're using a different CLI version, please report whether it works at: https://github.com/meawoppl/rust-code-agent-sdks/issues
License
Apache-2.0. See LICENSE.