Iaqualink Mcp

io.github.chrischall由 GitHub 账号 chrischall 发布v0.3.1更新于 Nov 4, 2026

iAqualink pool equipment: status plus confirm-gated pump, heater, light and set-point control.

已验证STDIO仅桌面位置与生活效率与工作流

概览

AI 生成的概览

让助手控制 iAqualink 泳池与水疗设备:读取状态,并在确认与回读校验下开关水泵、加热器、灯光、日程和场景。

可以做什么
  • 列出账户下的泳池/水疗系统并读取状态:温度、设定值、水泵、加热器、辅助回路、灯光、加氯器、盐度、pH 与 ORP
  • 开关设备:泳池/水疗水泵与加热器、太阳能加热器,以及 eXO 过滤泵、制氯、boost 与加热
  • 控制辅助回路与灯光,设置可调光亮度或颜色效果,并设置泳池/水疗加热目标温度
  • 读取与修改日程:通过 WebTouch 管理 RS 面板程序(新增、编辑、删除),以及 eXO 定时器
  • 读取并运行 OneTouch 场景,列出变速泵档位、切换档位并修改其转速
  • 检查面板是否在线及当前显示画面,并执行凭据健康检查
适用场景
适合拥有 iAqualink 账户下 Jandy iAquaLink 面板或 Zodiac eXO 盐氯机的用户,希望在对话中查看或调整泳池而不必打开 App。每次写入都需确认并回读校验,适合日常调整而非无人值守的自动化。
运行要求
以 stdio 方式在本地运行 npm 包 @chrischall/iaqualink-mcp,需要 Node.js。需要 iAqualink 账户邮箱与密码,分别放在 IAQUALINK_EMAIL 和 IAQUALINK_PASSWORD 中;缺少时服务器仍可启动,但所有工具调用都会失败。需要访问 iAqualink 的网络端点。可选设置:IAQUALINK_STATUS_CACHE_SECONDS、IAQUALINK_VERIFY_TIMEOUT_MS、IAQUALINK_WEBTOUCH_STREAM_HOSTS、MCP_CONFIRM_MODE、MCP_CONFIRM_TTL_SECONDS、MCP_CONFIRM_ELICITATION。
安装前请注意
服务器通过 IAQUALINK_PASSWORD 保存你的 iAqualink 账户密码并以你的身份登录,应视为真实凭据。写入会改变实体设备:水泵、加热器、灯光、加氯输出、设定值、日程与场景。删除面板程序会立即写入且无法撤销。部分写入为推导而非实测,包括 iAqua 的 set 命令、所有 eXO 请求以及加氯输出百分比,结果可能返回 sent-unconfirmed。项目由 AI 维护,仅部分功能经过实机验证。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Iaqualink Mcp,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

iaqualink-mcp

MCP server for iAqualink (Zodiac / Jandy / Fluidra) pool and spa equipment. Read temperatures, set points, pumps, heaters, lights, aux circuits and salt chlorinator state, and switch equipment — every change confirmation-gated and verified by a re-read. It signs in with your own iAqualink account (the same email and password as the iAqualink app); no browser, extension or bridge.

Supports the two system types the reference client supports: iAqua (Jandy iAquaLink panels) and eXO (Zodiac salt chlorinators). Other device types on the account (robotic cleaners, …) are listed but not controlled.

Status: partly verified live. Request shapes come from iaqualink-py 0.7.0 (what Home Assistant uses) and a WebTouch capture (see docs/IAQUALINK-API.md).

  • Seen working on a real iAqua (RS) panel, 2026-10-11/12: sign-in, the system list (devices.json), the iAqua status reads (get_home, get_devices) and WebTouch (location lookup, init, button presses and the display stream).
  • Still derived, not yet exercised live: the iAqua set_* commands (pump, heater, aux, light, temperature), every eXO request (shadow read and writes), iaqualink_set_chlorinator's inferred shape, and the iQ20 schedule fallback. Every write still re-reads to confirm what happened.

This project was developed and is maintained by AI (Claude Code). Use at your own discretion.

Tools

ToolWhat it doesAnnotation
iaqualink_list_systemsSystems on the account and their serialsread
iaqualink_get_statusTemperatures, set points, pumps, heaters, aux/lights, chlorinator, salinity/pH/ORP (view: compact · full · raw)read
iaqualink_healthcheckWhether a sign-in is configured and acceptedread
iaqualink_set_equipmentPool/spa pump, pool/spa/solar heater; eXO filter pump, production, boost, low, heating — on/offwrite, not destructive
iaqualink_set_auxAux circuit or light on/off (by number, aux_<n> or label)write, not destructive
iaqualink_set_lightDimmable brightness (0/25/50/75/100) or color effect (iAqua)write, not destructive
iaqualink_set_temperaturePool and/or spa set point (iAqua °F/°C; eXO °C pool)write, not destructive
iaqualink_set_chlorinatoreXO chlorinator output % — inferred shape, not in iaqualink-pywrite, not destructive
iaqualink_list_schedulesRS panel programs via WebTouch (iAqua; iQ20 fallback probe); eXO timersread
iaqualink_add_scheduleAdd an RS panel program (circuit, start, stop, run days) via WebTouchwrite, not destructive
iaqualink_edit_scheduleChange an RS panel program's start / stop / run days via WebTouchwrite, not destructive
iaqualink_delete_scheduleDelete an RS panel program via WebTouch — no undowrite, destructive
iaqualink_set_scheduleSet / re-time / disable an eXO timer (start–stop, rpm on variable-speed pumps) — eXO only, unverified livewrite, not destructive
iaqualink_check_panelIs an RS system online, and what is its panel showing (screen, open dialog, Edit mode with unsaved changes)? Run it when the app and these tools disagreeread
iaqualink_list_pump_speedsRS panel variable-speed pump: the named speeds, their RPM and which one runs, via WebTouchread
iaqualink_set_pump_speedRun the pump at a named speed via WebTouchwrite, not destructive
iaqualink_set_pump_speed_rpmChange a named speed's RPM (600–3450) via WebTouch; a speed that is not running runs briefly while set, then the running speed is restoredwrite, not destructive
iaqualink_list_onetouchRS panel OneTouch scenes (Spa Mode, All OFF, …) and their state, via WebTouchread
iaqualink_set_onetouchTurn a OneTouch scene on/off via WebTouch — toggle not exercised live yetwrite, not destructive

Systems by name. At start the server lists the account's systems once; when that works, every serial argument advertises the supported systems' names (e.g. "Pool", "Spa") as an enum, and every tool accepts a name or a serial — an unknown name is refused with the list of known systems. If the listing fails (no sign-in yet, iAqualink down, past 5 s), the argument is a plain serial and nothing else changes. Every tool also carries _meta.mint hints (domain home; lookup for reads, turn-on-off for the set_* switches, change for schedule edits) that mcp-host's context groups read and other clients ignore.

Every write has an inverse in this set and reaches no other person — except deleting a panel program, which the panel stores immediately with no undo, so that one is marked destructive.

Schedules and OneTouch on a Jandy AquaLink RS panel go through WebTouch, the panel emulation the iAqualink web app uses: the server opens the panel's display stream, presses the same buttons a person would (checking before every press that the panel is on the expected screen and row, and aborting otherwise), returns to Home, and re-reads to verify. Only one WebTouch session per system runs at a time. The add / edit / delete sequences follow a live capture on an RS panel (2026-10-11) — see docs/IAQUALINK-API.md. If WebTouch is unavailable, iaqualink_list_schedules falls back to iQ20 schedules (adapter firmware 3+), probing r-api.iaqualink.net/v2 (Bearer), p-api.iaqualink.net/v2 (Bearer), p-api.iaqualink.net/v2 (bare token) and prm.iaqualink.net/v1 (bare token) once each and reporting every attempt. iQ20 schedule writes are not built.

How a write works. It reads the current state first and sends nothing if it already matches — iAqua's pump/heater/aux commands are toggles, so a blind send would flip whatever the state happened to be. It then asks you to confirm (an elicitation prompt where the client supports one; otherwise a preview plus a confirmToken, bound to the state it was planned against), sends, and re-reads until the requested value shows up. The result is confirmed, unchanged, or sent-unconfirmed with what was observed (eXO applies changes asynchronously — check again rather than retrying).

Setup

sh
npm i -g @chrischall/iaqualink-mcp
VariableRequiredMeaning
IAQUALINK_EMAILfor every toolYour iAqualink app sign-in email
IAQUALINK_PASSWORDfor every toolYour iAqualink password (not trimmed)
IAQUALINK_STATUS_CACHE_SECONDSnoSeconds a status read is reused (default 5; 0 disables)
IAQUALINK_WEBTOUCH_STREAM_HOSTSnoExtra hosts (comma-separated) the WebTouch display stream may come from; default only prm.iaqualink.net
IAQUALINK_VERIFY_TIMEOUT_MSnoMilliseconds a write re-reads to confirm the change before reporting sent-unconfirmed, for iAqua and eXO alike (positive integer; default 15000 iAqua, 30000 eXO)
MCP_CONFIRM_MODEnoask-user (default) / auto / refuse
MCP_CONFIRM_TTL_SECONDSnoconfirmToken lifetime (default 600)
MCP_CONFIRM_ELICITATIONnooff skips the prompt even on clients that declare elicitation

The server starts without credentials (so hosts can list its tools) and reports them missing on the first call. A rejected password is never retried: the refusal is remembered until the server restarts, so a typo cannot lock the account.

Claude Code: claude mcp add iaqualink -e IAQUALINK_EMAIL=… -e IAQUALINK_PASSWORD=… -- npx -y @chrischall/iaqualink-mcp

Hosted (claude.ai)

mint.yaml declares per-user children with an email/password form on the connector's authorize page (each person signs in as themselves), egress to exactly prod.zodiac-io.com, r-api.iaqualink.net, p-api.iaqualink.net (iQ20 probe only) and prm.iaqualink.net (WebTouch, and the iQ20 probe); the WebTouch display stream is refused on any other host unless it is added to IAQUALINK_WEBTOUCH_STREAM_HOSTS (and egress). No persistent state — the session lives in memory and one sign-in rebuilds it after a cold start.

Skills

  • skills/iaqualink — how to use these tools.
  • skills/iaqualink-curl — the same reads straight from a shell with curl, credentials from the macOS Keychain (the sign-in, system list and iAqua reads are seen live; the eXO shadow read is still derived from iaqualink-py).

Development

sh
npm installnpm run buildnpm run test:coverage   # typecheck (src + tests) + vitest, 100% coverage — what CI runs

Tests run the real client against an in-memory iAqualink (tests/support/fake-server.ts) built from iaqualink-py's fixtures.

来源:README.md,提交 b88af77

工具

19

版本历史

5
  1. v0.3.1最新Nov 4, 2026
  2. v0.2.2Oct 17, 2026
  3. v0.2.1Oct 16, 2026
  4. v0.2.0Oct 12, 2026
  5. v0.1.0Oct 12, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分