diff --git a/Library/Homebrew/rubocops/extend/formula.rb b/Library/Homebrew/rubocops/extend/formula.rb
index d3e75ea34f7ff8624cb0baeff2c3293ac2f3a905..e985631bebb7984f31f80cfd69b1f0ca5668beff 100644
--- a/Library/Homebrew/rubocops/extend/formula.rb
+++ b/Library/Homebrew/rubocops/extend/formula.rb
@@ -473,8 +473,9 @@ module RuboCop
         match_obj[1]
       end
 
-      # Returns whether the current formula exists in the given style exception list
-      def tap_style_exception?(list)
+      # Returns whether the given formula exists in the given style exception list.
+      # Defaults to the current formula being checked.
+      def tap_style_exception?(list, formula = nil)
         if @tap_style_exceptions.blank? && formula_tap.present?
           @tap_style_exceptions = {}
 
@@ -495,7 +496,7 @@ module RuboCop
         return false if @tap_style_exceptions.blank?
         return false unless @tap_style_exceptions.key? list
 
-        @tap_style_exceptions[list].include? @formula_name
+        @tap_style_exceptions[list].include?(formula || @formula_name)
       end
 
       private
diff --git a/Library/Homebrew/rubocops/uses_from_macos.rb b/Library/Homebrew/rubocops/uses_from_macos.rb
index 77804e677b31b3e6ab479671e0563b82ac1a123a..539de517fbdee445d95080d1dc58a5d3a33d4cb9 100644
--- a/Library/Homebrew/rubocops/uses_from_macos.rb
+++ b/Library/Homebrew/rubocops/uses_from_macos.rb
@@ -6,82 +6,20 @@ require "rubocops/extend/formula"
 module RuboCop
   module Cop
     module FormulaAudit
+      # This cop audits formulae that are keg-only because they are provided by macos.
+      class ProvidedByMacos < FormulaCop
+        def audit_formula(_node, _class_node, _parent_class_node, body_node)
+          find_method_with_args(body_node, :keg_only, :provided_by_macos) do
+            unless tap_style_exception? :provided_by_macos_formulae
+              problem "Formulae that are `keg_only :provided_by_macos` should be added to "\
+                      "`style_exceptions/provided_by_macos_formulae.json`"
+            end
+          end
+        end
+      end
+
       # This cop audits `uses_from_macos` dependencies in formulae.
       class UsesFromMacos < FormulaCop
-        # Generate with:
-        #
-        # ```
-        # brew ruby -e 'puts Formula.select {|f| f.keg_only_reason&.provided_by_macos? }.map(&:name).sort.join("\n")'
-        # ```
-        #
-        # Not done at runtime as it's too slow and RuboCop doesn't have access.
-        PROVIDED_BY_MACOS_FORMULAE = %w[
-          apr
-          bc
-          bison
-          bzip2
-          cups
-          curl
-          dyld-headers
-          ed
-          expat
-          file-formula
-          flex
-          gcore
-          gnu-getopt
-          icu4c
-          krb5
-          libarchive
-          libedit
-          libffi
-          libiconv
-          libpcap
-          libressl
-          libxml2
-          libxslt
-          llvm
-          lsof
-          m4
-          ncompress
-          ncurses
-          net-snmp
-          openldap
-          openlibm
-          pod2man
-          rpcgen
-          ruby
-          sqlite
-          ssh-copy-id
-          swift
-          tcl-tk
-          texinfo
-          unifdef
-          unzip
-          zip
-          zlib
-        ].freeze
-
-        # These formulae aren't `keg_only :provided_by_macos` but are provided by
-        # macOS (or very similarly, e.g. OpenSSL where system provides LibreSSL).
-        # TODO: consider making some of these keg-only.
-        ALLOWED_USES_FROM_MACOS_DEPS = (PROVIDED_BY_MACOS_FORMULAE + %w[
-          bash
-          cpio
-          expect
-          groff
-          gzip
-          openssl
-          openssl@1.1
-          perl
-          php
-          python
-          python@3
-          rsync
-          vim
-          xz
-          zsh
-        ]).freeze
-
         def audit_formula(_node, _class_node, _parent_class_node, body_node)
           find_method_with_args(body_node, :uses_from_macos, /^"(.+)"/).each do |method|
             dep = if parameters(method).first.instance_of?(RuboCop::AST::StrNode)
@@ -90,7 +28,8 @@ module RuboCop
               parameters(method).first.keys.first
             end
 
-            next if ALLOWED_USES_FROM_MACOS_DEPS.include?(string_content(dep))
+            next if tap_style_exception? :provided_by_macos_formulae, string_content(dep)
+            next if tap_style_exception? :non_keg_only_provided_by_macos_formulae, string_content(dep)
 
             problem "`uses_from_macos` should only be used for macOS dependencies, not #{string_content(dep)}."
           end
diff --git a/Library/Homebrew/test/rubocops/uses_from_macos_spec.rb b/Library/Homebrew/test/rubocops/uses_from_macos_spec.rb
index 6a1280050518b653458d5f91c71367f37800d942..7495d680b2313ef6b7c2e99837842822dc14c6ec 100644
--- a/Library/Homebrew/test/rubocops/uses_from_macos_spec.rb
+++ b/Library/Homebrew/test/rubocops/uses_from_macos_spec.rb
@@ -17,6 +17,4 @@ describe RuboCop::Cop::FormulaAudit::UsesFromMacos do
       end
     RUBY
   end
-
-  include_examples "formulae exist", described_class::ALLOWED_USES_FROM_MACOS_DEPS
 end