# `Snodo.Prompt`
[🔗](https://github.com/joshrotenberg/snodo/blob/v0.1.0/lib/snodo/prompt.ex#L1)

Behaviour, compile-time DSL, and content builders for MCP prompts.

Prompt arguments are deliberately the flat string map defined by MCP rather
than JSON Schema. Required arguments are checked by the router before
`render/2` runs. A prompt returns one or more user/assistant messages through
`Snodo.Result.prompt_get/2`.

# `complete`
*optional* 

```elixir
@callback complete(Snodo.Completion.t(), Snodo.Context.t()) ::
  {:ok, Snodo.Result.t()} | {:error, Snodo.Error.t() | term()}
```

# `definition`

```elixir
@callback definition() :: Snodo.Prompt.Definition.t()
```

# `render`

```elixir
@callback render(arguments :: %{optional(String.t()) =&gt; String.t()}, Snodo.Context.t()) ::
  {:ok, Snodo.Result.t()} | {:error, Snodo.Error.t() | term()}
```

# `audio`

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

Builds base64-encoded audio content for a prompt message.

# `definition`

```elixir
@spec definition(module()) :: Snodo.Prompt.Definition.t()
```

Returns and validates the protocol-neutral definition for a prompt module.

# `embedded_resource`

```elixir
@spec embedded_resource(map(), keyword()) :: map()
```

Builds embedded resource content for a prompt message.

# `image`

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

Builds base64-encoded image content for a prompt message.

# `message`

```elixir
@spec message(:user | :assistant | String.t(), map()) :: map()
```

Builds a prompt message with a user or assistant role.

# `resource_link`

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

Builds a resource link for a prompt message.

# `text`

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

Builds text content for a prompt message.

---

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