Class: RubyLLM::MCP::Auth::ClientRegistrar

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_llm/mcp/auth/client_registrar.rb

Overview

Service for registering OAuth clients Implements RFC 7591 (Dynamic Client Registration)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(http_client, storage, logger, config) ⇒ ClientRegistrar

Returns a new instance of ClientRegistrar.



11
12
13
14
15
16
# File 'lib/ruby_llm/mcp/auth/client_registrar.rb', line 11

def initialize(http_client, storage, logger, config)
  @http_client = http_client
  @storage = storage
  @logger = logger
  @config = config
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config.



9
10
11
# File 'lib/ruby_llm/mcp/auth/client_registrar.rb', line 9

def config
  @config
end

#http_clientObject (readonly)

Returns the value of attribute http_client.



9
10
11
# File 'lib/ruby_llm/mcp/auth/client_registrar.rb', line 9

def http_client
  @http_client
end

#loggerObject (readonly)

Returns the value of attribute logger.



9
10
11
# File 'lib/ruby_llm/mcp/auth/client_registrar.rb', line 9

def logger
  @logger
end

#storageObject (readonly)

Returns the value of attribute storage.



9
10
11
# File 'lib/ruby_llm/mcp/auth/client_registrar.rb', line 9

def storage
  @storage
end

Instance Method Details

#get_or_register(server_url, server_metadata, grant_type, redirect_uri, scope) ⇒ ClientInfo

Get cached client info or register new client

Parameters:

  • server_url (String)

    MCP server URL

  • server_metadata (ServerMetadata)

    server metadata

  • grant_type (Symbol)

    :authorization_code or :client_credentials

  • redirect_uri (String)

    redirect URI for authorization code flow

  • scope (String, nil)

    requested scope

Returns:



25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/ruby_llm/mcp/auth/client_registrar.rb', line 25

def get_or_register(server_url, , grant_type, redirect_uri, scope)
  # Check cache first
  client_info = storage.get_client_info(server_url)
  return client_info if client_info && !client_info.client_secret_expired?

  # Register new client if no cached info or secret expired
  if .supports_registration?
    register(server_url, , grant_type, redirect_uri, scope)
  else
    raise Errors::TransportError.new(
      message: "OAuth server does not support dynamic client registration"
    )
  end
end

#register(server_url, server_metadata, grant_type, redirect_uri, scope) ⇒ ClientInfo

Register OAuth client dynamically (RFC 7591)

Parameters:

  • server_url (String)

    MCP server URL

  • server_metadata (ServerMetadata)

    server metadata

  • grant_type (Symbol)

    :authorization_code or :client_credentials

  • redirect_uri (String)

    redirect URI for authorization code flow

  • scope (String, nil)

    requested scope

Returns:



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/ruby_llm/mcp/auth/client_registrar.rb', line 47

def register(server_url, , grant_type, redirect_uri, scope)
  logger.debug("Registering OAuth client at: #{.registration_endpoint}")

   = (grant_type, redirect_uri, scope)
  response = post_registration(, )
  data = HttpResponseHandler.handle_response(response, context: "Client registration",
                                                       expected_status: [200, 201])

   = (data, redirect_uri)
  warn_redirect_uri_mismatch(, redirect_uri)

  client_info = create_client_info(data, )
  storage.set_client_info(server_url, client_info)
  logger.debug("Client registered successfully: #{client_info.client_id}")
  client_info
end