{"id":"48a48f92-cde2-4791-bbec-e054aca2934b","slug":"ober37-ac-infinity-mcp","kind":"mcp","name":"ac-infinity-mcp","summary":"MCP server for AC Infinity grow controllers. AI agent integration for climate monitoring, port control, and grow automation — works with Claude, Cursor, and any MCP client.","owner":"ober37","repoUrl":"https://github.com/ober37/ac-infinity-mcp","license":"MIT","licenseTier":"permissive","trust":"community","stars":6,"match":null,"fewStars":false,"format":"mcp","createdAt":"2026-05-20T14:37:22.000Z","addedAt":"2026-10-14T06:12:18.910Z","logoUrl":"https://avatars.githubusercontent.com/u/779545?u=7c8eefbab53dd349847d9ed26de369a26f7c9025&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["cloud-infra"],"tags":["grow","growtent","ac-infinity","ai-agents","fastmcp","grow-automation","iot","claude"],"runtime":"python","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-10-21T02:20:05.973Z","sample":false,"url":"https://conduits.dev/tools/ober37-ac-infinity-mcp","language":"Python","transports":["stdio"],"install":{"pypi":"ac-infinity-mcp"},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"<p align=\"center\">\n  <h1 align=\"center\">ac-infinity-mcp</h1>\n  <p align=\"center\">\n    Control and monitor your AC Infinity grow environment through Claude and any MCP-compatible AI assistant.\n  </p>\n  <p align=\"center\">\n    <a href=\"https://github.com/ober37/ac-infinity-mcp/actions/workflows/ci.yml\"><img src=\"https://github.com/ober37/ac-infinity-mcp/actions/workflows/ci.yml/badge.svg\" alt=\"CI\"></a>\n    <a href=\"https://github.com/ober37/ac-infinity-mcp/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/ober37/ac-infinity-mcp\" alt=\"License: MIT\"></a>\n    <a href=\"https://www.python.org/downloads/\"><img src=\"https://img.shields.io/badge/python-3.11%2B-blue\" alt=\"Python 3.11+\"></a>\n  </p>\n</p>\n\n---\n\n## What is this?\n\n**ac-infinity-mcp** is an [MCP server](https://modelcontextprotocol.io) 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.\n\n> Built with [FastMCP](https://github.com/jlowin/fastmcp) and the AC Infinity cloud API.\n\n## Example prompts\n\n> *\"What's the VPD trend in my tent over the last 7 days?\"*\n> *\"Is my environment in the right range for late flower?\"*\n> *\"Turn off port 3 on my 69 Pro controller — dry run first.\"*\n> *\"Show me which ports have been running the most this week.\"*\n> *\"Apply the veg stage template to port 1 — dry run first so I can see the settings.\"*\n> *\"My VPD is too high — what should I adjust?\"*\n\n## Compatible hardware\n\n| Controller | Reads | Writes | Notes |\n|---|---|---|---|\n| UIS Controller 69 Pro | ✅ | ✅ | Legacy protocol |\n| UIS Controller 69 Pro+ | ✅ | ✅ | Legacy protocol |\n| UIS Controller 89 AI+ | ✅ | ✅ † | New AI+ protocol — port writes require the `minversion` header (Quirk 14) |\n\n† Per-port writes (on/off, speed, mode, temperature/humidity/VPD automation) all work —\nthat is the scope of Quirk 14's `minversion` finding, which covers `addDevMode` only.\nMulti-port **Advance Automations** are only partly verified on AI+: reads work, creates\nand in-place edits have both landed on a devType 20 (#326), creates time out on a\ndifferent AI+ controller (#290), and enable/disable are unexercised on any AI+. Separately,\n`apply_grow_stage_template` / `break_out_of_automation` are held back pending hardware\nverification (#316) — both refuse with an explanation instead of writing. See\n[AI+ controllers](docs/GUIDE.md#ai-controllers).\n\n## Tools\n\n| Category | Tool | What it does |\n|---|---|---|\n| 🔍 **Discovery** | `discover_devices` | List all your controllers and ports |\n| 🌡️ **Readings** | `get_device_reading` | Live temp, humidity, VPD, and port states for one device |\n| 🌡️ **Readings** | `get_all_device_readings` | Same, for all devices at once |\n| 🌡️ **Readings** | `get_historical_readings` | Time-series data with optional bucketing (raw, 15m, 1h, 1d, …) |\n| 📊 **Analytics** | `check_vpd_drift` | VPD target compliance check for your current grow stage |\n| 📊 **Analytics** | `get_environment_health` | Composite health score (0–100, A–F) across temp, humidity, VPD |\n| 📊 **Analytics** | `detect_environment_trends` | Linear trend + 7-day projection per metric |\n| 📊 **Analytics** | `get_port_activity_report` | Per-port on/off hours, uptime %, and peak activity hour |\n| 🔎 **Port Status** | `get_port_status` | Live port power level, load detection, active mode, and timer countdown |\n| 🔎 **Port Status** | `get_port_settings` | Full automation config: mode, VPD target, temp/humidity thresholds, schedule, cycle |\n| 🔌 **Write** | `set_port_speed` | Set fan or pump speed 1–10 (`dry_run=True` by default) |\n| 🔌 **Write** | `set_port_on` | Turn a port fully on (`dry_run=True` by default) |\n| 🔌 **Write** | `set_port_off` | Turn a port fully off (`dry_run=True` by default) |\n| ⚙️ **Automation** | `set_vpd_automation` | Enable VPD mode with a kPa target using built-in sensors (`dry_run=True` by default) |\n| ⚙️ **Automation** | `set_temperature_automation` | Enable AUTO mode with min/max °C thresholds (`dry_run=True` by default) |\n| ⚙️ **Automation** | `set_humidity_automation` | Enable AUTO mode with min/max % RH thresholds (`dry_run=True` by default) |\n| ⚙️ **Automation** | `set_port_mode` | Switch to any mode: OFF, ON, AUTO, VPD, CYCLE, SCHEDULE, TIMER_TO_ON, TIMER_TO_OFF (`dry_run=True` by default) |\n| 🌱 **Intelligence** | `apply_grow_stage_template` | One-click VPD + temp + humidity automation for a named grow stage (`dry_run=True` by default) |\n| 🤖 **Advance Automation** | `list_advance_automations` | List all named Advance Automation programs on a device |\n| 🤖 **Advance Automation** | `get_advance_automation` | Get full detail (schedule, port groups, run state) for one automation |\n| 🤖 **Advance Automation** | `enable_advance_automation` | Enable a disabled automation — reads state first, no-ops if already enabled (`dry_run=True` by default) |\n| 🤖 **Advance Automation** | `disable_advance_automation` | Disable an enabled automation — reads state first, no-ops if already disabled (`dry_run=True` by default) |\n| 🤖 **Advance Automation** | `create_advance_automation` | Create a new named automation; the first rule can be off, on, cycle, auto (temp/humidity), or VPD (`dry_run=True` by default) |\n| 🤖 **Advance Automation** | `delete_advance_automation` | Delete an automation (disables first if active) (`dry_run=True` by default) |\n| 🤖 **Advance Automation** | `add_automation_rule` | Add one rule (window + behavior) to an existing program — off, on, cycle, auto (temp/humidity), or VPD (`dry_run=True` by default) |\n| 🤖 **Advance Automation** | `update_automation_rule` | Edit one rule in place — change its window, speed, mode, or sensor targets (`dry_run=True` by default) |\n| 🤖 **Advance Automation** | `delete_automation_rule` | Remove a single rule from a program, leaving the rest intact (`dry_run=True` by default) |\n| 🤖 **Advance Automation** | `break_out_of_automation` | Safely break a port out of automation control and lock co-governed ports to manual speed (`dry_run=True` by default) |\n\n> ✦ All write tools (Write, Automation, and Intelligence categories) default to `dry_run=True` — they return the exact payload they *would* send without making any changes to your equipment. Pass `dry_run=False` only when you're ready to execute.\n\n> 📖 For a complete grower's guide with conversation examples for every tool, see [docs/GUIDE.md](docs/GUIDE.md).\n\n## MCP Prompts\n\nThree built-in prompts are registered alongside the tools. In Claude Desktop and other MCP clients, these appear as slash commands or prompt suggestions.\n\n| Prompt | What it does |\n|---|---|\n| `vpd_troubleshooting` | Step-by-step guide: diagnose HIGH or LOW VPD and which tools to call to fix it |\n| `new_grower_setup` | Onboarding walkthrough: discover devices → apply a stage template → check your health score |\n| `environment_alert_interpretation` | How to read `check_vpd_drift` status values and `get_environment_health` grades (A–F, score weighting, what to do) |\n\n## Quick start\n\n### Option 1: pip (simplest)\n\n```bash\npip install git+https://github.com/ober37/ac-infinity-mcp.git\n```\n\nRequires Python 3.11+.\n\n### Option 2: isolated venv (recommended)\n\n```bash\npython3 -m venv ~/.venvs/ac-infinity-mcp\nsource ~/.venvs/ac-infinity-mcp/bin/activate\npip install git+https://github.com/ober37/ac-infinity-mcp.git\nwhich ac-infinity-mcp   # copy this path — you'll need it below\n```\n\n### Option 3: uvx (no install)\n\n```bash\nuvx --from git+https://github.com/ober37/ac-infinity-mcp.git ac-infinity-mcp\n```\n\n## MCP client configuration\n\n### Claude Desktop\n\nEdit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or\n`%APPDATA%\\Claude\\claude_desktop_config.json` (Windows):\n\n```json\n{\n  \"mcpServers\": {\n    \"ac-infinity\": {\n      \"command\": \"/path/to/ac-infinity-mcp\",\n      \"env\": {\n        \"AC_INFINITY_EMAIL\": \"you@example.com\",\n        \"AC_INFINITY_PASSWORD\": \"yourpassword\"\n      }\n    }\n  }\n}\n```\n\nReplace `/path/to/ac-infinity-mcp` with the path printed by `which ac-infinity-mcp`.\n\n### Cursor / Windsurf\n\nAdd to your MCP settings:\n\n```json\n{\n  \"ac-infinity\": {\n    \"command\": \"/path/to/ac-infinity-mcp\",\n    \"env\": {\n      \"AC_INFINITY_EMAIL\": \"you@example.com\",\n      \"AC_INFINITY_PASSWORD\": \"yourpassword\"\n    }\n  }\n}\n```\n\n## Docker\n\n```bash\ncp .env.example .env\n# fill in AC_INFINITY_EMAIL and AC_INFINITY_PASSWORD\ndocker compose up --build\n```\n\nThe container runs over stdio. Connect via a stdio bridge such as [mcp-proxy](https://github.com/sparfenyuk/mcp-proxy).\n\n> Credentials are injected at runtime via `env_file` — never baked into the image.\n\n## Environment variables\n\n| Variable | Required | Description |\n|---|---|---|\n| `AC_INFINITY_EMAIL` | Yes | Your AC Infinity account email |\n| `AC_INFINITY_PASSWORD` | Yes | Your AC Infinity account password |\n\n> ⚠️ **HTTP-only upstream:** The AC Infinity cloud API does not support HTTPS. Credentials and sensor data traverse the network in plain text. This is an upstream limitation — see [docs/API.md](docs/API.md) Quirk 8. Avoid running this server on untrusted networks.\n\n## Development\n\n```bash\ngit clone https://github.com/ober37/ac-infinity-mcp.git\ncd ac-infinity-mcp\npython3 -m venv .venv && source .venv/bin/activate\npip install -e \".[dev]\"\ncp .env.example .env   # fill in credentials\n\n# Lint + type-check\nruff check src/ tests/\nmypy src/ac_infinity_mcp/\n\n# Tests (unit + integration)\npytest tests/ -v\n\n# Security audit\npip-audit\n```\n\n## Security\n\nVulnerabilities should be reported via\n[GitHub Private Vulnerability Reporting](https://github.com/ober37/ac-infinity-mcp/security/advisories/new).\nSee [SECURITY.md](SECURITY.md) for the full disclosure policy, scope, and known\nlimitations (including the HTTP-only upstream API). Accepted dependency CVEs\nare tracked in [docs/SECURITY-RISKS.md](docs/SECURITY-RISKS.md).\n\n## License\n\nMIT\n"}