# SPDX-FileCopyrightText: 2026 James Harton
#
# SPDX-License-Identifier: Apache-2.0
defmodule BB.MCP.Tools.GetState do
@moduledoc """
Get the current operational and safety state of a robot.
Returns the safety state (`:armed | :disarmed | :disarming | :error`),
the operational state (e.g. `:idle`, `:executing`), and the list of
currently executing commands.
"""
use Anubis.Server.Component, type: :tool
alias Anubis.Server.Response
alias BB.MCP.Tools
alias BB.Robot.Runtime
alias BB.Safety
schema do
field(:robot, :string, required: true)
end
@impl true
def execute(params, frame) do
case Tools.fetch_robot(params) do
{:ok, robot} ->
payload = %{
"robot" => Tools.get_arg(params, :robot),
"safety_state" => Safety.state(robot),
"operational_state" => Runtime.operational_state(robot),
"executing" => Runtime.executing?(robot),
"executing_commands" => Enum.map(Runtime.executing_commands(robot), &command_info/1)
}
{:reply, Response.json(Response.tool(), payload), frame}
{:error, error} ->
{:error, error, frame}
end
end
defp command_info(%{name: name, pid: pid}) do
%{"name" => to_string(name), "pid" => inspect(pid)}
end
defp command_info(other), do: %{"raw" => inspect(other)}
end