MCP server for AC Infinity grow controllers. Monitor, automate, and control your grow environment through natural conversation with Claude.
This file documents two categories of accepted risk:
pip-audit is invoked with --ignore-vuln <ID> for each CVE entry below. If a
new CVE appears in a pip-audit run, do not blanket-add it here — file
an issue, evaluate the exposure, and only ignore after a documented finding.
Base URL: https://www.acinfinityserver.com/api
The AC Infinity cloud API supports HTTPS. TLS handshake verified 2026-05-29: TLSv1.3, DigiCert Encryption Everywhere DV TLS CA certificate, valid until 2026-11-18. Credentials and session tokens are encrypted in transit. This supersedes the previous HTTP-only accepted risk documented before 2026-05-29.
All endpoints below are confirmed over HTTPS. This list was updated via network capture (Phase 17, 2026-05-22) to include all confirmed v2.0 endpoints.
| Endpoint | Purpose |
|---|---|
POST /user/appUserLogin |
Authentication — credentials encrypted via TLS |
POST /user/devInfoListAll |
Device list — response includes user email (appEmail) |
POST /log/dataPage |
Historical sensor and port data |
POST /dev/getdevModeSettingList |
Read current port mode settings |
POST /dev/addDevMode |
Write port mode settings |
POST /api/dev/getDevSetting |
Richer port settings (sensor calibration, load type, Matter/UUID fields) |
POST /api/upgrade/getUpgrade |
Firmware upgrade check |
POST /api/upgrade/downgrade |
Firmware downgrade info (returns download URL and release notes) |
| Endpoint | Purpose |
|---|---|
POST /api/version=2.0/dev/getGroups |
List all automation groups for a device |
POST /api/version=2.0/dev/addGroups |
Create automation group |
POST /api/version=2.0/dev/updateGroupsById |
Edit an automation rule in place by advId (read-before-write) |
POST /api/version=2.0/dev/updateGroupsIsOn |
Toggle automation on/off state |
POST /api/version=2.0/dev/delByid |
Delete automation |
| Endpoint | Purpose |
|---|---|
POST /api/version=2.0/dev/getAlarms |
List all alarm configurations for a device |
POST /api/version=2.0/dev/addAlarms |
Create alarm |
POST /api/version=2.0/dev/updateAlarmsById |
Enable, disable, or edit alarm |
POST /api/version=2.0/dev/delAlarmsByid |
Delete alarm |
| Endpoint | Purpose |
|---|---|
POST /api/log/logdataByAll |
Historical readings (alternative to /log/dataPage; confirmed working) |
DELETE /api/log/log?devId=...&time=... |
Delete all history logs for a device |
GET /api/version=2.0/dev/recipe?advVersion=1 |
Grow stage templates (Seedling, Vegetative, Flowering, Plant Kit, Drying) |
AC Infinity permits only one active session per account. Authenticating through this server (initial login or a transparent session-expiry re-auth) can invalidate the user’s AC Infinity mobile-app session, and vice versa. This is an upstream account-model constraint, not a defect in this server.
10003) triggers transparent re-auth and
retry on reads only. On writes it is surfaced as an API error and never replayed,
because the write may have been processed server-side before the expiry response — a silent
retry could double-apply state. A refresh-failure cache bounds re-login to one attempt so a
bad credential does not hammer the login endpoint. See docs/API.md Quirk 31.discover_devices tool docstring carries a grower-readable heads-up.The client sends AC-app-style User-Agent headers rather than the default
python-requests UA, so traffic is indistinguishable from the official mobile app:
| Endpoint class | User-Agent |
|---|---|
Login (/user/appUserLogin) |
ACController/1.8.2 (com.acinfinity.humiture; build:489; iOS 16.5.1) |
| Data / write endpoints | okhttp/3.10.0 |
These are spoofed identity strings sent to the upstream API; they contain no user data and no credentials. A regression test locks both values. This is an accepted-behavior note, not a vulnerability.
mcp packagemcp (Model Context Protocol Python SDK; a direct dependency)mcp SDK’s transport handling for code paths this server does not use.
Our server runs stdio transport only (see server.py:main()); the
affected paths require HTTP/SSE transport.mcp releases. When a patched release
is available, bump the version pin in pyproject.toml and remove the
ignore from .github/workflows/ci.yml and CLAUDE.md.pip-audit without
the --ignore-vuln flag in a clean venv with current pins. If
PYSEC-2025-183 does not appear, the patched version is already pulled
in and the ignore can be removed. P3-C2-F006 raised this concern after
observing that a fresh install showed no findings under current pins;
remove the ignore as soon as the next CI run confirms the CVE is gone.starlette (transitive via the mcp SDK’s HTTP/SSE transport). This server
runs stdio transport only (see server.py:main()), so the affected request-handling
code paths were never reached at runtime — the exposure was theoretical.mcp pin to raise the starlette floor.pyproject.toml now pins starlette>=1.3.1 directly
rather than waiting on mcp. mcp requires only starlette>=0.27, so the stricter floor
is compatible. pip-audit reports no starlette advisories at 1.3.1. Nothing is added
to --ignore-vuln for starlette.The following 14 CVEs were identified in a pip-audit run on 2026-05-22 as part of
the Phase 17 Gate 2 review. None are exploitable via this server’s code paths.
They are documented here for tracking but are NOT added to the --ignore-vuln
list — each requires an explicit decision before ignoring. Re-evaluate when a fix
becomes available in the dependency tree.
cryptography (transitive via mcp SDK)mcp when upstream updates to cryptography ≥ 46.0.7.idna (transitive via requests)www.acinfinityserver.com (a simple ASCII hostname); the IDNA
vulnerability (malformed label handling) is not reachable.requests or idna directly once 3.15 is
available in the dependency tree.pip (dev tool — not a runtime dependency)pip is not imported or used by the server at runtime.
Upgrade pip in the build/dev environment: python3 -m pip install --upgrade pip.pygments (dev tool — pulled in by rich/IPython for terminal output)pygments is not imported or used at runtime.python-multipart (transitive via mcp → starlette)mcp SDK’s HTTP/SSE transport. This server runs
stdio transport only — the multipart parsing code paths are never invoked.mcp bumps its starlette/
python-multipart pins.setuptools (build/install tool — not a runtime dependency)setuptools is used during package installation;
it is not imported at runtime.pip install --upgrade setuptools.pip-audit and capture the CVE ID + package.--ignore-vuln <ID> to the pip-audit invocation in
.github/workflows/ci.yml with an inline comment pointing here.