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 分