open_simulator
Open simulator
Open the AI Rover Studio page in the default browser and wait (up to 15 s) for it to connect to this MCP server.
無需輸入參數。

io.github.taewankung由 GitHub 帳號 taewankung 發布v1.1.2更新於 Oct 31, 2026
Let an AI agent drive a 2D robot rover simulator in the browser: sensors, camera, wiring and code.
在瀏覽器中操控 2D 機器人漫遊車模擬器:感測器、攝影機、機身模組、程式,以及產生的接線與韌體。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
參照 儲存庫 中的啟動說明。
MCP server for AI Rover Studio, a 2D robot simulator that runs in the browser. It lets an AI agent (Claude Code, Claude Desktop or any MCP client) observe and drive the rover, change its body, run programs and read the real wiring for an ESP32 / Arduino Uno / Raspberry Pi. Simulation only: nothing is sent to hardware.
The page must be open in a browser and the tab must stay visible, because browsers
pause animation frames in background tabs, so the simulation stops there. The badge in
the page header shows MCP ● connected while the bridge is up.
Needs Node.js 18 or newer.
Then ask Claude to "open the rover simulator". open_simulator opens the hosted simulator
with ?mcp=on, which tells the page to connect to this server.
Open https://ai-rover.app/app/?mcp=on. Without ?mcp=on the hosted page does not
try to reach a local MCP server; you can also press เชื่อมต่อ MCP on its Agent / MCP page.
A copy opened from disk (file://) or from localhost connects on its own.
Example prompts: "Open the rover simulator and drive it to the light without using the autopilot", "Add an IR sensor on each side angled ±45° and tell me the readings", "What parts do I need to build this rover on an ESP32?"
ROVER_BRIDGE_PORT (default 8765). If you change it, the page needs ?mcpPort=<port>
(open_simulator adds this for you).ROVER_SIMULATOR_URL: the page open_simulator opens instead of the hosted one. A URL
(http://localhost:5173 while developing) or a path to a local build (dist/index.html,
relative to the working directory).ROVER_ALLOWED_ORIGINS: extra comma-separated https:// origins the bridge accepts
(for a self-hosted copy of the simulator).?mcp=on connects to the server, ?mcp=off never does.The WebSocket listens on 127.0.0.1 only. It accepts connections only from the page
opened from disk (file://), from localhost, from the hosted simulator, or from the
origin of ROVER_SIMULATOR_URL / ROVER_ALLOWED_ORIGINS, so other websites open in the
same browser cannot pose as the rover. The page only runs the fixed set of methods listed
above; it never evaluates code it receives from the server, except the program you send
with run_program, which runs in a Web Worker.
MIT
來源:README.md,提交 2857a7d
Open simulator
Open the AI Rover Studio page in the default browser and wait (up to 15 s) for it to connect to this MCP server.
無需輸入參數。
Connection status
Report whether the simulator page is connected to this MCP server.
無需輸入參數。
Get observation
Current robot pose (x, y, heading_deg), velocity, every enabled sensor reading, face display state, plus simulation status (running, autopilot, power, lamp position).
無需輸入參數。
Read sensors
Fresh readings from all enabled sensors, with their mounting position, angle, range and unit.
無需輸入參數。
Drive
Move the rover for a fixed time: forward / backward, or turn left / right in place. Turns autopilot off and starts the simulation. Rotation speed is about 2 rad/s (≈115°/s), so turning 90° takes ≈0.8 s. Forward speed is 65 % of max speed (≈61 px/s at the default 55 % power; backward ≈51 px/s). With wait=true (default) it returns the observation after the move finishes. The rover stops on collisions.
waitsecondsdirection必填Turn by degrees
Turn the rover in place by an exact angle (+ = right / clockwise, − = left) at ≈115°/s, then return the observation. Unlike drive left/right there is no 0.2 s minimum, so small corrections (e.g. 7°) are exact.
degrees必填Run a rover program
Run JavaScript on the robot with the `rover` library (same as the Code page; it replaces any running program and starts the simulation). Top-level await works. Motion (await): rover.forward(s), backward(s), turn(deg), left(s), right(s); rover.drive(speed −1…1, turn °/s) keeps going; rover.stop(); rover.power(%). Readings (sync, 50 ms snapshots): rover.read(id), sensors(), distance() (nearest sonar/IR cm), light() (%), bumped(), pose(), time(). Head/face: await rover.head(deg), trackLight(on), headAngle(); rover.face(emotion, text), say(text, s). Buttons: pressed(id), onButton([id], fn(event)), await waitButton([id]). Time/output: await wait(s), await rover.until(fn, timeout), log(...). Customise: await rover.module(name, on), addSensor({type,name,x,y,angle,range}), updateSensor(id, fields), removeSensor(id), sensorList(). Returns immediately; poll get_program for status and the console.
code必填Stop the program
Stop the running rover program (its worker is terminated, the wheels stop).
無需輸入參數。
Program status
The current/last rover program: code, status (idle, running, listening, done, stopped, error), error { message, line } and the last 50 console lines.
無需輸入參數。
Stop
Emergency stop: cancel any movement, turn autopilot off and pause the simulation.
無需輸入參數。
Start / pause simulation
Start (running=true) or pause (running=false) the physics simulation.
running必填Autopilot
Enable the built-in rule-based autopilot (seeks the light, backs away from obstacles; also starts the simulation) or disable it.
enabled必填Motor power
Set motor power in percent (10–100). Max speed is 170 px/s at 100 % (drive uses 65 % of it forward, 55 % backward).
percent必填Face expression
Show an expression on the robot's face display (emulated SSD1306 128×64 OLED); the message appears in the top text line and scrolls if long. Held ~5 s before sensor-driven emotions resume.
emotion必填messageShow text on the display
Make the rover "say" a text on the Face Display module (128×64 OLED): a small rover face with a talking mouth and the text typed out in a speech bubble (Thai supported, ~11 characters per line, 2 lines per bubble, extra bubbles follow). Returns to the big face after `seconds`, or once every bubble has been shown if that takes longer.
text必填secondsChoose the display module
Fit a different Face Display module: "ssd1306" (0.96" 128×64 monochrome OLED, I²C; default), "ssd1331" (0.95" 96×64 colour RGB OLED, SPI) or "st7789" (1.3" 240×240 colour IPS TFT, SPI). Faces and text adapt to the resolution; colour modules show a colour per emotion. `panel` changes the SSD1306 glass colour. Returns read_display.
modelpanelDraw a picture on the display
Show a picture on the Face Display module for `seconds`, then return to the face. Pass one string per pixel row, at most the module's resolution (SSD1306 128×64, SSD1331 96×64, ST7789 240×240; see read_display). Characters space . 0 - _ are dark. On colour modules (SSD1331, ST7789) these letters pick a colour: R red, O orange, Y yellow, G green, C cyan, B blue, P purple, M pink, W white, A grey, N brown, K black; any other character is white, and `palette` adds or overrides letters. On the monochrome SSD1306 every non-blank, non-black character is a lit pixel and colour comes from its panel variant (`panel`). The picture is centred; `scale` enlarges each pixel (e.g. 64×32 with scale 2 fills 128×64) and is lowered if it would not fit. Returns read_display, so the result shows what the module actually displays.
rows必填panelscalepalettesecondsRead the display
Read back what the Face Display module is showing: mode (face/text), text lines, module stats (frames, fps, bytes) and the actual 128×64 pixels from the module's GDDRAM as ASCII art (█▀▄, 2 pixel rows per line).
無需輸入參數。
Move light source
Move the light source to world coordinates (clamped to 42–758 × 42–478).
x必填y必填Reset world
Put the rover back at its start pose (120, 265, heading 0°) and the light at (690, 70). Turns autopilot off.
無需輸入參數。
Send chat command
Send a message to the in-page Agent Chat (offline Thai/English command parser, e.g. "ไปหาแสง", "อ่านเซนเซอร์", "เดินหน้า 2 วินาที") and return the rover's reply. It shows up in the chat panel.
text必填Get robot manifest
The Robot Capability Manifest (ai-cartridge/body-v1): motors, installed sensor modules and display.
無需輸入參數。
List sensors
All configured sensors (enabled or not) with id, type, mounting position, angle and range.
無需輸入參數。
Add sensor
Install a new sensor on the rover body. Unspecified fields use the type defaults (centre of the body, facing forward).
xynametype必填anglerangeenabledUpdate sensor
Change a sensor's name, type, mounting position, angle, range or enabled flag. Use list_sensors to find ids.
xyid必填nametypeanglerangeenabledRemove sensor
Uninstall a sensor by id.
id必填Install / remove a module
Install or remove a body module: "wheels" (drive motors + wheels; without them the rover cannot move), "head" (pan servo that turns the face and the light sensors), "display" (AI Face Display OLED) or "camera" (forward-facing camera).
module必填installed必填Turn the head
Control the Head module (pan servo, needs set_module head first). angle_deg turns the face to −90…90° relative to the body (+ = right, servo ≈180°/s) and switches to manual. track_light=true makes the head find and follow the light with its own light sensors: it sweeps the full range, settles on the brightest angle and keeps hill-climbing (rescans if the light is lost). Light sensors are directional (brightest when facing the lamp) and ride on the head. Starts the simulation.
angle_degtrack_lightPress a button
Press a push-button module (a sensor of type "button") for `seconds` and release it, like a person would. Held ≥ 0.8 s is a long press. The built-in program reacts: short press toggles the head's light tracking (happy face), long press stops everything (driving, autopilot, tracking; pauses the simulation). Returns the press event.
id必填secondsButton events
Button presses since the last call (oldest first, then cleared): { id, name, press: "short" | "long", seconds, at (ms epoch) }, plus every button and whether it is held right now. People press buttons in the simulator page; poll this to react to them.
無需輸入參數。
Head status
Head module status: angle_deg, target_deg, mode (manual / track_light), tracking phase and the head light brightness.
無需輸入參數。
Capture camera image
Take a picture with the rover's forward-facing camera (needs the camera module). Returns a 320×240 first-person PNG (walls, colored obstacles, colored floor tape, the light source) and a JSON list of what is in view: type (obstacle / tape / light), id, color, bearing_deg (0 = straight ahead, + = right) and distance_cm.
fov_degGet sensor map
The map the rover has built from its own sensors only (not the true layout): an occupancy grid of 10 px cells as ASCII rows ("#" occupied by a sonar/IR echo or bumper hit, "." free, " " unknown, "@" rover, a capital letter = floor color read by a color sensor), camera landmarks with estimated world x/y, bumper hit points, the pose and exploration stats. clear=true wipes the map first.
clearGet wiring
How the fitted rover body wires to a real microcontroller (the Wiring page): for each part (TB6612FNG motor driver, each enabled sensor, the display module, the camera) every pin and where it goes (MCU pin or 5V / 3V3 / GND / VBAT rail), the power budget per rail, issues found (pin conflicts, missing pins, 5 V signals into 3.3 V pins, duplicate I²C addresses, ESP32 strapping / ADC2 pins) and a ready-to-use pin file (Arduino pins.h, or pins.py with BCM numbers on the Pi). `board` switches the board first: "esp32" (ESP32 DevKit V1), "uno" (Arduino Uno R3) or "raspberrypi" (Raspberry Pi 4/5 40-pin header; analog sensors go through an ADS1115 on I²C, the camera on the CSI ribbon).
boardGet parts list
Bill of materials for building the fitted rover body for real (the parts tab on the Wiring page): the board, motor driver, every enabled sensor, display, camera and head servo, plus the parts the circuit needs around them (chassis, battery, buck converter, voltage-divider resistors, level shifter …), each with quantity, approximate price in THB and shop links when known, and a plain-text list to copy. `board` switches the board first: "esp32", "uno" or "raspberrypi".
boardGet firmware
A complete program for the real robot, generated from the fitted body and the wiring pin map: an Arduino sketch (rover_firmware.ino) for "esp32" / "uno", or a Python script (rover.py) for "raspberrypi". It drives the TB6612FNG wheels, reads every enabled sensor, turns the head servo (with light tracking), draws faces on the display and runs the same auto emotions / rule-based autopilot as the simulator. Text commands over Serial 115200 / stdin: READ, F|B|L|R <s>, AUTO 0|1, POWER <%>, HEAD <deg>, TRACK 0|1, EMO <emotion> [text], SAY <text>, STOP. Returns { name, text }. `board` switches the board first.
boardList world layout
World size, light position, all obstacles (id, kind, shape, position, size, color) and colored floor tapes.
無需輸入參數。
Add obstacle
Place an object in the world to test sensors, collisions or the camera. Kinds: cylinder / ball (circle, radius r), box / wall (rectangle w × h, rotated by angle°). Unspecified size and color use the kind's defaults. Refused if it would overlap the rover.
hrwx必填y必填kind必填anglecolorRemove obstacle
Remove an obstacle by id (see list_world).
id必填Add colored floor tape
Stick a strip of colored tape on the floor (for the color sensor, line following and the camera). A color sensor over the tape reads its color name.
x必填y必填anglecolor必填widthlengthRemove colored floor tape
Remove a floor tape by id (see list_world).
id必填已滿足適用檢查項的 90%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
MCP client ──stdio──▶ ai-rover-mcp ──WebSocket 127.0.0.1:8765──▶ simulator page in your browserclaude mcp add ai-rover -- npx -y ai-rover-mcp{ "mcpServers": { "ai-rover": { "command": "npx", "args": ["-y", "ai-rover-mcp"] } }}npm installclaude mcp add ai-rover -- node /path/to/ai-rover-mcp/server.js