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

Type definitions for MCP protocol version 2025-11-25.

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

Key changes from 2025-06-18:
- Tasks: experimental async state machines for long-running tool calls
- URL-mode elicitation: server can send URL instead of form schema
- Icons metadata on tools, resources, prompts, and serverInfo
- Tool calling in sampling (tools and toolChoice in createMessage)
- Enhanced OAuth/OIDC authorization with incremental scope
- Tool name validation (alphanumeric, dots, hyphens, underscores)
- title/description fields on Implementation
- size/lastModified fields on resource annotations

# `call_tool_result`

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

Enhanced tool result.

# `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-11-25.

# `create_task_result`

```elixir
@type create_task_result() :: %{
  :taskId =&gt; String.t(),
  :state =&gt; task_state(),
  optional(:metadata) =&gt; map()
}
```

Result of creating a task (immediate response to tools/call with task support).

# `cursor`

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

# `elicit_result`

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

Elicitation result (updated for 2025-11-25 to support URL mode).

# `icon`

```elixir
@type icon() :: %{
  :src =&gt; String.t(),
  optional(:mimeType) =&gt; String.t(),
  optional(:sizes) =&gt; String.t(),
  optional(:theme) =&gt; String.t()
}
```

Icon metadata for tools, resources, prompts, and server info.

# `implementation`

```elixir
@type implementation() :: %{
  :name =&gt; String.t(),
  :version =&gt; String.t(),
  optional(:title) =&gt; String.t(),
  optional(:description) =&gt; String.t(),
  optional(:websiteUrl) =&gt; String.t(),
  optional(:icons) =&gt; [icon()]
}
```

Implementation info with title and description fields (new in 2025-11-25).

# `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.

# `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(:icons) =&gt; [icon()],
  optional(:_meta) =&gt; meta()
}
```

Prompt with icons (new in 2025-11-25).

# `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; resource_annotations(),
  optional(:icons) =&gt; [icon()],
  optional(:size) =&gt; integer(),
  optional(:lastModified) =&gt; String.t(),
  optional(:_meta) =&gt; meta()
}
```

Resource with icons, size, and lastModified (new in 2025-11-25).

# `resource_annotations`

```elixir
@type resource_annotations() :: %{
  optional(:audience) =&gt; [ExMCP.Types.role()],
  optional(:priority) =&gt; float(),
  optional(:lastModified) =&gt; String.t()
}
```

Resource annotations with lastModified (new in 2025-11-25).

# `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(:outputSchema) =&gt; boolean()
  },
  optional(:logging) =&gt; %{},
  optional(:completions) =&gt; %{},
  optional(:tasks) =&gt; %{},
  optional(:_meta) =&gt; meta()
}
```

Server capabilities for 2025-11-25.
Adds tasks capability.

# `task`

```elixir
@type task() :: %{
  :taskId =&gt; String.t(),
  :status =&gt; task_state(),
  optional(:statusMessage) =&gt; String.t(),
  :createdAt =&gt; String.t(),
  :lastUpdatedAt =&gt; String.t(),
  :ttl =&gt; integer(),
  optional(:pollInterval) =&gt; integer()
}
```

Task struct representing an async operation.

# `task_state`

```elixir
@type task_state() :: :working | :input_required | :completed | :failed | :cancelled
```

Task state enum.

# `task_support`

```elixir
@type task_support() :: %{
  optional(:taskSupport) =&gt; :required | :optional | :forbidden
}
```

Task support configuration on a tool.

# `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(:icons) =&gt; [icon()],
  optional(:execution) =&gt; task_support(),
  optional(:_meta) =&gt; meta()
}
```

Tool definition with icons and execution/task support (new in 2025-11-25).

# `tool_annotations`

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

Tool annotations.

# `tool_choice`

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

Tool choice for sampling/createMessage.

# `tool_result_content`

```elixir
@type tool_result_content() :: %{
  :type =&gt; String.t(),
  :toolUseId =&gt; String.t(),
  :content =&gt; [ExMCP.Types.content()],
  optional(:isError) =&gt; boolean()
}
```

Tool result content type (result of tool execution).

# `tool_use_content`

```elixir
@type tool_use_content() :: %{
  type: String.t(),
  id: String.t(),
  name: String.t(),
  input: map()
}
```

Tool use content type (model using a tool).

# `url_elicit_request`

```elixir
@type url_elicit_request() :: %{
  :message =&gt; String.t(),
  :url =&gt; String.t(),
  :mode =&gt; String.t(),
  :elicitationId =&gt; String.t(),
  optional(:_meta) =&gt; meta()
}
```

URL-mode elicitation request (new in 2025-11-25).
Server sends a URL for the client to navigate to instead of a form schema.

# `protocol_version`

---

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