acinfinity-mcp
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., "@acinfinity-mcpWhat's the current temperature and humidity in my tent?"
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.
acinfinity-mcp
MCP server for AC Infinity UIS grow controllers (Controller 69 Pro / Pro+, AI+, Outlet AI). Lets Claude Code, Claude Desktop, Codex or any other MCP client read your tent's climate and change port settings through natural language.
"How is the tent doing?" → 26.5 °C / 57 % / 1.49 kPa, exhaust fan at level 3 driven by automation Automatisierung 1 …
Uses the same unofficial cloud API as the AC Infinity app, so the controller must be connected to Wi‑Fi (Bluetooth-only models such as Controller 67 are not supported). Not affiliated with AC Infinity.
Status
Area | State |
Reading controllers, sensors, port settings, automations | ✅ verified live on a Controller AI+ (CTR89Q) and a 69 Pro |
Writing port modes / power / timers / triggers | ✅ verified live on the AI+ (mode + timer round trip); standard family follows the Home Assistant integration's proven path |
Backup / compare / restore of the whole configuration | ✅ ports and automation rules; controller record is reported, not written |
Renaming ports | ✅ verified live on the AI+ (ports with nothing plugged in are rejected by the controller) |
Writing advanced settings (calibration, load type, …) | ⚠️ implemented on both families exactly like the app does it (decompiled 2.0.8); not yet exercised on hardware |
API coverage | ✅ complete — all 179 endpoint declarations of the Android app are inventoried in |
Creating / editing automations | 🚧 in-place rule edits and enable/disable are wired (used by restore); create/delete next — see |
Related MCP server: iot-mcp-bridge
Tools
Tool | What it does |
| All controllers with |
| Decoded mode configuration of one port: on/off power, auto & VPD triggers, timers, cycle, schedule |
| Unmodified API object incl. advanced settings ( |
| Advanced settings (calibration, load type, dynamic response, …) |
| Advance Automation programs: rules per port with mode, power, time window, days, thresholds — the real configuration on AI+ controllers |
| Unmodified automation rules + alarms |
| Save every port's mode settings, the controller record, all automation rules and alarms to a local JSON file |
| List saved backups; show every field that differs between a backup and the device now |
| Write a backup back (changed ports and automation rules), then re-read and report anything still different |
| Change the port label shown in the app |
| Switch a port to Off / On / Auto / Timer / Cycle / Schedule / VPD / … |
| On/off power level 0–10 |
| Countdown to on / to off |
| Repeating on/off minutes |
| Daily HH:MM on/off window |
| Auto-mode temperature / humidity thresholds |
| VPD-mode thresholds |
Every set_* tool refuses to run unless it is called with user_authorized: true, so the assistant has to ask you
before touching a device.
Install
Requires Python ≥ 3.12 and uv.
uvx acinfinity-mcp # once published to PyPI
# or from a checkout:
uv run acinfinity-mcpCredentials are passed as environment variables — the e‑mail and password of your AC Infinity app account:
Variable | Required | Description |
| yes | App login e‑mail |
| yes | App password (only the first 25 characters are used — that's an API limitation) |
| no |
|
| no | Where |
Client configuration
Claude Code
claude mcp add acinfinity -e ACINFINITY_EMAIL=you@example.com -e ACINFINITY_PASSWORD=secret -- uvx acinfinity-mcpor in .mcp.json / ~/.claude.json:
{
"mcpServers": {
"acinfinity": {
"command": "uvx",
"args": ["acinfinity-mcp"],
"env": {
"ACINFINITY_EMAIL": "you@example.com",
"ACINFINITY_PASSWORD": "secret"
}
}
}
}Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or
%APPDATA%\Claude\claude_desktop_config.json (Windows). Use an absolute path to uvx if it is not on Claude's PATH.
{
"mcpServers": {
"acinfinity": {
"command": "uvx",
"args": ["acinfinity-mcp"],
"env": {
"ACINFINITY_EMAIL": "you@example.com",
"ACINFINITY_PASSWORD": "secret"
}
}
}
}OpenAI Codex
~/.codex/config.toml:
[mcp_servers.acinfinity]
command = "uvx"
args = ["acinfinity-mcp"]
[mcp_servers.acinfinity.env]
ACINFINITY_EMAIL = "you@example.com"
ACINFINITY_PASSWORD = "secret"Development
uv sync # deps into .venv
cp .env.example .env # local creds (git-ignored)
uv run --env-file .env acinfinity-mcp # run over stdio
uv run --env-file .env mcp dev src/acinfinity_mcp/server.py # MCP Inspector
uv run pytest # tests (no live API calls)
uv run ruff check . && uv run ruff format .The API is undocumented; everything known about it lives in docs/api/.
Writes are full read‑modify‑write round trips; standard and AI controllers use different endpoints
(see docs/api/endpoints.md).
Security
Your AC Infinity credentials only ever go to
www.acinfinityserver.com(the same host the app uses) and are never logged.Every mutating tool requires
user_authorized: true; the server never changes a device on its own initiative.Tool annotations mark reads as
readOnlyHintso clients can auto-approve them and prompt for writes.
Contributing
Issues and PRs are welcome — especially captures from other controller models (Outlet AI, 69 Pro+) and help
decoding the remaining sensorModeData fields. Run uv run pytest and uv run ruff check . before opening a PR;
never include real device ids, MAC addresses or account data in fixtures.
Credits
API knowledge reverse-engineered from dalinicus/homeassistant-acinfinity, ober37/ac-infinity-mcp and keithah/homebridge-acinfinity.
License
Available Tools
18 toolsbackup_settingsBackup settingsA
Save the complete configuration of a controller (every port's mode settings, the controller record, all Advance Automation rules and alarms) to a local JSON file. Nothing on the device changes. Do this before any set_* call; restore_settings undoes changes.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Optional tag for the file name. | |
| controller_id | Yes | Controller id (`id` from list_controllers). |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| label | No | |
| ports | Yes | |
| backup_id | Yes | Use this id with restore_settings / compare_backup. |
| created_at | Yes | |
| controller_id | Yes | |
| controller_name | Yes | |
| automation_rules | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations showing readOnlyHint=false, idempotentHint=false, and destructiveHint=false, the description adds important behavioral context: 'Nothing on the device changes' and 'local JSON file' clarify the side-effect profile (writes a file locally but does not alter the device). It also ties into restore_settings for reversibility, which adds meaningful behavioral context beyond the annotations.
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 sentences with zero fluff. The first sentence front-loads the purpose and scope; the second delivers usage guidance and the relation to restore_settings. 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?
For a two-parameter tool with a full schema and an output schema, the description covers all essential aspects: what is saved, where it goes, side effects, and when to use it. Nothing an agent needs to call it correctly is missing.
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 100%, so parameters are already fully documented. The description adds no extra semantics beyond what the schema provides; the 'label' is correctly called out in the schema as an optional file-name tag. Baseline 3 is appropriate because the schema carries the load.
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 verb ('Save'), the resource (complete controller configuration), and the output (local JSON file), enumerating exactly what is included. It also differentiates from siblings by mentioning 'restore_settings undoes changes' and the directive to run before set_* calls, so an agent can distinguish it from other tools without opening schemas.
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?
'Do this before any set_* call' is an explicit when-to-use directive, and 'restore_settings undoes changes' implies the alternative for reverting changes. This is clear, actionable guidance that leaves no ambiguity about when the tool should be invoked.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_backupCompare backupARead-onlyIdempotent
Show every configuration field that differs between a backup and the device right now (per port and per automation rule), without changing anything. Use it after write experiments to verify the device is back in its original state.
| Name | Required | Description | Default |
|---|---|---|---|
| backup_id | Yes | Backup id from backup_settings. |
Output Schema
| Name | Required | Description |
|---|---|---|
| changes | Yes | |
| backup_id | Yes | |
| new_rules | No | Rule ids on the device that the backup does not know. |
| controller_id | Yes | |
| missing_rules | No | Rule ids present in the backup but gone from the device. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, and the description reinforces this with 'without changing anything'. It also adds useful behavioral detail about what is compared ('per port and per automation rule') and that it reflects the current device state.
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 sentences with no filler; the core behavior is front-loaded and the use case is in the second sentence. Every sentence 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?
With a single required parameter, rich annotations, and an output schema available, the description covers what the tool does, its scope, its side-effect-free behavior, and when to invoke it.
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 100%, with backup_id already described as 'Backup id from backup_settings.' The tool description adds no parameter-level detail, but it doesn't need to because the schema carries the meaning.
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 a specific verb ('Show') and resource ('configuration field that differs between a backup and the device right now'), with explicit scope ('per port and per automation rule'). The no-change disclaimer makes it clearly distinct from mutating siblings like restore_settings and set_* tools.
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?
It gives an explicit usage context: 'after write experiments to verify the device is back in its original state.' It doesn't name alternative tools or define when not to use it, but the intended trigger is concrete enough for an agent to select it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_automations_rawGet raw automationsARead-onlyIdempotent
Unmodified Advance Automation rule objects (getGroups) plus alarms (getAlarms) for a controller, in API units. Use list_automations for the decoded view.
| Name | Required | Description | Default |
|---|---|---|---|
| controller_id | Yes | Controller id (`id` from list_controllers). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint and idempotentHint, so the safety profile is known. The description adds meaningful behavioral context by revealing that results are unmodified API units and that it surfaces underlying getGroups and getAlarms calls, which clarifies the output format and source.
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 tightly written sentences: the first states the core behavior and representation, the second routes to the sibling tool. No filler, no repetition of schema or annotations. Front-loaded with the essential raw/API-units distinction.
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 simple one-parameter read-only tool with an output schema, the description fully covers what an agent needs to invoke it correctly: what is returned, in what format, and when to choose the decoded alternative. No missing critical information.
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 100% for the single parameter controller_id, including a helpful reference to list_controllers. The description adds no additional parameter semantics beyond 'for a controller', which is already implied by the schema. Baseline 3 is appropriate.
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 clearly identifies the tool as returning unmodified Automation rule objects (getGroups) plus alarms (getAlarms) for a controller, in API units. It also contrasts with the sibling list_automations by labeling that as the decoded view, making the tool's specific purpose 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 description explicitly directs users to list_automations for the decoded view, which distinguishes the appropriate use case for each. This is a clear when-to-use versus when-not-to-use alternative, reinforced by the 'in API units' phrasing that indicates raw output.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_device_settingsGet advanced device settingsARead-onlyIdempotent
Return the advanced settings object (getDevSetting) for a port, or for the controller when
port=0: temperature unit, calibration offsets, load type, dynamic response, sunrise timer,
display options. Values are in API units. Works on both controller families; on AI
controllers the same data is also nested as devSetting in get_port_settings_raw.
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes | ||
| controller_id | Yes | Controller id (`id` from list_controllers). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this tool as read-only and idempotent, so the safety profile is covered. The description adds meaningful behavioral details: values are in API units, port=0 selects the controller, and the same data appears in get_port_settings_raw on AI controllers. There is no contradiction with the annotations.
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?
The description is compact and front-loaded, opening with the core action and scope, then listing contents, units, and the raw-endpoint alternative. Every sentence earns its place without repetition or 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?
Given the read-only annotations, the presence of an output schema, and the simple two-parameter input, the description covers everything an agent needs to call the tool correctly: what it returns, the special port=0 case, unit semantics, and the relationship to a sibling tool. No critical behavior is left unexplained.
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 schema only documents controller_id; port has only a title and numeric bounds. The description compensates by explaining that port=0 means the controller rather than a physical port, which is essential semantic information. It adds less for controller_id, but the schema already describes that parameter adequately.
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 a specific verb and resource: it returns the advanced settings object (getDevSetting) for a port, or the controller when port=0. It also lists the contained fields, which makes the tool's purpose concrete and distinguishable from the raw/basic port-setting siblings.
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 clear context: it works on both controller families and notes that on AI controllers the same data is nested inside get_port_settings_raw, which helps route an agent to the raw variant when appropriate. It does not explicitly state when not to use this tool versus get_port_settings, but the distinction is mostly clear from the word 'advanced'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_port_settingsGet port settingsARead-onlyIdempotent
Get the mode configuration of one port: active mode, on/off power, auto temperature and humidity triggers (°C / %), VPD triggers (kPa), timer and cycle durations (minutes) and the schedule window (HH:MM). Units are already converted; nothing is scaled.
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes | Port number as printed on the controller (1-based). | |
| controller_id | Yes | Controller id (`id` from list_controllers). |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | Active mode id (atType). |
| port | Yes | |
| on_power | Yes | |
| mode_name | Yes | |
| off_power | Yes | |
| temp_low_c | Yes | |
| temp_high_c | Yes | |
| vpd_low_kpa | Yes | |
| schedule_end | Yes | |
| vpd_high_kpa | Yes | |
| controller_id | Yes | |
| target_temp_c | Yes | |
| schedule_start | Yes | HH:MM or null when disabled. |
| target_vpd_kpa | Yes | |
| cycle_on_minutes | Yes | |
| humidity_low_pct | Yes | |
| vpd_setting_mode | Yes | |
| auto_setting_mode | Yes | 'triggers' (high/low) or 'target'. |
| cycle_off_minutes | Yes | |
| humidity_high_pct | Yes | |
| target_humidity_pct | Yes | |
| timer_to_on_minutes | Yes | |
| timer_to_off_minutes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint and idempotentHint, so the description doesn't need to restate safety. It adds meaningful behavior by specifying converted units and no scaling, and by enumerating all settings. No contradiction with annotations; no side effects are claimed.
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 sentences, front-loaded with the operation and scope, followed by a compact inventory of values and units. No filler or repetition of schema 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?
Given read-only annotations, a full input schema, and an output schema, the description covers the substantive return semantics. It stops just short of explicitly guiding which sibling to choose when raw values are needed, so it is not a perfect 5.
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 100% and both parameters are described in the schema, including the note that controller_id comes from list_controllers. The description adds no parameter-specific semantics beyond what the schema already provides, so baseline 3 applies.
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 concrete verb+resource: 'Get the mode configuration of one port' and enumerates the exact settings returned. The final sentence 'Units are already converted; nothing is scaled' differentiates it from the raw sibling without needing to open schemas.
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 explicit when/when-not or named alternatives. The 'already converted; nothing is scaled' clause implies this is the human-readable variant compared with get_port_settings_raw, but the description leaves the routing decision to inference rather than stating it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_port_settings_rawGet raw port settingsARead-onlyIdempotent
Return the unmodified API object for a port (getdevModeSettingList) including the nested
devSetting advanced settings. Port 0 = controller-level settings. Values are in API units
(see docs/api/controls-and-settings.md); use get_port_settings for converted values.
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes | ||
| controller_id | Yes | Controller id (`id` from list_controllers). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a read-only, idempotent operation. The description adds real behavioral context beyond those flags: it returns an unmodified API object, includes nested devSetting fields, uses API units, and explains Port 0 semantics. This is useful disclosure without contradicting the annotations.
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 sentences with no filler: the primary behavior, endpoint, special port case, unit caveat, and sibling alternative are all packed in without redundancy. It is front-loaded with the most important 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?
With a read-only annotation, both parameters explained (either in schema or description), and an output schema present, this description covers everything an agent needs to select and call the tool correctly. The reference to the docs link and converted-value alternative fills the remaining gaps.
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 only 50% because port lacks a description, but the description compensates by explaining Port 0's special meaning and the value units. controller_id is already documented in the schema. The endpoint name and 'raw' framing also clarify what the port parameter refers to.
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 a specific verb and resource: 'Return the unmodified API object for a port', names the underlying endpoint (getdevModeSettingList), and clarifies the 'raw' distinction from get_port_settings. It leaves no ambiguity about what the tool returns.
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?
It explicitly tells the agent to use get_port_settings for converted values, which is a clear routing signal. It also adds the Port 0 = controller-level settings rule. It does not exhaustively enumerate when not to use the tool, but the guidance given is actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_automationsList automationsARead-onlyIdempotent
List the Advance Automation programs of a controller (the app's "Automations" tab).
A program is a named set of rules; each rule governs one or more ports with a mode (On/Off/Auto/Cycle/VPD), on/off power, a schedule and, for Auto/VPD, sensor thresholds. These rules override the per-port mode from get_port_settings while they run — on AI controllers this is where the real configuration lives.
Use schedule/continuous for when a rule applies: continuous=true means the app's
24/7 switch is on and the rule runs at all times (window/days are then null/empty).
Thresholds: low/high are null when that trigger is not set; the underlying record
is only partially reverse-engineered (see raw), so report values as decoded from the
device rather than as guaranteed.
| Name | Required | Description | Default |
|---|---|---|---|
| controller_id | Yes | Controller id (`id` from list_controllers). |
Output Schema
| Name | Required | Description |
|---|---|---|
| rules | Yes | |
| programs | Yes | Distinct program names, in API order. |
| controller_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses important behavioral traits: rule override semantics, continuous=true meaning 24/7 mode with null window/days, null threshold semantics, and the caveat that the underlying record is only partially reverse-engineered. This is exactly the kind of non-obvious behavior an agent needs.
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?
The description is front-loaded with the core purpose and then adds dense, high-value context in a logical progression: program definition, override behavior, schedule semantics, and decoding caveats. Every sentence earns its place; no filler or repetition.
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 not be restated. The description covers conceptual model, runtime behavior, edge cases, and reliability caveats, making it complete enough for an agent to call this tool correctly and interpret results sensibly.
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 100% and the single controller_id parameter is already documented in the schema. The description adds no further parameter-level meaning, so it meets the baseline but does not go beyond what structured input schema already provides.
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 clearly states the action ('List'), the resource ('Advance Automation programs of a controller'), and the app context ('Automations' tab). It distinguishes itself from raw/settings siblings by framing these as the real configuration on AI controllers, so an agent can tell what this tool returns.
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 provides strong contextual guidance: rules override get_port_settings while running, and on AI controllers this is where real configuration lives. This implies when to prefer this tool over port-settings tools. However, it does not explicitly contrast with get_automations_raw or state when not to use this tool, so the guidance is clear but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_backupsList backupsARead-onlyIdempotent
List saved backups (newest first) with their ids for restore_settings/compare_backup.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| backups | Yes | |
| backup_dir | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and idempotent behavior, and the description adds useful behavioral detail beyond them: results are newest-first and contain IDs suitable for restore/compare operations. With no parameters and a read-only operation, this is complete behavioral disclosure.
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 sentence that front-loads the action, then adds the ordering, output content, and intended downstream use with no 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?
For a zero-parameter, read-only list tool with an output schema, annotations, and a stated downstream purpose, the description gives the agent everything needed to understand and invoke it correctly. There are no missing behavioral or usage details that matter.
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 are no parameters, so the input schema already communicates that the tool takes no arguments. The description adds no parameter detail, but none is needed; this is the baseline for a zero-parameter tool.
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 verb and resource: listing saved backups, ordered newest first, and providing IDs. It also states the downstream consumers (restore_settings/compare_backup), which distinguishes this tool from sibling tools like list_automations or list_controllers in a single sentence.
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 restore_settings/compare_backup' gives clear context for when this list is the relevant prerequisite, pointing the agent to sibling tools that consume the IDs. It does not explicitly state when not to use it or name an alternative listing tool, so it stops short of a full when/when-not recommendation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_controllersList controllersARead-onlyIdempotent
List all AC Infinity controllers on the account with current readings and port status.
tent is the climate inside the grow tent (external probe: temperature °C, humidity %,
VPD kPa) — use this when the user asks how the tent is doing. ambient (AI controllers
only) is the onboard sensor in the controller housing, i.e. the room outside the tent.
Also returns every port with name, power level (0-10), on/off state and active mode, and
on AI controllers every individual sensor reading. Readings are null while offline.
A port whose mode is 'Off' but whose power is > 0 is being driven by an Advance Automation program — call list_automations to see the rules governing it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| controllers | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description doesn't need to restate safety. It adds useful behavioral details: readings are null while offline, the tent/ambient distinction, and the special case of an off-mode port with power > 0 indicating an automation. This goes beyond annotations without contradicting them.
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?
The description is efficiently structured with the core purpose in the first sentence, then a concise breakdown of sensor types and a note about the automation edge case. Every sentence adds value, and the information is front-loaded. It's slightly longer than the high example but still well-organized.
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?
Given that an output schema exists (has_output_schema: true), the description doesn't need to enumerate return fields. It explains the nuanced semantics of tent vs. ambient, offline behavior, and the automation condition, which an agent needs to interpret the results correctly. No critical gaps are apparent.
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. The description correctly focuses on output semantics rather than parameter details, which is appropriate. No parameter information is needed, and the description doesn't attempt to 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 clear verb+resource: 'List all AC Infinity controllers on the account with current readings and port status.' It also distinguishes the tool from siblings by specifying it returns a full overview of controllers, rather than individual settings like get_port_settings or get_device_settings. The added explanation of tent vs. ambient sensors further clarifies the scope.
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 concrete usage context: it says to use the tent reading 'when the user asks how the tent is doing' and advises calling list_automations when a port shows mode 'Off' but power > 0. However, it doesn't explicitly state when NOT to use this tool or name alternatives for specific tasks, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_portRename portAIdempotent
Rename a port (the label shown in the AC Infinity app). Does not change any mode or power.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New port name shown in the app. | |
| port | Yes | Port number as printed on the controller (1-based). | |
| controller_id | Yes | Controller id (`id` from list_controllers). | |
| user_authorized | No | Must be true. Set only after the user explicitly approved this exact change. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| port | Yes | |
| changed | Yes | API keys that were written, in API units. |
| controller_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description adds a useful behavioral guarantee that mode and power are unaffected, but it does not disclose the user_authorized approval requirement or any other operational caveats. This is similar to the calibrated baseline where the description adds some value but not rich behavioral context.
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?
The description is two short sentences with zero filler. The primary purpose is front-loaded, and the key exclusion is stated immediately after.
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 simple rename operation, the combination of the description, rich input schema, and annotations covers almost everything needed. The only notable gap is that the mandatory user_authorized=true requirement is buried in the schema rather than surfaced in the tool description, which an agent could miss during initial selection.
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 100%, so the input schema already documents all parameters. The tool description adds no additional parameter-level meaning beyond what the schema provides, so the baseline score of 3 applies.
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 verb and resource: 'Rename a port' with the clarifying parenthetical 'the label shown in the AC Infinity app'. It also explicitly distinguishes the tool from sibling set_port_mode/set_port_power tools by saying 'Does not change any mode or power'.
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 a clear when-to-use context: renaming a port label. It also includes an explicit when-not exclusion ('Does not change any mode or power'), but it does not name alternative sibling tools or state that user_authorized must be true before invoking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_settingsRestore settingsAIdempotent
Write a backup back to the device: each changed port's full mode settings and each
changed automation rule (in place, by id). The controller record (port 0) and rules that
no longer exist are skipped and reported. Afterwards the device is re-read and any
remaining differences are returned — an empty remaining_changes means fully restored.
| Name | Required | Description | Default |
|---|---|---|---|
| ports | No | Restore per-port mode settings. | |
| backup_id | Yes | Backup id from backup_settings. | |
| automations | No | Restore Advance Automation rules. | |
| only_changed | No | Only write ports/rules that differ from the backup. | |
| user_authorized | No | Must be true. Set only after the user explicitly approved this exact change. |
Output Schema
| Name | Required | Description |
|---|---|---|
| skipped | No | |
| backup_id | Yes | |
| controller_id | Yes | |
| ports_restored | Yes | |
| rules_restored | Yes | |
| remaining_changes | Yes | Differences that still exist after the restore (re-read from the device). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description reveals important behavior: what exactly is written, that controller record port 0 and missing rules are skipped and reported, and that the device is re-read afterwards with remaining_changes as the verification result. No contradiction with readOnlyHint=false, destructiveHint=false, or idempotentHint=true.
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 sentences, each doing work: the first states the operation and scope, the second states exclusions/reporting, and the third states verification semantics. The main action is front-loaded 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?
For a mutating restore tool, the description covers preconditions through scope, exceptions, and postconditions; the user_authorized and backup_id requirements are already fully documented in the schema. The presence of an output schema and the explicit remaining_changes explanation makes the contract complete.
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?
With 100% schema description coverage the baseline is 3, and the description adds extra meaning by explaining what 'changed' means, that automation rules are applied in place by id, and that port 0 is a special controller record. These details enrich the schema's generic booleans without replacing them.
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 opens with a specific verb and resource: 'Write a backup back to the device,' then narrows the scope to per-port mode settings and automation rules. It also names the controller record exception, which distinguishes it from sibling setters and backup_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 action of writing a backup back implies this is the restore counterpart to backup_settings, and the detailed mechanics give clear context. However, it never explicitly says when to prefer this over compare_backup or individual set_port_* tools, nor gives any exclusions or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_auto_triggersSet auto triggersAIdempotent
Configure Auto-mode temperature/humidity triggers. Each trigger has a value and an enabled flag; pass only what should change. Temperatures are °C (the °F twin is derived).
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes | Port number as printed on the controller (1-based). | |
| activate | No | Also switch the port into Auto mode. | |
| temp_low_c | No | Turn on below this °C. | |
| temp_high_c | No | Turn on above this °C; null = unchanged. | |
| controller_id | Yes | Controller id (`id` from list_controllers). | |
| user_authorized | No | Must be true. Set only after the user explicitly approved this exact change. | |
| humidity_low_pct | No | ||
| temp_low_enabled | No | ||
| humidity_high_pct | No | ||
| temp_high_enabled | No | ||
| humidity_low_enabled | No | ||
| humidity_high_enabled | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| port | Yes | |
| changed | Yes | API keys that were written, in API units. |
| controller_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations already indicate a safe, idempotent mutation, the description adds meaningful behavioral context: only provided fields change, each trigger has both a value and an enabled flag, and temperatures are in °C with the °F value derived. This goes beyond the structured annotations without contradicting them.
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 place the core purpose first and the most important behavioral guidance second. There is no filler or repetition of schema details.
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 12-parameter tool with an output schema and safety annotations, the description is largely sufficient: it covers the trigger model, partial-update behavior, and temperature units. The main gap is the lack of explicit guidance about when to choose this over sibling trigger/mode tools.
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?
With 50% schema description coverage, the description helps fill gaps by explaining the value/enabled-flag pattern for temperature and humidity triggers and clarifying that nulls can be used to leave fields unchanged. It does not deeply document every parameter, but it adds useful structure that the schema alone lacks.
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 a specific verb ('Configure'), a specific resource ('Auto-mode temperature/humidity triggers'), and the subject matter it covers. It differentiates from the sibling set_vpd_triggers by being explicitly temperature/humidity focused.
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 a useful partial-update rule ('pass only what should change') but does not say when this tool should be used versus siblings like set_vpd_triggers, set_port_mode, or set_port_schedule. No explicit use-case context or alternative routing is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_port_cycleSet port cycleAIdempotent
Configure Cycle mode: repeat on_minutes on, then off_minutes off.
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes | Port number as printed on the controller (1-based). | |
| activate | No | Also switch the port into Cycle mode. | |
| on_minutes | Yes | Duration in minutes (0-1440). | |
| off_minutes | Yes | Duration in minutes (0-1440). | |
| controller_id | Yes | Controller id (`id` from list_controllers). | |
| user_authorized | No | Must be true. Set only after the user explicitly approved this exact change. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| port | Yes | |
| changed | Yes | API keys that were written, in API units. |
| controller_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the key safety traits: readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description adds the on/off repeating behavior, which is useful, but it does not disclose side effects of switching a port into Cycle mode or mention the activation/authorization requirements. There is no contradiction with annotations.
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?
The description is one focused sentence that front-loads the core action and then clarifies the cycle semantics. There is no filler or redundant restatement of the 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?
Given the rich schema (100% coverage, clear parameter descriptions, and an output schema) and annotations, the description is adequate for a competent agent to call the tool correctly. The main missing element is explicit usage context relative to sibling cycle/timer/schedule tools, but that gap is partially mitigated by the tool name and schema.
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 100%, so the baseline is 3. The description adds value by explicitly connecting on_minutes and off_minutes into a repeating cycle, a relationship the individual parameter descriptions don't state. It doesn't discuss activate or user_authorized, but those parameters are already well-described in the schema.
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, 'Configure Cycle mode', and explains the behavior: 'repeat on_minutes on, then off_minutes off.' This makes the tool's function clear and distinct from generic port controls, though it doesn't explicitly contrast it with siblings like set_port_timer or set_port_schedule.
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 is given for when to use this tool versus alternatives such as set_port_mode, set_port_timer, or set_port_schedule. The description defines what the tool does but supplies no context for selection, prerequisites, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_port_modeSet port modeAIdempotent
Switch the active mode of a port (e.g. Off, On, Auto, Schedule). The mode's parameters (power, triggers, timers) keep their current values — set them first with the other tools.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | 1 Off, 2 On, 3 Auto, 4 Timer to On, 5 Timer to Off, 6 Cycle, 7 Schedule, 8 VPD, 9 CO2, 10 CO2 Fan, 11 Moisture, 12 Water Temp, 13 pH, 14 EC, 15 Water Detect. | |
| port | Yes | Port number as printed on the controller (1-based). | |
| controller_id | Yes | Controller id (`id` from list_controllers). | |
| user_authorized | No | Must be true. Set only after the user explicitly approved this exact change. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| port | Yes | |
| changed | Yes | API keys that were written, in API units. |
| controller_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavior beyond the annotations: mode parameters (power, triggers, timers) keep their current values, and parameter setup should happen before switching modes. This clarifies the operation's side-effect profile without contradicting the idempotentHint or destructiveHint annotations.
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 sentences with no filler: the first states the operation and examples, the second delivers the essential behavioral caveat about preserving parameter values. Everything included earns its place, and the most important usage guidance is 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?
The description is sufficient for a straightforward mode-switching tool, especially with a 100%-covered schema, output schema, and idempotent/destructive annotations. The only mild gap is not mentioning the user_authorized requirement in prose, but the schema already makes that mandatory explicit.
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 100%, and the schema already documents each parameter, including the mode enum mapping. The description adds little beyond the schema, though it does reference parameter categories (power, triggers, timers) that align with sibling tools. The required user_authorized approval flag is only explained in the schema.
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 uses a specific verb and resource ('Switch the active mode of a port') and gives concrete examples (Off, On, Auto, Schedule). It clearly differentiates this tool from sibling set_port_power, set_port_timer, and set_port_schedule by stating that this tool only changes the mode while leaving parameters untouched.
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 conveys clear context: use this to switch mode, and configure the mode's parameters first with the other tools. It implies the division of labor between this and the parameter-setting siblings, though it does not explicitly name those alternatives or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_port_powerSet port powerAIdempotent
Set the power levels (0-10) a port uses in its on and/or off state. Applies to every mode;
in On mode on_power is the running level. Pass only the values you want to change.
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes | Port number as printed on the controller (1-based). | |
| on_power | No | Power level used while the port is 'on'. | |
| off_power | No | Power level used while the port is 'off'. | |
| controller_id | Yes | Controller id (`id` from list_controllers). | |
| user_authorized | No | Must be true. Set only after the user explicitly approved this exact change. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| port | Yes | |
| changed | Yes | API keys that were written, in API units. |
| controller_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation as non-read-only, idempotent, and non-destructive. The description adds useful behavioral nuance by stating that the power setting applies to every mode and clarifying the On-mode meaning of on_power, plus the partial-update semantics.
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 front-load the core action and range, then give the mode-scope and partial-update guidance. No filler or repetition of schema details.
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 description plus fully documented schema, annotations, and output schema give an agent enough to call the tool safely and correctly. The only notable caveat, user_authorized must be true, is already explicit in the schema.
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?
All five parameters are fully described in the schema with ranges, defaults, and constraints, so the description need not repeat them. It adds only the partial-update convention, which is a useful extra but not a substitute for schema coverage.
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 action (set) on a specific resource (port power levels) and clarifies the 0-10 range and both on/off states. This differentiates it from sibling tools focused on mode, timer, cycle, schedule, and triggers.
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 actionable guidance about partial updates ('Pass only the values you want to change') and clarifies that the setting applies to every mode, with On-mode behavior spelled out. It doesn't explicitly name sibling alternatives or exclusion conditions, but the context is sufficient to select this tool over the read/set siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_port_scheduleSet port scheduleAIdempotent
Configure Schedule mode: on at start, off at end (controller local time). A window
crossing midnight (e.g. 18:00 → 06:00) is allowed. Null disables that edge (API value 65535).
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Daily off time HH:MM, or null to disable. | |
| port | Yes | Port number as printed on the controller (1-based). | |
| start | Yes | Daily on time HH:MM, or null to disable. | |
| activate | No | Also switch the port into Schedule mode. | |
| controller_id | Yes | Controller id (`id` from list_controllers). | |
| user_authorized | No | Must be true. Set only after the user explicitly approved this exact change. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| port | Yes | |
| changed | Yes | API keys that were written, in API units. |
| controller_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish non-read-only, non-destructive, idempotent behavior. The description adds genuinely useful behavior: controller-local time, midnight-crossing windows, and the 65535 API value for disabled edges. This goes beyond the annotations without contradicting them.
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 sentences with no filler; the core action is front-loaded. Every clause contributes information: schedule mode, start/end, local time, midnight behavior, and null semantics.
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 6-parameter mutation with an output schema and thorough schema descriptions, the description covers the non-obvious schedule behavior. Return values are handled by the output schema. The only minor gap is that the 'activate' parameter behavior is left to the schema, which is acceptable.
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 100%, so the baseline is 3. The description adds semantic value for start and end by explaining local time, midnight crossing, and null-to-65535 mapping. It does not need to repeat the schema's per-parameter explanations.
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 uses a specific verb ('Configure') and resource ('Schedule mode') and clearly defines the on/off semantics. It does not explicitly differentiate from siblings like set_port_timer or set_port_mode, so it stops short of a top score.
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 provides no guidance on when to use this tool versus sibling schedule/timer/cycle tools. It does not mention alternatives, exclusions, or prerequisites, leaving the agent to infer the intended context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_port_timerSet port timerAIdempotent
Configure a countdown timer: the port turns on (to_on) or off (to_off) after minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes | Port number as printed on the controller (1-based). | |
| minutes | Yes | Duration in minutes (0-1440). | |
| activate | No | Also switch the port into the matching timer mode. | |
| direction | Yes | 'to_on' or 'to_off'. | |
| controller_id | Yes | Controller id (`id` from list_controllers). | |
| user_authorized | No | Must be true. Set only after the user explicitly approved this exact change. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| port | Yes | |
| changed | Yes | API keys that were written, in API units. |
| controller_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the annotations by specifying that the port transitions to to_on or to_off after the timer expires. It does not explain whether an existing timer is replaced, but idempotentHint=true already covers safe retries and destructiveHint=false covers risk.
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?
The description is a single, focused sentence with no filler. The core behavior is front-loaded and every word contributes to understanding what the tool does.
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?
Together with the fully described schema, annotations, and output schema, the description gives an agent enough to call the tool correctly. It lacks only an explicit note about replacing existing timers or the default activation behavior, but these are not critical given the schema and idempotentHint.
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 input schema has 100% description coverage, so the baseline is 3. The description adds a helpful link between minutes and the direction parameter but does not elaborate on activate or user_authorized, which are already adequately described in the schema.
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 clearly states a specific action (configure a countdown timer) and the concrete effect (the port turns on or off after the given minutes). The phrase "countdown timer" distinguishes it from sibling tools like set_port_schedule or set_port_cycle.
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 the "countdown timer" wording, but the description does not explicitly say when to prefer this tool over alternatives such as set_port_schedule or set_port_cycle. There are no when-to-use or when-not-to-use statements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_vpd_triggersSet VPD triggersAIdempotent
Configure VPD-mode high/low triggers in kPa (one decimal). Pass only what should change.
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes | Port number as printed on the controller (1-based). | |
| activate | No | Also switch the port into VPD mode. | |
| vpd_low_kpa | No | Turn on below this VPD (kPa). | |
| vpd_high_kpa | No | Turn on above this VPD (kPa). | |
| controller_id | Yes | Controller id (`id` from list_controllers). | |
| user_authorized | No | Must be true. Set only after the user explicitly approved this exact change. | |
| vpd_low_enabled | No | ||
| vpd_high_enabled | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| port | Yes | |
| changed | Yes | API keys that were written, in API units. |
| controller_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a mutating, idempotent, non-destructive operation. The description adds meaningful behavioral detail beyond those annotations by stating the partial-update semantics: only passed fields should change, implying unspecified triggers remain unaffected.
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 front-loaded sentences with zero filler. It communicates the resource, units, precision, and update semantics without repeating anything already present in the schema or annotations.
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?
Given the rich schema, clear annotations, and existing output schema, the description is mostly sufficient for an agent to invoke the tool correctly. The notable gap is the lack of sibling differentiation and use-case context, but the core call semantics are clear and well-supported.
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 75%, so the schema already documents most parameters. The description adds value by clarifying the kPa unit, the one-decimal precision for trigger values, and the 'pass only what should change' partial-update model, which helps the agent interpret optional and null-default parameters correctly.
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 ('Configure') and a specific resource ('VPD-mode high/low triggers'), with the added precision of kPa and one-decimal values. This is distinct from sibling tools like set_auto_triggers because it is explicitly VPD-mode focused.
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?
Provides no guidance on when to use this tool versus alternatives such as set_auto_triggers, nor any exclusions or prerequisites. The instruction 'Pass only what should change' is useful once the tool is already selected, but it does not help an agent choose this tool over siblings.
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.
18 tool updates
v0.1.0- First observed
backup_settings - First observed
compare_backup - First observed
get_automations_raw - First observed
get_device_settings - First observed
get_port_settings - First observed
get_port_settings_raw - First observed
list_automations - First observed
list_backups - First observed
list_controllers - First observed
rename_port - First observed
restore_settings - First observed
set_auto_triggers - First observed
set_port_cycle - First observed
set_port_mode - First observed
set_port_power - First observed
set_port_schedule - First observed
set_port_timer - First observed
set_vpd_triggers
TDQS
Scored across 18 tools
Most tools are clearly distinct: list_*, get_*, set_*, and backup/restore operations each target specific resources. The main potential confusion is between get_port_settings_raw and get_device_settings, which both expose raw device data, but the descriptions clarify their different scopes.
Tool names follow a consistent verb_noun pattern: list_*, get_*, set_*, backup_settings, restore_settings, compare_backup. The only minor inconsistency is list_backups vs compare_backup (plural vs singular), but this does not hurt predictability.
With 18 tools, the server is slightly above the ideal 3-15 range, but every tool addresses a distinct configuration aspect of AC Infinity controllers. The count feels justified rather than bloated.
The set covers reading and writing port modes, timers, schedules, triggers, and backups well. However, there are notable gaps: no create/update/delete operations for automation programs, and no setter for device-level settings (e.g., temperature unit, calibration), limiting full lifecycle management.
Maintenance
Related MCP Connectors
Manage Superlist tasks and lists in plain language from any MCP-compatible AI agent.
Automate 1,000+ services from any MCP-compatible AI agent: build Applets, run actions and queries.
MCP connector that lets ChatGPT list, search, and run your Apple Shortcuts via a local Mac agent
Use AI models for chat, image, and video generation from Claude Code and other MCP hosts.
Related MCP Servers
- AlicenseAqualityBmaintenanceac-infinity-mcp is an MCP server that connects Claude (and other AI assistants) directly to your AC Infinity controllers — so you can read live sensor data, run analytics, and adjust fan speeds or port states using natural language, without opening the AC Infinity app.256MIT
- AlicenseNot gradedqualityDmaintenanceEnables natural language control of ESP8266 and Raspberry Pi IoT devices via Claude Desktop using the MCP protocol.MIT
- FlicenseAqualityCmaintenanceQuery and control Orbit B-Hyve irrigation systems from MCP-compatible clients like Claude Code and Cursor.121-
- AlicenseNot gradedqualityDmaintenanceControl and monitor your AC Infinity grow environment through Claude and any MCP-compatible AI assistant. It provides live sensor data, analytics, and the ability to adjust fan speeds or port states using natural language.MIT