{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-05T19:28:49.526Z","url":"https://verifymcp.io/servers/taewankung-ai-rover-mcp/ai-rover-mcp","markdownUrl":"https://verifymcp.io/servers/taewankung-ai-rover-mcp/ai-rover-mcp.md","server":{"slug":"taewankung-ai-rover-mcp","name":"AI Rover Studio","registryName":"io.github.taewankung/ai-rover-mcp","description":"Let an AI agent drive a 2D robot rover simulator in the browser: sensors, camera, wiring and code.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"ai-rover-mcp","type":"npm","identifier":"ai-rover-mcp","withdrawn":false,"url":"https://verifymcp.io/servers/taewankung-ai-rover-mcp/ai-rover-mcp","version":"1.1.2","transport":"stdio","scoredAt":"2026-11-05T02:12:26.141Z"},"score":{"total":67,"tier":"medium","status":"scored","weekDelta":null,"history":[{"date":"2026-11-05","total":67},{"date":"2026-11-04","total":67},{"date":"2026-11-03","total":67},{"date":"2026-11-02","total":67},{"date":"2026-11-01","total":67},{"date":"2026-10-31","total":52}]},"categories":[{"name":"Supply Chain Security","score":98,"verdict":"partial","reasons":["No malware found by supply-chain analysis.","No known CVEs affecting this package version or its production dependencies.","No install/post-install scripts declared.","30 of 93 dependencies flagged as unhealthy."],"codes":[{"code":"supplychain.malware_clean","args":{}},{"code":"cve.none","args":{}},{"code":"installscript.none","args":{}},{"code":"dephealth.assessed","args":{"deps":"93","unhealthy":"30"}}]},{"name":"Provenance & Transparency","score":45,"verdict":"fail","reasons":["Source repository is publicly reachable at the declared URL.","Provenance check failed: no build-provenance attestation is published.","Clear OSI-approved license (MIT).","Actively maintained (last published 4 days ago).","Disclosure check failed: no security disclosure policy was found in the source repository."],"codes":[{"code":"provenance.repo_verified","args":{}},{"code":"provenance.none","args":{}},{"code":"license.osi","args":{"spdx":"MIT"}},{"code":"maintenance.recent","args":{"age_days":"4"}},{"code":"disclosure.absent","args":{}}]},{"name":"Schema Quality & AI Usability","score":70,"verdict":"fail","reasons":["AI-judged instruction clarity (good).","Tool/resource definitions use about 3958 tokens (~96/item across 41 items; 41 tools + 0 resources), lean.","Usage-examples check failed: none of the tools include examples."],"codes":[{"code":"schema.ai_quality","args":{"band":"good"}},{"code":"schema.footprint_lean","args":{"avg":"96","items":"41","tools":"41","tokens":"3958","resources":"0"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":0,"verdict":"unverified","reasons":["Stability not yet verified: not enough scan history yet (needs a 30-day window)."],"codes":[{"code":"stability.insufficient_history","args":{}}]},{"name":"Tool Coverage","score":85,"verdict":"partial","reasons":["100% of tools have a non-trivial description (not blank, and not just the tool's name).","54% of tool parameters carry a description."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"54"}}]},{"name":"Tool Safety","score":94,"verdict":"partial","reasons":["No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.","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.","An AI judge read all 42 captured unit(s) of tool text and found none that tries to manipulate the model reading it."],"codes":[{"code":"toolsafety.injection_clean","args":{}},{"code":"toolsafety.destructive_undeclared","args":{"pct":"75","tool":"send_chat","verb":"send","declared":"none","annotated":"3","destructive":"4"}},{"code":"toolsafety.manipulation_clean","args":{"units":"42","judged":"42"}}]},{"name":"Capabilities","score":100,"verdict":"pass","reasons":["Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28."],"codes":[{"code":"protocol.supported","args":{"latest":"2026-07-28","version":"2025-11-25"}}]}],"inconclusive":["Stability not yet verified: not enough scan history yet (needs a 30-day window)."],"malware":[],"components":[{"slug":"ai-rover-mcp","type":"npm","identifier":"ai-rover-mcp","withdrawn":false,"score":67,"current":true,"url":"https://verifymcp.io/servers/taewankung-ai-rover-mcp/ai-rover-mcp","markdownUrl":"https://verifymcp.io/servers/taewankung-ai-rover-mcp/ai-rover-mcp.md"}],"facts":[{"label":"Registry","value":"npm"},{"label":"Package","value":"ai-rover-mcp"},{"label":"Version","value":"1.1.2"},{"label":"Transport","value":"stdio"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"open_simulator","title":"Open simulator","description":"Open the AI Rover Studio page in the default browser and wait (up to 15 s) for it to connect to this MCP server.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":37},{"name":"connection_status","title":"Connection status","description":"Report whether the simulator page is connected to this MCP server.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":20},{"name":"get_observation","title":"Get observation","description":"Current robot pose (x, y, heading_deg), velocity, every enabled sensor reading, face display state, plus simulation status (running, autopilot, power, lamp position).","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":45},{"name":"read_sensors","title":"Read sensors","description":"Fresh readings from all enabled sensors, with their mounting position, angle, range and unit.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":27},{"name":"drive","title":"Drive","description":"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.","inputs":[{"name":"direction","type":"string","required":true,"description":null},{"name":"seconds","type":"number","required":false,"description":"Duration, 0.2–10 s (default 2 for forward/backward, 1 for turns)"},{"name":"wait","type":"boolean","required":false,"description":"Wait for the move to finish before returning (default true)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":168},{"name":"turn","title":"Turn by degrees","description":"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.","inputs":[{"name":"degrees","type":"number","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":74},{"name":"run_program","title":"Run a rover program","description":"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.","inputs":[{"name":"code","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":241},{"name":"stop_program","title":"Stop the program","description":"Stop the running rover program (its worker is terminated, the wheels stop).","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":23},{"name":"get_program","title":"Program status","description":"The current/last rover program: code, status (idle, running, listening, done, stopped, error), error { message, line } and the last 50 console lines.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":45},{"name":"stop","title":"Stop","description":"Emergency stop: cancel any movement, turn autopilot off and pause the simulation.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":23},{"name":"set_simulation","title":"Start / pause simulation","description":"Start (running=true) or pause (running=false) the physics simulation.","inputs":[{"name":"running","type":"boolean","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":31},{"name":"set_autopilot","title":"Autopilot","description":"Enable the built-in rule-based autopilot (seeks the light, backs away from obstacles; also starts the simulation) or disable it.","inputs":[{"name":"enabled","type":"boolean","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":45},{"name":"set_power","title":"Motor power","description":"Set motor power in percent (10–100). Max speed is 170 px/s at 100 % (drive uses 65 % of it forward, 55 % backward).","inputs":[{"name":"percent","type":"number","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":51},{"name":"set_emotion","title":"Face expression","description":"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.","inputs":[{"name":"emotion","type":"string","required":true,"description":null},{"name":"message","type":"string","required":false,"description":"Speech text shown under the face"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":74},{"name":"display_text","title":"Show text on the display","description":"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.","inputs":[{"name":"seconds","type":"number","required":false,"description":"How long to show it (default 6)"},{"name":"text","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":108},{"name":"set_display","title":"Choose the display module","description":"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.","inputs":[{"name":"model","type":"string","required":false,"description":null},{"name":"panel","type":"string","required":false,"description":"SSD1306 panel colour: yellow-blue (top 16 rows yellow, rest blue; the default), white, blue or yellow"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":151},{"name":"draw_display","title":"Draw a picture on the display","description":"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.","inputs":[{"name":"palette","type":"object","required":false,"description":"Extra colour letters, e.g. {\"s\": \"#87ceeb\"} (colour modules)"},{"name":"panel","type":"string","required":false,"description":"SSD1306 panel colour: yellow-blue (top 16 rows yellow, rest blue; the default), white, blue or yellow"},{"name":"rows","type":"array","required":true,"description":"Pixel rows, top to bottom"},{"name":"scale","type":"integer","required":false,"description":"Pixel size (default 1)"},{"name":"seconds","type":"number","required":false,"description":"How long to show it (default 10)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":329},{"name":"read_display","title":"Read the display","description":"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).","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":65},{"name":"move_light","title":"Move light source","description":"Move the light source to world coordinates (clamped to 42–758 × 42–478).","inputs":[{"name":"x","type":"number","required":true,"description":null},{"name":"y","type":"number","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":43},{"name":"reset_world","title":"Reset world","description":"Put the rover back at its start pose (120, 265, heading 0°) and the light at (690, 70). Turns autopilot off.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":42},{"name":"send_chat","title":"Send chat command","description":"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.","inputs":[{"name":"text","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":72},{"name":"get_manifest","title":"Get robot manifest","description":"The Robot Capability Manifest (ai-cartridge/body-v1): motors, installed sensor modules and display.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":28},{"name":"list_sensors","title":"List sensors","description":"All configured sensors (enabled or not) with id, type, mounting position, angle and range.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":29},{"name":"add_sensor","title":"Add sensor","description":"Install a new sensor on the rover body. Unspecified fields use the type defaults (centre of the body, facing forward).","inputs":[{"name":"angle","type":"number","required":false,"description":"Facing angle in degrees, 0 = forward, 90 = right side (wrapped to −180…180)"},{"name":"enabled","type":"boolean","required":false,"description":null},{"name":"name","type":"string","required":false,"description":"Display name"},{"name":"range","type":"number","required":false,"description":"Detection range in cm"},{"name":"type","type":"string","required":true,"description":null},{"name":"x","type":"number","required":false,"description":"Local x in px (forward +, rear −)"},{"name":"y","type":"number","required":false,"description":"Local y in px (right side +, left side −)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":132},{"name":"update_sensor","title":"Update sensor","description":"Change a sensor's name, type, mounting position, angle, range or enabled flag. Use list_sensors to find ids.","inputs":[{"name":"angle","type":"number","required":false,"description":"Facing angle in degrees, 0 = forward, 90 = right side (wrapped to −180…180)"},{"name":"enabled","type":"boolean","required":false,"description":null},{"name":"id","type":"string","required":true,"description":null},{"name":"name","type":"string","required":false,"description":"Display name"},{"name":"range","type":"number","required":false,"description":"Detection range in cm"},{"name":"type","type":"string","required":false,"description":null},{"name":"x","type":"number","required":false,"description":"Local x in px (forward +, rear −)"},{"name":"y","type":"number","required":false,"description":"Local y in px (right side +, left side −)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":140},{"name":"remove_sensor","title":"Remove sensor","description":"Uninstall a sensor by id.","inputs":[{"name":"id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":22},{"name":"set_module","title":"Install / remove a module","description":"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).","inputs":[{"name":"installed","type":"boolean","required":true,"description":null},{"name":"module","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":79},{"name":"set_head","title":"Turn the head","description":"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.","inputs":[{"name":"angle_deg","type":"number","required":false,"description":null},{"name":"track_light","type":"boolean","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":135},{"name":"press_button","title":"Press a button","description":"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.","inputs":[{"name":"id","type":"string","required":true,"description":"Button sensor id (list_sensors)"},{"name":"seconds","type":"number","required":false,"description":"How long to hold it (default 0.2 s)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":120},{"name":"get_button_events","title":"Button events","description":"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.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":71},{"name":"get_head","title":"Head status","description":"Head module status: angle_deg, target_deg, mode (manual / track_light), tracking phase and the head light brightness.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":33},{"name":"capture_camera","title":"Capture camera image","description":"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.","inputs":[{"name":"fov_deg","type":"number","required":false,"description":"Change the horizontal field of view first (default 60°)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":107},{"name":"get_sensor_map","title":"Get sensor map","description":"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.","inputs":[{"name":"clear","type":"boolean","required":false,"description":"Clear the map before returning it (default false)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":114},{"name":"get_wiring","title":"Get wiring","description":"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).","inputs":[{"name":"board","type":"string","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":215},{"name":"get_bom","title":"Get parts list","description":"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\".","inputs":[{"name":"board","type":"string","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":125},{"name":"get_firmware","title":"Get firmware","description":"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.","inputs":[{"name":"board","type":"string","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":184},{"name":"list_world","title":"List world layout","description":"World size, light position, all obstacles (id, kind, shape, position, size, color) and colored floor tapes.","inputs":[],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":34},{"name":"add_obstacle","title":"Add obstacle","description":"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.","inputs":[{"name":"angle","type":"number","required":false,"description":"Rotation in degrees for box / wall"},{"name":"color","type":"string","required":false,"description":null},{"name":"h","type":"number","required":false,"description":"Height (depth) for box / wall"},{"name":"kind","type":"string","required":true,"description":null},{"name":"r","type":"number","required":false,"description":"Radius for cylinder / ball"},{"name":"w","type":"number","required":false,"description":"Width for box / wall"},{"name":"x","type":"number","required":true,"description":"World x (px)"},{"name":"y","type":"number","required":true,"description":"World y (px)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":159},{"name":"remove_obstacle","title":"Remove obstacle","description":"Remove an obstacle by id (see list_world).","inputs":[{"name":"id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":26},{"name":"add_color_tape","title":"Add colored floor tape","description":"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.","inputs":[{"name":"angle","type":"number","required":false,"description":"Rotation in degrees (0 = along x)"},{"name":"color","type":"string","required":true,"description":null},{"name":"length","type":"number","required":false,"description":"Length in px (default 100)"},{"name":"width","type":"number","required":false,"description":"Width in px (default 18)"},{"name":"x","type":"number","required":true,"description":"Centre x (px)"},{"name":"y","type":"number","required":true,"description":"Centre y (px)"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":114},{"name":"remove_color_tape","title":"Remove colored floor tape","description":"Remove a floor tape by id (see list_world).","inputs":[{"name":"id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":28}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-05T02:12:26.000Z","track":"package","endpoint":null,"declaredUrl":null,"truncated":false,"tls":null,"dnssec":null,"auth":null,"httpsRedirect":null,"transports":[],"provenance":{"outcome":"none","label":"No attestation","reason":null,"reasonLabel":null,"discovery":null,"discoveryLabel":null,"sourceRepo":null,"attestationSkipped":null,"attestationSkippedLabel":null},"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":{"nodes":93,"partial":false,"deprecated":null,"stale":30,"noRepo":null}},"mismatches":[],"changelog":{"trackingSince":"2026-10-31","recent":[{"id":"chg_01a194e1-a758-7c1a-aada-5e88b2552d24","kind":"check.reverified","summary":"Malware scan (unverified → pass)","materiality":"security","direction":"improvement","scoreDelta":null,"occurredOn":"2026-11-01","url":"https://verifymcp.io/servers/taewankung-ai-rover-mcp/ai-rover-mcp#chg-chg_01a194e1-a758-7c1a-aada-5e88b2552d24"},{"id":"chg_01a194e1-a759-7516-87cb-a4c294f508d5","kind":"score.total_changed","summary":"Trust score (52 → 67)","materiality":"functional","direction":"improvement","scoreDelta":15,"occurredOn":"2026-11-01","url":"https://verifymcp.io/servers/taewankung-ai-rover-mcp/ai-rover-mcp#chg-chg_01a194e1-a759-7516-87cb-a4c294f508d5"},{"id":"chg_01a191f7-8c2c-70c4-b52a-f6468b818833","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/taewankung-ai-rover-mcp/ai-rover-mcp#chg-chg_01a191f7-8c2c-70c4-b52a-f6468b818833"}],"truncated":false,"feedUrl":"https://verifymcp.io/servers/taewankung-ai-rover-mcp/ai-rover-mcp/changelog.json"},"links":{"html":"https://verifymcp.io/servers/taewankung-ai-rover-mcp/ai-rover-mcp","markdown":"https://verifymcp.io/servers/taewankung-ai-rover-mcp/ai-rover-mcp.md","changelogJson":"https://verifymcp.io/servers/taewankung-ai-rover-mcp/ai-rover-mcp/changelog.json","changelogRss":"https://verifymcp.io/servers/taewankung-ai-rover-mcp/ai-rover-mcp.xml","external":[{"label":"npm package","href":"https://www.npmjs.com/package/ai-rover-mcp"},{"label":"Socket report","href":"https://socket.dev/npm/package/ai-rover-mcp"},{"label":"Repository","href":"https://github.com/taewankung/ai-rover-mcp"},{"label":"Website","href":"https://ai-rover.app/"}]}}