Class: Mcp::ClientManager

Inherits:
Object
  • Object
show all
Defined in:
lib/mcp/client_manager.rb

Overview

Connects to MCP servers and registers their tools with Tools::Registry. Each configured server (HTTP or stdio) gets a dedicated MCP::Client instance, cached for the worker’s lifetime. Connection failures are logged and skipped — a misconfigured or unavailable server does not prevent other servers or built-in tools from working.

Spawned stdio processes are reaped on worker exit via StdioTransport.cleanup_all.

The cache is built once on the first #register_tools call and never invalidated; edits to mcp.toml require a worker restart.

Examples:

Mcp::ClientManager.shared.register_tools(registry)

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config: Config.new(logger: Rails.logger)) ⇒ ClientManager

Returns a new instance of ClientManager.

Parameters:

  • config (Mcp::Config) (defaults to: Config.new(logger: Rails.logger))

    injectable config for testing



30
31
32
# File 'lib/mcp/client_manager.rb', line 30

def initialize(config: Config.new(logger: Rails.logger))
  @config = config
end

Class Method Details

.sharedMcp::ClientManager

Lazily-instantiated process-wide manager. Production code should call shared; new is reserved for tests and internal use.

Returns:



25
26
27
# File 'lib/mcp/client_manager.rb', line 25

def self.shared
  @shared ||= new
end

Instance Method Details

#register_tools(registry) ⇒ Array<String>

Connects to every configured MCP server on first call, caches the resulting tool wrappers, and registers them in the given registry.

Parameters:

Returns:

  • (Array<String>)

    warning messages from configuration plus any per-server load failures



41
42
43
44
45
# File 'lib/mcp/client_manager.rb', line 41

def register_tools(registry)
  load_servers if @wrappers.nil?
  @wrappers.each { |wrapper| registry.register(wrapper) }
  @config.warnings + @warnings
end