# SPDX-FileCopyrightText: 2026 James Harton # # SPDX-License-Identifier: Apache-2.0 defmodule BB.MCP.Tools.ListCommands do @moduledoc """ List the commands declared on a robot, with their typed argument schemas. Use the returned `arguments` schemas to know what to pass to the `invoke_command` tool. """ use Anubis.Server.Component, type: :tool alias Anubis.Server.Response alias BB.Dsl.Info alias BB.MCP.JsonSchema alias BB.MCP.Tools schema do field(:robot, :string, required: true) end @impl true def execute(params, frame) do case Tools.fetch_robot(params) do {:ok, robot} -> commands = robot |> Info.commands() |> Enum.map(fn cmd -> %{ "name" => Atom.to_string(cmd.name), "category" => to_string(cmd.category || ""), "allowed_states" => Enum.map(cmd.allowed_states, &Atom.to_string/1), "timeout" => format_timeout(cmd.timeout), "arguments" => JsonSchema.for_command(cmd) } end) {:reply, Response.json(Response.tool(), %{"commands" => commands}), frame} {:error, error} -> {:error, error, frame} end end defp format_timeout(:infinity), do: "infinity" defp format_timeout(timeout) when is_integer(timeout), do: timeout end