# `ExMCP.Types.V20250618`
[🔗](https://github.com/azmaveth/ex_mcp/blob/v1.0.0/lib/ex_mcp/types/v20250618.ex#L1)

Type definitions for MCP protocol version 2025-06-18.

This module contains type definitions specific to the 2025-06-18
version of the Model Context Protocol specification.

Key changes from 2025-03-26:
- Removed JSON-RPC batching support
- Added structured tool output (structuredOutput field)
- OAuth 2.1 Resource Server classification
- Elicitation support (now stable)
- Resource links in tool results
- MCP-Protocol-Version header requirement for HTTP
- _meta fields for extensibility
- context field in completion requests
- title fields for human-friendly display names

# `call_tool_result`

```elixir
@type call_tool_result() :: %{
  optional(:content) =&gt; [ExMCP.Types.content()],
  optional(:structuredOutput) =&gt; any(),
  optional(:resourceLinks) =&gt; [resource_link()],
  optional(:isError) =&gt; boolean(),
  optional(:_meta) =&gt; meta()
}
```

Enhanced tool result with structured output and resource links.

# `client_capabilities`

```elixir
@type client_capabilities() :: %{
  optional(:experimental) =&gt; %{required(String.t()) =&gt; any()},
  optional(:sampling) =&gt; %{required(String.t()) =&gt; any()},
  optional(:roots) =&gt; %{optional(:listChanged) =&gt; boolean()},
  optional(:elicitation) =&gt; %{},
  optional(:_meta) =&gt; meta()
}
```

Client capabilities for 2025-06-18.
Elicitation is now a stable feature.

# `completion_request`

```elixir
@type completion_request() :: %{
  :ref =&gt; String.t(),
  :argument =&gt; %{name: String.t(), value: String.t()},
  optional(:context) =&gt; %{required(String.t()) =&gt; any()},
  optional(:_meta) =&gt; meta()
}
```

Completion request with context field.

# `cursor`

```elixir
@type cursor() :: ExMCP.Types.cursor()
```

# `elicit_request`

```elixir
@type elicit_request() :: %{
  :message =&gt; String.t(),
  :requestedSchema =&gt; %{
    :type =&gt; String.t(),
    :properties =&gt; %{required(String.t()) =&gt; primitive_schema()},
    optional(:required) =&gt; [String.t()]
  },
  optional(:_meta) =&gt; meta()
}
```

Elicitation request (stable feature).

# `elicit_result`

```elixir
@type elicit_result() :: %{
  :action =&gt; String.t(),
  optional(:content) =&gt; %{required(String.t()) =&gt; any()},
  optional(:_meta) =&gt; meta()
}
```

Elicitation result.

# `json_schema`

```elixir
@type json_schema() :: map()
```

# `json_value`

```elixir
@type json_value() :: any()
```

# `log_level`

```elixir
@type log_level() :: ExMCP.Types.log_level()
```

# `meta`

```elixir
@type meta() :: %{optional(String.t()) =&gt; any()}
```

Meta field for extensibility. Can be added to most protocol objects.

# `primitive_schema`

```elixir
@type primitive_schema() :: %{
  :type =&gt; String.t(),
  optional(:title) =&gt; String.t(),
  optional(:description) =&gt; String.t(),
  optional(:enum) =&gt; [String.t()],
  optional(:enumNames) =&gt; [String.t()],
  optional(:default) =&gt; any(),
  optional(:minLength) =&gt; integer(),
  optional(:maxLength) =&gt; integer(),
  optional(:minimum) =&gt; number(),
  optional(:maximum) =&gt; number(),
  optional(:format) =&gt; String.t()
}
```

Primitive schema for elicitation fields.

# `progress_token`

```elixir
@type progress_token() :: ExMCP.Types.progress_token()
```

# `prompt`

```elixir
@type prompt() :: %{
  :name =&gt; String.t(),
  optional(:title) =&gt; String.t(),
  optional(:description) =&gt; String.t(),
  optional(:arguments) =&gt; [ExMCP.Types.prompt_argument()],
  optional(:annotations) =&gt; ExMCP.Types.annotations(),
  optional(:_meta) =&gt; meta()
}
```

Prompt with title field.

# `protected_resource_metadata`

```elixir
@type protected_resource_metadata() :: %{
  :authorization_server =&gt; String.t(),
  :resource =&gt; String.t(),
  optional(:scopes) =&gt; [String.t()],
  optional(:_meta) =&gt; meta()
}
```

OAuth 2.1 protected resource metadata.
Server metadata for OAuth 2.1 Resource Server classification.

# `request_id`

```elixir
@type request_id() :: ExMCP.Types.request_id()
```

# `resource`

```elixir
@type resource() :: %{
  :uri =&gt; String.t(),
  optional(:title) =&gt; String.t(),
  optional(:name) =&gt; String.t(),
  optional(:description) =&gt; String.t(),
  optional(:mimeType) =&gt; String.t(),
  optional(:annotations) =&gt; ExMCP.Types.annotations(),
  optional(:_meta) =&gt; meta()
}
```

Resource with title field.

# `resource_link`

```elixir
@type resource_link() :: %{
  :uri =&gt; String.t(),
  optional(:title) =&gt; String.t(),
  optional(:mimeType) =&gt; String.t(),
  optional(:_meta) =&gt; meta()
}
```

Resource link in tool results.

# `server_capabilities`

```elixir
@type server_capabilities() :: %{
  optional(:experimental) =&gt; %{required(String.t()) =&gt; any()},
  optional(:prompts) =&gt; %{optional(:listChanged) =&gt; boolean()},
  optional(:resources) =&gt; %{
    optional(:subscribe) =&gt; boolean(),
    optional(:listChanged) =&gt; boolean()
  },
  optional(:tools) =&gt; %{optional(:listChanged) =&gt; boolean()},
  optional(:logging) =&gt; %{optional(:setLevel) =&gt; boolean()},
  optional(:completions) =&gt; %{},
  optional(:_meta) =&gt; meta()
}
```

Server capabilities for 2025-06-18.
Note: No batch support in this version.

# `tool`

```elixir
@type tool() :: %{
  :name =&gt; String.t(),
  optional(:title) =&gt; String.t(),
  optional(:description) =&gt; String.t(),
  :inputSchema =&gt; json_schema(),
  optional(:outputSchema) =&gt; json_schema(),
  optional(:annotations) =&gt; tool_annotations(),
  optional(:_meta) =&gt; meta()
}
```

Tool definition with output schema support and title field.

# `tool_annotations`

```elixir
@type tool_annotations() :: %{
  optional(:readOnlyHint) =&gt; boolean(),
  optional(:destructiveHint) =&gt; boolean(),
  optional(:idempotentHint) =&gt; boolean(),
  optional(:openWorldHint) =&gt; boolean()
}
```

# `protocol_version`

---

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