Module: SolidLoop::Mcp::ClientFactory
- Defined in:
- lib/solid_loop/mcp/client_factory.rb
Overview
Resolves an agent mcps entry into a transport and a protocol client.
Three entry forms (name: is required in all):
{ name:, url:, api_token:, ... } — HTTP sugar -> Mcp::HttpTransport
{ name:, toolset: SearchTools } — in-process -> the toolset itself
{ name:, transport: object } — general form -> any Mcp::Transport
Class Method Summary collapse
- .client_for(mcp_config, context: nil) ⇒ Object
- .transport_for(mcp_config) ⇒ Object
- .transport_kind(mcp_config) ⇒ Object
-
.validate_session_recovery!(mcp_config) ⇒ Object
Validated eagerly — a typo must surface at session init, not months later when a session actually expires.
Class Method Details
.client_for(mcp_config, context: nil) ⇒ Object
11 12 13 14 15 16 17 18 19 20 |
# File 'lib/solid_loop/mcp/client_factory.rb', line 11 def client_for(mcp_config, context: nil) validate_session_recovery!(mcp_config) SolidLoop::McpClient.new( transport: transport_for(mcp_config), context: context, initialize_params: mcp_config[:initialize_params] || {}, stateless: mcp_config.fetch(:stateless, transport_kind(mcp_config) != "http") ) end |
.transport_for(mcp_config) ⇒ Object
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/solid_loop/mcp/client_factory.rb', line 22 def transport_for(mcp_config) if (toolset = mcp_config[:toolset]) toolset.is_a?(Class) ? toolset.new : toolset elsif mcp_config[:transport] mcp_config[:transport] elsif mcp_config[:url] HttpTransport.new( url: mcp_config[:url], token: mcp_config[:api_token] || ENV["MCP_API_TOKEN"], timeout: mcp_config[:timeout] || 60, headers: mcp_config[:custom_headers] || {} ) else raise SolidLoop::McpError, "MCP config '#{mcp_config[:name]}' must provide url:, toolset:, or transport:" end end |
.transport_kind(mcp_config) ⇒ Object
50 51 52 53 54 55 56 57 58 |
# File 'lib/solid_loop/mcp/client_factory.rb', line 50 def transport_kind(mcp_config) return "local" if mcp_config[:toolset] if (transport = mcp_config[:transport]) return transport.is_a?(StdioTransport) ? "stdio" : "custom" end "http" end |
.validate_session_recovery!(mcp_config) ⇒ Object
Validated eagerly — a typo must surface at session init, not months later when a session actually expires.
42 43 44 45 46 47 48 |
# File 'lib/solid_loop/mcp/client_factory.rb', line 42 def validate_session_recovery!(mcp_config) value = mcp_config.fetch(:session_recovery, :auto).to_sym return if %i[auto fail].include?(value) raise SolidLoop::McpError, "Invalid session_recovery #{value.inspect} for '#{mcp_config[:name]}' (use :auto or :fail)" end |