robotmcp avatar

Ros Mcp Server

robotmcp/ros-mcp-server

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.

GitHub stars
1.5K
tools
31
transport
STDIO
last updated
Sep 23, 2026

Install

From registry metadata
$ npx add-mcp 'uvx ros-mcp' --name ros

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add ros -- uvx ros-mcp

Run in your terminal. Replace YOUR_* placeholders with real values; add --scope user to install for every project.

Tools

Verified live · 31 tools

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 params

Get complete action details including type, goal, result, and feedback structures. Works only with ROS 2. Example: get_action_details('/turtle1/rotate_absolute')

Parameters* required
action*string
The action name (e.g., '/turtle1/rotate_absolute')
get_action_statusGet action status for a specific action name. Works only with ROS 2. Example: get_action_status('/fibonacci')1 params

Get action status for a specific action name. Works only with ROS 2. Example: get_action_status('/fibonacci')

Parameters* required
action_name*string
The action name (e.g., '/fibonacci')
send_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 params

Send 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})

Parameters* required
action_name*string
The name of the action to call (e.g., '/turtle1/rotate_absolute')
action_type*string
The type of the action (e.g., 'turtlesim/action/RotateAbsolute')
goal*object
The goal message to send
timeoutnumber
Timeout for action completion in seconds. If None, uses ws_manager.default_timeout.
cancel_action_goalCancel a specific action goal. Works only with ROS 2. Example: cancel_action_goal('/turtle1/rotate_absolute', 'goal_1758653551839_21acd486')2 params

Cancel a specific action goal. Works only with ROS 2. Example: cancel_action_goal('/turtle1/rotate_absolute', 'goal_1758653551839_21acd486')

Parameters* required
action_name*string
The name of the action (e.g., '/turtle1/rotate_absolute')
goal_id*string
The goal ID to cancel
connect_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 params

Connect 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.

Parameters* required
ipstring
The IP address of the rosbridge server.default: 127.0.0.1
ping_timeoutnumber
Timeout for ping in seconds. Default = 2.0.default: 2
portvalue
The port number of the rosbridge server.default: 9090
port_timeoutnumber
Timeout for port check in seconds. Default = 2.0.default: 2
ping_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 params

Ping 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)

Parameters* required
ip*string
The IP address to ping (e.g., '192.168.1.100')
ping_timeoutnumber
Timeout for ping in seconds. Default = 2.0.default: 2
port*integer
The port number to check (e.g., 9090)
port_timeoutnumber
Timeout for port check in seconds. Default = 2.0.default: 2
get_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 params

Load 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.

Parameters* required
name*string
The exact robot model name from the verified list.
get_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 params

Analyze 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...

Parameters* required
image_pathstring
Path to the saved image file (default: "./camera/received_image.jpeg")default: ./camera/received_image.jpeg
get_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 params

Get detailed information about a specific node including its publishers, subscribers, and services. Example: get_node_details('/turtlesim')

Parameters* required
node*string
The node name (e.g., '/turtlesim')
get_parameterGet a single ROS parameter value by name. Works only with ROS 2. Example: get_parameter('/turtlesim:background_b')1 params

Get a single ROS parameter value by name. Works only with ROS 2. Example: get_parameter('/turtlesim:background_b')

Parameters* required
name*string
The parameter name (e.g., '/turtlesim:background_b')
set_parameterSet a single ROS parameter value. Works only with ROS 2. Example: set_parameter('/turtlesim:background_b', '255')2 params

Set a single ROS parameter value. Works only with ROS 2. Example: set_parameter('/turtlesim:background_b', '255')

Parameters* required
name*string
The parameter name (e.g., '/turtlesim:background_b')
value*string
The parameter value to set
has_parameterCheck if a ROS parameter exists. Works only with ROS 2. Example: has_parameter('/turtlesim:background_b')1 params

Check if a ROS parameter exists. Works only with ROS 2. Example: has_parameter('/turtlesim:background_b')

Parameters* required
name*string
The parameter name (e.g., '/turtlesim:background_b')
delete_parameterDelete a ROS parameter. Works only with ROS 2. Example: delete_parameter('/turtlesim:background_b')1 params

Delete a ROS parameter. Works only with ROS 2. Example: delete_parameter('/turtlesim:background_b')

Parameters* required
name*string
The parameter name (e.g., '/turtlesim:background_b')
get_parametersGet list of all ROS parameter names for a specific node. Works only with ROS 2. Example: get_parameters('cam2image') get_parameters('/cam2image')1 params

Get list of all ROS parameter names for a specific node. Works only with ROS 2. Example: get_parameters('cam2image') get_parameters('/cam2image')

Parameters* required
node_name*string
The node name (e.g., '/turtlesim')
get_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 params

Get comprehensive details about a specific ROS parameter including value, type, and metadata. Works only with ROS 2. Example: get_parameter_details('/turtlesim:background_r')

Parameters* required
name*string
The parameter name (e.g., '/turtlesim:background_r')
get_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 params

Get the service type for a specific service. Example: get_service_type('/rosapi/topics')

Parameters* required
service*string
The service name (e.g., '/rosapi/topics')
get_service_detailsGet complete service details including request/response structures and provider nodes. Example: get_service_details('/rosapi/topics')1 params

Get complete service details including request/response structures and provider nodes. Example: get_service_details('/rosapi/topics')

Parameters* required
service*string
The service name (e.g., '/rosapi/topics')
call_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 params

Call 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...

Parameters* required
request*object
Service request data as a dictionary
service_name*string
The service name (e.g., '/rosapi/topics')
service_type*string
The service type (e.g., 'rosapi/Topics')
timeoutnumber
Timeout in seconds. If None, uses ws_manager.default_timeout.
get_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 params

Get the message type for a specific topic. Example: get_topic_type('/cmd_vel')

Parameters* required
topic*string
The topic name (e.g., '/cmd_vel')
get_topic_detailsGet detailed information about a specific topic including its type, publishers, and subscribers. Example: get_topic_details('/cmd_vel')1 params

Get detailed information about a specific topic including its type, publishers, and subscribers. Example: get_topic_details('/cmd_vel')

Parameters* required
topic*string
The topic name (e.g., '/cmd_vel')
get_message_detailsGet the complete structure/definition of a message type. Example: get_message_details('geometry_msgs/Twist')1 params

Get the complete structure/definition of a message type. Example: get_message_details('geometry_msgs/Twist')

Parameters* required
message_type*string
The message type (e.g., 'geometry_msgs/Twist')
subscribe_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 params

Subscribe 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_...

Parameters* required
expects_imagestring
Hint about whether to expect image data. - "true": prioritize image parsing (use for sensor_msgs/Image topics) - "false": skip image detection for faster processing (use for non-image topics) - "au...default: auto
msg_typestring
The ROS message type (e.g., "geometry_msgs/Twist").default:
queue_lengthinteger
How many messages to buffer before dropping old ones. Must be ≥ 1. Default is 1.
throttle_rate_msinteger
Minimum interval between messages in milliseconds. Must be ≥ 0. Default is 0 (no throttling).
timeoutnumber
Timeout in seconds. If None, uses ws_manager.default_timeout.
topicstring
The ROS topic name (e.g., "/cmd_vel", "/joint_states").default:
subscribe_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 params

Subscribe 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...

Parameters* required
durationnumber
How long (seconds) to listen for messagesdefault: 5
expects_imagestring
Hint about whether to expect image data. - "true": prioritize image parsing (use for sensor_msgs/Image topics) - "false": skip image detection for faster processing (use for non-image topics) - "au...default: auto
max_messagesinteger
Maximum number of messages to collect before stoppingdefault: 100
msg_typestring
ROS message type (e.g. "geometry_msgs/Twist")default:
queue_lengthinteger
How many messages to buffer before dropping old ones. Must be ≥ 1. Default is 1.
throttle_rate_msinteger
Minimum interval between messages in milliseconds. Must be ≥ 0. Default is 0 (no throttling).
topicstring
ROS topic name (e.g. "/cmd_vel", "/joint_states")default:
publish_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 params

Publish 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])

Parameters* required
durationsarray
A list of durations (seconds) to wait between messages
messagesarray
A list of message dictionaries (ROS-compatible payloads)
msg_typestring
ROS message type (e.g., "geometry_msgs/Twist")default:
topicstring
ROS topic name (e.g., "/cmd_vel")default:
publish_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 params

Publish a single message to a ROS topic. Example: publish_once(topic='/cmd_vel', msg_type='geometry_msgs/msg/TwistStamped', msg={'linear': {'x': 1.0}})

Parameters* required
msgobject
Message payload as a dictionary
msg_typestring
ROS message type (e.g., "geometry_msgs/msg/Twist")default:
topicstring
ROS topic name (e.g., "/cmd_vel")default:

Sponsors

Readme

ROS MCP Server 🧠⇄🤖

Static Badge Static Badge Static Badge Python pip Dev Container GitHub Repo stars GitHub last commit

framework

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.

Why ROS-MCP?


View the full README on GitHub

Details

Repository
github.com/robotmcp/ros-mcp-server
Package
ros-mcp
Transport
STDIO
Registry
MCP registry, active
Resources
6
Prompts
7
Tools verified
Jun 11, 2026