diff --git a/platform-mc/manager.hpp b/platform-mc/manager.hpp
index 213f1f5..5654099 100644
--- a/platform-mc/manager.hpp
+++ b/platform-mc/manager.hpp
@@ -76,6 +76,32 @@
         terminusManager.removeMctpTerminus(mctpInfos);
     }
 
+    /** @brief Helper function to invoke registered handlers for
+     *  updating the availability status of the MCTP endpoint
+     *
+     *  @param[in] mctpInfo - information of the target endpoint
+     *  @param[in] availability - new availability status
+     */
+    void updateMctpEndpointAvailability(const MctpInfo& mctpInfo,
+                                        Availability availability)
+    {
+        /* Get TID of initialized terminus */
+        auto tid = terminusManager.toTid(mctpInfo);
+        if (tid)
+        {
+            if (availability)
+            {
+                sensorManager.startSensorPollTimer(tid.value());
+            }
+            else
+            {
+                sensorManager.disableTerminusSensors(tid.value());
+            }
+            updateAvailableState(tid.value(), availability);
+        }
+        terminusManager.updateMctpEndpointAvailability(mctpInfo, availability);
+    }
+
     /** @brief Helper function to start sensor polling of the terminus TID
      */
     void startSensorPolling(pldm_tid_t tid)
diff --git a/platform-mc/sensor_manager.cpp b/platform-mc/sensor_manager.cpp
index 5924106..d29e552 100644
--- a/platform-mc/sensor_manager.cpp
+++ b/platform-mc/sensor_manager.cpp
@@ -52,6 +52,11 @@
         event.get(),
         std::bind_front(&SensorManager::doSensorPolling, this, tid));
 
+    startSensorPollTimer(tid);
+}
+
+void SensorManager::startSensorPollTimer(pldm_tid_t tid)
+{
     try
     {
         if (sensorPollTimers[tid] && !sensorPollTimers[tid]->isRunning())
@@ -71,6 +76,22 @@
     }
 }
 
+void SensorManager::disableTerminusSensors(pldm_tid_t tid)
+{
+    if (!termini.contains(tid))
+    {
+        return;
+    }
+
+    // numeric sensor
+    auto terminus = termini[tid];
+    for (auto& sensor : terminus->numericSensors)
+    {
+        sensor->updateReading(true, false,
+                              std::numeric_limits<double>::quiet_NaN());
+    }
+}
+
 void SensorManager::stopPolling(pldm_tid_t tid)
 {
     /* Stop polling timer */
diff --git a/platform-mc/sensor_manager.hpp b/platform-mc/sensor_manager.hpp
index 29172bb..c82b336 100644
--- a/platform-mc/sensor_manager.hpp
+++ b/platform-mc/sensor_manager.hpp
@@ -44,6 +44,15 @@
      */
     void startPolling(pldm_tid_t tid);
 
+    /** @brief Helper function to start sensor polling timer
+     */
+    void startSensorPollTimer(pldm_tid_t tid);
+
+    /** @brief Helper function to set all terminus sensor as nan when the
+     *  terminus is not available for pldm request
+     */
+    void disableTerminusSensors(pldm_tid_t tid);
+
     /** @brief stopping sensor polling task
      */
     void stopPolling(pldm_tid_t tid);
diff --git a/platform-mc/terminus_manager.cpp b/platform-mc/terminus_manager.cpp
index dd5ee7f..be70740 100644
--- a/platform-mc/terminus_manager.cpp
+++ b/platform-mc/terminus_manager.cpp
@@ -125,6 +125,21 @@
     return true;
 }
 
+void TerminusManager::updateMctpEndpointAvailability(const MctpInfo& mctpInfo,
+                                                     Availability availability)
+{
+    mctpInfoAvailTable.insert_or_assign(mctpInfo, availability);
+
+    if (manager)
+    {
+        auto tid = toTid(mctpInfo);
+        if (tid)
+        {
+            manager->updateAvailableState(tid.value(), availability);
+        }
+    }
+}
+
 void TerminusManager::discoverMctpTerminus(const MctpInfos& mctpInfos)
 {
     queuedMctpInfos.emplace(mctpInfos);
@@ -176,6 +191,7 @@
             auto it = findTerminusPtr(mctpInfo);
             if (it == termini.end())
             {
+                mctpInfoAvailTable[mctpInfo] = true;
                 co_await initMctpTerminus(mctpInfo);
             }
 
@@ -183,6 +199,7 @@
             auto tid = toTid(mctpInfo);
             if (!tid)
             {
+                mctpInfoAvailTable.erase(mctpInfo);
                 co_return PLDM_ERROR;
             }
             addedTids.push_back(tid.value());
@@ -221,6 +238,7 @@
 
         unmapTid(it->first);
         termini.erase(it);
+        mctpInfoAvailTable.erase(mctpInfo);
     }
 }
 
@@ -627,6 +645,17 @@
         co_return PLDM_ERROR_NOT_READY;
     }
 
+    // There's a cost of maintaining another table to hold availability
+    // status as we can't ensure that it always synchronizes with the
+    // mctpInfoTable; std::map operator[] will insert a default of boolean
+    // which is false to the mctpInfoAvailTable if the mctpInfo key doesn't
+    // exist. Once we miss to initialize the availability of an available
+    // endpoint, it will drop all the messages to/from it.
+    if (!mctpInfoAvailTable[mctpInfo.value()])
+    {
+        co_return PLDM_ERROR_NOT_READY;
+    }
+
     auto eid = std::get<0>(mctpInfo.value());
     auto requestMsg = reinterpret_cast<pldm_msg*>(request.data());
     requestMsg->hdr.instance_id = instanceIdDb.next(eid);
diff --git a/platform-mc/terminus_manager.hpp b/platform-mc/terminus_manager.hpp
index c37d74d..c4c8914 100644
--- a/platform-mc/terminus_manager.hpp
+++ b/platform-mc/terminus_manager.hpp
@@ -154,6 +154,15 @@
         return localEid;
     }
 
+    /** @brief Helper function to invoke registered handlers for
+     *  updating the availability status of the MCTP endpoint
+     *
+     *  @param[in] mctpInfo - information of the target endpoint
+     *  @param[in] availability - new availability status
+     */
+    void updateMctpEndpointAvailability(const MctpInfo& mctpInfo,
+                                        Availability availability);
+
   private:
     /** @brief Find the terminus object pointer in termini list.
      *
@@ -258,6 +267,9 @@
 
     /** @brief local EID */
     mctp_eid_t localEid;
+
+    /** @brief MCTP Endpoint available status mapping */
+    std::map<MctpInfo, Availability> mctpInfoAvailTable;
 };
 } // namespace platform_mc
 } // namespace pldm
diff --git a/platform-mc/test/event_manager_test.cpp b/platform-mc/test/event_manager_test.cpp
index 5fb53e5..5ba9d80 100644
--- a/platform-mc/test/event_manager_test.cpp
+++ b/platform-mc/test/event_manager_test.cpp
@@ -359,6 +359,9 @@
         sizeof(eventMessageSupportedResp));
     EXPECT_EQ(rc, PLDM_SUCCESS);
 
+    terminusManager.updateMctpEndpointAvailability(
+        pldm::MctpInfo(10, "", "", 1), true);
+
     // queue SetEventReceiver response
     const size_t SetEventReceiverLen = 1;
     PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES;
@@ -483,6 +486,9 @@
         sizeof(pollForPlatformEventMessage3Resp));
     EXPECT_EQ(rc, PLDM_SUCCESS);
 
+    terminusManager.updateMctpEndpointAvailability(
+        pldm::MctpInfo(10, "", "", 1), true);
+
     EXPECT_CALL(eventManager, processCperEvent(_, _, _, _))
         .Times(1)
         .WillRepeatedly(Return(1));
diff --git a/platform-mc/test/platform_manager_test.cpp b/platform-mc/test/platform_manager_test.cpp
index 09f94e5..cf6567d 100644
--- a/platform-mc/test/platform_manager_test.cpp
+++ b/platform-mc/test/platform_manager_test.cpp
@@ -183,8 +183,12 @@
         sizeof(getPdrAuxNameResp));
     EXPECT_EQ(rc, PLDM_SUCCESS);
 
+    mockTerminusManager.updateMctpEndpointAvailability(
+        pldm::MctpInfo(10, "", "", 1), true);
+
     stdexec::sync_wait(platformManager.initTerminus());
     EXPECT_EQ(true, terminus->initialized);
+    EXPECT_EQ(true, terminus->doesSupportCommand(PLDM_PLATFORM, PLDM_GET_PDR));
     EXPECT_EQ(2, terminus->pdrs.size());
     EXPECT_EQ(1, terminus->numericSensors.size());
     EXPECT_EQ("S0", terminus->getTerminusName().value());
@@ -342,6 +346,9 @@
         sizeof(getPdrAuxNameResp));
     EXPECT_EQ(rc, PLDM_SUCCESS);
 
+    mockTerminusManager.updateMctpEndpointAvailability(
+        pldm::MctpInfo(10, "", "", 1), true);
+
     stdexec::sync_wait(platformManager.initTerminus());
     EXPECT_EQ(true, terminus->initialized);
     EXPECT_EQ(2, terminus->pdrs.size());
