Hermolaos.Protocol.Capabilities (Hermolaos v0.3.0)
View SourceMCP capability negotiation and validation.
Capabilities define what features a client or server supports. During the initialization handshake, both parties exchange their capabilities to establish what operations are available.
Client Capabilities
Clients can advertise these capabilities:
roots- Filesystem root accesslistChanged- Whether client sends notifications when roots change
sampling- LLM sampling support (allows server to request text generation)
Server Capabilities
Servers can advertise these capabilities:
tools- Tool invocation supportlistChanged- Whether server sends notifications when tools change
resources- Resource access supportsubscribe- Whether subscriptions are supportedlistChanged- Whether server sends notifications when resources change
prompts- Prompt template supportlistChanged- Whether server sends notifications when prompts change
logging- Structured logging supportcompletions- Argument completion support
Example
# Default client capabilities
caps = Hermolaos.Protocol.Capabilities.default_client_capabilities()
# Check if server supports tools
if Hermolaos.Protocol.Capabilities.supports?(server_caps, :tools) do
# Can list and call tools
end
Summary
Functions
Builds custom client capabilities.
Returns client capabilities with sampling support enabled.
Returns default client capabilities.
Extracts capabilities from an initialize response.
Returns the latest (preferred) protocol version.
Extracts the protocol version from an initialize response.
Validates that required capabilities are present for an operation.
Extracts server info from an initialize response.
Returns the list of supported protocol versions.
Checks if capabilities include support for a specific feature.
Checks if a capability supports change notifications.
Checks if resource capabilities support subscriptions.
Checks if a protocol version is supported.
Types
@type capability() ::
:roots | :sampling | :tools | :resources | :prompts | :logging | :completions
@type client_capabilities() :: %{ optional(:roots) => %{optional(:listChanged) => boolean()}, optional(:sampling) => %{} }
@type server_capabilities() :: %{ optional(:tools) => %{optional(:listChanged) => boolean()}, optional(:resources) => %{ optional(:subscribe) => boolean(), optional(:listChanged) => boolean() }, optional(:prompts) => %{optional(:listChanged) => boolean()}, optional(:logging) => %{}, optional(:completions) => %{} }
Functions
@spec build_client_capabilities(keyword()) :: client_capabilities()
Builds custom client capabilities.
Options
:roots- Enable roots capability (default: true):roots_list_changed- Enable roots change notifications (default: true):sampling- Enable sampling capability (default: false)
Examples
caps = Hermolaos.Protocol.Capabilities.build_client_capabilities(
roots: true,
sampling: true
)
@spec client_capabilities_with_sampling() :: client_capabilities()
Returns client capabilities with sampling support enabled.
Examples
caps = Hermolaos.Protocol.Capabilities.client_capabilities_with_sampling()
# => %{"roots" => %{"listChanged" => true}, "sampling" => %{}}
@spec default_client_capabilities() :: client_capabilities()
Returns default client capabilities.
The default client advertises:
rootswithlistChanged: true
Sampling is not enabled by default as it requires special handling.
Examples
caps = Hermolaos.Protocol.Capabilities.default_client_capabilities()
# => %{"roots" => %{"listChanged" => true}}
Extracts capabilities from an initialize response.
Examples
response = %{"capabilities" => %{"tools" => %{}}, "serverInfo" => %{...}}
{:ok, caps} = Hermolaos.Protocol.Capabilities.from_init_response(response)
@spec latest_version() :: String.t()
Returns the latest (preferred) protocol version.
Extracts the protocol version from an initialize response.
Examples
response = %{"protocolVersion" => "2025-03-26"}
{:ok, version} = Hermolaos.Protocol.Capabilities.protocol_version_from_response(response)
@spec require(map(), [capability()]) :: :ok | {:error, {:missing_capability, capability()}}
Validates that required capabilities are present for an operation.
Examples
# Check if we can list tools
:ok = Hermolaos.Protocol.Capabilities.require(server_caps, [:tools])
# Check if we can subscribe to resources
{:error, {:missing_capability, :resources}} =
Hermolaos.Protocol.Capabilities.require(%{}, [:resources])
Extracts server info from an initialize response.
Examples
response = %{"serverInfo" => %{"name" => "MyServer", "version" => "1.0.0"}}
{:ok, info} = Hermolaos.Protocol.Capabilities.server_info_from_response(response)
@spec supported_versions() :: [String.t()]
Returns the list of supported protocol versions.
@spec supports?(map(), capability()) :: boolean()
Checks if capabilities include support for a specific feature.
Examples
iex> caps = %{"tools" => %{"listChanged" => true}}
iex> Hermolaos.Protocol.Capabilities.supports?(caps, :tools)
true
iex> caps = %{}
iex> Hermolaos.Protocol.Capabilities.supports?(caps, :tools)
false
@spec supports_list_changed?(map(), capability()) :: boolean()
Checks if a capability supports change notifications.
Examples
iex> caps = %{"tools" => %{"listChanged" => true}}
iex> Hermolaos.Protocol.Capabilities.supports_list_changed?(caps, :tools)
true
iex> caps = %{"tools" => %{}}
iex> Hermolaos.Protocol.Capabilities.supports_list_changed?(caps, :tools)
false
Checks if resource capabilities support subscriptions.
Examples
iex> caps = %{"resources" => %{"subscribe" => true}}
iex> Hermolaos.Protocol.Capabilities.supports_subscribe?(caps)
true
Checks if a protocol version is supported.
Examples
iex> Hermolaos.Protocol.Capabilities.version_supported?("2025-03-26")
true
iex> Hermolaos.Protocol.Capabilities.version_supported?("1.0.0")
false