Skip to main content
Glama

Webots MCP Server

Generic MCP (Model Context Protocol) bridge for any Webots robot simulation. Provides Claude Code and Cursor with real-time access to robot state, sensors, camera, and simulation control.

Quick Start (3 Lines)

from mcp_bridge import MCPBridge

bridge = MCPBridge(robot)  # Auto-detects Supervisor
bridge.publish({"pose": [x, y, theta], "mode": "navigate"})

That's it! Claude Code now has full visibility into your simulation.

Installation

git clone https://github.com/luisfelipesena/webots-youbot-mcp.git
pip install mcp pydantic

Option 2: Copy Files

Copy mcp_bridge.py to your controller directory.

Claude Code Integration

Add to your project's .mcp.json:

{
  "mcpServers": {
    "webots": {
      "command": "python",
      "args": ["/path/to/webots-youbot-mcp/webots_youbot_mcp_server.py"],
      "cwd": "/path/to/webots-youbot-mcp"
    }
  }
}

Cursor Integration

Same configuration - Cursor reads .mcp.json automatically.

Controller Integration

Minimal Example

import sys
sys.path.insert(0, "/path/to/webots-youbot-mcp")
from mcp_bridge import MCPBridge

class MyController:
    def __init__(self):
        self.robot = Robot()  # or Supervisor()
        self.mcp = MCPBridge(self.robot)

    def run(self):
        while self.robot.step(32) != -1:
            # Your logic here
            self.mcp.publish({
                "pose": [x, y, theta],
                "mode": self.mode,
                "sensors": {"front": 1.2, "left": 0.8},
            })
            self.mcp.get_command()  # Handle simulation control

Advanced: World Reload Detection

def reset_state():
    """Called automatically when world reloads"""
    self.mode = "search"
    self.collected = 0

bridge = MCPBridge(robot)
bridge.on_reload(reset_state)

# In main loop:
bridge.detect_reload()  # Triggers callback if reload detected

Advanced: Custom Commands

def handle_custom(cmd):
    if cmd.get("action") == "my_action":
        print(f"Custom command: {cmd}")

bridge.register_command("my_action", handle_custom)

Available MCP Tools

Tool

Description

webots_get_robot_state

Get current robot state (pose, mode, etc.)

webots_get_sensors

Get sensor data from status

webots_get_camera

Get latest camera frame path

webots_get_logs

Get controller logs

webots_simulation_control

Pause/resume/reset/reload/step/fast

webots_world_reload

Force reload world (macOS: osascript)

webots_world_reset

Reset simulation to initial state

webots_reset_controller_state

Reset controller internal state

webots_take_screenshot

Capture simulation view

webots_monitor

Monitor robot for N seconds

webots_get_full_state

Complete state dump

Force Reload (macOS)

When controller is stuck, use force reload via osascript:

# From MCP:
webots_world_reload(force=True)  # Sends Ctrl+Shift+R to Webots
webots_world_reset(force=True)   # Sends Ctrl+Shift+T to Webots

Requires accessibility permissions for Terminal/IDE in System Preferences.

Data Directory Structure

data/
├── status.json      # Robot state (written by controller)
├── commands.json    # Commands from MCP
├── camera/          # Camera frames
├── screenshots/     # Simulation screenshots
└── logs/            # Controller logs

MCPBridge API Reference

bridge = MCPBridge(robot, data_dir=None, throttle_interval=5)

# Core
bridge.publish(state_dict)          # Publish state (throttled)
bridge.publish(state, force=True)   # Publish immediately
bridge.get_command()                # Check for MCP commands

# Reload Detection
bridge.on_reload(callback)          # Register reload callback
bridge.detect_reload()              # Check if world reloaded

# Custom Commands
bridge.register_command(action, handler)

# Utilities
bridge.log(message)                 # Write to log file
bridge.save_camera_frame(camera)    # Save camera image

Global Installation (All Projects)

Add to ~/.config/claude/mcp.json (Claude Code) or global Cursor settings:

{
  "mcpServers": {
    "webots": {
      "command": "python",
      "args": ["/absolute/path/to/webots_youbot_mcp_server.py"],
      "cwd": "/absolute/path/to/webots-youbot-mcp"
    }
  }
}

Requirements

  • Python 3.10+

  • mcp >= 1.0.0

  • pydantic >= 2.0.0

  • Pillow (optional, for camera frames)

License

MIT

-
security - not tested
F
license - not found
-
quality - not tested

Resources

Looking for Admin?

Admins can modify the Dockerfile, update the server description, and track usage metrics. If you are the server author, to access 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/luisfelipesena/webots-youbot-mcp'

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