README.md

# ClaudeSDK

An Elixir SDK that wraps the [Claude Code CLI](https://docs.anthropic.com/en/docs/claude-code) as a subprocess, communicating via stdin/stdout using newline-delimited JSON. It provides both a stateless streaming API and a stateful multi-turn client.

## Features

- **Stateless streaming** — `ClaudeSDK.query/2` spawns a subprocess per call, streams messages, and cleans up automatically
- **Stateful multi-turn** — `ClaudeSDK.Client` keeps a single subprocess alive across multiple queries with session persistence and rewind
- **MCP server support** — Define in-process MCP tools with `ClaudeSDK.MCP.Server`
- **Control request routing** — Automatic handling of tool approval and MCP messages via `ClaudeSDK.ControlRouter`
- **Typed messages** — All Claude responses are parsed into typed structs

## Prerequisites

The [Claude Code CLI](https://docs.anthropic.com/en/docs/claude-code) must be installed and available in your PATH.

## Installation

Add `claude_sdk` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:claude_sdk, "~> 0.1.0"}
  ]
end
```

## Quick Start

### Single query

```elixir
ClaudeSDK.query("Explain pattern matching in Elixir", %ClaudeSDK.Types.Options{})
|> Enum.each(fn message ->
  IO.inspect(message)
end)
```

### Multi-turn client

```elixir
{:ok, client} = ClaudeSDK.Client.start_link(options: %ClaudeSDK.Types.Options{})

ClaudeSDK.Client.query(client, "What is the capital of France?")
# Receive messages via {:client_message, message} in your process mailbox

ClaudeSDK.Client.query(client, "And what about Germany?")
```

## Documentation

Full documentation is available on [HexDocs](https://hexdocs.pm/claude_sdk).

## License

MIT — see [LICENSE](LICENSE) for details.