The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Air Q listing page.
MCP server for air-Q air quality sensor devices. Enables Claude Desktop, Claude Code, and other MCP clients to directly query and configure air-Q devices on your local network.
Built on aioairq, the official async Python library for air-Q.
The same mcp-airq executable also works as a direct CLI when you pass a tool
name as a subcommand.
Or run directly with uvx:
Use the same command directly from the shell:
For historical plots and exports:
device, location, and group to combine all configured devices into one artifactlocation or group to combine only the matching devicesplot_air_quality_history returns one file per requested sensor, with one series per matching deviceexport_air_quality_history returns one CSV/XLSX file per request, with rows for all matching devicesThe CLI subcommands mirror the MCP tool names. Both styles work:
To force MCP server mode from an interactive terminal, run:
The CLI is pipe-friendly: successful command output goes to stdout, while
tool errors go to stderr with exit code 1.
Create a JSON file with your device(s), e.g. ~/.config/airq-devices.json:
Each entry requires:
address — IP address or mDNS hostname (e.g. abcde_air-q.local)password — Device password (default: airqsetup)name (optional) — Human-readable name; defaults to addresslocation (optional) — Physical room/area for grouping (e.g. "Living Room")group (optional) — Second grouping dimension, orthogonal to location (e.g. "Home", "Work")Then restrict access to the file (it contains passwords):
Alternatively, pass the device list inline via the AIRQ_DEVICES environment variable as a JSON string.
Add to your claude_desktop_config.json:
Register the server once via the CLI:
This writes to ~/.claude/settings.json and is automatically picked up by the Claude Code VSCode extension as well — no separate configuration needed.
If the server fails to connect: MCP servers run in a subprocess that may not inherit your shell's PATH. Replace
uvxwith its full path (which uvx→ e.g./home/you/.local/bin/uvx):
Register the server once via the CLI:
This writes to ~/.codex/config.toml and is automatically picked up by the Codex VSCode extension as well.
If the server fails to connect: Use the full path to
uvx(see note above).
| Tool | Description |
|---|---|
list_devices | List all configured air-Q devices (with location/group if set) |
get_air_quality | Get sensor readings — by device, location, or group |
get_air_quality_history | Get historical sensor data as column-oriented JSON |
plot_air_quality_history | Render one historical chart per sensor across all matching devices |
export_air_quality_history | Export one historical sensor as one csv/xlsx across matching devices |
get_device_info | Get device metadata (name, model, firmware version) |
get_config | Get full device configuration |
get_logs | Get device log entries |
identify_device | Make device blink its LEDs for visual identification |
get_led_theme | Get current LED visualization theme |
get_possible_led_themes | List all available LED visualization themes |
get_night_mode | Get current night mode configuration |
get_brightness_config | Get current LED brightness configuration |
| Tool | Description |
|---|---|
set_device_name | Rename a device |
set_led_theme | Change LED visualization (CO₂, VOC, Humidity, PM2.5, …) |
set_night_mode | Configure night mode schedule and settings |
set_brightness | Adjust LED brightness (day/night) |
configure_network | Set static IP or switch to DHCP |
| Tool | Description |
|---|---|
restart_device | Restart the device (~30s downtime) |
shutdown_device | Shut down the device (manual restart required) |
When multiple devices are configured, specify which device to query:
"air-Q Pro""pro", "radon"If only one device is configured, it is selected automatically.
get_air_quality accepts two optional grouping parameters:
location — query all devices in the same room (e.g. "Living Room")group — query all devices sharing a group tag (e.g. "Home")Both are independent: a device can have a location, a group, both, or neither. Matching is case-insensitive and substring-based.
Exactly one of device, location, or group may be specified per call.
Three tools provide access to data stored on the device's SD card:
plot_air_quality_history renders a chart for one sensor. When multiple devices
match, each device becomes a separate series in the same chart.

Single device (24 h, area chart, PNG)

Multiple devices at one location (24 h, area chart, PNG)
Output formats: png (default), webp, svg, html (interactive Plotly chart with hover tooltips and zoom)
Customization: --title, --x-axis-title, --y-axis-title, --chart-type (line/area), --dark, --timezone-name
export_air_quality_history produces one CSV or Excel file containing all matching devices.
get_air_quality_history returns column-oriented JSON, useful for programmatic analysis.
| Parameter | Default | Description |
|---|---|---|
--last-hours | 1 (history) / 24 (plot) | Hours of data to retrieve |
--from-datetime / --to-datetime | — | ISO 8601 time range (overrides --last-hours) |
--max-points | 300 | Downsample to at most N evenly spaced points |
--timezone-name | UTC | IANA timezone for timestamps (e.g. Europe/Berlin) |
The repository uses a project-local .venv plus uv.lock for reproducible tooling.
Run all developer commands through uv run, for example:
version in pyproject.toml.v0.1.1.The publish workflow validates that the release tag matches pyproject.toml, uploads the package to PyPI, and then publishes the same version to the MCP Registry.
Apache License 2.0 — see LICENSE.