AI Rover Studio
NPM · AI-ROVER-MCP
Let an AI agent drive a 2D robot rover simulator in the browser: sensors, camera, wiring and code.
Available components
Last scanned (10 hours ago)
Scores higher than 35% of npm servers
Category IoT and Hardware
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 30 of 93 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 4 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability70
- AI-judged instruction clarity (good).Pass
- Tool/resource definitions use about 3958 tokens (~96/item across 41 items; 41 tools + 0 resources), lean.Pass
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
- Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage85
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 54% of tool parameters carry a description.Partial
Tool Safety94
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 3 of 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "send_chat" implies "send" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Partial
- An AI judge read all 42 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Unverified: 1 category
A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 1 Nov 26 +15
- Malware scan: unverified → pass ▲ security
- 31 Oct 26 52
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Analysed npm/ai-rover-mcp@1.1.2
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Dependencies 93 packages
| Packages resolved | 93 |
|---|---|
| Stale | 30 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
add_color_tape Add colored floor tape ~114
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.
| Name | Type | Req | Description |
|---|---|---|---|
| angle | number | – | Rotation in degrees (0 = along x) |
| color | string | yes | – |
| length | number | – | Length in px (default 100) |
| width | number | – | Width in px (default 18) |
| x | number | yes | Centre x (px) |
| y | number | yes | Centre y (px) |
No output schema declared.
No examples provided.
add_obstacle Add obstacle ~159
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.
| Name | Type | Req | Description |
|---|---|---|---|
| angle | number | – | Rotation in degrees for box / wall |
| color | string | – | – |
| h | number | – | Height (depth) for box / wall |
| kind | string | yes | – |
| r | number | – | Radius for cylinder / ball |
| w | number | – | Width for box / wall |
| x | number | yes | World x (px) |
| y | number | yes | World y (px) |
No output schema declared.
No examples provided.
add_sensor Add sensor ~132
Install a new sensor on the rover body. Unspecified fields use the type defaults (centre of the body, facing forward).
| Name | Type | Req | Description |
|---|---|---|---|
| angle | number | – | Facing angle in degrees, 0 = forward, 90 = right side (wrapped to −180…180) |
| enabled | boolean | – | – |
| name | string | – | Display name |
| range | number | – | Detection range in cm |
| type | string | yes | – |
| x | number | – | Local x in px (forward +, rear −) |
| y | number | – | Local y in px (right side +, left side −) |
No output schema declared.
No examples provided.
capture_camera Capture camera image ~107
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.
| Name | Type | Req | Description |
|---|---|---|---|
| fov_deg | number | – | Change the horizontal field of view first (default 60°) |
No output schema declared.
No examples provided.
connection_status Connection status ~20
Report whether the simulator page is connected to this MCP server.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
display_text Show text on the display ~108
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.
| Name | Type | Req | Description |
|---|---|---|---|
| seconds | number | – | How long to show it (default 6) |
| text | string | yes | – |
No output schema declared.
No examples provided.
draw_display Draw a picture on the display ~329
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.
| Name | Type | Req | Description |
|---|---|---|---|
| palette | object | – | Extra colour letters, e.g. {"s": "#87ceeb"} (colour modules) |
| panel | string | – | SSD1306 panel colour: yellow-blue (top 16 rows yellow, rest blue; the default), white, blue or yellow |
| rows | array | yes | Pixel rows, top to bottom |
| scale | integer | – | Pixel size (default 1) |
| seconds | number | – | How long to show it (default 10) |
No output schema declared.
No examples provided.
drive Drive ~168
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.
| Name | Type | Req | Description |
|---|---|---|---|
| direction | string | yes | – |
| seconds | number | – | Duration, 0.2–10 s (default 2 for forward/backward, 1 for turns) |
| wait | boolean | – | Wait for the move to finish before returning (default true) |
No output schema declared.
No examples provided.
get_bom Get parts list ~125
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".
| Name | Type | Req | Description |
|---|---|---|---|
| board | string | – | – |
No output schema declared.
No examples provided.
get_button_events Button events ~71
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.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_firmware Get firmware ~184
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.
| Name | Type | Req | Description |
|---|---|---|---|
| board | string | – | – |
No output schema declared.
No examples provided.
get_head Head status ~33
Head module status: angle_deg, target_deg, mode (manual / track_light), tracking phase and the head light brightness.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_manifest Get robot manifest ~28
The Robot Capability Manifest (ai-cartridge/body-v1): motors, installed sensor modules and display.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_observation Get observation ~45
Current robot pose (x, y, heading_deg), velocity, every enabled sensor reading, face display state, plus simulation status (running, autopilot, power, lamp position).
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_program Program status ~45
The current/last rover program: code, status (idle, running, listening, done, stopped, error), error { message, line } and the last 50 console lines.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_sensor_map Get sensor map ~114
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.
| Name | Type | Req | Description |
|---|---|---|---|
| clear | boolean | – | Clear the map before returning it (default false) |
No output schema declared.
No examples provided.
get_wiring Get wiring ~215
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).
| Name | Type | Req | Description |
|---|---|---|---|
| board | string | – | – |
No output schema declared.
No examples provided.
list_sensors List sensors ~29
All configured sensors (enabled or not) with id, type, mounting position, angle and range.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_world List world layout ~34
World size, light position, all obstacles (id, kind, shape, position, size, color) and colored floor tapes.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
move_light Move light source ~43
Move the light source to world coordinates (clamped to 42–758 × 42–478).
| Name | Type | Req | Description |
|---|---|---|---|
| x | number | yes | – |
| y | number | yes | – |
No output schema declared.
No examples provided.
open_simulator Open simulator ~37
Open the AI Rover Studio page in the default browser and wait (up to 15 s) for it to connect to this MCP server.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
press_button Press a button ~120
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Button sensor id (list_sensors) |
| seconds | number | – | How long to hold it (default 0.2 s) |
No output schema declared.
No examples provided.
read_display Read the display ~65
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).
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
read_sensors Read sensors ~27
Fresh readings from all enabled sensors, with their mounting position, angle, range and unit.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
remove_color_tape Remove colored floor tape ~28
Remove a floor tape by id (see list_world).
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | – |
No output schema declared.
No examples provided.
remove_obstacle Remove obstacle ~26
Remove an obstacle by id (see list_world).
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | – |
No output schema declared.
No examples provided.
remove_sensor Remove sensor ~22
Uninstall a sensor by id.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | – |
No output schema declared.
No examples provided.
reset_world Reset world ~42
Put the rover back at its start pose (120, 265, heading 0°) and the light at (690, 70). Turns autopilot off.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
run_program Run a rover program ~241
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.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | yes | – |
No output schema declared.
No examples provided.
send_chat Send chat command ~72
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.
| Name | Type | Req | Description |
|---|---|---|---|
| text | string | yes | – |
No output schema declared.
No examples provided.
set_autopilot Autopilot ~45
Enable the built-in rule-based autopilot (seeks the light, backs away from obstacles; also starts the simulation) or disable it.
| Name | Type | Req | Description |
|---|---|---|---|
| enabled | boolean | yes | – |
No output schema declared.
No examples provided.
set_display Choose the display module ~151
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.
| Name | Type | Req | Description |
|---|---|---|---|
| model | string | – | – |
| panel | string | – | SSD1306 panel colour: yellow-blue (top 16 rows yellow, rest blue; the default), white, blue or yellow |
No output schema declared.
No examples provided.
set_emotion Face expression ~74
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.
| Name | Type | Req | Description |
|---|---|---|---|
| emotion | string | yes | – |
| message | string | – | Speech text shown under the face |
No output schema declared.
No examples provided.
set_head Turn the head ~135
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.
| Name | Type | Req | Description |
|---|---|---|---|
| angle_deg | number | – | – |
| track_light | boolean | – | – |
No output schema declared.
No examples provided.
set_module Install / remove a module ~79
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).
| Name | Type | Req | Description |
|---|---|---|---|
| installed | boolean | yes | – |
| module | string | yes | – |
No output schema declared.
No examples provided.
set_power Motor power ~51
Set motor power in percent (10–100). Max speed is 170 px/s at 100 % (drive uses 65 % of it forward, 55 % backward).
| Name | Type | Req | Description |
|---|---|---|---|
| percent | number | yes | – |
No output schema declared.
No examples provided.
set_simulation Start / pause simulation ~31
Start (running=true) or pause (running=false) the physics simulation.
| Name | Type | Req | Description |
|---|---|---|---|
| running | boolean | yes | – |
No output schema declared.
No examples provided.
stop Stop ~23
Emergency stop: cancel any movement, turn autopilot off and pause the simulation.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
stop_program Stop the program ~23
Stop the running rover program (its worker is terminated, the wheels stop).
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
turn Turn by degrees ~74
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.
| Name | Type | Req | Description |
|---|---|---|---|
| degrees | number | yes | – |
No output schema declared.
No examples provided.
update_sensor Update sensor ~140
Change a sensor's name, type, mounting position, angle, range or enabled flag. Use list_sensors to find ids.
| Name | Type | Req | Description |
|---|---|---|---|
| angle | number | – | Facing angle in degrees, 0 = forward, 90 = right side (wrapped to −180…180) |
| enabled | boolean | – | – |
| id | string | yes | – |
| name | string | – | Display name |
| range | number | – | Detection range in cm |
| type | string | – | – |
| x | number | – | Local x in px (forward +, rear −) |
| y | number | – | Local y in px (right side +, left side −) |
No output schema declared.
No examples provided.
How do I install the AI Rover Studio MCP server?
AI Rover Studio runs locally as an npm package, launched with npx -y ai-rover-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · ai-rover-mcp
claude mcp add taewankung-ai-rover-mcp -- npx -y ai-rover-mcp
What is the AI Rover Studio MCP server?
AI Rover Studio is an MCP server listed in the public MCP registry as io.github.taewankung/ai-rover-mcp. Let an AI agent drive a 2D robot rover simulator in the browser: sensors, camera, wiring and code. This page covers its npm package (ai-rover-mcp).
Is the AI Rover Studio MCP server safe to use?
AI Rover Studio scores 67 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the AI Rover Studio MCP server expose?
AI Rover Studio exposes 41 tools: open_simulator, connection_status, get_observation, read_sensors, drive, and 36 more. Their descriptions and schemas cost roughly 3,609 tokens of context every time the server is loaded.
Is the AI Rover Studio MCP server still maintained?
AI Rover Studio is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the AI Rover Studio MCP server under?
AI Rover Studio declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.