Class: ActionMCP::ResourceTemplate

Inherits:
Object
  • Object
show all
Includes:
CurrentHelpers, ResourceCallbacks, UriAmbiguityChecker, ActiveModel::Model, ActiveModel::Validations
Defined in:
lib/action_mcp/resource_template.rb

Direct Known Subclasses

ApplicationMCPResTemplate

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(attributes = {}) ⇒ ResourceTemplate

Initialize with attribute values



243
244
245
246
247
# File 'lib/action_mcp/resource_template.rb', line 243

def initialize(attributes = {})
  super(attributes)
  @execution_context = {}
  validate!
end

Class Attribute Details

._metaObject (readonly)

Returns the value of attribute _meta.



19
20
21
# File 'lib/action_mcp/resource_template.rb', line 19

def _meta
  @_meta
end

.description(value = nil) ⇒ Object (readonly)

Returns the value of attribute description.



19
20
21
# File 'lib/action_mcp/resource_template.rb', line 19

def description
  @description
end

.mime_type(value = nil) ⇒ Object (readonly)

Returns the value of attribute mime_type.



19
20
21
# File 'lib/action_mcp/resource_template.rb', line 19

def mime_type
  @mime_type
end

.parametersObject (readonly)

Returns the value of attribute parameters.



19
20
21
# File 'lib/action_mcp/resource_template.rb', line 19

def parameters
  @parameters
end

.registered_templatesObject (readonly)

Returns the value of attribute registered_templates.



19
20
21
# File 'lib/action_mcp/resource_template.rb', line 19

def registered_templates
  @registered_templates
end

.template_name(value = nil) ⇒ Object (readonly)

Returns the value of attribute template_name.



19
20
21
# File 'lib/action_mcp/resource_template.rb', line 19

def template_name
  @template_name
end

.uri_template(value = nil) ⇒ Object (readonly)

Returns the value of attribute uri_template.



19
20
21
# File 'lib/action_mcp/resource_template.rb', line 19

def uri_template
  @uri_template
end

Instance Attribute Details

#descriptionObject (readonly)

Returns the value of attribute description.



16
17
18
# File 'lib/action_mcp/resource_template.rb', line 16

def description
  @description
end

#execution_contextObject (readonly)

Returns the value of attribute execution_context.



16
17
18
# File 'lib/action_mcp/resource_template.rb', line 16

def execution_context
  @execution_context
end

#mime_typeObject (readonly)

Returns the value of attribute mime_type.



16
17
18
# File 'lib/action_mcp/resource_template.rb', line 16

def mime_type
  @mime_type
end

#uri_templateObject (readonly)

Returns the value of attribute uri_template.



16
17
18
# File 'lib/action_mcp/resource_template.rb', line 16

def uri_template
  @uri_template
end

Class Method Details

.abstract!Object



26
27
28
29
30
31
32
# File 'lib/action_mcp/resource_template.rb', line 26

def abstract!
  @abstract = true
  # Unregister from the appropriate registry if already registered
  return unless ActionMCP::ResourceTemplatesRegistry.items.values.include?(self)

  ActionMCP::ResourceTemplatesRegistry.unregister(self)
end

.abstract?Boolean

Returns:

  • (Boolean)


22
23
24
# File 'lib/action_mcp/resource_template.rb', line 22

def abstract?
  @abstract ||= false
end

.capability_nameObject



125
126
127
128
129
# File 'lib/action_mcp/resource_template.rb', line 125

def capability_name
  return "" if name.nil?

  @capability_name ||= name.demodulize.underscore.sub(/_template$/, "")
end

.inherited(subclass) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
# File 'lib/action_mcp/resource_template.rb', line 34

def inherited(subclass)
  super
  subclass.instance_variable_set(:@abstract, false)
  # Create a copy of validation requirements for subclasses
  subclass.instance_variable_set(:@required_parameters, [])

  # Run the ActiveSupport load hook when a resource template is defined
  subclass.class_eval do
    ActiveSupport.run_load_hooks(:action_mcp_resource_template, subclass)
  end
end

.meta(data = nil) ⇒ Object

Sets or retrieves the _meta field



98
99
100
101
102
103
104
105
106
107
# File 'lib/action_mcp/resource_template.rb', line 98

def meta(data = nil)
  if data
    raise ArgumentError, "_meta must be a hash" unless data.is_a?(Hash)

    @_meta ||= {}
    @_meta = @_meta.merge(data)
  else
    @_meta || {}
  end
end

.parameter(name, description:, required: false, **options) ⇒ Object Also known as: attribute



56
57
58
59
60
61
62
63
64
65
# File 'lib/action_mcp/resource_template.rb', line 56

def parameter(name, description:, required: false, **options)
  @parameters ||= {}
  @parameters[name] = { description: description, required: required, **options }

  # Define attribute accessor if not already defined
  attr_accessor name unless method_defined?(name) && method_defined?("#{name}=")

  # Track required parameters for validation
  required_parameters << name if required
end

.process(uri_string) ⇒ Object

Process a URI string to create a template instance



132
133
134
135
136
137
138
139
140
141
# File 'lib/action_mcp/resource_template.rb', line 132

def process(uri_string)
  return nil unless @uri_template

  # Extract parameters from URI using pattern matching
  params = extract_params_from_uri(uri_string)
  return new if params.nil? # Return invalid template for bad URI

  # Create new instance with the extracted parameters
  new(params)
end

.required_parametersObject

Track required parameters for validation



47
48
49
# File 'lib/action_mcp/resource_template.rb', line 47

def required_parameters
  @required_parameters ||= []
end

.to_hObject



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/action_mcp/resource_template.rb', line 109

def to_h
  name_value = defined?(@template_name) ? @template_name : name.demodulize.underscore.gsub(/_template$/, "")

  result = {
    uriTemplate: @uri_template,
    name: name_value,
    description: @description,
    mimeType: @mime_type
  }.compact

  # Add _meta if present
  result[:_meta] = @_meta if @_meta&.any?

  result
end

.uri_regex_cacheObject

Cache compiled regex patterns for URI matching to avoid recompilation



52
53
54
# File 'lib/action_mcp/resource_template.rb', line 52

def uri_regex_cache
  @uri_regex_cache ||= {}
end

Instance Method Details

#callObject



270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
# File 'lib/action_mcp/resource_template.rb', line 270

def call
  @response = ResourceResponse.new

  # Validate parameters first
  unless valid?
    missing_params = errors.full_messages
    @response.mark_as_parameter_validation_failed!(missing_params, "template://#{self.class.name}")
    return @response
  end

  begin
    run_callbacks :resolve do
      result = resolve
      if result.nil?
        @response.mark_as_not_found!("template://#{self.class.name}")
      else
        @response.add_content(result)
      end
      @response
    end
  rescue StandardError => e
    @response.mark_as_resolution_failed!("template://#{self.class.name}", e.message)
  end

  @response
end

#sessionObject



259
260
261
# File 'lib/action_mcp/resource_template.rb', line 259

def session
  execution_context[:session]
end

#validate!Object

Override validate! to not raise exceptions



250
251
252
# File 'lib/action_mcp/resource_template.rb', line 250

def validate!
  valid?
end

#with_context(context) ⇒ Object



254
255
256
257
# File 'lib/action_mcp/resource_template.rb', line 254

def with_context(context)
  @execution_context = context
  self
end