Class: RailsMcp::Tools::FindRecord

Inherits:
MCP::Tool
  • Object
show all
Defined in:
lib/rails_mcp/tools/find_record.rb

Class Method Summary collapse

Class Method Details

.call(model:, id:, server_context:, fields: []) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/rails_mcp/tools/find_record.rb', line 20

def self.call(model:, id:, server_context:, fields: [])
  result = Database::RoleProxy.with_role do
    klass  = Database::ModelResolver.resolve(model)
    record = klass.find_by(klass.primary_key => id)

    raise Database::ModelResolver::UnknownModel, "#{model} with id=#{id} not found" unless record

    # Pre-query: resolve and validate fields against the same allowed set QueryBuilder uses
    allowed  = allowed_columns(klass)
    resolved = Array(fields).map(&:to_s)
    resolved = RailsMcp.configuration.default_fields.map(&:to_s) & allowed if resolved.empty?

    unknown = resolved - allowed
    raise Database::QueryBuilder::Error, "Unknown field(s): #{unknown.join(", ")}" if unknown.any?

    # Post-query: strip denied columns from output regardless of how resolved was built
    resolved
      .reject { |f| RailsMcp.configuration.column_denied?(f) }
      .to_h { |f| [f, record.public_send(f)] }
  end
  MCP::Tool::Response.new([{ type: "text", text: result.to_json }])
end