⚠️ Prerequisite: You need either ROS installed locally on your machine OR access over the network to a robot/computer with ROS installed. This MCP server connects to ROS systems on a robot, so a running ROS environment is required.
Installation includes the following steps:
- Install the MCP server
- Clone this repository
- Install uv (Python virtual environment manager)
- Install and configure the Language Model Client
- Install any language model client (We demonstrate with Claude Desktop)
- Configure the client to run the MCP server and connect automatically on launch.
- Install and launch Rosbridge
Below are detailed instructions for each of these steps.
git clone https://github.com/robotmcp/ros-mcp-server.git
⚠️ WSL Users: Clone the repository in your WSL home directory (e.g.,/home/username/) instead of the Windows filesystem mount (e.g.,/mnt/c/Users/username/). Using the native Linux filesystem provides better performance and avoids potential permission issues.
Note the absolute path to the cloned directory — you'll need this later when configuring your language model client.
You can install uv using one of the following methods:
Option A: Shell installer
curl -LsSf https://astral.sh/uv/install.sh | shOption B: Using pip
pip install uvAny LLM client that supports MCP can be used. We use Claude Desktop for testing and development.
Linux (Ubuntu)
- Follow the installation instructions from the community-supported claude-desktop-debian
MacOS
- Download from claude.ai
Windows (Using WSL)
This will have Claude running on Windows and the MCP server running on WSL. We assume that you have cloned the repository and installed UV on your WSL
- Download from claude.ai
Linux (Ubuntu)
- Locate and edit the
claude_desktop_config.jsonfile: - (If the file does not exist, create it)
~/.config/Claude/claude_desktop_config.json- Add the following to the
"mcpServers"section of the JSON file - Make sure to replace
<ABSOLUTE_PATH>with the full absolute path to yourros-mcp-serverfolder (note:~for home directory may not work in JSON files):
{
"mcpServers": {
"ros-mcp-server": {
"command": "uv",
"args": [
"--directory",
"/<ABSOLUTE_PATH>/ros-mcp-server",
"run",
"server.py"
]
}
}
}MacOS
- Locate and edit the
claude_desktop_config.jsonfile: - (If the file does not exist, create it)
~/Library/Application\ Support/Claude/claude_desktop_config.json- Add the following to the
"mcpServers"section of the JSON file - Make sure to replace
<ABSOLUTE_PATH>with the full absolute path to yourros-mcp-serverfolder (note:~for home directory may not work in JSON files):
{
"mcpServers": {
"ros-mcp-server": {
"command": "uv",
"args": [
"--directory",
"/<ABSOLUTE_PATH>/ros-mcp-server",
"run",
"server.py"
]
}
}
}Windows (Using WSL)
- Locate and edit the
claude_desktop_config.jsonfile: - (If the file does not exist, create it)
~/.config/Claude/claude_desktop_config.json- Add the following to the
"mcpServers"section of the JSON file - Make sure to replace
<ABSOLUTE_PATH>with the full absolute path to yourros-mcp-serverfolder (note:~for home directory may not work in JSON files): - Set the full WSL path to your
uvinstallation (e.g.,/home/youruser/.local/bin/uv) - Use the correct WSL distribution name (e.g.,
"Ubuntu-22.04")
{
"mcpServers": {
"ros-mcp-server": {
"command": "wsl",
"args": [
"-d", "Ubuntu-22.04",
"/home/<YOUR_USER>/.local/bin/uv",
"--directory",
"/<ABSOLUTE_PATH>/ros-mcp-server",
"run",
"server.py"
]
}
}
}Alternate Configuration - HTTP Transport
The above configurations sets up the MCP server using the default STDIO transport layer, which launches the server as a plugin automatically on launching Claude.
It is also possible to configure the MCP server using the http transport layer, which configures Claude to connect to the MCP server when it is launched as a standalone application.
For HTTP transport, the configuration is the same across all platforms. First start the MCP server manually:
Linux/macOS/Windows(WSL):
cd /<ABSOLUTE_PATH>/ros-mcp-server
# Using command line arguments (recommended)
uv run server.py --transport streamable-http --host 127.0.0.1 --port 9000
# Or using environment variables (legacy)
export MCP_TRANSPORT=streamable-http
export MCP_HOST=127.0.0.1
export MCP_PORT=9000
uv run server.pyThen configure Claude Desktop to connect to the HTTP server (same for all platforms):
{
"mcpServers": {
"ros-mcp-server-http": {
"name": "ROS-MCP Server (http)",
"transport": "http",
"url": "http://127.0.0.1:9000/mcp"
}
}
}Comparison between default (STDIO) and HTTP Transport
- Best for: Local development, single-user setups
- Pros: Simple setup, no network configuration needed
- Cons: MCP server and LLM/MCP client need to be running on the local machine.
- Use case: Running MCP server directly with your LLM client
- Best for: Remote access, multiple clients, production deployments
- Pros: Network accessible, multiple clients can connect
- Cons: Requires network configuration, MCP server needs to be run independently.
- Use case: Remote robots, team environments, web-based clients
- Launch Claude Desktop and check connection status.
- The ros-mcp-server should be visible in your list of tools.
Troubleshooting
- If the
ros-mcp-serverdoesn't appear even after correctly configuringclaude_desktop_config.json, try completely shutting down Claude Desktop using the commands below and then restarting it. This could be a Claude Desktop caching issue.
# Completely terminate Claude Desktop processes
pkill -f claude-desktop
# Or alternatively
killall claude-desktop
# Restart Claude Desktop
claude-desktopROS 1
This package is required for MCP to interface with ROS or ROS 2 via WebSocket. It needs to be installed on the same machine that is running ROS.
For ROS Noetic
sudo apt install ros-noetic-rosbridge-serverFor other ROS Distros
sudo apt install ros-${ROS_DISTRO}-rosbridge-serverroslaunch rosbridge_server rosbridge_websocket.launch
⚠️ Don’t forget tosourceyour ROS workspace before launching, especially if you're using custom messages or services.
ROS 2
This package is required for MCP to interface with ROS or ROS 2 via WebSocket. It needs to be installed on the same machine that is running ROS.
For ROS 2 Humble
sudo apt install ros-humble-rosbridge-serverFor other ROS Distros
sudo apt install ros-${ROS_DISTRO}-rosbridge-serverros2 launch rosbridge_server rosbridge_websocket_launch.xml
⚠️ Don’t forget tosourceyour ROS workspace before launching, especially if you're using custom messages or services.
You can test out your server with any robot that you have running. Just tell your AI to connect to the robot using its target IP address. (Default is localhost, so you don't need to tell it to connect if the MCP server is installed on the same machine as your ROS)
✅ Tip: If you don't currently have any robots running, turtlesim is considered the 'hello world' robot for ROS to experiment with. It does not have any simulation dependencies such as Gazebo or IsaacSim.
For a complete step-by-step tutorial on using turtlesim with the MCP server and for more information on ROS and turtlesim, see our Turtlesim Tutorial.
If you have ROS already installed, you can launch turtlesim with the below command: ROS1:
rosrun turtlesim turtlesim_node
ROS2:
ros2 run turtlesim turtlesim_node
Example Commands
Example:
Make the robot move forward.
Example:
What topics and services do you see on the robot?
Examples and setup instructions for other LLMs
For detailed Cursor setup instructions, see our Cursor Tutorial.
For detailed ChatGPT setup instructions, see our ChatGPT Tutorial.
For detailed Gemini setup instructions, see our Gemini Tutorial.
Custom MCP Client
You can also use the MCP server directly in your Python code:
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main():
server_params = StdioServerParameters(
command="uv",
args=["--directory", "/path/to/ros-mcp-server", "run", "server.py"]
)
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
# Use the MCP server
result = await session.call_tool("get_topics", {})
print(result)MCP Server Not Appearing in Client
Symptoms: The ros-mcp-server doesn't appear in your LLM client's tool list.
Solutions:
- Check file paths: Ensure all paths in your configuration are absolute and correct
- Restart client: Completely shut down and restart your LLM client
- Check logs: Look for error messages in your LLM client's logs
- Test manually: Try running the MCP server manually to check for errors:
cd /<ABSOLUTE_PATH>/ros-mcp-server
uv run server.pyConnection Refused Errors
Symptoms: "Connection refused" or "No valid session ID provided" errors.
Solutions:
- Check ROS is running: Ensure ROS and rosbridge are running
- Verify rosbridge port: Default is 9090, check if it's different
- Test connectivity: Use the ping tool to test connection:
# Test if rosbridge is accessible
curl -I http://localhost:9090- Check firewall: Ensure firewall allows the rosbridge port
WSL-Specific Issues
Symptoms: Issues when running on Windows with WSL.
Solutions:
- Check WSL distribution: Ensure you're using the correct WSL distribution name
- Verify uv path: Check that the uv path in WSL is correct:
# In WSL
which uv- Test WSL connectivity: Ensure Windows can reach WSL services
- Check WSL networking: For HTTP transport, use
0.0.0.0instead of127.0.0.1
HTTP Transport Issues
Symptoms: HTTP transport not working or connection timeouts.
Solutions:
-
Check command line arguments: Ensure the correct transport, host, and port are specified:
# Check available options python server.py --help # Example with custom settings python server.py --transport http --host 0.0.0.0 --port 8080
-
Check environment variables (legacy): Ensure MCP_TRANSPORT, MCP_HOST, and MCP_PORT are set correctly
-
Verify port availability: Check if the port is already in use:
# Check if port is in use
netstat -tulpn | grep :9000- Test HTTP endpoint: Try accessing the HTTP endpoint directly:
curl http://localhost:9000- Check firewall: Ensure firewall allows the configured port
# Test ROS connectivity
ros2 topic list # For ROS 2
rostopic list # For ROS 1
# Test rosbridge
curl -I http://localhost:9090
# Test MCP server manually
cd /<ABSOLUTE_PATH>/ros-mcp-server
uv run server.py
# Check processes
ps aux | grep rosbridge
ps aux | grep ros-mcpIf you're still having issues:
- Check the logs: Look for error messages in your LLM client and MCP server logs
- Test with turtlesim: Try the turtlesim tutorial to verify basic functionality
- Open an issue: Create an issue on the GitHub repository with:
- Your operating system
- ROS version
- LLM client being used
- Error messages
- Steps to reproduce


