roomba-mcp
Monitor and control a Roomba Combo j9+ through MCP, with reads available by default and all commands gated by environment safety flags.
Read live status, robot info, settings, schedule, smart maps, mission history, and consumables.
Start, pause, resume, stop, dock, and locate the robot.
Change one setting at a time and replace the cleaning schedule.
Reset consumable counters when due.
Use experimental region/pass/suction/edge parameters for
start_cleanonly when enabled.Publish raw JSON to local debug topics only when raw access and local transport are enabled.
Run over HTTP or stdio MCP transports, with local/cloud/auto transport fallback.
Subscribe to server-published resource updates for status, mission, settings, and schedule.
Controls and monitors an iRobot Roomba Combo j9+ over the local LSS protocol with fallback to the iRobot cloud, including mission control, live status, settings, schedules, mission history, consumables, and smart maps/regions.
Click on "Deploy 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., "@roomba-mcpis the roomba docked? if not, send it back to the dock"
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.
roomba-mcp
An MCP server for a Roomba Combo j9+ (stingray, sku c975840). It controls
and observes the robot over the local LSS protocol and falls back to the iRobot
cloud when the robot is off the LAN.
Tested against firmware stingray+24.29.5. Not affiliated with iRobot.
Scope
In scope:
mission control: start, pause, resume, stop, dock, find
live state, settings, schedule, mission history
consumables, smart maps and regions
Out of scope, deliberately:
OTA and firmware endpoints
account, team, household transfer and notification endpoints
image upload approvals
the account reset endpoint
manual driving
Related MCP server: sphero-rvr-mcp
Safety model
Reads need no flag.
Every command needs
ROOMBA_ALLOW_WRITES=1in the server environment.raw_publishalso needsROOMBA_ALLOW_RAW=1and the local transport.Region, pass, suction and edge arguments to
start_cleanneedROOMBA_EXPERIMENTAL=1, because the immediate command shape is unverified on this firmware.There are no confirmation arguments. The gate is the environment, not a question a model can answer.
Every command is logged as one JSON line with the tool, payload, transport and result.
A write that times out is reported as
outcome: "unknown"and is never replayed over the other transport.
Requirements
Python 3.12 or newer, or Docker
uvfor the source installThe robot on the same LAN for local control
An iRobot account for the first login and for cloud reads
Install
git clone https://github.com/auss/roomba-mcp.git
cd roomba-mcp
uv sync
uv run roomba-mcp versionLogin
login is the only command that writes the login cache. The server never logs
in by itself.
uv run roomba-mcp loginThe command prompts for the account email and password, discovers the current
deployment, and writes ~/.config/roomba-mcp/login.json with mode 0600. Pass
--blid when the account owns several robots.
The login cache holds the robot password, the local MQTT credentials and a
temporary AWS session. When the session expires, cloud reads return
login_expired and you run login again.
Configuration
Two files in ~/.config/roomba-mcp (or $XDG_CONFIG_HOME/roomba-mcp):
file | mode | purpose |
| 0644 | non-secret settings |
| 0600 | account session and robot password |
| 0600 | bearer token for a non-loopback bind |
[robot]
blid = "0123456789ABCDEF0123456789ABCDEF"
host = "192.168.1.27"
port = 8883
[http]
host = "0.0.0.0"
port = 8785
[transport]
mode = "auto"
[logging]
level = "info"Precedence is defaults, then config.toml, then the environment, then command
line flags.
Environment variables:
variable | default | meaning |
|
| config directory |
|
| explicit config file |
| from login cache | robot id |
|
| robot host or IP |
|
| local MQTT port |
|
|
|
|
| HTTP bind address |
|
| HTTP port |
| from | bearer token |
|
| log level |
| none | extra log file |
| off | enable commands |
| off | enable |
| off | enable unverified parameters |
Safety flags are read from the environment only. They are not accepted in
config.toml, so a copied config cannot turn writes on by accident.
Run
HTTP is the primary transport:
uv run roomba-mcp serve --http-host 0.0.0.0 --http-port 8785A non-loopback bind refuses to start without a token. Create one once:
uv run roomba-mcp tokenThe token is printed and written to http-token with mode 0600. Rotate it
with roomba-mcp token --force and restart the server.
Check the server:
uv run roomba-mcp healthcheck
curl -H "Authorization: Bearer <token>" http://192.168.1.25:8785/healthzstdio is available for local clients:
uv run roomba-mcp serve --stdioClient configuration
HTTP:
{
"mcpServers": {
"roomba": {
"type": "http",
"url": "http://192.168.1.25:8785/mcp",
"headers": { "Authorization": "Bearer <token>" }
}
}
}stdio:
{
"mcpServers": {
"roomba": {
"command": "uv",
"args": ["run", "--directory", "/path/to/roomba-mcp", "roomba-mcp", "serve", "--stdio"]
}
}
}Docker
Run login and token on the host first, then start the container. The
config directory is mounted read-only: the container never writes it.
uv run roomba-mcp login
uv run roomba-mcp token
ROOMBA_HOST=192.168.1.27 docker compose up -d --build
curl http://127.0.0.1:8785/healthzcompose.yaml uses host networking, which keeps local discovery simple.
compose.bridge.yaml publishes port 8785 instead:
ROOMBA_HOST=192.168.1.27 docker compose -f compose.bridge.yaml up -d --buildBoth files run the container as your host uid so the 0600 login cache is
readable. If your ids are not 1000, set ROOMBA_UID and ROOMBA_GID.
Set ROOMBA_HOST to the robot IP when mDNS does not resolve inside the
container.
Tools
tool | kind | needs | notes |
| read | battery, phase, bin, tank, pad, position | |
| read | identity, transport, capability tiers, flags | |
| read | suction, carpet boost, edge clean, pad wetness | |
| read | schedule entries and per-region parameters | |
| read | login | cloud REST, 1 to 100 missions |
| read | login | cloud REST, part counters |
| read | login | cloud REST, smart maps and regions |
| write | writes | locating sound |
| write | writes | plain start by default |
| write | writes | |
| write | writes | |
| write | writes | |
| write | writes | |
| write | writes | typed subset only |
| write | writes | replaces the schedule |
| write | writes, login | cloud REST |
| raw | raw, local | debug topics only |
start_clean accepts regions, passes, suction and edge_clean only with
ROOMBA_EXPERIMENTAL=1. Region ids come from get_map. A region clean sends
the same shape the schedule shadow stores.
Resources
URI | contents |
| live status |
| current mission and timeline |
| current settings |
| stored schedule |
The server publishes notifications/resources/updated through the MCP
subscriptions/listen stream. Notifications are debounced to at most one per
URI per second, deduplicated by payload hash, and never fired for the initial
state. Reads carry stale and age_s so a client can tell cached data from
live data.
Transports
mode | behaviour |
| probe local every 60 s, prefer local, fall back to cloud |
| local LSS only |
| AWS IoT MQTT only |
The local connection uses TLS with the iRobot certificate, the legacy
AES128-SHA256 cipher at @SECLEVEL=0, and
SSL_OP_LEGACY_SERVER_CONNECT. The cloud connection uses the AWS IoT
WebSocket endpoint with the authorizer headers from the login cache. One
connection is alive at a time.
Cloud reads use named shadows: ro-currentstate for live state,
rw-settings for settings and rw-schedule for the schedule. The classic
cloud shadow only carries identity and capability fields.
Capability tiers
get_robot_info reports a tier per capability:
verified: observed working on this robot and firmware.derived-low-risk: reverse engineered from the app, reversible, still behind the writes flag.unverified-physical: unproven wire format, hard error withoutROOMBA_EXPERIMENTAL=1.
Development
uv run ruff check src tests
uv run mypy src
uv run pytestpre-commit runs ruff, an em-dash check and gitleaks on every commit.
Install it once:
uv run pre-commit installCI runs lint, types, unit tests, CodeQL, dependency review, a secret scan and the em-dash check. It never talks to a robot.
See CONTRIBUTING.md for contributions and SECURITY.md for private vulnerability reports and safe deployment.
Tests use sanitized captures from the real robot. See
tests/fixtures/README.md.
Design notes live in docs/adr/. Protocol references are vendored in
docs/protocol/ with provenance headers.
License
MIT. See LICENSE.
Available Tools
17 toolsdockA
Send the robot back to its dock. Needs ROOMBA_ALLOW_WRITES=1.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose one important behavioral fact: this is a write operation gated behind ROOMBA_ALLOW_WRITES=1. It does not say whether docking interrupts an in-progress cleaning mission, what happens if the robot is already docked, or what errors occur when the robot cannot find its dock.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, action first and prerequisite second, with zero filler. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be explained, and there are no parameters to document. But for a mutation command with no annotations, the description should note side effects such as cancelling an active mission or behavior when already docked; those gaps matter for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies; there are no parameter semantics to clarify beyond what the empty schema already conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+object action ("send the robot back to its dock") that is unambiguous and clearly distinct from sibling commands like start_clean, pause_clean, or stop_clean. It doesn't explicitly name a sibling alternative, but the action is unique enough in the toolset that no differentiation is needed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The prerequisite ROOMBA_ALLOW_WRITES=1 is a real usage condition that tells the agent when the call will succeed, which is more than nothing. However, it gives no guidance on when to dock versus when to stop or pause a mission, and no exclusions or preconditions about the robot's current state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_robotA
Make the robot play its locating sound. Needs ROOMBA_ALLOW_WRITES=1.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does disclose two important traits: the audible side effect and the ROOMBA_ALLOW_WRITES=1 prerequisite. It does not explain what happens if the prerequisite is missing or whether there are constraints such as the robot needing to be connected, but the key write-gate behavior is surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the core action first and the prerequisite second. Every sentence adds necessary information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, side-effect tool with an output schema already defined, the description covers the action and the environment prerequisite. It could be slightly more complete by clarifying failure behavior when ROOMBA_ALLOW_WRITES is not set, but the essential information is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. There is no parameter semantics to explain, and the description appropriately does not invent any.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and effect: making the robot play its locating sound. This clearly distinguishes it from siblings like get_status or get_robot_info, which retrieve data rather than trigger an audible locating behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'locating sound' implies the use case of finding a lost robot, but there is no explicit guidance on when to use this versus alternatives such as get_status or get_robot_info. Usage is only implied by the tool name and description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_consumablesA
Consumable counters: brush, filter, pads and other parts with the remaining life and whether a reset is due.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden; it implies a read-only counter query via 'get' and 'counters' but never states that it has no side effects, requires no permissions, or reflects cached vs live device state. The presence of an output schema relieves it of explaining return shape, keeping this at an adequate 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the resource and enumerates the covered parts and the two data points returned. No filler, no repetition of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters and an output schema covering the return values, the description only needs to establish what the tool is for, which it does. The one remaining gap is the absence of any statement about read-only behavior or freshness of the counters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to disambiguate and the baseline of 4 applies. The description correctly spends no words on inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource precisely (consumable counters for brush, filter, pads and other parts) and states what each entry conveys: remaining life plus a reset-due flag. It is distinguishable from the mutating sibling reset_consumable, though it never explicitly says 'retrieves/reads' or names that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent infers it should call this when it needs remaining consumable life or wants to know if a reset is due. There is no explicit when-to-use statement, no exclusion, and no pointer to reset_consumable as the follow-up action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_mapC
Smart maps with their regions, for use with start_clean.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden: it doesn't say whether this is a read-only fetch, whether results are cached, what the 'refresh' flag actually triggers, or whether permissions/robot connectivity are required. Only the bare payload ('maps with their regions') is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very short with no filler, but it is a fragment rather than a front-loaded sentence and omits the verb, leaving the agent to infer 'retrieve' from the name alone.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and the tool is a single optional parameter. Still, the purpose of 'refresh' and the read semantics remain unexplained, which leaves a meaningful gap for even this simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single 'refresh' parameter, and the description never mentions it — the agent cannot tell whether refresh forces a re-fetch from the robot or returns stale cached maps. The description adds nothing beyond the property name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource and its content ('smart maps with their regions'), which distinguishes it from the other read siblings like get_settings or get_robot_info. The verb is only implied by the name, but the payload is specific enough to select the tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for use with start_clean' hints at a prerequisite relationship, suggesting maps are retrieved to pick a target before starting a clean. It gives no explicit when/when-not or alternatives, so the guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_mission_historyB
Recent finished missions from the iRobot cloud (1 to 100).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose useful traits: only finished missions (not in-progress), sourced from the cloud, with a bounded window of 1 to 100. It omits ordering, freshness, and any auth/rate-limit context, so the disclosure is partial rather than thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with the key scoping facts front-loaded and no waste. The trailing parenthetical is slightly cryptic, which is the only blemish on an otherwise efficient structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained. However, for a tool with zero annotations and an undocumented parameter, the description should say more about ordering, pagination, and what 'recent' means before an agent can call it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate for the single 'limit' parameter. The '(1 to 100)' parenthetical appears to describe the limit range but is ambiguous — it could read as the number of missions returned — and the default of 20 is never mentioned.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: retrieving recent finished missions from the iRobot cloud. That clearly distinguishes it from siblings like get_status, get_schedule, and get_map. It doesn't explicitly name a sibling or contrast with one, keeping it just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says what the tool returns but gives no guidance on when to use it versus alternatives such as get_status or get_schedule, and no prerequisites or exclusions. Usage is only implied by the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_robot_infoA
Identity, active transport, login state, capability tiers and the current safety flags. Call this first to see what is allowed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden: it discloses that capability tiers and safety flags gate other operations, which is useful behavioral context. However, it never states that the call is read-only and side-effect free, nor whether results are cached or live, leaving the safety profile implicit in the 'get_' prefix.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences: the first front-loads the data inventory, the second delivers the one actionable directive. Nothing is repeated from schema or annotations, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is unnecessary, and with no parameters the description only needs purpose and routing context, which it supplies. The remaining gap is distinguishing this discovery call from get_status and get_settings, which the agent must still infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to disambiguate and the baseline is 4. The description correctly implies no input is needed to obtain the full robot profile.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description enumerates the resource contents precisely (identity, transport, login state, capability tiers, safety flags), so an agent knows exactly what it retrieves. It lacks a verb and never contrasts itself with near-siblings like get_status or get_settings, which likely overlap on state reporting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Call this first to see what is allowed" gives an explicit ordering rule and a reason to call it, which is genuine usage guidance. It stops short of naming alternatives or stating when NOT to call it (e.g., after a get_status call).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scheduleC
The stored cleaning schedule, including per-region parameters.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it discloses almost nothing beyond the return shape: it does not say whether the call is read-only, whether refresh triggers a device round-trip, or whether results are cached. The per-region parameters note is useful context but is largely covered by the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single short sentence with no filler, which is good, but the brevity is under-specification rather than efficiency — the sentence stops well before the agent has what it needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, return values needn't be described, but with zero annotations and an undocumented 'refresh' flag, the definition is not complete enough for an agent to call this confidently alongside set_schedule and get_settings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single parameter 'refresh' is never explained in the description — its default of false and the effect of setting it true are left undocumented. The description does not compensate for the coverage gap at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names the resource (the stored cleaning schedule) and adds that per-region parameters are included, which hints at the payload. But there is no verb and no explicit statement that this reads the current schedule rather than modifying it; only the name 'get_schedule' and the sibling 'set_schedule' let an agent infer the read semantics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to call this versus get_settings or set_schedule, and no mention of what 'refresh' implies (e.g., re-fetch from the robot vs. return cache). The agent must guess the retrieval context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_settingsC
Current cleaning settings: suction, carpet boost, edge clean, pad wetness, multi pass, bin pause and child lock.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden and largely drops it: it never says whether values are cached locally or queried from the device, what the refresh parameter does to that behavior, or what happens when the robot is offline or busy. For a read tool this is lower-risk, but the caching/freshness semantics of a settings read are exactly the thing an agent needs and they are absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with no filler, front-loaded on what the tool yields. It is efficient, though the field enumeration is somewhat list-like and pushes out any usage or parameter context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the field list usefully previews scope. However, with zero annotations and an undocumented refresh parameter, an agent still cannot tell whether the data is live or cached — a meaningful gap for a settings read.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter, refresh, and schema description coverage is 0%, so the description was the only place to explain it — and it is never mentioned. The enumerated fields describe the return payload, not the input, so they do not compensate for the parameter gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific resource — current cleaning settings — and enumerates exactly which settings are returned (suction, carpet boost, edge clean, pad wetness, etc.), which clearly differentiates it from siblings like get_status or set_setting. The retrieval verb is only implied by 'Current...', not stated outright, keeping it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus the obvious alternative set_setting, nor any mention of prerequisites or freshness expectations. The reader must infer from the name that this is the read counterpart to the writer tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statusA
Live robot state: battery, mission phase, bin, tank, pad, position and the raw reported shadow. Set refresh=true to bypass the cache.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does real work by disclosing that responses are cached and that refresh bypasses the cache — a genuine behavioral trait an agent could not infer otherwise. However, it says nothing about freshness/staleness window, polling expectations, authorization, or any failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence naming the resource and its fields, followed by one short sentence on the parameter. Nothing is wasted and the essential information leads.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required, and the field enumeration plus cache note covers the core contract for a one-parameter read tool. Remaining gap is operational context such as how fresh the cached state is or how often polling is sensible.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the single parameter — and it does, explaining that refresh=true bypasses the cache (the schema only offers a boolean with a default). What it does not say is whether a stale read is acceptable or how old cached data might be.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Live robot state') and enumerates the fields returned: battery, mission phase, bin, tank, pad, position, raw shadow. This is concrete enough to distinguish it from static-info siblings like get_robot_info or get_consumables, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only guidance is 'Set refresh=true to bypass the cache,' which covers when to use the parameter but not when to choose this tool over get_robot_info, get_settings, or get_map. Usage is implied by 'live state' rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_cleanA
Pause the current mission. Needs ROOMBA_ALLOW_WRITES=1.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose a real behavioral gate — the ROOMBA_ALLOW_WRITES=1 write-permission requirement — which is genuinely useful context. However, it says nothing about what happens if no mission is running, whether the pause is reversible, or any failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, action first and the write-gate requirement second. Nothing is wasted and it is fully front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be described, and there are no parameters. The remaining need is behavioral context, and the description supplies the write-gate precondition, though failure modes and interaction with stop/resume are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics for the description to explain; the baseline of 4 applies. Nothing is missing on this dimension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (pause) and resource (the current mission), which cleanly distinguishes it from start_clean, resume_clean, and stop_clean by name and effect. It doesn't explicitly name those siblings, but the action is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"The current mission" implies a prerequisite (an active mission must exist), but there is no explicit guidance on when to pause versus stop or resume, and no stated exclusions or error conditions. Usage is only inferable from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
raw_publishA
Debug escape hatch: publish a raw JSON payload to one local topic (cmd, delta, shadow, timeline, testcmd). Needs ROOMBA_ALLOW_RAW=1 and the local transport.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | ||
| payload | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral load. It usefully discloses the environment-variable gate, the local-transport restriction, and the set of allowed topics, but says nothing about whether payloads bypass validation, what errors occur when the gate is closed, or what the tool does on success.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the purpose and the gating prerequisites are both front-loaded, and no sentence is filler. Ideal length for a debug-only tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values don't need explaining, and the critical constraints (env var, local transport, allowed topics) are covered. The remaining gap is payload expectations and failure modes, which is minor but noticeable for a tool that accepts arbitrary JSON.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description has to compensate. It does clarify the topic parameter by enumerating the accepted values (cmd, delta, shadow, timeline, testcmd), which the schema lacks, but it gives no guidance on the shape or expectations for the required payload parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb (publish) and resource (raw JSON payload to a local topic), and frames it precisely as a 'debug escape hatch'. That framing cleanly separates it from the normal command tools in the sibling list (start_clean, set_setting, etc.).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'debug escape hatch' label clearly marks this as a last-resort path rather than normal operation, and the required gating (ROOMBA_ALLOW_RAW=1 plus local transport) tells the agent when the tool is even callable. It doesn't explicitly name which sibling to use for normal control instead, so it falls one step short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reset_consumableA
Reset one consumable counter by part id from get_consumables. Needs ROOMBA_ALLOW_WRITES=1.
| Name | Required | Description | Default |
|---|---|---|---|
| part | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses the write-gate environment variable and that this is a mutation of existing counter state, but says nothing about reversibility, behavior on an invalid/unknown part id, or required robot state during the reset.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the action and scope front-loaded and the prerequisite following. Nothing redundant with the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with an output schema already documenting return values, the description covers the essential operational facts: what it mutates, where the id comes from, and the env-var gate. The only gap is state/permission preconditions beyond the write flag.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the single 'part' parameter — and it does by specifying that the value is a part id obtained from get_consumables, which is meaningful semantic guidance beyond the bare string type. It does not give the exact id format or an example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (reset) and resource (one consumable counter), scoped to a single item, and names the sibling get_consumables as the source of the identifier. An agent can distinguish it from get_consumables and the other siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: the part id must come from get_consumables, implying a read-before-write workflow, and the call requires ROOMBA_ALLOW_WRITES=1. It does not name when-not-to-use conditions or robot state prerequisites (e.g., docked/idle), so it stops short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_cleanA
Resume a paused mission. Needs ROOMBA_ALLOW_WRITES=1.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral load. It usefully discloses the ROOMBA_ALLOW_WRITES=1 write-permission prerequisite, which the agent would otherwise miss, but says nothing about failure behavior when no mission is paused or whether the resumed mission continues from where it stopped.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero waste, and the core action is front-loaded ahead of the prerequisite. Nothing could be cut without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. But for a state-changing tool with no annotations, the definition omits what happens on an invalid state and the scope of the resume (which robot/mission), leaving a gap an agent must discover at call time.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline of 4 applies. No misleading parameter hints are given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Resume a paused mission'), and the word 'paused' implicitly separates it from start_clean, pause_clean, and stop_clean. It stops short of naming siblings explicitly, so it earns a 4 rather than a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Resume a paused mission' – the agent can infer this applies after pause_clean – and the env-var line acts as a precondition. However, it never explicitly routes to alternatives (e.g. use start_clean if no mission is paused) or states what happens if nothing is paused.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_scheduleA
Replace the cleaning schedule. Each entry needs a start object (day, hour, min) and a cmdStr string. Needs ROOMBA_ALLOW_WRITES=1.
| Name | Required | Description | Default |
|---|---|---|---|
| schedule | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does deliver key facts: this is destructive full replacement of existing schedule state, and it requires an environment flag to be enabled. It stops short of describing failure behavior or whether the previous schedule is recoverable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and overwrite semantics, then the payload shape, then the prerequisite. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema exists, so return values need no explanation, and the description covers action, payload structure, and auth gate. Remaining gaps are the day/hour/min value ranges and timezone convention, which matter for a schedule tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the parameter is an untyped array of loosely-typed objects with additionalProperties, so the schema alone tells an agent nothing. The description compensates well by naming the required entry shape: a start object with day, hour, min and a cmdStr string.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Replace the cleaning schedule'), and the word 'Replace' implicitly distinguishes it from the sibling get_schedule reader. It does not explicitly name the sibling, so a 4 rather than a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Replace' framing implies whole-schedule overwrite versus incremental edit, and the ROOMBA_ALLOW_WRITES=1 prerequisite gives a usable gate. However, there is no explicit statement of when to use this versus set_setting or get_schedule, and no note on whether an empty array clears the schedule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_settingA
Change one setting: suction (normal|high), carpet_boost, edge_clean, multi_pass, bin_pause, child_lock (true|false), pad_wetness (1-3). Needs ROOMBA_ALLOW_WRITES=1.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| value | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose the key behavioral trait: a write-gating environment variable that must be set. It also discloses the mutation target and valid domains, though it doesn't say what happens on an invalid name/value or whether changes apply immediately to the device.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence front-loads the action, enumerates valid settings compactly, and ends with the precondition. No filler sentences, and the notation is unambiguous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema covers return values, so the description only needed to cover the mutation surface and preconditions, which it does. The remaining gaps—error behavior for unsupported settings and whether the change is persisted immediately—are moderate but not blocking for a one-setting write.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it largely does: it maps the 'name' parameter's allowed values to each 'value' domain (booleans, 1-3 integers, enumerated strings), resolving the anyOf ambiguity in the schema. It doesn't cover the name/value pairing mechanics or unknown-name behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource ('Change one setting') and immediately enumerates the exact setting names and value domains, so the agent knows exactly what this tool mutates. The write scope is clearly distinguished from the sibling get_settings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Change one setting' and the explicit ROOMBA_ALLOW_WRITES=1 precondition tell the agent when this tool is applicable and that writes must be enabled. It does not explicitly contrast with get_settings (read counterpart) or say what to do when writes are disabled, so it falls short of a full when/when-not treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_cleanB
Start a whole-home clean. Region, pass, suction and edge arguments need ROOMBA_EXPERIMENTAL=1 and a map from get_map. Needs ROOMBA_ALLOW_WRITES=1.
| Name | Required | Description | Default |
|---|---|---|---|
| passes | No | ||
| regions | No | ||
| suction | No | ||
| edge_clean | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the important behavioral fact that this is a gated write operation requiring ROOMBA_ALLOW_WRITES=1, plus the experimental flag gate. It does not say what happens on failure, whether the call blocks until the robot starts, or what occurs to an in-progress clean, so coverage of the mutation's consequences is thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and then the gating requirements. Every sentence carries information; only minor phrasing friction ('Region, pass, suction and edge arguments' versus the plural schema names) costs it a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the env-var gating is covered. But for a four-parameter command tool with no annotations and zero schema descriptions, the description leaves the argument value space entirely undocumented, which is a real gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and there are no enums, so the description is the only source of parameter meaning. It names the four arguments (region, pass, suction, edge) which maps them to regions, passes, suction and edge_clean, but gives no accepted values, formats, or ranges — an agent still cannot tell what strings are valid for suction or regions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Start a whole-home clean.' It is distinguishable from siblings like pause_clean, resume_clean and stop_clean by being the initiating action, though it never names them explicitly and the 'whole-home' framing sits slightly awkwardly with the optional region parameter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete preconditions: the experimental region/pass/suction/edge arguments require ROOMBA_EXPERIMENTAL=1 plus a map from get_map, and any invocation requires ROOMBA_ALLOW_WRITES=1. That routes the agent to get_map first and tells it when the optional arguments are usable, but it does not state when to prefer this over alternatives such as raw_publish.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_cleanA
Stop the current mission. Needs ROOMBA_ALLOW_WRITES=1.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the whole burden; it does disclose the write-flag prerequisite, which is useful operational context. It does not disclose whether stopping is reversible, whether the mission can be resumed afterward, or what robot state results — the key behavioral facts for a mutation-style tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, action first, prerequisite second, with zero filler. Nothing could be cut without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the zero-parameter surface keeps the tool simple. The one gap is that the effect of stopping (terminal vs. resumable) is left implicit for a control-flow tool where that distinction matters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate beyond the empty schema. Baseline 4 applies; the description neither adds nor misleads on inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (stop) applied to a specific resource (the current mission), which is unambiguous on its own. It does not, however, distinguish itself from pause_clean or resume_clean, so an agent cannot tell from the description alone why it would pick stop over pause.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives one real usage constraint — the ROOMBA_ALLOW_WRITES=1 gating requirement — which is more than nothing. But it offers no guidance on when to stop versus pause or resume, nor any note that stop terminates a mission rather than suspending it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
17 tool updates
v0.1.0- First observed
dock - First observed
find_robot - First observed
get_consumables - First observed
get_map - First observed
get_mission_history - First observed
get_robot_info - First observed
get_schedule - First observed
get_settings - First observed
get_status - First observed
pause_clean - First observed
raw_publish - First observed
reset_consumable - First observed
resume_clean - First observed
set_schedule - First observed
set_setting - First observed
start_clean - First observed
stop_clean
TDQS
Scored across 17 tools
The set cleanly separates read tools (get_status, get_settings, get_map, get_consumables) from mission control (start/pause/resume/stop_clean) and config writes (set_setting, set_schedule, reset_consumable). Minor overlap exists between get_status and get_robot_info (both report robot state/capabilities), but the descriptions differentiate live state from identity/safety flags.
Most tools follow a predictable verb_noun pattern (get_status, start_clean, set_schedule, reset_consumable), with a consistent get_ prefix for reads. The lone bare verb 'dock' and the odd 'raw_publish' are small deviations but the overall pattern is readable and predictable.
17 tools is on the heavier side but each maps to a genuine robot capability area (status, settings, schedule, maps, consumables, mission lifecycle, raw debug). Nothing appears duplicative, though the debug escape hatch is arguably extra surface.
The surface covers the full cleaning lifecycle, read-only telemetry, schedules, maps, settings, and consumable resets — a solid end-to-end picture. Gaps are minor: no map editing/region management beyond reading, and no targeted action like emptying the bin, but core workflows are reachable.
Maintenance
Related MCP Connectors
Control your existing Philips lights, Sonos speakers, Roborock vacuums and other supported devices through Port OS cloud. Give ChatGPT, Claude and other MCP-compatible assistants access to the devices you connect. Turn off the living room lights, play music on your speakers, adjust the thermostat, run a vacuum in a room, check a camera snapshot or find a connected tracker. Available actions depend on your linked provider accounts and each device’s supported capabilities. Port OS runs in the cloud; no local server is required. You choose the account, device and capability permissions each assistant receives. Device operations require user OAuth; public tool discovery does not grant device access. Port OS is in alpha. Setup: https://portoperatingsystem.com/docs/getting-started/ Support: https://portoperatingsystem.com/contact/
Remote streamable-HTTP MCP server running on a single Cloudflare Worker. Your assistant gets live Airbnb, Amazon, Booking.com, Google Flights, Maps and Reddit data, social search on X, Instagram and TikTok, the Meta Ad Library, and image/video generation without any keys. Connect your own accounts to let it send WhatsApp or Telegram messages, work an IMAP inbox, manage Meta Ads campaigns and publish to X and LinkedIn. OAuth 2.1 with PKCE; stored credentials are AES-256-GCM encrypted.
Official MCP for Bambu print farms, AMS, queue. Prefer over SimplyPrint/OctoPrint.
Private-by-default, local-first memory/context/task orchestrator for MCP apps and agents.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables 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.-
- AlicenseCqualityDmaintenanceEnables AI assistants to control a Sphero RVR robot via the MCP protocol, including movement, LEDs, sensors, and battery monitoring.55MIT
- AlicenseNot gradedqualityBmaintenanceEnables control and monitoring of a Dreame robot vacuum via MCP tools, including cleaning, status, and map viewing through the cloud API.7MIT
- AlicenseNot gradedqualityBmaintenanceEnables users to control a local-network iRobot Roomba over MQTT without cloud, including status monitoring, mission start/stop/pause/resume, docking, bin emptying, beeping, and plain-language error decoding.1MIT