Class: AdminSuite::Mcp::Tools::DescribeResources

Inherits:
MCP::Tool
  • Object
show all
Defined in:
lib/admin_suite/mcp/tools/describe_resources.rb

Class Method Summary collapse

Class Method Details

.call(server_context:) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/admin_suite/mcp/tools/describe_resources.rb', line 12

def self.call(server_context:)
  AdminSuite::Mcp.instrument(tool: "describe_resources", actor: server_context[:actor], request: server_context[:request]) do
    allowed = false
    if AdminSuite.config.authorize.nil? || Auth.normalize_actor(server_context[:actor]).nil?
      [Authorization.denied_response, nil, false]
    else
      allowed = true
      payload = Authorization
        .readable_resources(actor: server_context[:actor], request: server_context[:request])
        .map { |config| describe(config) }
      response = ::MCP::Tool::Response.new([{ type: "text", text: Serializer.dump(payload) }])
      [response, payload.size, true]
    end
  rescue StandardError => e
    Rails.logger&.warn("AdminSuite MCP describe_resources failed: #{e.class}: #{e.message}")
    [Authorization.error_response("describe_resources failed"), nil, allowed]
  end
end

.describe(config) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/admin_suite/mcp/tools/describe_resources.rb', line 31

def self.describe(config)
  index = config.index_config
  {
    name: config.resource_name,
    model: config.model_class.to_s,
    portal: config.portal_name,
    section: config.section_name,
    fields: Array(index&.columns_list).map do |column|
      { name: column.name, label: column.header, type: column.type }
    end,
    filters: Array(index&.filters_list).map(&:name),
    sortable: Array(index&.sortable_fields),
    searchable: Array(index&.searchable_fields),
    default_page_size: index&.per_page,
    actions: declared_actions(config)
  }
end