Current section

Files

Jump to
hermes_mcp lib hermes.ex
Raw

lib/hermes.ex

defmodule Hermes do
@moduledoc false
import Peri
alias Hermes.Server.Transport.STDIO, as: ServerSTDIO
alias Hermes.Server.Transport.StreamableHTTP, as: ServerStreamableHTTP
alias Hermes.Transport.SSE, as: ClientSSE
alias Hermes.Transport.STDIO, as: ClientSTDIO
alias Hermes.Transport.StreamableHTTP, as: ClientStreamableHTTP
@client_transports if Mix.env() == :test,
do: [ClientSTDIO, ClientSSE, ClientStreamableHTTP, StubTransport, Hermes.MockTransport],
else: [ClientSTDIO, ClientSSE, ClientStreamableHTTP]
@server_transports if Mix.env() == :test,
do: [ServerSTDIO, ServerStreamableHTTP, StubTransport],
else: [ServerSTDIO, ServerStreamableHTTP]
defschema :client_transport,
layer: {:required, {:enum, @client_transports}},
name: {:required, get_schema(:process_name)}
defschema :server_transport,
layer: {:required, {:enum, @server_transports}},
name: {:required, get_schema(:process_name)}
defschema :process_name, {:either, {:pid, {:custom, &genserver_name/1}}}
@doc "Checks if hermes should be compiled/used as standalone CLI or OTP library"
def should_compile_cli? do
Code.ensure_loaded?(Burrito) and Application.get_env(:hermes_mcp, :compile_cli?, false)
end
@doc """
Validates a possible GenServer name using `peri` `:custom` type definition.
"""
def genserver_name({:via, registry, _}) when is_atom(registry), do: :ok
def genserver_name({:global, _}), do: :ok
def genserver_name(name) when is_atom(name), do: :ok
def genserver_name(val) do
{:error, "#{inspect(val, pretty: true)} is not a valid name for a GenServer"}
end
end