diff --git a/mpsd-software-environment.py b/mpsd-software-environment.py
index b56123bfab51f0ec50dec2d863183f1cc2296af7..6a1531e7f05ffc525defcc96d0797448212824b1 100755
--- a/mpsd-software-environment.py
+++ b/mpsd-software-environment.py
@@ -471,6 +471,61 @@ def prepare_environment(mpsd_release: str, script_dir: Path) -> List[str]:
     return available_toolchains
 
 
+def get_native_microarchitecture():
+    """Return native microarchitecture.
+
+    On MPSD machines, there should be an environment variable "MPSD_MICROARCH".
+    We try to read that. If it fails, we use the 'archspec cpu' command.
+    If that fails, we ask the user to install it.
+
+    Returns
+    -------
+    MPSD_MICROARCH : str
+
+    Example
+    -------
+    >>> get_native_microarchitecture()
+    'haswell'
+    """
+    # attempt to get MICRO_ARCH from environment variable (should work on
+    # MPSD_HPC and MPSD linux laptops). If not defined, return
+    # "UNKNOWN_MICROARCH"
+    microarch = os.environ.get("MPSD_MICROARCH", "UNKNOWN_MICROARCH")
+
+    # if we have not found the microarchitecture environment variable,
+    # try calling archspec
+    if microarch == "UNKNOWN_MICROARCH":
+        logging.debug(
+            "Couldn't find MPSD_MICROARCH environment variable. Will try archspec."
+        )
+        try:
+            process = run(["archspec", "cpu"], stdout=subprocess.PIPE, text=True)
+        except FileNotFoundError as e:
+            logging.debug(f"Call of 'archspec cpu' failed: {e=}")
+            # Presumably 'archspec' is not installed.
+            msg = "Please install archspec, for example via 'pipx install archspec'.\n"
+            msg += "The command we need to execute is 'archspec cpu'.\n"
+            msg += "Documentation of package: https://archspec.readthedocs.io/"
+
+            logging.error(msg)
+            sys.exit(1)
+        else:  # we have found archspec and executed it
+            if process.returncode == 0:  # sanity check
+                microarch = process.stdout
+                logging.debug(
+                    f"Found microarchitecture from 'archspec cpu' to be '{microarch}'"
+                )
+                assert len(microarch) > 0  # sanity check
+            else:
+                raise ValueError(
+                    f"Some error occurred when calling 'archspec cpu': {process=}"
+                )
+
+    # at this point, we have determined the microarchitecture
+    log_metadata("microarchitecture", microarch)
+    return microarch
+
+
 def install_environment(
     mpsd_release: str,
     toolchains: List[str],
diff --git a/tests.py b/tests.py
index a82efcd7a5bb8003181220deb5051b445482999a..c7103b4f04ca2ef93f716c2d7e95379da33118c2 100644
--- a/tests.py
+++ b/tests.py
@@ -361,3 +361,7 @@ def test_interface(tmp_path):
     # check that the help message is printed when no arguments are provided
     # check that the help message is printed when -h is provided
     # check that the error messages are also logged to the log file
+
+
+# other tests to add (ideally)
+# - get_native_microarchitecture()