diff --git a/.clang-tidy b/.clang-tidy
index d892bdd..bed3fad 100644
--- a/.clang-tidy
+++ b/.clang-tidy
@@ -222,6 +222,7 @@
 cppcoreguidelines-pro-type-vararg,
 cppcoreguidelines-slicing,
 cppcoreguidelines-special-member-functions,
+google-explicit-constructor,
 misc-misplaced-const,
 #misc-no-recursion,
 misc-redundant-expression,
diff --git a/http/routing.hpp b/http/routing.hpp
index db25433..3a7b9c2 100644
--- a/http/routing.hpp
+++ b/http/routing.hpp
@@ -30,7 +30,7 @@
 class BaseRule
 {
   public:
-    BaseRule(const std::string& thisRule) : rule(thisRule)
+    explicit BaseRule(const std::string& thisRule) : rule(thisRule)
     {}
 
     virtual ~BaseRule() = default;
@@ -224,7 +224,7 @@
     template <typename Req, typename... Args>
     struct ReqHandlerWrapper
     {
-        ReqHandlerWrapper(Func fIn) : f(std::move(fIn))
+        explicit ReqHandlerWrapper(Func fIn) : f(std::move(fIn))
         {}
 
         void operator()(const Request& req,
@@ -328,7 +328,7 @@
     using self_t = WebSocketRule;
 
   public:
-    WebSocketRule(const std::string& ruleIn) : BaseRule(ruleIn)
+    explicit WebSocketRule(const std::string& ruleIn) : BaseRule(ruleIn)
     {}
 
     void validate() override
@@ -467,7 +467,7 @@
 class DynamicRule : public BaseRule, public RuleParameterTraits<DynamicRule>
 {
   public:
-    DynamicRule(const std::string& ruleIn) : BaseRule(ruleIn)
+    explicit DynamicRule(const std::string& ruleIn) : BaseRule(ruleIn)
     {}
 
     void validate() override
@@ -545,7 +545,7 @@
   public:
     using self_t = TaggedRule<Args...>;
 
-    TaggedRule(const std::string& ruleIn) : BaseRule(ruleIn)
+    explicit TaggedRule(const std::string& ruleIn) : BaseRule(ruleIn)
     {}
 
     void validate() override
diff --git a/http/utility.hpp b/http/utility.hpp
index 0b1743f..7b0af13 100644
--- a/http/utility.hpp
+++ b/http/utility.hpp
@@ -655,7 +655,8 @@
         return std::string_view(segment.data(), segment.size()) == expected;
     }
 
-    UrlSegmentMatcherVisitor(const boost::urls::string_value& segmentIn) :
+    explicit UrlSegmentMatcherVisitor(
+        const boost::urls::string_value& segmentIn) :
         segment(segmentIn)
     {}
 
diff --git a/include/openbmc_dbus_rest.hpp b/include/openbmc_dbus_rest.hpp
index 7641023..0e2af70 100644
--- a/include/openbmc_dbus_rest.hpp
+++ b/include/openbmc_dbus_rest.hpp
@@ -436,7 +436,7 @@
 // Structure for storing data on an in progress action
 struct InProgressActionData
 {
-    InProgressActionData(crow::Response& resIn) : res(resIn)
+    explicit InProgressActionData(crow::Response& resIn) : res(resIn)
     {}
     ~InProgressActionData()
     {
@@ -1781,7 +1781,7 @@
 
 struct AsyncPutRequest
 {
-    AsyncPutRequest(const std::shared_ptr<bmcweb::AsyncResp>& resIn) :
+    explicit AsyncPutRequest(const std::shared_ptr<bmcweb::AsyncResp>& resIn) :
         asyncResp(resIn)
     {}
     ~AsyncPutRequest()
diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp
index 3c47698..1785828 100644
--- a/redfish-core/include/event_service_manager.hpp
+++ b/redfish-core/include/event_service_manager.hpp
@@ -374,7 +374,8 @@
         // Subscription constructor
     }
 
-    Subscription(const std::shared_ptr<boost::beast::tcp_stream>& adaptor) :
+    explicit Subscription(
+        const std::shared_ptr<boost::beast::tcp_stream>& adaptor) :
         eventSeqNum(1)
     {
         sseConn = std::make_shared<crow::ServerSentEvents>(adaptor);
diff --git a/redfish-core/include/privileges.hpp b/redfish-core/include/privileges.hpp
index 160816f..f20cede 100644
--- a/redfish-core/include/privileges.hpp
+++ b/redfish-core/include/privileges.hpp
@@ -198,7 +198,8 @@
     }
 
   private:
-    Privileges(const std::bitset<maxPrivilegeCount>& p) : privilegeBitset{p}
+    explicit Privileges(const std::bitset<maxPrivilegeCount>& p) :
+        privilegeBitset{p}
     {}
     std::bitset<maxPrivilegeCount> privilegeBitset = 0;
 };
diff --git a/redfish-core/include/redfish.hpp b/redfish-core/include/redfish.hpp
index c961b2d..8c05dd7 100644
--- a/redfish-core/include/redfish.hpp
+++ b/redfish-core/include/redfish.hpp
@@ -62,7 +62,7 @@
      *
      * @param[in] app   Crow app on which Redfish will initialize
      */
-    RedfishService(App& app)
+    explicit RedfishService(App& app)
     {
         requestAccountServiceRoutes(app);
         requestRoutesRoles(app);
diff --git a/redfish-core/include/server_sent_events.hpp b/redfish-core/include/server_sent_events.hpp
index 6663f66..16d8e18 100644
--- a/redfish-core/include/server_sent_events.hpp
+++ b/redfish-core/include/server_sent_events.hpp
@@ -256,7 +256,8 @@
     ServerSentEvents(ServerSentEvents&&) = delete;
     ServerSentEvents& operator=(ServerSentEvents&&) = delete;
 
-    ServerSentEvents(const std::shared_ptr<boost::beast::tcp_stream>& adaptor) :
+    explicit ServerSentEvents(
+        const std::shared_ptr<boost::beast::tcp_stream>& adaptor) :
         sseConn(adaptor)
     {
         startSSE();
diff --git a/redfish-core/lib/certificate_service.hpp b/redfish-core/lib/certificate_service.hpp
index b931c7d..2fc606d 100644
--- a/redfish-core/lib/certificate_service.hpp
+++ b/redfish-core/lib/certificate_service.hpp
@@ -155,7 +155,7 @@
     CertificateFile& operator=(const CertificateFile&) = delete;
     CertificateFile(CertificateFile&&) = delete;
     CertificateFile& operator=(CertificateFile&&) = delete;
-    CertificateFile(const std::string& certString)
+    explicit CertificateFile(const std::string& certString)
     {
         std::array<char, 18> dirTemplate = {'/', 't', 'm', 'p', '/', 'C',
                                             'e', 'r', 't', 's', '.', 'X',
diff --git a/redfish-core/lib/health.hpp b/redfish-core/lib/health.hpp
index 04281bf..cf84c93 100644
--- a/redfish-core/lib/health.hpp
+++ b/redfish-core/lib/health.hpp
@@ -31,8 +31,10 @@
 struct HealthPopulate : std::enable_shared_from_this<HealthPopulate>
 {
     // By default populate status to "/Status" of |asyncResp->res.jsonValue|.
-    HealthPopulate(const std::shared_ptr<bmcweb::AsyncResp>& asyncRespIn) :
-        asyncResp(asyncRespIn), statusPtr("/Status")
+    explicit HealthPopulate(
+        const std::shared_ptr<bmcweb::AsyncResp>& asyncRespIn) :
+        asyncResp(asyncRespIn),
+        statusPtr("/Status")
     {}
 
     // Takes a JSON pointer rather than a reference. This is pretty useful when
diff --git a/redfish-core/lib/managers.hpp b/redfish-core/lib/managers.hpp
index f15fb0b..bda5a1a 100644
--- a/redfish-core/lib/managers.hpp
+++ b/redfish-core/lib/managers.hpp
@@ -1168,7 +1168,8 @@
 struct GetPIDValues : std::enable_shared_from_this<GetPIDValues>
 {
 
-    GetPIDValues(const std::shared_ptr<bmcweb::AsyncResp>& asyncRespIn) :
+    explicit GetPIDValues(
+        const std::shared_ptr<bmcweb::AsyncResp>& asyncRespIn) :
         asyncResp(asyncRespIn)
 
     {}
diff --git a/redfish-core/lib/sensors.hpp b/redfish-core/lib/sensors.hpp
index ca842d9..8b97b7c 100644
--- a/redfish-core/lib/sensors.hpp
+++ b/redfish-core/lib/sensors.hpp
@@ -307,7 +307,7 @@
 class InventoryItem
 {
   public:
-    InventoryItem(const std::string& objPath) : objectPath(objPath)
+    explicit InventoryItem(const std::string& objPath) : objectPath(objPath)
     {
         // Set inventory item name to last node of object path
         sdbusplus::message::object_path path(objectPath);
diff --git a/redfish-core/lib/task.hpp b/redfish-core/lib/task.hpp
index b1b1d22..dcad059 100644
--- a/redfish-core/lib/task.hpp
+++ b/redfish-core/lib/task.hpp
@@ -39,7 +39,7 @@
 
 struct Payload
 {
-    Payload(const crow::Request& req) :
+    explicit Payload(const crow::Request& req) :
         targetUri(req.url), httpOperation(req.methodString()),
         httpHeaders(nlohmann::json::array())
 
