# SPDX-FileCopyrightText: 2026 James Harton # # SPDX-License-Identifier: Apache-2.0 defmodule BB.MCP.Tools.ListParameters do @moduledoc """ List the runtime parameters registered on a robot, optionally filtered by a path prefix. Returns each parameter's dotted path and current value. """ use Anubis.Server.Component, type: :tool alias Anubis.Server.Response alias BB.MCP.Tools alias BB.Parameter schema do field(:robot, :string, required: true) field(:prefix, :string, required: false, description: "Dotted path prefix to filter by (e.g. \"controller.pid\")" ) end @impl true def execute(params, frame) do case Tools.fetch_robot(params) do {:ok, robot} -> prefix = case Tools.get_arg(params, :prefix) do nil -> [] "" -> [] str -> Tools.parse_path(str) end payload = robot |> Parameter.list(prefix: prefix) |> Enum.map(&format_parameter/1) {:reply, Response.json(Response.tool(), %{"parameters" => payload}), frame} {:error, error} -> {:error, error, frame} end end defp format_parameter({path, metadata}) when is_map(metadata) do Map.reject( %{ "path" => format_path(path), "value" => Map.get(metadata, :value), "type" => metadata |> Map.get(:type) |> inspect_or_nil(), "doc" => Map.get(metadata, :doc), "default" => Map.get(metadata, :default) }, fn {_k, v} -> is_nil(v) end ) end defp format_parameter({path, value}) do %{"path" => format_path(path), "value" => value} end defp format_path(path), do: Enum.map_join(path, ".", &Atom.to_string/1) defp inspect_or_nil(nil), do: nil defp inspect_or_nil(other), do: inspect(other) end