# `ExMCP.ACP.Adapters.ClaudeSDK.Protocol`
[🔗](https://github.com/azmaveth/ex_mcp/blob/v1.4.0/lib/ex_mcp/acp/adapters/claude_sdk/protocol.ex#L1)

Pure helpers for Claude Code's SDK-flavoured stream-json protocol.

The official `@anthropic-ai/claude-agent-sdk` still launches Claude Code, but
it uses a richer stdin/stdout protocol than the basic CLI stream. This module
keeps that wire-shape construction side-effect free.

# `cli_path`

```elixir
@spec cli_path(keyword()) :: String.t()
```

Returns the Claude Code executable path used for SDK-style sessions.

# `command`

```elixir
@spec command(keyword()) :: {String.t(), [String.t()]}
```

Builds the Claude Code command line used by SDK-style sessions.

# `control_error`

```elixir
@spec control_error(String.t(), String.t()) :: map()
```

Builds an error response for a Claude-originated control request.

# `control_request`

```elixir
@spec control_request(String.t(), map()) :: map()
```

Builds a host-to-Claude SDK control request.

# `control_success`

```elixir
@spec control_success(String.t(), map() | nil) :: map()
```

Builds a success response for a Claude-originated control request.

# `env`

```elixir
@spec env(keyword()) :: map()
```

Environment required for Claude Code's SDK entrypoint.

# `initialize_request`

```elixir
@spec initialize_request(
  keyword(),
  String.t()
) :: map()
```

Builds the initial SDK control request sent after process startup.

# `line`

```elixir
@spec line(map()) :: String.t()
```

Encodes one SDK message as an NDJSON line.

# `permission_options`

```elixir
@spec permission_options(map()) :: [map()]
```

Builds ACP permission options for a Claude SDK permission request.

# `permission_result`

```elixir
@spec permission_result(map(), map()) :: map()
```

Converts an ACP permission outcome into a Claude SDK PermissionResult.

# `permission_tool_call`

```elixir
@spec permission_tool_call(map(), String.t() | nil) :: map()
```

Builds a compact ACP tool call map for permission prompts.

# `prompt_content`

```elixir
@spec prompt_content(list() | String.t() | nil) ::
  {:ok, list()} | {:error, String.t()}
```

Converts ACP prompt blocks into Claude message content blocks.

# `user_message`

```elixir
@spec user_message(String.t() | nil, list() | String.t()) ::
  {:ok, map()} | {:error, String.t()}
```

Builds a user message for a prompt turn.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
