diff --git a/requester/mctp_endpoint_discovery.cpp b/requester/mctp_endpoint_discovery.cpp
new file mode 100644
index 0000000..b95935f
--- /dev/null
+++ b/requester/mctp_endpoint_discovery.cpp
@@ -0,0 +1,106 @@
+#include "mctp_endpoint_discovery.hpp"
+
+#include "libpldm/requester/pldm.h"
+
+#include "common/types.hpp"
+#include "common/utils.hpp"
+
+#include <algorithm>
+#include <map>
+#include <string>
+#include <string_view>
+#include <vector>
+
+namespace pldm
+{
+
+MctpDiscovery::MctpDiscovery(sdbusplus::bus::bus& bus,
+                             fw_update::Manager* fwManager) :
+    bus(bus),
+    fwManager(fwManager),
+    mctpEndpointSignal(bus,
+                       sdbusplus::bus::match::rules::interfacesAdded(
+                           "/xyz/openbmc_project/mctp"),
+                       std::bind_front(&MctpDiscovery::dicoverEndpoints, this))
+{
+    dbus::ObjectValueTree objects;
+
+    try
+    {
+        auto method = bus.new_method_call(
+            "xyz.openbmc_project.MCTP.Control", "/xyz/openbmc_project/mctp",
+            "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
+        auto reply = bus.call(method);
+        reply.read(objects);
+    }
+    catch (const std::exception& e)
+    {
+        return;
+    }
+
+    std::vector<mctp_eid_t> eids;
+
+    for (const auto& [objectPath, interfaces] : objects)
+    {
+        for (const auto& [intfName, properties] : interfaces)
+        {
+            if (intfName == mctpEndpointIntfName)
+            {
+                if (properties.contains("EID") &&
+                    properties.contains("SupportedMessageTypes"))
+                {
+                    auto eid = std::get<size_t>(properties.at("EID"));
+                    auto types = std::get<std::vector<uint8_t>>(
+                        properties.at("SupportedMessageTypes"));
+                    if (std::find(types.begin(), types.end(), mctpTypePLDM) !=
+                        types.end())
+                    {
+                        eids.emplace_back(eid);
+                    }
+                }
+            }
+        }
+    }
+
+    if (eids.size() && fwManager)
+    {
+        fwManager->handleMCTPEndpoints(eids);
+    }
+}
+
+void MctpDiscovery::dicoverEndpoints(sdbusplus::message::message& msg)
+{
+    constexpr std::string_view mctpEndpointIntfName{
+        "xyz.openbmc_project.MCTP.Endpoint"};
+    std::vector<mctp_eid_t> eids;
+
+    sdbusplus::message::object_path objPath;
+    std::map<std::string, std::map<std::string, dbus::Value>> interfaces;
+    msg.read(objPath, interfaces);
+
+    for (const auto& [intfName, properties] : interfaces)
+    {
+        if (intfName == mctpEndpointIntfName)
+        {
+            if (properties.contains("EID") &&
+                properties.contains("SupportedMessageTypes"))
+            {
+                auto eid = std::get<size_t>(properties.at("EID"));
+                auto types = std::get<std::vector<uint8_t>>(
+                    properties.at("SupportedMessageTypes"));
+                if (std::find(types.begin(), types.end(), mctpTypePLDM) !=
+                    types.end())
+                {
+                    eids.emplace_back(eid);
+                }
+            }
+        }
+    }
+
+    if (eids.size() && fwManager)
+    {
+        fwManager->handleMCTPEndpoints(eids);
+    }
+}
+
+} // namespace pldm
\ No newline at end of file
diff --git a/requester/mctp_endpoint_discovery.hpp b/requester/mctp_endpoint_discovery.hpp
new file mode 100644
index 0000000..b09a2e9
--- /dev/null
+++ b/requester/mctp_endpoint_discovery.hpp
@@ -0,0 +1,46 @@
+#pragma once
+
+#include "fw-update/manager.hpp"
+
+#include <sdbusplus/bus/match.hpp>
+
+namespace pldm
+{
+
+class MctpDiscovery
+{
+  public:
+    MctpDiscovery() = delete;
+    MctpDiscovery(const MctpDiscovery&) = delete;
+    MctpDiscovery(MctpDiscovery&&) = delete;
+    MctpDiscovery& operator=(const MctpDiscovery&) = delete;
+    MctpDiscovery& operator=(MctpDiscovery&&) = delete;
+    ~MctpDiscovery() = default;
+
+    /** @brief Constructs the MCTP Discovery object to handle discovery of
+     *         MCTP enabled devices
+     *
+     *  @param[in] bus - reference to systemd bus
+     *  @param[in] fwManager - pointer to the firmware manager
+     */
+    explicit MctpDiscovery(sdbusplus::bus::bus& bus,
+                           fw_update::Manager* fwManager);
+
+  private:
+    /** @brief reference to the systemd bus */
+    sdbusplus::bus::bus& bus;
+
+    fw_update::Manager* fwManager;
+
+    /** @brief Used to watch for new MCTP endpoints */
+    sdbusplus::bus::match_t mctpEndpointSignal;
+
+    void dicoverEndpoints(sdbusplus::message::message& msg);
+
+    static constexpr uint8_t mctpTypePLDM = 1;
+
+    static constexpr std::string_view mctpEndpointIntfName{
+        "xyz.openbmc_project.MCTP.Endpoint"};
+};
+
+} // namespace pldm
\ No newline at end of file
