Module: Legion::MCP::DeferredRegistry

Defined in:
lib/legion/mcp/deferred_registry.rb

Constant Summary collapse

ALWAYS_LOADED =

Tools that are ALWAYS fully loaded (never deferred). These are high-frequency entry points or meta-tools.

%w[
  legion.do
  legion.tools
  legion.run_task
  legion.list_tasks
  legion.get_task
  legion.get_status
  legion.describe_runner
  legion.plan_action
  legion.query_knowledge
  legion.knowledge_context
  legion.knowledge_health
  legion.absorb
  legion.get_task_logs
].freeze

Class Method Summary collapse

Class Method Details

.always_loaded_toolsObject



35
36
37
38
39
40
41
42
43
44
45
# File 'lib/legion/mcp/deferred_registry.rb', line 35

def always_loaded_tools
  return @always_loaded_cache if @always_loaded_cache

  base = ALWAYS_LOADED.dup
  if defined?(Legion::Tools::Registry) && Legion::Tools::Registry.respond_to?(:tools)
    registry_always = Legion::Tools::Registry.tools(:always)
    base |= registry_always.map(&:tool_name) if registry_always.is_a?(Array)
  end
  custom = Legion::Settings.dig(:mcp, :deferred_loading, :always_loaded)
  @always_loaded_cache = custom.is_a?(Array) ? (base | custom) : base
end

.build_tools_list(tool_classes) ⇒ Object



62
63
64
65
66
67
68
69
70
# File 'lib/legion/mcp/deferred_registry.rb', line 62

def build_tools_list(tool_classes)
  tool_classes.map do |tc|
    if deferred?(tc)
      deferred_entry(tc)
    else
      full_entry(tc)
    end
  end
end

.deferred?(tool_class) ⇒ Boolean

Returns:

  • (Boolean)


47
48
49
50
51
52
# File 'lib/legion/mcp/deferred_registry.rb', line 47

def deferred?(tool_class)
  return false unless enabled?

  name = tool_class.respond_to?(:tool_name) ? tool_class.tool_name : tool_class.name
  !always_loaded_tools.include?(name)
end

.deferred_entry(tool_class) ⇒ Object



54
55
56
# File 'lib/legion/mcp/deferred_registry.rb', line 54

def deferred_entry(tool_class)
  { name: tool_class.tool_name, description: tool_class.description }
end

.enabled?Boolean

Returns:

  • (Boolean)


30
31
32
33
# File 'lib/legion/mcp/deferred_registry.rb', line 30

def enabled?
  setting = Legion::Settings.dig(:mcp, :deferred_loading, :enabled)
  setting.nil? || setting
end

.full_entry(tool_class) ⇒ Object



58
59
60
# File 'lib/legion/mcp/deferred_registry.rb', line 58

def full_entry(tool_class)
  tool_class.to_h
end

.reset_cache!Object



26
27
28
# File 'lib/legion/mcp/deferred_registry.rb', line 26

def reset_cache!
  @always_loaded_cache = nil
end

.resolve_schemas(tool_names, tool_classes) ⇒ Object



72
73
74
75
76
77
78
79
# File 'lib/legion/mcp/deferred_registry.rb', line 72

def resolve_schemas(tool_names, tool_classes)
  tool_names.filter_map do |name|
    tc = tool_classes.find { |klass| klass.tool_name == name }
    next unless tc

    tc.to_h
  end
end