io.github.Lynn-hh/armguard-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_robot_stateB | Current joint positions [rad], TCP pose [m, quaternion xyzw] in the robot base frame, estimated external wrench [N, N*m], gripper state and safety status. Read-only. |
| get_safety_envelopeA | The limits the server enforces (joint limits, workspace box, keep-out zones, speed/step caps, force thresholds, gripper limits, approval mode). Read this before planning and stay inside it: violations are rejected server-side and cannot be overridden. |
| lookup_transformA | Pose of source_frame expressed in target_frame (tf2 semantics), e.g. target_frame='fr3_link0', source_frame='fr3_hand_tcp'. Position in metres, orientation as a quaternion (x, y, z, w). |
| list_controllersB | ros2_control controllers with their type and state, plus which ones the policy lets you switch. |
| list_ros_graphA | ROS 2 nodes, topics, services and actions visible to the server. Read-only; you cannot publish or call arbitrary services through this server. |
| get_audit_tailA | The last n audit-log events (tool calls, approvals, denials, e-stops). Images are redacted. |
| camera_snapshotA | Grab the latest image from an allowlisted camera topic (see get_safety_envelope.camera_topics). Returns the image plus JSON metadata (width, height, stamp). Images wider than the policy's max_image_width are downscaled (or refused if Pillow is not installed). |
| plan_to_jointsA | Plan (do NOT move) a joint-space motion from the current state to joint_positions [rad]. Returns a plan summary validated against the safety envelope; if status is not 'rejected', pass plan_id to execute_plan. Scaling above the policy cap is clamped. |
| plan_to_poseA | Plan (do NOT move) a motion that brings the TCP to a pose. Uses inverse kinematics; the path is a joint-space interpolation (the TCP does not move in a straight line - use plan_cartesian_path for that). Returns a plan summary validated against the safety envelope. |
| plan_cartesian_pathA | Plan (do NOT move) a straight-line TCP path through the waypoints [m]. Total TCP path length is capped by the policy (max_cartesian_step_m). Returns a plan summary validated against the envelope. |
| execute_planA | EXECUTE a previously planned motion on the robot. The server re-validates the plan against the safety envelope, rejects stale/expired/used plans, may ask a human to approve (depending on policy), monitors contact force while moving (aborting and latching an e-stop above the limit), and streams progress. Plan handles are single-use and one plan executes at a time. Refused if the robot provides no force estimate (unless the policy allows it). Cancelling the call stops the robot. In dry-run mode nothing moves. |
| get_motion_statusB | Whether a plan is executing, its progress (0..1) and the result of the last execution. |
| gripper_moveA | Move the gripper fingers to an opening width [m] without applying grasp force. |
| gripper_graspA | Close the gripper on an object of about width_m [m] with force_n [N]. Succeeds (ok=true) only if the fingers stop within [width - epsilon_inner, width + epsilon_outer]. Forces above the policy maximum are rejected, not clamped. |
| gripper_homeB | Home (fully open and calibrate) the gripper. |
| switch_controllersA | Activate/deactivate ros2_control controllers. Only controllers in the policy allowlist may be switched; a human may need to approve. |
| set_collision_thresholdsA | Set the robot's collision (reflex) thresholds. Values above the policy maxima are rejected. |
| stop_motionA | Stop the current motion immediately: the arm trajectory and any gripper action. Always available, never rate limited, never needs approval. Does not latch; use estop to also block further motion. |
| estopA | SOFTWARE E-STOP: stop all motion (arm and gripper), invalidate every plan and refuse motion/gripper/control tools until a human approves reset_estop. Always available, never rate limited, never needs approval, accepts any reason. This is not a substitute for the hardware e-stop. |
| reset_estopA | Release the software e-stop (and any latched force violation). ALWAYS requires human approval via the MCP client, regardless of the approval mode. An approval only releases the e-stop event it was shown for; if another e-stop is latched while the prompt is open, call reset_estop again. |
| error_recoveryA | Clear the robot's error/reflex state (e.g. after a collision reflex). May require human approval. Refused while the software e-stop is active (reset it first). |
| get_safety_statusA | E-stop state, latched force violation, dry-run flag and the last envelope violation. Never rate limited. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 22 tools
Most tools have clearly distinct purposes: the three planners are separated by space (joint, IK pose, cartesian line), and read-only tools (get_robot_state, get_safety_envelope, get_safety_status, get_motion_status) target different resources despite similar names. The only real risk of confusion is among the stopping/recovery family (stop_motion, estop, reset_estop, error_recovery), but descriptions make the latch/approval semantics explicit enough to guide selection.
Predominantly consistent snake_case verb_noun (get_*, set_*, list_*, plan_*, execute_plan, switch_controllers) with a coherent gripper_* sub-family. A handful of bare noun/verb forms (estop, reset_estop, error_recovery, camera_snapshot, lookup_transform) deviate from the pattern but remain unambiguous.
22 tools is on the heavy side, but the domain genuinely spans planning, execution, monitoring, gripper control, safety policy, recovery, and ROS introspection, so almost every tool earns its place. Nothing looks redundant or like filler.
The surface covers the full lifecycle: introspect envelope/state/ROS graph, plan three ways, execute, monitor, control the gripper and controllers, stop/e-stop/reset, recover, and audit. Minor gaps exist (no explicit plan-inspection or cancel tool beyond stop_motion, no tool-frame/payload configuration), but these are workaroundable and likely intentional policy-side controls.