Class: RubyLLM::MCP::Adapters::MCPTransports::StreamableHTTP

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_llm/mcp/adapters/mcp_transports/streamable_http.rb

Overview

Custom Streamable HTTP transport for MCP SDK adapter Wraps the native StreamableHTTP transport to provide the interface expected by MCP::Client

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(url:, headers: {}, version: :http2, request_timeout: 10_000, reconnection: {}, oauth_provider: nil, rate_limit: nil, session_id: nil, protocol_version: RubyLLM::MCP.config.protocol_version, notification_callback: nil) ⇒ StreamableHTTP

rubocop:disable Metrics/ParameterLists



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/ruby_llm/mcp/adapters/mcp_transports/streamable_http.rb', line 9

def initialize(url:, headers: {}, version: :http2, request_timeout: 10_000, # rubocop:disable Metrics/ParameterLists
               reconnection: {}, oauth_provider: nil, rate_limit: nil, session_id: nil,
               protocol_version: RubyLLM::MCP.config.protocol_version, notification_callback: nil)
  # Create a minimal coordinator-like object for the native transport
  @coordinator = CoordinatorStub.new(
    protocol_version: protocol_version,
    notification_callback: notification_callback
  )
  @initialized = false

  @native_transport = RubyLLM::MCP::Native::Transports::StreamableHTTP.new(
    url: url,
    headers: headers,
    version: version,
    coordinator: @coordinator,
    request_timeout: request_timeout,
    reconnection: reconnection,
    oauth_provider: oauth_provider,
    rate_limit: rate_limit,
    session_id: session_id
  )

  @coordinator.transport = @native_transport
end

Instance Attribute Details

#native_transportObject (readonly)

Returns the value of attribute native_transport.



7
8
9
# File 'lib/ruby_llm/mcp/adapters/mcp_transports/streamable_http.rb', line 7

def native_transport
  @native_transport
end

Instance Method Details

#closeObject



38
39
40
41
# File 'lib/ruby_llm/mcp/adapters/mcp_transports/streamable_http.rb', line 38

def close
  @initialized = false
  @native_transport.close
end

#send_request(request:) ⇒ Hash

Send a JSON-RPC request and return the response This is the interface expected by MCP::Client

Parameters:

  • request (Hash)

    A JSON-RPC request object

Returns:

  • (Hash)

    A JSON-RPC response object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/ruby_llm/mcp/adapters/mcp_transports/streamable_http.rb', line 48

def send_request(request:)
  # Auto-initialize on first non-initialize request
  # Streamable HTTP servers require initialization before other requests
  unless @initialized || request[:method] == "initialize" || request["method"] == "initialize"
    perform_initialization
  end

  unless request["id"] || request[:id]
    request["id"] = SecureRandom.uuid
  end
  result = @native_transport.request(request, wait_for_response: true)

  if result.is_a?(RubyLLM::MCP::Result)
    result.response
  else
    result
  end
end

#startObject



34
35
36
# File 'lib/ruby_llm/mcp/adapters/mcp_transports/streamable_http.rb', line 34

def start
  @native_transport.start
end