Control SharkClean robot vacuums through natural language
MCP server that controls newer SharkClean/SharkNinja robot vacuums via the skegox cloud, the same backend the app uses.
0.2.0Add to Favorites
Why it matters
Enable AI assistants to control SharkNinja robot vacuums through plain-language commands by connecting to the SharkClean cloud API, allowing users to start cleanings, target specific rooms, check status, and manage their robot vacuum without opening the app.
Outcomes
What it gets done
Start whole-home or room-specific cleaning sessions with configurable power modes (eco/normal/max)
Check real-time robot status including battery level, cleaning state, power mode, and error conditions
Control cleaning operations with pause, resume, stop, and return-to-dock commands
List available rooms from the robot's map and validate room names before targeted cleaning
Source
Get it from source
Spark does not host a copy of it.
Open sourceReports
Agent outcome reports
No reports yet
Capabilities
Tools your agent gets
List robots on the account with name and device id
Get live robot state: cleaning/paused/docked, battery %, charging, power mode, online, errors
Start whole-home clean with optional power mode (eco/normal/max)
List rooms the robot knows from its current map with floor id and last-updated
Clean only specific rooms validated against the live map
Pause the robot's current cleaning operation
Resume the robot's paused cleaning operation
Stop the robot's current cleaning operation
Overview
Sharkclean Mcp
An MCP server that controls newer SharkClean/SharkNinja robot vacuums via the skegox cloud, with tools to start, target rooms, dock, and check status. Use it for newer SharkClean/SharkNinja robots migrated to the skegox cloud, especially ones the legacy sharkiq/Ayla integration shows as offline.
What it does
An MCP server for SharkClean/SharkNinja robot vacuums that lets any MCP client start cleanings, clean specific rooms, send the robot home, and check status in plain language. All commands go through SharkNinja's current cloud backend, called skegox, the same one the SharkClean app itself uses, so the robot behaves exactly as if driven from the app with no hardware modification. It exposes 9 tools: list_robots (name, device id per robot on the account), get_status (cleaning, paused, or docked state, battery percentage, charging, power mode, online status, errors), start_cleaning (whole-home clean with an optional eco, normal, or max power mode), list_rooms (rooms known from the robot's current map, with floor id and last-updated time), clean_rooms (clean only specific named rooms, validated against the live map), pause_cleaning, resume_cleaning, and stop_cleaning for run control, return_to_dock (send the robot home to recharge or self-empty), set_power_mode, and locate_robot (make the robot beep). start_cleaning and clean_rooms both check the robot is online first and refuse if it isn't, so a command never silently vanishes; every tool accepts an optional robot name or device-id argument for multi-robot accounts, which can be omitted with only one robot.
When to use - and when NOT to
Use it specifically for SharkClean/SharkNinja robots on newer generations (Matrix, AI Ultra, Mach 2, RV2500+) that have been migrated to the skegox cloud backend - the widely-used sharkiq SDK and its Home Assistant integration talk to SharkNinja's legacy Ayla IoT cloud instead, where these newer robots show up permanently offline with a frozen, stale room map even though the app controls them fine. Room targeting (clean_rooms) requires a robot with a completed map; older models without room support simply report no rooms. This is an unofficial project built on community reverse engineering of the skegox API, not affiliated with or endorsed by SharkNinja, and SharkNinja can change the backend at any time.
Capabilities
Beyond the MCP tool set, a shark-mcp-rc command-line tool drives the robot directly from a shell for scripts or cron jobs (status, rooms, clean specific rooms, start at a given power level, dock), and a shark-mcp-doctor command runs a live end-to-end check against the cloud, printing the robot and its current room map.
How to install
Requires uv and Python 3.10+:
git clone https://github.com/a-funk/sharkclean-mcp
cd sharkclean-mcp
uv sync
cp .env.example .env # add your SharkClean app email + password
uv run shark-mcp-auth # one-time browser login (see below)
uv run shark-mcp-doctor # confirm: prints your robot + current room map
The one-time login is required because SharkNinja's Auth0 tenant blocks headless password logins with bot detection: shark-mcp-auth opens the real SharkClean login page in a browser, the post-login redirect to a com.sharkninja.shark:// URL, which typically errors or shows an "Open SharkClean?" dialog, is copied and pasted back at the prompt, and the resulting refresh token is cached at ~/.config/shark-mcp/tokens.json (mode 600) and refreshed automatically afterward. Register with Claude Code via claude mcp add --scope user sharkclean -- uv run --directory /ABSOLUTE/PATH/TO/sharkclean-mcp shark-mcp, or the equivalent mcpServers block in Claude Desktop's config; credentials come from SHARKCLEAN_EMAIL/SHARKCLEAN_PASSWORD environment variables or the .env file, with an optional SHARKCLEAN_REGION=eu. The project is MIT licensed.
Who it's for
Owners of newer SharkClean/SharkNinja robot vacuums who want to control cleaning, room targeting, docking, and status checks through natural-language MCP prompts or shell scripts, especially those whose robot shows up offline on the older Ayla-cloud-based sharkiq integration.
Source README
sharkclean-mcp
An MCP server for SharkClean /
SharkNinja robot vacuums. Lets any MCP client (Claude Code, Claude Desktop, etc.) start
cleanings, clean specific rooms, send the robot home, and check status - agentically, in
plain language.
Unofficial - not affiliated with or endorsed by SharkNinja.
All commands go through SharkNinja's current cloud ("skegox") - the same backend the
SharkClean app uses - so the robot behaves exactly as if driven from the app, with no
hardware modification.
Why not the Ayla cloud? The widely-used
sharkiqSDK (and the Home Assistant Shark IQ
integration built on it) talk to SharkNinja's legacy Ayla IoT cloud. Newer robots
(Matrix, AI Ultra, Mach 2, the RV2500+ generation) have been migrated off Ayla onto the
skegox backend. On Ayla those robots show up permanently "Offline" with a frozen, stale
room map, even though the app controls them fine. This server talks to skegox directly,
which is why it works with the newer robots thatsharkiqcan't reach. The reverse
engineering of the skegox API is owed to the shark2mqtt
project.
Tools
| Tool | What it does |
|---|---|
list_robots |
List robots on the account (name, device id) |
get_status |
Live state: cleaning/paused/docked, battery %, charging, power mode, online, errors |
start_cleaning |
Whole-home clean, optional power mode (eco/normal/max) |
list_rooms |
Rooms the robot knows from its current map (with floor id + last-updated) |
clean_rooms |
Clean only specific rooms (validated against the live map) |
pause_cleaning / resume_cleaning / stop_cleaning |
Run control |
return_to_dock |
Send the robot home to recharge / self-empty |
set_power_mode |
Suction: eco, normal, max |
locate_robot |
Make the robot beep |
start_cleaning and clean_rooms first check the robot is online and refuse if it isn't,
so commands don't silently vanish. Multi-robot accounts are supported - every tool takes an
optional robot argument (name or device id). With one robot, omit it.
Setup
Requires uv and Python ≥ 3.10.
git clone https://github.com/a-funk/sharkclean-mcp
cd sharkclean-mcp
uv sync
cp .env.example .env # add your SharkClean app email + password
uv run shark-mcp-auth # one-time browser login (see below)
uv run shark-mcp-doctor # confirm: prints your robot + current room map
One-time login (shark-mcp-auth)
SharkNinja's Auth0 tenant blocks headless password logins, so the first login happens in
your browser using the SharkClean app's own PKCE flow:
shark-mcp-authopens the real SharkClean login page.- Log in. The browser then tries to redirect to
com.sharkninja.shark://...and usually
shows an error, blank page, or an "Open SharkClean?" dialog - that's expected. - Copy that full
com.sharkninja.shark://...URL (from the address bar, browser history,
or the DevTools Network tab with "Preserve log" on) and paste it at the prompt.
That's it. Tokens are cached at ~/.config/shark-mcp/tokens.json (mode 600) and refreshed
automatically; you won't need the browser again. See SECURITY.md for how
credentials are handled.
Register with your MCP client
Claude Code (user-wide):
claude mcp add --scope user sharkclean -- uv run --directory /ABSOLUTE/PATH/TO/sharkclean-mcp shark-mcp
Or copy .mcp.json.example to .mcp.json, set the absolute path, and Claude Code will pick
it up automatically when opened in this directory.
Claude Desktop - add to claude_desktop_config.json:
{
"mcpServers": {
"sharkclean": {
"command": "uv",
"args": ["run", "--directory", "/ABSOLUTE/PATH/TO/sharkclean-mcp", "shark-mcp"]
}
}
}
Credentials come from environment variables or the .env file: SHARKCLEAN_EMAIL,SHARKCLEAN_PASSWORD, and optionally SHARKCLEAN_REGION=eu.
Example prompts
- "Start a max-power clean."
- "Vacuum the kitchen and the living room."
- "Is the shark done? What's its battery at?"
- "Send the robot back to its dock."
Command-line control
Beyond the MCP server, shark-mcp-rc drives the robot from a shell (handy for scripts/cron):
uv run shark-mcp-rc status
uv run shark-mcp-rc rooms
uv run shark-mcp-rc clean Kitchen "Living Room"
uv run shark-mcp-rc start max
uv run shark-mcp-rc dock
Development
uv run pytest # unit tests (fake robot, no cloud calls)
uv run shark-mcp # run the server on stdio
uv run shark-mcp-doctor # live end-to-end check against the cloud
See CONTRIBUTING.md. If your robot works, add it to
CONFIRMED_MODELS.md.
Notes & limitations
- Auth: the one-time browser login (
shark-mcp-auth) yields an Auth0 refresh token, cached
at~/.config/shark-mcp/tokens.json. The server mints short-lived skegox id_tokens from
it. SharkNinja's Auth0 tenant rotates refresh tokens, so the server persists the rotated
token on every refresh - if you seeinvalid_grant, re-runshark-mcp-auth. - Headless/scripted password login is blocked by Auth0 bot detection ("Suspicious request
requires verification"); the browser flow is the reliable path. - Room targeting (
clean_rooms) requires a robot with a completed map; older models
without room support report no rooms. - This is unofficial, built on community reverse engineering. SharkNinja can change the
backend at any time.
FAQ
Common questions
Discussion
Questions & comments · 0
Sign In Sign in to leave a comment.