{"ok":true,"site":{"host":"jonasneves.com","url":"https://jonasneves.com/ros-mcp/","type":"live","desc":"Inspect and control ROS robots from the browser","tools":[{"name":"connect_to_robot","kind":"act","impl":"imperative","description":"Set the rosbridge WebSocket URL and reconnect.","inputSchema":{"type":"object","properties":{"ip":{"type":"string","description":"rosbridge host IP or hostname","default":"127.0.0.1"},"port":{"type":"number","description":"rosbridge port","default":9090}},"required":["ip","port"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]},{"name":"get_topics","kind":"answer","impl":"imperative","description":"List all ROS topics.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]},{"name":"get_topic_type","kind":"answer","impl":"imperative","description":"Get the message type for a ROS topic.","inputSchema":{"type":"object","properties":{"topic":{"type":"string","description":"Full topic name, e.g. /turtle1/cmd_vel"}},"required":["topic"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]},{"name":"get_topic_details","kind":"answer","impl":"imperative","description":"Get publishers, subscribers, and type for a topic.","inputSchema":{"type":"object","properties":{"topic":{"type":"string"}},"required":["topic"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]},{"name":"subscribe_once","kind":"transact","impl":"imperative","description":"Subscribe to a topic and return the first message received.","inputSchema":{"type":"object","properties":{"topic":{"type":"string"},"msg_type":{"type":"string","description":"ROS message type, e.g. turtlesim/msg/Pose"},"timeout":{"type":"number","description":"Timeout in seconds (default 5)","default":5}},"required":["topic","msg_type"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]},{"name":"subscribe_for_duration","kind":"transact","impl":"imperative","description":"Subscribe to a topic and collect messages for a given duration.","inputSchema":{"type":"object","properties":{"topic":{"type":"string"},"msg_type":{"type":"string"},"duration":{"type":"number","description":"Duration in seconds"},"max_messages":{"type":"number","description":"Stop after this many messages","default":100}},"required":["topic","msg_type","duration"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]},{"name":"publish_once","kind":"act","impl":"imperative","description":"Publish a single message to a topic.","inputSchema":{"type":"object","properties":{"topic":{"type":"string"},"msg_type":{"type":"string"},"msg":{"type":"object","description":"Message payload as JSON object"}},"required":["topic","msg_type","msg"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]},{"name":"publish_for_durations","kind":"act","impl":"imperative","description":"Publish a sequence of messages with delays between each.","inputSchema":{"type":"object","properties":{"topic":{"type":"string"},"msg_type":{"type":"string"},"messages":{"type":"array","items":{"type":"object"},"description":"Array of message payloads"},"durations":{"type":"array","items":{"type":"number"},"description":"Delay in seconds after each message"}},"required":["topic","msg_type","messages","durations"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]},{"name":"turn_by_angle","kind":"act","impl":"imperative","description":"Rotate a robot in place by an angle in degrees. Computes duration = (|angle_deg| x pi/180) / angular_velocity and sends a zero-velocity stop when finished. Prefer this over publish_for_durations for rotation — it removes the error-prone duration maths from the caller. Positive angle_deg = counter-clockwise, negative = clockwise. Units: angle_deg in degrees, angular_velocity in rad/s.\nExample — turn turtle1 90 degrees counter-clockwise at 1.0 rad/s:\nturn_by_angle(cmd_vel_topic='/ts1/turtle1/cmd_vel', msg_type='geometry_msgs/Twist', angle_deg=90)","inputSchema":{"type":"object","properties":{"cmd_vel_topic":{"type":"string","description":"e.g. /ts1/turtle1/cmd_vel"},"msg_type":{"type":"string","description":"e.g. geometry_msgs/Twist"},"angle_deg":{"type":"number","description":"Degrees; positive = counter-clockwise"},"angular_velocity":{"type":"number","description":"rad/s, must be > 0","default":1}},"required":["cmd_vel_topic","msg_type","angle_deg"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]},{"name":"move_by_distance","kind":"act","impl":"imperative","description":"Move a robot forward or backward by a distance in metres. Computes duration = |distance_m| / linear_velocity and sends a zero-velocity stop when finished. Prefer this over publish_for_durations for straight-line motion. Positive distance_m = forward, negative = backward. Units: distance_m in metres, linear_velocity in m/s.\nExample — move turtle1 forward 1 metre at 0.5 m/s:\nmove_by_distance(cmd_vel_topic='/ts1/turtle1/cmd_vel', msg_type='geometry_msgs/Twist', distance_m=1.0)","inputSchema":{"type":"object","properties":{"cmd_vel_topic":{"type":"string","description":"e.g. /ts1/turtle1/cmd_vel"},"msg_type":{"type":"string","description":"e.g. geometry_msgs/Twist"},"distance_m":{"type":"number","description":"Metres; positive = forward"},"linear_velocity":{"type":"number","description":"m/s, must be > 0","default":0.5}},"required":["cmd_vel_topic","msg_type","distance_m"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]},{"name":"get_services","kind":"answer","impl":"imperative","description":"List all available ROS services.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]},{"name":"get_service_details","kind":"answer","impl":"imperative","description":"Get the request/response type and provider node for a service.","inputSchema":{"type":"object","properties":{"service":{"type":"string"}},"required":["service"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]},{"name":"call_service","kind":"act","impl":"imperative","description":"Call a ROS service with a request payload.","inputSchema":{"type":"object","properties":{"service_name":{"type":"string"},"service_type":{"type":"string"},"request":{"type":"object","description":"Request payload as JSON object"}},"required":["service_name","service_type","request"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]},{"name":"get_nodes","kind":"answer","impl":"imperative","description":"List all running ROS nodes.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]},{"name":"get_node_details","kind":"answer","impl":"imperative","description":"Get publishers, subscribers, and services for a node.","inputSchema":{"type":"object","properties":{"node":{"type":"string"}},"required":["node"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]},{"name":"get_connected_robots","kind":"answer","impl":"imperative","description":"Detect connected robots by finding active cmd_vel topics on the ROS network. Works with any robot — no hardcoded names. Returns the cmd_vel topic and message type for each robot. Call this when you need to discover robot topics before issuing motion commands.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]},{"name":"move_robots","kind":"act","impl":"imperative","description":"Move multiple robots simultaneously. All start and stop at the same time. Use get_connected_robots() first to get topics and message types. Each robot entry needs: cmd_vel_topic, msg_type, and linear_x and/or angular_z.","inputSchema":{"type":"object","properties":{"robots":{"type":"array","items":{"type":"object","properties":{"cmd_vel_topic":{"type":"string"},"msg_type":{"type":"string"},"linear_x":{"type":"number","default":0},"angular_z":{"type":"number","default":0}},"required":["cmd_vel_topic","msg_type"]}},"duration":{"type":"number","description":"Duration in seconds","default":2}},"required":["robots"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]},{"name":"get_robot_description","kind":"answer","impl":"imperative","description":"Fetch the robot's URDF from the /robot_description ROS parameter. Requires robot_state_publisher to be running.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]},{"name":"get_joint_states","kind":"answer","impl":"imperative","description":"Read current joint positions (rad), velocities (rad/s), and efforts (N·m) from /joint_states.","inputSchema":{"type":"object","properties":{"topic":{"type":"string","description":"Joint states topic (default: /joint_states)","default":"/joint_states"},"timeout":{"type":"number","description":"Timeout in seconds (default 5)","default":5}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/ros-mcp/","pages":["/ros-mcp/"]}],"category":"Developer Tools","favicon":"/favicons/jonasneves.com.png","apiSurface":"spec","toolCount":19}}