irobot-mcp
Controls local-network iRobot Roomba vacuums over MQTT, providing tools to discover the robot, read live status (battery, bin, dock, wifi), decode why it stopped or is waiting, send mission commands such as start, pause, stop, resume, dock, empty bin, and trigger a find beep.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@irobot-mcpwhy did my Roomba stop cleaning?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
irobot-mcp
Control a local-network iRobot Roomba from the command line and from an MCP server — no cloud account, no internet round-trip. Talks straight to the robot's own MQTT broker over your LAN.
Built and tested against a Roomba i4 (i415020), firmware daredevil+2.6.0.
What this can and cannot do
It can: discover the robot on the LAN, read live state (battery, bin, dock, wifi, mission progress, lifetime counters), start/stop/pause/resume a cleaning mission, send it to the dock, empty the bin, make it beep, and — the actually useful part day to day — tell you in plain language why it stopped by decoding the numeric error code.
It cannot drive the robot. There is no forward/turn/nudge/motor control. Wifi Roombas only expose mission-level commands; the low-level drive API of the old serial "Roomba Open Interface" is not reachable over wifi. This is a hard limit of the hardware, verified three independent ways (dorita980's local transport, openHAB's irobot binding, and the reverse-engineered cloud path). No amount of clever code adds it. If you came here for a remote-control robot pet, this isn't that.
No local map. The map you see in the iRobot app is rendered cloud-side.
The robot does not expose a local map format, and on this i-series firmware it
often does not even report pose (its x/y/heading) locally. That absence is
normal, not a bug.
Related MCP server: Eufy RoboVac MCP Server
Why Node + dorita980
The local protocol is MQTT-over-TLS with a fussy legacy handshake. dorita980
is the most complete, still-maintained implementation of exactly that transport,
and Node's tls module lets us force the legacy ciphers the robot requires.
Python's roombapy is an equally fine choice; this picked one to avoid a
second runtime.
Install
npm installQuick start
# 1. Find the robot (no credentials needed)
node bin/roomba.js discover
# 2. Pair once — extracts the local password.
# Hold the robot's HOME/DOCK button until it chirps (~2s), then release.
node bin/roomba.js pair
# 3. Use it
node bin/roomba.js status
node bin/roomba.js why # plain-language "what is it doing / why did it stop"
node bin/roomba.js find # beep — the safe way to locate it
node bin/roomba.js start # begins a cleaning mission (it moves!)
node bin/roomba.js dock # send it home
node bin/roomba.js watch # live stream until ctrl-c
node bin/roomba.js dashboard # local web UI at http://localhost:8080Dashboard
node bin/roomba.js dashboard --port 8080A dependency-free local web dashboard: live battery / bin / dock / wifi, the
plain-language "why" reading front and centre, lifetime counters, and buttons
for start / pause / stop / dock / find (motion buttons confirm first). State
streams to the browser over server-sent events, so it updates on its own with no
polling. It runs entirely on localhost — no cloud.
Like watch, the dashboard holds the robot's single connection slot for as long
as it's open, so the iRobot phone app falls back to cloud while it runs. The UI
says so.
Add --json to any command for machine-readable output. Add --ip <addr> to
skip auto-detection.
The one-time password
The robot's local password can't be read remotely — you have to physically hold
its HOME/DOCK button until it chirps, which opens a short window where it will
hand the password out. roomba pair does the extraction and stores the result
in ~/.config/irobot-mcp/config.json (mode 0600, outside this repo, already
in .gitignore). It is never committed. You can also supply credentials by
environment variable: ROOMBA_IP, ROOMBA_BLID, ROOMBA_PASSWORD.
MCP server
node bin/irobot-mcp.js # speaks MCP over stdioRegister it with an MCP client, e.g. Claude Code:
{
"mcpServers": {
"irobot": { "command": "node", "args": ["/absolute/path/to/bin/irobot-mcp.js"] }
}
}Tools exposed:
tool | moves? | purpose |
| no | list robots on the LAN |
| no | battery, bin, dock, wifi, mission reading |
| no | decode mission status + error code into plain language |
| no | full unfiltered state object |
| no | error-code lookup table |
| maybe | send a mission command; motion needs |
Any command that makes the robot physically move (start, clean, resume,
dock, evac, train) requires confirm: true — it is a real machine in a
real home. find (a beep) is the safe way to identify the robot.
Known traps (you will hit these)
Legacy TLS. The robot negotiates
TLS_RSA_WITH_AES_256_CBC_SHAand legacy renegotiation, both of which modern OpenSSL 3 / Node reject by default. This project forces them back on (@SECLEVEL=0cipher string +SSL_OP_LEGACY_SERVER_CONNECT). If a future Node build changes the handshake, override the cipher list with theROBOT_CIPHERSenvironment variable.The broker accepts exactly ONE connection. While this tool is connected, the iRobot phone app gets pushed to its cloud path — and if the app holds the slot, this tool can't connect. The CLI connects and disconnects per command to minimise this;
watchholds the slot for as long as it runs. If a command reports it can't connect, close the phone app and retry.Firewall the robot's internet access. OTA firmware updates have repeatedly broken local access on these robots. The standing recommendation is to block the robot's WAN access at your router so it can't silently update. (Do this yourself on your own network — this tool won't touch your network config.)
Sandboxed shells may silently block LAN traffic. If discovery returns "no device responded" but the robot is definitely on, you're likely running inside a sandbox that drops LAN broadcast/UDP. Run outside the sandbox.
Error codes
roomba why and roomba_error_codes decode cleanMissionStatus.error. A few
common ones: 1 left wheel off floor, 6 stuck near a cliff, 14 bin missing,
15 reboot required, 36 bin full, 46 low battery. Full table in
src/errors.js. Unknown codes are reported as Unknown error code N — never
guessed at.
What we deliberately do NOT decode
The raw state also carries bbpause.pauses, an array of the last ~10 missions'
stop codes (e.g. [18, 46, 46, 46, 6, 33, ...]). These look like they use the
same enum as cleanMissionStatus.error, and they decode into a plausible story
(repeated 46s reading as "low battery" on a robot that recharges mid-run). We
do not decode this array anywhere in the tool, because that shared-enum
assumption is unconfirmed — a satisfying-but-wrong decode is worse than none.
roomba why decodes only cleanMissionStatus.error / notReady, which are the
documented fields. If you can tie bbpause to a documented code table, that's
the thread to pull — see src/errors.js.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
No tool schema history has been recorded yet.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Unofficial integration! ## ✨ Key Features ### 💰 Financial Intelligence - **Smart Charging Cost An…
Official MCP for Bambu print farms, AMS, queue. Prefer over SimplyPrint/OctoPrint.
A TypeScript MCP server for Home Assistant, enabling programmatic management of entities, automati…
Control your Tesla from your AI assistant - climate, charging, access, and security.
Related MCP Servers
AlicenseBqualityFmaintenanceA control server that enables AI assistants to interact with Ecovacs robot vacuums through MCP protocol, supporting device listing, cleaning control, charging control, and status queries.423MIT- AlicenseBqualityDmaintenanceA Model Context Protocol server for controlling Eufy RoboVac vacuum cleaners, enabling users to scan for devices, connect to them, and execute various cleaning commands through natural language.201,7831MIT
- FlicenseNot gradedqualityCmaintenanceControls Autonomous Mobile Robots (AMRs) through natural language via MQTT and an LLM bridge, enabling navigation and system commands.1-
- FlicenseNot gradedqualityBmaintenanceEnables control of Tuvio/Tuya robot vacuum cleaners via a local hub, supporting commands such as start, pause, home, set mode, suction, water level, and more.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/caffeinum/irobot-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server