ExMCP.Server.HandlerServer (ex_mcp v1.0.0-rc.0)

View Source

Transport-aware process for ExMCP.Server.Handler modules.

This module runs a handler module behind the MCP transports that need a server process, including the in-memory test transport.

Usage

# Handler module implementing ExMCP.Server.Handler
defmodule MyHandler do
  use ExMCP.Server.Handler

  @impl true
  def handle_initialize(params, state) do
    {:ok, %{
      protocolVersion: "2025-03-26",
      serverInfo: %{name: "test-server", version: "1.0.0"},
      capabilities: %{tools: %{}}
    }, state}
  end

  @impl true
  def handle_list_tools(_cursor, state) do
    tools = [
      %{
        name: "ping",
        description: "Simple ping tool",
        inputSchema: %{type: "object", properties: %{}}
      }
    ]
    {:ok, tools, nil, state}
  end
end

# Start the server
{:ok, server} = ExMCP.Server.HandlerServer.start_link(transport: :test, handler: MyHandler)

Summary

Functions

Returns a specification to start this module under a supervisor.

Starts a handler-based server.

Types

handler_module()

@type handler_module() :: module()

state()

@type state() :: %{
  handler_module: handler_module(),
  handler_state: any(),
  transport: any(),
  transport_state: any(),
  protocol_version: String.t() | nil
}

Functions

child_spec(init_arg)

Returns a specification to start this module under a supervisor.

See Supervisor.

start_link(opts)

@spec start_link(keyword()) :: GenServer.on_start()

Starts a handler-based server.

Options

  • :handler - Module implementing ExMCP.Server.Handler behaviour (required)
  • :transport - Transport type (:test, :stdio, :http, etc.)
  • :handler_args - Optional term passed to handler.init/1 (default: [])
  • Other options are passed to the transport