# `ExMCP.Protocol.Methods`
[🔗](https://github.com/azmaveth/ex_mcp/blob/v1.0.0/lib/ex_mcp/protocol/methods.ex#L1)

Canonical registry of MCP methods understood by ExMCP.

Every row records the method name, its inclusive version bounds, whether it
is a request or notification, and the consumer-specific handler functions.
Consumers derive their dispatch maps and version gates from this registry so
method additions do not require parallel string tables.

Unknown methods remain version-available for backward compatibility; the
individual dispatchers still decide whether to invoke a custom-method hook or
return `Method not found`.

# `consumer`

```elixir
@type consumer() :: :server_dispatch | :message_processor | :request_processor
```

# `handlers`

```elixir
@type handlers() :: %{optional(consumer()) =&gt; atom()}
```

# `kind`

```elixir
@type kind() :: :request | :notification
```

# `row`

```elixir
@type row() :: {String.t(), version(), version() | nil, kind(), handlers()}
```

# `version`

```elixir
@type version() :: String.t()
```

# `available?`

```elixir
@spec available?(String.t(), version()) :: boolean()
```

Checks the version bounds for a known method. Unknown methods remain allowed.

# `handler_map`

```elixir
@spec handler_map(consumer()) :: %{required(String.t()) =&gt; atom()}
```

Returns a method-to-handler map for a specific dispatcher.

# `introduced_request_methods`

```elixir
@spec introduced_request_methods(version()) :: [String.t()]
```

Returns request methods introduced by a version after the base revision.

# `methods_for`

```elixir
@spec methods_for(consumer()) :: [String.t()]
```

Returns the methods handled by a specific dispatcher.

# `notification_methods`

```elixir
@spec notification_methods(version()) :: [String.t()]
```

Returns the notification methods available in a version.

# `rows`

```elixir
@spec rows() :: [row()]
```

Returns every canonical method row.

---

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