diff --git a/autoware_iv_external_api_adaptor/CMakeLists.txt b/autoware_iv_external_api_adaptor/CMakeLists.txt
index db2cd73d5..9a15e7360 100644
--- a/autoware_iv_external_api_adaptor/CMakeLists.txt
+++ b/autoware_iv_external_api_adaptor/CMakeLists.txt
@@ -21,6 +21,7 @@ ament_auto_add_library(${PROJECT_NAME} SHARED
src/engage.cpp
src/initial_pose.cpp
src/map.cpp
+ src/metadata_packages.cpp
src/operator.cpp
src/route.cpp
src/service.cpp
@@ -35,6 +36,7 @@ rclcpp_components_register_nodes(${PROJECT_NAME} "external_api::Engage")
rclcpp_components_register_nodes(${PROJECT_NAME} "external_api::InitialPose")
rclcpp_components_register_nodes(${PROJECT_NAME} "external_api::Map")
rclcpp_components_register_nodes(${PROJECT_NAME} "external_api::Operator")
+rclcpp_components_register_nodes(${PROJECT_NAME} "external_api::MetadataPackages")
rclcpp_components_register_nodes(${PROJECT_NAME} "external_api::Route")
rclcpp_components_register_nodes(${PROJECT_NAME} "external_api::Service")
rclcpp_components_register_nodes(${PROJECT_NAME} "external_api::Start")
diff --git a/autoware_iv_external_api_adaptor/package.xml b/autoware_iv_external_api_adaptor/package.xml
index f70b3e6b7..935f85713 100644
--- a/autoware_iv_external_api_adaptor/package.xml
+++ b/autoware_iv_external_api_adaptor/package.xml
@@ -14,6 +14,7 @@
autoware_external_api_msgs
autoware_system_msgs
autoware_vehicle_msgs
+ nlohmann-json-dev
rclcpp
rclcpp_components
std_srvs
diff --git a/autoware_iv_external_api_adaptor/src/metadata_packages.cpp b/autoware_iv_external_api_adaptor/src/metadata_packages.cpp
new file mode 100644
index 000000000..0535319b6
--- /dev/null
+++ b/autoware_iv_external_api_adaptor/src/metadata_packages.cpp
@@ -0,0 +1,59 @@
+// Copyright 2021 Tier IV, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "metadata_packages.hpp"
+#include
+#include "ament_index_cpp/get_resources.hpp"
+#include "ament_index_cpp/get_resource.hpp"
+#include "nlohmann/json.hpp"
+
+namespace external_api
+{
+
+MetadataPackages::MetadataPackages(const rclcpp::NodeOptions & options)
+: Node("external_api_metadata_packages", options)
+{
+ using namespace std::placeholders;
+ autoware_api_utils::ServiceProxyNodeInterface proxy(this);
+
+ const auto resources = ament_index_cpp::get_resources("autoware_metadata_packages");
+ nlohmann::json json = nlohmann::json::object();
+ for (const auto & resource : resources) {
+ const std::string & package = resource.first;
+ std::string content;
+ ament_index_cpp::get_resource("autoware_metadata_packages", package, content);
+ json[package] = nlohmann::json::parse(content);
+ }
+ metadata_.format = "1";
+ metadata_.json = json.dump();
+
+ group_ = create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive);
+ srv_ = proxy.create_service(
+ "/api/external/get/metadata/packages",
+ std::bind(&MetadataPackages::getVersions, this, _1, _2),
+ rmw_qos_profile_services_default, group_);
+}
+
+void MetadataPackages::getVersions(
+ const autoware_external_api_msgs::srv::GetMetadataPackages::Request::SharedPtr,
+ const autoware_external_api_msgs::srv::GetMetadataPackages::Response::SharedPtr response)
+{
+ response->metadata = metadata_;
+ response->status = autoware_api_utils::response_success();
+}
+
+} // namespace external_api
+
+#include "rclcpp_components/register_node_macro.hpp"
+RCLCPP_COMPONENTS_REGISTER_NODE(external_api::MetadataPackages)
diff --git a/autoware_iv_external_api_adaptor/src/metadata_packages.hpp b/autoware_iv_external_api_adaptor/src/metadata_packages.hpp
new file mode 100644
index 000000000..2d25d05b9
--- /dev/null
+++ b/autoware_iv_external_api_adaptor/src/metadata_packages.hpp
@@ -0,0 +1,46 @@
+// Copyright 2021 Tier IV, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef PACKAGE_VERSIONS_HPP_
+#define PACKAGE_VERSIONS_HPP_
+
+#include "rclcpp/rclcpp.hpp"
+#include "autoware_api_utils/autoware_api_utils.hpp"
+#include "autoware_external_api_msgs/srv/get_metadata_packages.hpp"
+
+namespace external_api
+{
+
+class MetadataPackages : public rclcpp::Node
+{
+public:
+ explicit MetadataPackages(const rclcpp::NodeOptions & options);
+
+private:
+ // ros interface
+ rclcpp::CallbackGroup::SharedPtr group_;
+ autoware_api_utils::Service::SharedPtr srv_;
+
+ // ros callback
+ void getVersions(
+ const autoware_external_api_msgs::srv::GetMetadataPackages::Request::SharedPtr request,
+ const autoware_external_api_msgs::srv::GetMetadataPackages::Response::SharedPtr response);
+
+ // data
+ autoware_external_api_msgs::msg::MetadataPackages metadata_;
+};
+
+} // namespace external_api
+
+#endif // PACKAGE_VERSIONS_HPP_