Class: RosettAi::Mcp::Admin::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/rosett_ai/mcp/admin/registry.rb

Overview

Registry of configured MCP servers.

Manages discovery, storage, and querying of MCP server configurations from XDG-compliant paths.

Author:

  • hugo

  • claude

Constant Summary collapse

CONFIG_DIR =
'.config/rosett-ai/mcp/servers'

Instance Method Summary collapse

Constructor Details

#initialize(config_dir: nil) ⇒ Registry

Returns a new instance of Registry.

Parameters:

  • config_dir (Pathname, nil) (defaults to: nil)

    override config directory



20
21
22
# File 'lib/rosett_ai/mcp/admin/registry.rb', line 20

def initialize(config_dir: nil)
  @config_dir = config_dir || Pathname.new(Dir.home).join(CONFIG_DIR)
end

Instance Method Details

#add(config) ⇒ Pathname

Adds a server configuration.

Parameters:

  • config (Hash)

    server configuration

Returns:

  • (Pathname)

    path to the written file



45
46
47
48
49
50
51
52
# File 'lib/rosett_ai/mcp/admin/registry.rb', line 45

def add(config)
  FileUtils.mkdir_p(@config_dir)
  name = config.fetch('name') { config.fetch(:name) }
  path = @config_dir.join("#{name}.yml")

  File.write(path, YAML.dump(stringify_keys(config)))
  path
end

#config_pathsArray<Pathname>

Returns all server config file paths.

Returns:

  • (Array<Pathname>)


69
70
71
72
73
# File 'lib/rosett_ai/mcp/admin/registry.rb', line 69

def config_paths
  return [] unless @config_dir.directory?

  @config_dir.glob('*.yml')
end

#find(name) ⇒ Hash?

Finds a server by name.

Parameters:

  • name (String)

    server name

Returns:

  • (Hash, nil)

    server entry or nil



37
38
39
# File 'lib/rosett_ai/mcp/admin/registry.rb', line 37

def find(name)
  list.find { |s| s[:name] == name }
end

#listArray<Hash>

Lists all registered MCP servers.

Returns:

  • (Array<Hash>)

    server entries with :name, :transport, :command/:url



27
28
29
30
31
# File 'lib/rosett_ai/mcp/admin/registry.rb', line 27

def list
  return [] unless @config_dir.directory?

  @config_dir.glob('*.yml').filter_map { |path| load_server(path) }
end

#remove(name) ⇒ Boolean

Removes a server configuration.

Parameters:

  • name (String)

    server name

Returns:

  • (Boolean)

    true if removed



58
59
60
61
62
63
64
# File 'lib/rosett_ai/mcp/admin/registry.rb', line 58

def remove(name) # rubocop:disable Naming/PredicateMethod -- destructive action, not a predicate
  path = @config_dir.join("#{name}.yml")
  return false unless path.exist?

  File.delete(path)
  true
end