Skip to main content
Glama

Gazebo MCP Server

ROS2 Model Context Protocol Server for Gazebo Simulation

Enable AI assistants like Claude to control Gazebo simulations, spawn and manage models, query world and physics properties, drive robots, and gather sensor data through a standardized MCP interface.

License: MIT Python 3.10+ ROS2 Humble Gazebo Harmonic

Features

The server exposes 27 MCP tools across 5 categories. See Available MCP Tools for the full per-tool list.

Model Management

  • Spawn models from URDF/SDF files or XML strings

  • List, delete, and query models in the simulation

  • Set model pose and velocity (teleport / set velocity)

  • Apply force and torque for physics testing

Sensor Integration

  • List sensors with filtering by model/type

  • Read latest sensor data (camera, depth, RGBD, IMU, LiDAR, GPS, contact, force/torque, magnetometer, altimeter, sonar)

  • Subscribe to a sensor topic and cache streamed data

World Tools

  • Validate and load world files; save the current world

  • Query physics, gravity, and scene properties

  • Update world properties and set the gravity vector (Earth, Moon, zero-g, custom)

Simulation Control

  • Pause, unpause, and reset the simulation

  • Set simulation speed and query simulation time / performance metrics

  • Get comprehensive simulation status and list active worlds

ROS2 Tools

  • List ROS2 topics and inspect topic info

  • Publish velocity (twist) commands to drive a robot

  • Look up TF transforms between coordinate frames

  • Spawn models from SDF/URDF XML and read joint states

Developer Experience & Debugging

  • Add and clear visual debug markers; highlight models

  • Generate RViz2 launch and visualization-panel instructions

  • Record and play back simulations via rosbag (ros2 bag commands)

  • Save and restore simulation snapshots for regression testing

  • Profile performance and identify bottlenecks

Note: Tools gracefully fall back to mock data when Gazebo is not running, so the server is usable for development and testing without a live simulator.

Related MCP server: ROS2 MCP Server

Quick Start

Prerequisites

  • ROS2: Humble or Jazzy (LTS recommended)

  • Gazebo: Modern Gazebo (Fortress, Garden, or Harmonic) - Primary Support

    • ⚠️ Classic Gazebo 11 is deprecated and will be removed in v2.0.0

  • Python: 3.10 or higher

  • OS: Ubuntu 22.04 or 24.04 (recommended)

Installation

There are two ways to install: pixi (recommended — self-contained, no apt/system ROS2 needed) or a manual ROS2 + pip setup.


pixi pulls ROS2 Jazzy from RoboStack and the Python deps from conda-forge into one reproducible, locked environment. No /opt/ros, no apt.

# Install pixi (if you don't have it)
curl -fsSL https://pixi.sh/install.sh | bash

# Clone and install
git clone https://github.com/kvgork/gazebo-mcp.git
cd gazebo-mcp
pixi install            # server only
# pixi install -e dev   # + pytest/ruff/mypy
# pixi install -e sim   # + full gz simulator (ros_gz)
# pixi install -e full  # everything

# Run the server
pixi run serve

Environments:

Command

Includes

pixi install

ROS2 Jazzy (rclpy + msgs) + MCP server

pixi install -e dev

+ pytest, pytest-asyncio/cov/mock/timeout, ruff, mypy

pixi install -e sim

+ ros-jazzy-ros-gz (full Gazebo simulator + bridge)

pixi install -e full

sim + dev

Tasks: pixi run serve (stdio server), pixi run server (console script), pixi run -e dev test, pixi run -e dev lint.

The package is installed editable, so gazebo_mcp and the gazebo-mcp-server entry point are immediately on PATH inside the env. Backend defaults (GAZEBO_BACKEND=modern, GAZEBO_WORLD_NAME=empty, PYTHONUNBUFFERED=1) are set via pixi activation — override per shell as needed.

Modern (gz) Gazebo is the default backend and is fully covered by RoboStack. The classic-Gazebo gazebo_msgs spawn/delete paths are not packaged by RoboStack; use Option B if you need classic Gazebo.


Option B — manual ROS2 + pip

1. Install ROS2 and Gazebo

# Install ROS2 Humble
sudo apt update
sudo apt install ros-humble-desktop

# Install Modern Gazebo (Recommended)
# For ROS2 Humble - Gazebo Fortress or Garden:
sudo apt install ros-humble-ros-gz

# Or for specific Gazebo version:
sudo apt install gz-harmonic  # Gazebo Harmonic
sudo apt install gz-garden    # Gazebo Garden
sudo apt install gz-fortress  # Gazebo Fortress

# Note: Classic Gazebo (gazebo-ros-pkgs) is deprecated
# Only install if you need legacy support:
# sudo apt install ros-humble-gazebo-ros-pkgs

2. Clone and Setup

# Clone the repository
git clone https://github.com/kvgork/gazebo-mcp.git
cd gazebo-mcp

# Source ROS2
source /opt/ros/humble/setup.bash

# Install Python dependencies
pip install -r requirements.txt

# Build the package (if using ROS2 workspace)
colcon build
source install/setup.bash

3. Run the MCP Server

# Ensure ROS2 is sourced:
source /opt/ros/humble/setup.bash
source install/setup.bash  # If using colcon build

# Run the MCP server:
python -m gazebo_mcp.server

4. Configuration (Optional)

Control Gazebo backend selection via environment variables:

# Use Modern Gazebo (Default - Recommended)
export GAZEBO_BACKEND=modern

# Use Classic Gazebo (Deprecated)
export GAZEBO_BACKEND=classic

# Auto-detect based on running services
export GAZEBO_BACKEND=auto

# Set default world name for multi-world support (Modern only)
export GAZEBO_WORLD_NAME=default

# Set service call timeout (seconds)
export GAZEBO_TIMEOUT=5.0

Actuation safety bounds (P5 hardening). All actuation is clamped at a single bridge-level chokepoint (identical across mock/modern/classic). Defaults and overrides:

export GAZEBO_MAX_FORCE_N=1000          # force magnitude cap (N)
export GAZEBO_MAX_TORQUE_NM=500         # torque magnitude cap (N·m)
export GAZEBO_MAX_JOINT_VELOCITY=10     # vel-mode joint cap (rad/s or m/s)
export GAZEBO_MAX_JOINT_EFFORT=500      # force/effort-mode joint cap (N·m or N)
export GAZEBO_MAX_PERSISTENT_WRENCHES=8 # max simultaneous persistent wrenches
export GAZEBO_RATE_LIMIT_HZ=50          # per-entity rate cap (Hz); <=0 disables
export GAZEBO_STRICT_BOUNDS=0           # 0 = clamp (default); 1 = reject over-limit

By default over-limit commands are clamped (vectors scaled, direction preserved); with GAZEBO_STRICT_BOUNDS=1 they are rejected with ACTUATION_BOUNDS_EXCEEDED. Persistent wrenches require an explicit clear before a new one can take a slot. See docs/guides/p5-hardening.md for full details, plus the notify-then-poll sensor model, CPU-only physics, image caps, and live-Gazebo acceptance requirements.

Configuration Priority:

  1. Environment variables (highest)

  2. Default values in code (lowest)

Note: Modern Gazebo is now the default backend. Classic Gazebo support is deprecated and will be removed in v2.0.0.

For Claude Desktop Integration, add to your claude_desktop_config.json:

If installed via pixi (Option A)pixi run handles ROS2 sourcing and env activation, so no PYTHONPATH/sourcing needed:

{
  "mcpServers": {
    "gazebo": {
      "command": "pixi",
      "args": ["run", "--manifest-path", "/path/to/gazebo-mcp/pixi.toml", "serve"]
    }
  }
}

If installed via manual setup (Option B):

{
  "mcpServers": {
    "gazebo": {
      "command": "python",
      "args": ["-m", "gazebo_mcp.server"],
      "cwd": "/path/to/gazebo_mcp_package",
      "env": {
        "PYTHONPATH": "/path/to/gazebo_mcp_package/src",
        "ROS_DOMAIN_ID": "0",
        "GAZEBO_BACKEND": "modern",
        "GAZEBO_WORLD_NAME": "default",
        "GAZEBO_TIMEOUT": "5.0"
      }
    }
  }
}

See mcp/README.md for detailed MCP server documentation.

Usage Example

Once the MCP server is running, AI assistants can use it to control Gazebo:

# Example: Claude controlling Gazebo via MCP

# 1. List all models in simulation
await use_mcp_tool("gazebo_list_models", {
    "response_format": "summary"
})

# 2. Spawn a model from file
await use_mcp_tool("gazebo_spawn_model", {
    "model_name": "my_robot",
    "model_file": "/path/to/robot.urdf",
    "pose": {
        "position": {"x": 0.0, "y": 0.0, "z": 0.5},
        "orientation": {"roll": 0, "pitch": 0, "yaw": 0}
    }
})

# 3. Get model state
state = await use_mcp_tool("gazebo_get_model_state", {
    "model_name": "my_robot"
})

# 4. List available sensors
await use_mcp_tool("gazebo_list_sensors", {
    "model_name": "my_robot"
})

# 5. Get sensor data
sensor_data = await use_mcp_tool("gazebo_get_sensor_data", {
    "sensor_name": "front_camera",
    "timeout": 5.0
})

# 6. Control simulation
await use_mcp_tool("gazebo_pause_simulation", {})
await use_mcp_tool("gazebo_unpause_simulation", {})

# 7. Get simulation status
status = await use_mcp_tool("gazebo_get_simulation_status", {})

Practical Examples

The examples/ directory contains 5 complete working examples demonstrating real-world usage:

  1. 01_basic_connection.py - MCP server basics, tool discovery, token efficiency

  2. 02_spawn_and_control.py - Model spawning, state queries, lifecycle management

  3. 03_sensor_streaming.py - Sensor discovery, data access, streaming

  4. 04_simulation_control.py - Pause/resume, reset, time queries, world properties

  5. 05_complete_workflow.py - Full robot testing workflow (8 phases)

All examples work without ROS2/Gazebo using mock data. See examples/README.md for detailed documentation.

# Run any example (no Gazebo required)
cd examples/
python 01_basic_connection.py
python 05_complete_workflow.py

Available MCP Tools

Total Tools: 69 tools across 10 categories

See mcp/README.md for detailed tool documentation and examples.

Model Management (6 tools)

Tool

Description

gazebo_list_models

List all models in simulation with ResultFilter support

gazebo_spawn_model

Spawn model from URDF/SDF file or XML string

gazebo_delete_model

Remove model from simulation

gazebo_get_model_state

Query model pose and velocity

gazebo_set_model_state

Set model pose and/or velocity (teleport or set velocity)

gazebo_apply_force

Apply force/torque to a model for physics testing

Sensor Tools (3 tools)

Tool

Description

gazebo_list_sensors

List all sensors with optional filtering by model/type

gazebo_get_sensor_data

Get latest sensor data (camera, lidar, IMU, GPS, etc.)

gazebo_subscribe_sensor_stream

Subscribe to sensor topic and cache data

Supported sensor types: camera, depth_camera, rgbd_camera, imu, lidar, ray, gps, contact, force_torque, magnetometer, altimeter, sonar

World Tools (5 tools)

Tool

Description

gazebo_load_world

Validate world file and provide loading instructions

gazebo_save_world

Provide instructions for saving current world

gazebo_get_world_properties

Query physics settings, gravity, scene properties

gazebo_set_world_property

Provide instructions for updating world properties

gazebo_set_gravity

Set simulation gravity vector (Earth, Moon, zero-g, custom)

Simulation Control (7 tools)

Tool

Description

gazebo_pause_simulation

Pause physics simulation

gazebo_unpause_simulation

Resume physics simulation

gazebo_reset_simulation

Reset simulation to initial state

gazebo_set_simulation_speed

Provide instructions for setting simulation speed

gazebo_get_simulation_time

Query simulation time and performance metrics

gazebo_get_simulation_status

Get comprehensive simulation status

gazebo_list_worlds

List all active Gazebo worlds

ROS2 Tools (6 tools)

Tool

Description

gazebo_list_topics

List all active ROS2 topics with message types

gazebo_get_topic_info

Get detailed info about a specific ROS2 topic

gazebo_publish_twist

Publish velocity commands to drive a robot

gazebo_get_transform

Look up TF transform between two coordinate frames

gazebo_spawn_sdf

Spawn a model from complete SDF/URDF XML string

gazebo_get_joint_states

Read current joint positions and velocities from a robot

Developer Experience & Debugging (12 tools)

Tool

Description

gazebo_add_debug_marker

Add a visual debug marker (line, arrow, point, text, bounding_box, trajectory, force_vector)

gazebo_clear_debug_markers

Remove a specific marker or clear all markers

gazebo_highlight_model

Highlight a model with a visual effect (glow, outline, transparency, color_overlay)

gazebo_launch_rviz

Generate the RViz2 launch command and recommended panel configuration

gazebo_add_rviz_visualization

Generate RViz2 display-panel instructions for a topic (point_cloud, marker, trajectory, map, laser_scan, image)

gazebo_start_recording

Start a rosbag recording session; returns the ros2 bag record command

gazebo_stop_recording

Stop the active recording session and report bag info

gazebo_playback_recording

Generate the ros2 bag play command for a recorded bag

gazebo_save_snapshot

Save a named snapshot of model poses/velocities and world state

gazebo_restore_snapshot

Restore a previously saved simulation snapshot

gazebo_profile_simulation

Profile real-time factor, physics step time, FPS, memory, sensor rates

gazebo_identify_bottlenecks

Return a ranked list of performance bottlenecks with suggestions

Note: RViz2 launch, rosbag record/play, and snapshot restoration require an external ROS2/Gazebo session — these tools return the exact CLI commands/instructions to run, and operate in mock mode when Gazebo is not available.

Multi-Robot Coordination (6 tools)

Tool

Description

gazebo_spawn_robot_fleet

Spawn a fleet with collision-free formation placement (line, grid, circle, random)

gazebo_get_fleet_status

Query per-robot position, velocity, battery, and task status

gazebo_send_fleet_command

Dispatch a command (move, stop, formation, sync, return_home) to the whole fleet or a subset

gazebo_apply_swarm_behavior

Apply a swarm behavior (flocking, coverage, formation_keeping, leader_follower, consensus)

gazebo_visualize_robot_network

Build comms-graph / task-allocation / formation-line / collision-zone visualization markers

gazebo_enable_multi_robot_collision_avoidance

Enable inter-robot collision avoidance (dynamic, social_force, velocity_obstacles, priority)

Advanced Sensors (8 tools)

Tool

Description

gazebo_fuse_sensor_data

Fuse multiple sensors (lidar_camera, multi_lidar, imu_gps, camera_depth)

gazebo_visualize_sensor_data

Build sensor visualization markers (point_cloud, camera_frustum, imu_arrows, gps_path, contact_forces)

gazebo_process_sensor_data

Apply processing (voxel/statistical filter, image_blur, edge_detection, segmentation, imu_filter, ground_removal)

gazebo_calibrate_sensor

Calibrate a sensor (camera_intrinsics/extrinsics, lidar_offset, imu_bias, time_sync)

gazebo_monitor_sensor_health

Report data rate, latency, dropout, and quality score with alerts

gazebo_record_sensor_stream

Record sensor topics to a bag (none/lz4/zstd compression)

gazebo_detect_objects_in_view

Run object detection on a camera feed with confidence threshold

gazebo_segment_camera_image

Semantic or instance segmentation of a camera image

SLAM & Mapping (6 tools)

Tool

Description

gazebo_start_slam

Start SLAM with a chosen backend (slam_toolbox, cartographer, rtabmap, orb_slam3)

gazebo_save_slam_map

Save the generated map (pgm_yaml or ros_map_server format)

gazebo_load_slam_map

Load a saved map for localization

gazebo_localize_robot

Localize in a known map (amcl, map_matching, icp)

gazebo_get_localization_quality

Report particle spread, match score, and ambiguity

gazebo_detect_loop_closure

Detect loop closures via visual bag-of-words

Navigation & Path Planning — Nav2 (10 tools)

Tool

Description

gazebo_initialize_nav2

Initialize the Nav2 stack and lifecycle nodes for a robot

gazebo_send_nav_goal

Send a navigation goal (planner: DWB, TEB, RPP, MPPI)

gazebo_cancel_nav_goal

Cancel the current or a specific navigation goal

gazebo_get_nav_status

Query active goal, progress, distance remaining, obstacles

gazebo_plan_path

Plan a path without executing (A*, RRT, RRT*, DWB, TEB)

gazebo_visualize_path

Build visualization markers for a planned path

gazebo_create_occupancy_map

Generate an occupancy grid from the world

gazebo_update_costmap

Inject, clear, or inflate costmap regions

gazebo_follow_waypoints

Execute a multi-waypoint mission (sequence, loop, patrol)

gazebo_plan_coverage_path

Plan area coverage (boustrophedon, spiral, energy_efficient)

Note: Multi-robot, advanced-sensor, SLAM, and Nav2 tools integrate with external ROS2 stacks (Nav2, SLAM Toolbox, etc.) where available, and operate in deterministic mock mode when Gazebo/ROS2 is not running.

Project Structure

ros2_gazebo_mcp/
├── src/gazebo_mcp/
│   ├── __init__.py
│   ├── bridge/
│   │   ├── __init__.py
│   │   ├── connection_manager.py    # ROS2 lifecycle management
│   │   └── gazebo_bridge_node.py    # Gazebo service interface
│   ├── tools/
│   │   ├── __init__.py
│   │   ├── model_management.py      # Model spawn/delete/list/state
│   │   ├── sensor_tools.py          # Sensor data queries
│   │   ├── world_tools.py           # World loading/properties
│   │   └── simulation_tools.py      # Simulation control
│   └── utils/
│       ├── __init__.py
│       ├── validators.py            # Input validation
│       ├── converters.py            # ROS2 ↔ Python conversions
│       ├── geometry.py              # Quaternion math, transforms
│       ├── exceptions.py            # Custom exceptions
│       ├── logger.py                # Structured logging
│       ├── metrics.py               # Performance metrics collection
│       └── profiler.py              # Tool profiling decorator
├── mcp/
│   ├── server/
│   │   ├── server.py                # Main MCP server (stdio protocol)
│   │   └── adapters/
│   │       ├── __init__.py
│   │       ├── model_management_adapter.py
│   │       ├── sensor_tools_adapter.py
│   │       ├── world_tools_adapter.py
│   │       ├── simulation_tools_adapter.py
│   │       ├── ros2_tools_adapter.py
│   │       └── developer_tools_adapter.py
│   └── README.md                    # MCP server documentation
├── tests/
│   ├── conftest.py                  # Pytest configuration
│   ├── test_integration.py          # Integration tests (80+ tests)
│   ├── test_utils.py                # Unit tests
│   └── README.md                    # Test documentation
├── examples/
│   ├── 01_basic_connection.py       # Basic MCP usage
│   ├── 02_spawn_and_control.py      # Model management
│   ├── 03_sensor_streaming.py       # Sensor data access
│   ├── 04_simulation_control.py     # Simulation control
│   ├── 05_complete_workflow.py      # Full robot testing workflow
│   └── README.md                    # Examples documentation
├── docs/
│   ├── IMPLEMENTATION_PLAN.md       # Original implementation plan
│   ├── PHASE3_PROGRESS.md           # Phase 3 progress tracking
│   ├── PHASE4_PLAN.md               # Phase 4 enhancements plan
│   ├── DEPLOYMENT.md                # Production deployment guide
│   ├── METRICS.md                   # Performance monitoring guide
│   └── ARCHITECTURE.md              # System architecture
├── deployment/
│   ├── gazebo-mcp.service           # systemd service file
│   └── install.sh                   # Production installation script
├── scripts/
│   └── show_metrics.py              # Metrics display and export
├── .github/workflows/
│   ├── test.yml                     # CI/CD pipeline
│   └── pre-commit.yml               # Pre-commit checks
├── Dockerfile                       # Multi-stage Docker build
├── docker-compose.yml               # Docker Compose configuration
├── .dockerignore                    # Docker ignore patterns
├── pyproject.toml                   # Python package configuration
├── package.xml                      # ROS2 package manifest
├── requirements.txt                 # Python dependencies
├── requirements-dev.txt             # Development dependencies
├── pytest.ini                       # Pytest configuration
└── README.md                        # This file

Documentation

Key Features & Architecture

Token Efficiency (95-99% Savings!)

This implementation uses the ResultFilter pattern for massive token savings:

# ❌ Traditional approach - sends all 1000 models through model:
result = gazebo_list_models()  # 50,000+ tokens

# ✅ Our approach - filter locally in MCP server:
result = gazebo_list_models(response_format="summary")  # ~500 tokens (95% savings)

# Or get full data but filter client-side:
from skills.common.filters import ResultFilter
all_models = gazebo_list_models()["data"]["models"]
robots = ResultFilter.search(all_models, "robot", ["name"])
top_5 = ResultFilter.top_n_by_field(robots, "position.z", 5)
# Only 5 models sent to Claude instead of 1000! (95%+ savings)

Graceful Fallback

Tools automatically fall back to mock data when Gazebo is not available:

  • ✅ Development/testing without Gazebo running

  • ✅ Clear indication in responses ("note": "Mock mode - Gazebo not available")

  • ✅ Same response format for consistent agent behavior

Comprehensive Testing

  • 80+ tests covering all components

  • 60+ unit tests for validators, converters, geometry

  • 20+ integration tests for ROS2 and Gazebo integration

  • 95%+ code coverage for core utilities

  • See tests/README.md for running tests

Deployment

Quick Start:

# Start all services (Gazebo + MCP Server):
docker-compose up

# Run in background:
docker-compose up -d

# View logs:
docker-compose logs -f mcp_server

# Stop services:
docker-compose down

Development Mode:

# Start with development container:
docker-compose --profile development up dev

# Run examples:
docker-compose exec mcp_server python3 examples/01_basic_connection.py

# View metrics:
docker-compose exec mcp_server python3 scripts/show_metrics.py

Monitoring Mode:

# Start with metrics exporter:
docker-compose --profile monitoring up

# Metrics exported to: ./metrics/metrics.prom (Prometheus format)

See Deployment Guide for comprehensive deployment documentation including:

  • Production deployment with systemd

  • Security best practices

  • High availability setup

  • Monitoring and observability

  • Backup and recovery

Production Deployment (systemd)

Installation:

cd deployment
sudo ./install.sh

Service Management:

# Start service:
sudo systemctl start gazebo-mcp

# Check status:
sudo systemctl status gazebo-mcp

# View logs:
sudo journalctl -u gazebo-mcp -f

# Stop service:
sudo systemctl stop gazebo-mcp

See Deployment Guide for complete installation and configuration instructions.

Development

Running Tests

# Unit tests (no ROS2 required):
pytest tests/test_utils.py -v

# Integration tests (ROS2 required):
source /opt/ros/humble/setup.bash
pytest tests/test_integration.py -v --with-ros2

# Full integration tests (Gazebo required):
# Terminal 1:
ros2 launch gazebo_ros gazebo.launch.py

# Terminal 2:
pytest tests/test_integration.py -v --with-gazebo

# Run all tests:
pytest tests/ -v

See tests/README.md for detailed test documentation.

Code Quality

# Type checking (recommended):
mypy src/gazebo_mcp/

# Linting:
ruff check src/ tests/

# Formatting:
black src/ tests/

Contributing

  1. Fork the repository

  2. Create a feature branch (git checkout -b feature/amazing-feature)

  3. Write tests for your changes

  4. Ensure all tests pass

  5. Commit your changes (git commit -m 'Add amazing feature')

  6. Push to the branch (git push origin feature/amazing-feature)

  7. Open a Pull Request

Troubleshooting

ROS2 Connection Issues

# Check ROS2 environment
echo $ROS_DISTRO  # Should show "humble" or "jazzy"

# Verify Gazebo installation
gz sim --version

# Check ROS2 topics
ros2 topic list

MCP Server Not Starting

# Check Python version
python --version  # Should be 3.10+

# Verify dependencies
pip install -r requirements.txt

# Check ROS2 is sourced
source /opt/ros/humble/setup.bash

# Run server with logging
python -m gazebo_mcp.server 2>&1 | tee server.log

"No module named rclpy" Error

# Source ROS2 before running MCP server:
source /opt/ros/humble/setup.bash

# Verify rclpy is available:
python -c "import rclpy; print('rclpy OK')"

Gazebo Not Available

This is expected! The server gracefully falls back to mock data when Gazebo is not running. You'll see "note": "Mock mode - Gazebo not available" in responses.

To connect to real Gazebo:

# Terminal 1 - Start Gazebo:
ros2 launch gazebo_ros gazebo.launch.py

# Terminal 2 - Run MCP server:
python -m gazebo_mcp.server

Performance

Token Efficiency:

  • Without ResultFilter: 50,000+ tokens (for 1000 models)

  • With response_format="summary": ~500 tokens (95% savings)

  • With local filtering: ~2,000 tokens (95%+ savings)

Response Times:

  • Model operations: < 100ms

  • Sensor queries: < 200ms (depends on topic frequency)

  • Simulation control: < 50ms

  • World queries: < 100ms

System Requirements:

  • CPU: Minimal overhead (< 5% CPU usage)

  • Memory: ~100-200 MB (ROS2 + Python)

  • Network: ROS2 local communication only

Performance Monitoring

View real-time metrics:

# Show summary:
python3 scripts/show_metrics.py

# Show detailed metrics:
python3 scripts/show_metrics.py --detailed

# Export to Prometheus:
python3 scripts/show_metrics.py --export metrics.prom --format prometheus

# Export to JSON:
python3 scripts/show_metrics.py --export metrics.json --format json

See Performance Metrics Guide for complete documentation on:

  • Automatic metrics collection

  • Token efficiency tracking

  • Prometheus integration

  • Grafana dashboards

  • Performance optimization

Implementation Status

✅ Phase 1: Core Infrastructure (100% Complete)

  • ROS2 Humble/Jazzy integration

  • Gazebo Harmonic integration

  • Connection management with auto-reconnect

  • Utility functions (validators, converters, geometry)

✅ Phase 2: Tool Implementation (100% Complete)

  • Model management (6 tools)

  • Sensor tools (3 tools)

  • World tools (5 tools)

  • Simulation control (7 tools)

  • ROS2 tools (6 tools)

✅ Phase 3: MCP Server & Testing (100% Complete)

  • MCP server with stdio protocol

  • 6 tool adapters with schemas

  • 80+ tests (unit + integration)

  • Comprehensive documentation

✅ Enhancement Area 7: Developer Experience & Debugging (100% Complete)

  • Developer tools (12 tools): debug markers, model highlighting, RViz integration, rosbag record/playback, simulation snapshots, performance profiling

  • 49 unit tests (mock-mode coverage), 244 unit tests passing total

  • See CAPABILITY_ENHANCEMENT_PLAN.md Area 7 for the full capability map

✅ Phase 4: Production Enhancements (100% Complete)

  • Complete set_model_state() implementation for teleporting models

  • 5 working usage examples with detailed documentation

  • Performance metrics and profiling system

  • Docker deployment (Dockerfile + docker-compose)

  • CI/CD pipeline (GitHub Actions)

  • Production deployment guide (systemd service)

  • Comprehensive deployment documentation

🔵 Future Enhancements

  • Real-time sensor streaming improvements

  • Advanced world generation tools

  • Multi-robot coordination helpers

  • Additional sensor types (thermal, radar)

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

Support

Citation

If you use this project in your research, please cite:

@software{gazebo_mcp,
  title = {Gazebo MCP Server: ROS2 Model Context Protocol for Gazebo},
  author = {Gazebo MCP Team},
  year = {2024},
  url = {https://github.com/kvgork/gazebo-mcp}
}

Built with ❤️ for the robotics and AI community

A
license - permissive license
-
quality - not tested
A
maintenance

Maintenance

Maintainers
Response time
Release cycle
1Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/kvgork/gazebo-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server