# `Codex.MCP.OAuth`
[🔗](https://github.com/nshkrdotcom/codex_sdk/blob/v0.18.1/lib/codex/mcp/oauth.ex#L1)

Stores and refreshes OAuth credentials for streamable HTTP MCP servers.

# `store_mode`

```elixir
@type store_mode() :: :auto | :file | :keyring
```

Where to store OAuth credentials.

# `tokens`

```elixir
@type tokens() :: %{
  server_name: String.t(),
  url: String.t(),
  client_id: String.t(),
  access_token: String.t(),
  refresh_token: String.t() | nil,
  expires_at: non_neg_integer() | nil,
  scopes: [String.t()]
}
```

Stored OAuth credentials for an MCP server.

# `delete_tokens`

```elixir
@spec delete_tokens(String.t(), String.t(), store_mode() | nil) ::
  :ok | {:error, term()}
```

Deletes stored OAuth tokens for the given MCP server name and URL.

# `load_tokens`

```elixir
@spec load_tokens(String.t(), String.t(), store_mode() | nil) :: tokens() | nil
```

Loads OAuth tokens for the given MCP server name and URL.

Returns `nil` when no tokens are stored or the entry cannot be decoded.

# `refresh_if_needed`

```elixir
@spec refresh_if_needed(tokens() | nil, String.t(), keyword()) ::
  {:ok, tokens() | nil} | {:error, term()}
```

Refreshes OAuth tokens when they are near expiry.

Returns the original tokens when refresh is not needed or not possible.

# `save_tokens`

```elixir
@spec save_tokens(tokens(), store_mode() | nil) :: :ok | {:error, term()}
```

Stores OAuth tokens for the given MCP server name and URL.

---

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