diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h
index 94cee7bd8..e3e40aa89 100644
--- a/include/libcamera/camera.h
+++ b/include/libcamera/camera.h
@@ -131,6 +131,7 @@ public:
 
 	const ControlInfoMap &controls() const;
 	const ControlList &properties() const;
+	const MetadataListPlan &metadata() const;
 
 	const std::set<Stream *> &streams() const;
 
diff --git a/include/libcamera/internal/camera.h b/include/libcamera/internal/camera.h
index 8a2e9ed58..016c1ae51 100644
--- a/include/libcamera/internal/camera.h
+++ b/include/libcamera/internal/camera.h
@@ -18,6 +18,7 @@
 #include <libcamera/base/class.h>
 
 #include <libcamera/camera.h>
+#include <libcamera/metadata_list_plan.h>
 
 namespace libcamera {
 
@@ -40,6 +41,7 @@ public:
 	std::queue<Request *> waitingRequests_;
 	ControlInfoMap controlInfo_;
 	ControlList properties_;
+	MetadataListPlan metadataPlan_;
 
 	uint32_t requestSequence_;
 
diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp
index 5c78f36c1..fa57d46c9 100644
--- a/src/libcamera/camera.cpp
+++ b/src/libcamera/camera.cpp
@@ -669,6 +669,14 @@ Camera::Private::~Private()
  * over a single capture session.
  */
 
+/**
+ * \var Camera::Private::metadataPlan_
+ * \brief The set of metadata supported by the camera
+ *
+ * The metadata information shall be initialised by the pipeline handler when
+ * creating the camera.
+ */
+
 static const char *const camera_state_names[] = {
 	"Available",
 	"Acquired",
@@ -1074,6 +1082,19 @@ const ControlInfoMap &Camera::controls() const
 	return _d()->controlInfo_;
 }
 
+/**
+ * \brief Retrieve the set of metadata supported by the camera
+ *
+ * The list of metadata controls that may be reported by the camera
+ * for a \ref Request::metadata() "request".
+ *
+ * \return A MetadataListPlan listing the metadata controls supported by the camera
+ */
+const MetadataListPlan &Camera::metadata() const
+{
+	return _d()->metadataPlan_;
+}
+
 /**
  * \brief Retrieve the list of properties of the camera
  *
