Bridges Claude, GPT, and other LLMs to ROS and ROS2 robots through rosbridge, letting you publish and subscribe to topics, call services and actions, set parameters, and read sensor data without modifying your robot code. The LLM can discover available topics and services at runtime, including custom message types, so it learns the right syntax on the fly. Works across ROS distributions from ROS1 through ROS2 Jazzy and Humble. Particularly useful for natural language robot control, debugging industrial systems by querying state through custom services, or giving LLMs full observability into what your robot is doing. Built on stdio transport and works with any MCP client.
claude mcp add ros -- uvx ros-mcpRun in your terminal. Replace YOUR_* placeholders with real values; add --scope user to install for every project.
Review the command, arguments, and environment values before installing — MCP servers run with your local permissions.
Verified live against the running server on Jun 11, 2026.
get_actionsGet list of all available ROS actions. Works only with ROS 2. Example: get_actions()Get list of all available ROS actions. Works only with ROS 2. Example: get_actions()
No parameters — call it with no arguments.
get_action_detailsGet complete action details including type, goal, result, and feedback structures. Works only with ROS 2. Example: get_action_details('/turtle1/rotate_absolute')1 paramsGet complete action details including type, goal, result, and feedback structures. Works only with ROS 2. Example: get_action_details('/turtle1/rotate_absolute')
action*stringget_action_statusGet action status for a specific action name. Works only with ROS 2. Example: get_action_status('/fibonacci')1 paramsGet action status for a specific action name. Works only with ROS 2. Example: get_action_status('/fibonacci')
action_name*stringsend_action_goalSend a goal to a ROS action server. Works only with ROS 2. Example: send_action_goal('/turtle1/rotate_absolute', 'turtlesim/action/RotateAbsolute', {'theta': 1.57})4 paramsSend a goal to a ROS action server. Works only with ROS 2. Example: send_action_goal('/turtle1/rotate_absolute', 'turtlesim/action/RotateAbsolute', {'theta': 1.57})
goal*objecttimeoutnumberaction_name*stringaction_type*stringcancel_action_goalCancel a specific action goal. Works only with ROS 2. Example: cancel_action_goal('/turtle1/rotate_absolute', 'goal_1758653551839_21acd486')2 paramsCancel a specific action goal. Works only with ROS 2. Example: cancel_action_goal('/turtle1/rotate_absolute', 'goal_1758653551839_21acd486')
goal_id*stringaction_name*stringconnect_to_robotConnect to the robot by setting the IP/port. This tool also tests connectivity to confirm that the robot is reachable and the port is open.4 paramsConnect to the robot by setting the IP/port. This tool also tests connectivity to confirm that the robot is reachable and the port is open.
ipstringportvalueping_timeoutnumberport_timeoutnumberping_robotPing a robot's IP address and check if a specific port is open. A successful ping to the IP but not the port can indicate that ROSbridge is not running. Example: ping_robot(ip='192.168.1.100', port=9090)4 paramsPing a robot's IP address and check if a specific port is open. A successful ping to the IP but not the port can indicate that ROSbridge is not running. Example: ping_robot(ip='192.168.1.100', port=9090)
ip*stringport*integerping_timeoutnumberport_timeoutnumberget_verified_robot_specLoad specifications and usage context for a verified robot model. ONLY use if the robot model is in the verified list (use get_verified_robots_list first to check). Most robots won't have a spec - that's OK, connect directly using connect_to_robot instead.1 paramsLoad specifications and usage context for a verified robot model. ONLY use if the robot model is in the verified list (use get_verified_robots_list first to check). Most robots won't have a spec - that's OK, connect directly using connect_to_robot instead.
name*stringget_verified_robots_listList pre-verified robot models that have specification files with usage guidance available. Use this to check if a robot model has additional context available before calling get_verified_robot_spec. If your robot is not in this list, you can still connect to it directly using...List pre-verified robot models that have specification files with usage guidance available. Use this to check if a robot model has additional context available before calling get_verified_robot_spec. If your robot is not in this list, you can still connect to it directly using...
No parameters — call it with no arguments.
detect_ros_versionDetect the ROS version and distribution via rosbridge.Detect the ROS version and distribution via rosbridge.
No parameters — call it with no arguments.
analyze_previously_received_imageAnalyze a previously received image that was saved by any ROS operation. Images can be received from: - Any topic containing image data (not just topics with 'Image' in the name) - Service responses containing image data - subscribe_once() or subscribe_for_duration() operation...1 paramsAnalyze a previously received image that was saved by any ROS operation. Images can be received from: - Any topic containing image data (not just topics with 'Image' in the name) - Service responses containing image data - subscribe_once() or subscribe_for_duration() operation...
image_pathstringget_nodesGet list of all currently running ROS nodes. Example: get_nodes()Get list of all currently running ROS nodes. Example: get_nodes()
No parameters — call it with no arguments.
get_node_detailsGet detailed information about a specific node including its publishers, subscribers, and services. Example: get_node_details('/turtlesim')1 paramsGet detailed information about a specific node including its publishers, subscribers, and services. Example: get_node_details('/turtlesim')
node*stringget_parameterGet a single ROS parameter value by name. Works only with ROS 2. Example: get_parameter('/turtlesim:background_b')1 paramsGet a single ROS parameter value by name. Works only with ROS 2. Example: get_parameter('/turtlesim:background_b')
name*stringset_parameterSet a single ROS parameter value. Works only with ROS 2. Example: set_parameter('/turtlesim:background_b', '255')2 paramsSet a single ROS parameter value. Works only with ROS 2. Example: set_parameter('/turtlesim:background_b', '255')
name*stringvalue*stringhas_parameterCheck if a ROS parameter exists. Works only with ROS 2. Example: has_parameter('/turtlesim:background_b')1 paramsCheck if a ROS parameter exists. Works only with ROS 2. Example: has_parameter('/turtlesim:background_b')
name*stringdelete_parameterDelete a ROS parameter. Works only with ROS 2. Example: delete_parameter('/turtlesim:background_b')1 paramsDelete a ROS parameter. Works only with ROS 2. Example: delete_parameter('/turtlesim:background_b')
name*stringget_parametersGet list of all ROS parameter names for a specific node. Works only with ROS 2. Example: get_parameters('cam2image') get_parameters('/cam2image')1 paramsGet list of all ROS parameter names for a specific node. Works only with ROS 2. Example: get_parameters('cam2image') get_parameters('/cam2image')
node_name*stringget_parameter_detailsGet comprehensive details about a specific ROS parameter including value, type, and metadata. Works only with ROS 2. Example: get_parameter_details('/turtlesim:background_r')1 paramsGet comprehensive details about a specific ROS parameter including value, type, and metadata. Works only with ROS 2. Example: get_parameter_details('/turtlesim:background_r')
name*stringget_servicesGet list of all available ROS services. Example: get_services()Get list of all available ROS services. Example: get_services()
No parameters — call it with no arguments.
get_service_typeGet the service type for a specific service. Example: get_service_type('/rosapi/topics')1 paramsGet the service type for a specific service. Example: get_service_type('/rosapi/topics')
service*stringget_service_detailsGet complete service details including request/response structures and provider nodes. Example: get_service_details('/rosapi/topics')1 paramsGet complete service details including request/response structures and provider nodes. Example: get_service_details('/rosapi/topics')
service*stringcall_serviceCall a ROS service with specified request data. Example: call_service('/rosapi/topics', 'rosapi/Topics', {}) call_service('/slow_service', 'my_package/SlowService', {}, timeout=10.0) # Specify timeout only for slow services IMPORTANT: Field names in the request dict should mat...4 paramsCall a ROS service with specified request data. Example: call_service('/rosapi/topics', 'rosapi/Topics', {}) call_service('/slow_service', 'my_package/SlowService', {}, timeout=10.0) # Specify timeout only for slow services IMPORTANT: Field names in the request dict should mat...
request*objecttimeoutnumberservice_name*stringservice_type*stringget_topicsGet list of all available ROS topics. Example: get_topics()Get list of all available ROS topics. Example: get_topics()
No parameters — call it with no arguments.
get_topic_typeGet the message type for a specific topic. Example: get_topic_type('/cmd_vel')1 paramsGet the message type for a specific topic. Example: get_topic_type('/cmd_vel')
topic*stringget_topic_detailsGet detailed information about a specific topic including its type, publishers, and subscribers. Example: get_topic_details('/cmd_vel')1 paramsGet detailed information about a specific topic including its type, publishers, and subscribers. Example: get_topic_details('/cmd_vel')
topic*stringget_message_detailsGet the complete structure/definition of a message type. Example: get_message_details('geometry_msgs/Twist')1 paramsGet the complete structure/definition of a message type. Example: get_message_details('geometry_msgs/Twist')
message_type*stringsubscribe_onceSubscribe to a ROS topic and return the first message received. Example: subscribe_once(topic='/cmd_vel', msg_type='geometry_msgs/msg/TwistStamped') subscribe_once(topic='/slow_topic', msg_type='my_package/SlowMsg', timeout=10.0) # Use longer timeout for slow topics subscribe_...6 paramsSubscribe to a ROS topic and return the first message received. Example: subscribe_once(topic='/cmd_vel', msg_type='geometry_msgs/msg/TwistStamped') subscribe_once(topic='/slow_topic', msg_type='my_package/SlowMsg', timeout=10.0) # Use longer timeout for slow topics subscribe_...
topicstringtimeoutnumbermsg_typestringqueue_lengthintegerexpects_imagestringthrottle_rate_msintegersubscribe_for_durationSubscribe to a topic for a duration and collect messages. Example: subscribe_for_duration(topic='/cmd_vel', msg_type='geometry_msgs/msg/TwistStamped', duration=5, max_messages=10) subscribe_for_duration(topic='/high_rate_topic', msg_type='sensor_msgs/Image', duration=10, queue...7 paramsSubscribe to a topic for a duration and collect messages. Example: subscribe_for_duration(topic='/cmd_vel', msg_type='geometry_msgs/msg/TwistStamped', duration=5, max_messages=10) subscribe_for_duration(topic='/high_rate_topic', msg_type='sensor_msgs/Image', duration=10, queue...
topicstringdurationnumbermsg_typestringmax_messagesintegerqueue_lengthintegerexpects_imagestringthrottle_rate_msintegerpublish_for_durationsPublish a sequence of messages with delays. Example: publish_for_durations(topic='/cmd_vel', msg_type='geometry_msgs/msg/TwistStamped', messages=[{'linear': {'x': 1.0}}, {'linear': {'x': 0.0}}], durations=[1, 2])4 paramsPublish a sequence of messages with delays. Example: publish_for_durations(topic='/cmd_vel', msg_type='geometry_msgs/msg/TwistStamped', messages=[{'linear': {'x': 1.0}}, {'linear': {'x': 0.0}}], durations=[1, 2])
topicstringmessagesarraymsg_typestringdurationsarraypublish_oncePublish a single message to a ROS topic. Example: publish_once(topic='/cmd_vel', msg_type='geometry_msgs/msg/TwistStamped', msg={'linear': {'x': 1.0}})3 paramsPublish a single message to a ROS topic. Example: publish_once(topic='/cmd_vel', msg_type='geometry_msgs/msg/TwistStamped', msg={'linear': {'x': 1.0}})
msgobjecttopicstringmsg_typestring
ROS-MCP-Server connects large language models (such as Claude, GPT, and Gemini) to robots, enabling bidirectional communication with no changes to existing robot source code.
rosbridge node to your existing ROS setup.🏭 Example - AI Agent diagnosis of Industrial Robot End Effector (Video)
🤖 Example - Controlling "Wilson" with natural language (video)
From a single prompt — "Grab a Coke from the fridge & go to the living room." — Google Gemini uses the MCP server to navigate and manipulate autonomously. Built on ROS 2 with Nav2 (SLAM) for mapping and navigation, and MoveIt to command the manipulator.
🐕 Example - Controlling Unitree Go2 in NVIDIA Isaac Sim (video)
The MCP server connects Claude to a simulated Unitree Go2 quadruped in NVIDIA Isaac Sim, interpreting natural language commands to navigate and control the robot.
Follow the installation guide to get started.
ROS-MCP works with Claude Code, Codex CLI, Gemini CLI, Claude Desktop, ChatGPT, Cursor, or any MCP-compatible client.
Browse our examples to see the server in action.
We welcome community PRs with new examples and integrations!
We love contributions of all kinds:
Check out the contributing guidelines and see issues tagged good first issue to get started.
This project is licensed under the Apache License 2.0.