diff --git a/model_server/base/accessors.py b/model_server/base/accessors.py
index 7fc28bb3dac2113413124ef2ce25bcfbc66d3fd4..f7d076fa7653faf7fbf22d8a2ff7577228ab2420 100644
--- a/model_server/base/accessors.py
+++ b/model_server/base/accessors.py
@@ -51,6 +51,9 @@ class GenericImageDataAccessor(ABC):
 
 
     def get_zi(self, zi: int):
+        """
+        Return a new accessor of a specific z-coordinate
+        """
         return self._derived_accessor(
             self.data.take(
                 indices=[zi],
@@ -58,6 +61,12 @@ class GenericImageDataAccessor(ABC):
             )
         )
 
+    def get_mip(self):
+        """
+        Return a new accessor of maximum intensity projection (MIP) along z-axis
+        """
+        return self.apply(lambda x: x.max(axis=self._ga('Z'), keepdims=True))
+
 
     def get_mono(self, channel: int, mip: bool = False, squeeze=False):
         return self.get_channels([channel], mip=mip)
diff --git a/tests/base/test_accessors.py b/tests/base/test_accessors.py
index b42030707eb4ab1b336e62ff03f15d2e8dda2f59..d72e5ca198c6dd0fdfd3bc4e4d41821e02f01239 100644
--- a/tests/base/test_accessors.py
+++ b/tests/base/test_accessors.py
@@ -73,6 +73,17 @@ class TestCziImageFileAccess(unittest.TestCase):
 
         self.assertTrue(np.all(sz.data[:, :, :, 0] == cf.data[:, :, :, zi]))
 
+    def test_get_mip(self):
+        w = 256
+        h = 512
+        nc = 4
+        nz = 11
+        zi = 5
+        cf = InMemoryDataAccessor(_random_int(h, w, nc, nz))
+        sm = cf.get_mip()
+        self.assertEqual(sm.shape_dict['Z'], 1)
+        self.assertTrue(np.all(cf.data.max(axis=-1, keepdims=True) == sm.data))
+
     def test_crop_yx(self):
         w = 256
         h = 512