Back to Directory/Developer Tools

io.github.davidmosiah/wellness-air

Local-first air-quality MCP for AI agents — AirGradient, AirThings, PurpleAir, IQAir, Awair.

Developer ToolsTypeScriptv0.5.6

⚡ One-command install — pick your runtime:

Or wire it standalone into Claude Desktop / Cursor / ChatGPT Desktop — see the install section below.


HTTP (v2 stateless)

Default is stdio. Optional Streamable HTTP — no session id, JSON responses, loopback only:

npx -y wellness-air --http
# GET  http://127.0.0.1:3000/health
# POST http://127.0.0.1:3000/mcp   (sessionless)

Env: WELLNESS_AIR_HOST, WELLNESS_AIR_PORT, WELLNESS_AIR_TRANSPORT=http.

Overview

Wellness Air is a local MCP server that exposes air-quality readings to any MCP-aware AI agent. It ships with first-class AirGradient support (open hardware + free public API — no auth needed for the 2,000+ public sensors in the worldwide feed). AirThings and PurpleAir are implemented (bring your own free API credentials); IQAir AirVisual and Awair are on the roadmap.

If wellness-air helps your agent, please star the repo. Stars make the project easier for other AI builders to discover and help Delx keep shipping local-first wellness infrastructure.

Try It In 60 Seconds

# 89 is a real, public AirGradient sensor (Prem Tinsulanonda School, Thailand).
# Swap in one near you from https://www.airgradient.com/map/ — copy the numeric
# locationId from the URL.

WELLNESS_AIR_DEFAULT_LOCATION=89 npx -y wellness-air doctor
WELLNESS_AIR_DEFAULT_LOCATION=89 npx -y wellness-air current

That's it — no token, no signup, no telemetry. Public reads use AirGradient's token-free worldwide feed, so any locationId in that feed works out of the box.

Install in Claude Desktop / Cursor / ChatGPT Desktop / Codex

{
  "mcpServers": {
    "wellness-air": {
      "command": "npx",
      "args": ["-y", "wellness-air"],
      "env": {
        "WELLNESS_AIR_DEFAULT_PROVIDER": "airgradient",
        "WELLNESS_AIR_DEFAULT_LOCATION": "89"
      }
    }
  }
}

Reload your client. The agent now has 19 air-quality tools.

Tools (19 total)

ToolPurpose
air_agent_manifestRuntime contract: tool list, supported clients, env vars, recommended first calls
air_capabilitiesSupported providers, configured providers, available metrics, privacy modes
air_connection_statusHealth check + warnings the agent should surface
air_privacy_auditWhat is logged locally vs sent to providers
air_data_inventoryMetric catalog + AQI band thresholds
air_current_readingLatest sensor reading (PM2.5, CO₂, AQI, temp, humidity)
air_list_devicesList devices on an authenticated provider account (AirThings)
air_aqi_checkFast 'is the air OK?' answer with band + recommendation
air_daily_summarySynthesized daily snapshot
air_compare_locationsCompare AQI across 2-10 locations
air_search_public_sensorsDiscovery helper for AirGradient public map
air_quickstartPersonalized 3-step setup walkthrough based on current env state
air_profile_getRead the shared Delx Wellness profile (location, sensitivities, units)
air_profile_updatePersist a non-secret patch to the shared wellness profile (explicit intent required)
air_onboarding11-question onboarding flow for the shared wellness profile
air_demoRealistic example payloads — preview output before configuring anything
air_health_recommendationPM2.5/CO₂/VOC → WHO/EPA bands + plain-language actions
air_health_bandsClassify PM2.5/PM10/CO₂/VOC into WHO 2021 / EPA / ASHRAE / UBA bands + citations
air_trendWindowed trend analysis (mean/median/rate-of-change/peaks) for PM2.5/CO₂/VOC

Why local-first?

  • Public sensors require zero auth. AirGradient runs an open public API; just pass a locationId.
  • Owned-sensor tokens stay on your machine. Set AIRGRADIENT_API_TOKEN only if you own a sensor.
  • No telemetry. wellness-air never phones home. The only outbound calls go to the providers you configure.
  • Read-only. No tool mutates anything upstream. (air_profile_update writes only to your local shared wellness profile, never to a provider, and requires explicit user intent.)

Cross-connector wedge

Where this gets interesting: pair it with the rest of the Delx Wellness stack.

WHOOP recovery 47   +   wellness-air AQI 132 (unhealthy_sensitive)
       ↓                          ↓
   Coach: "Recovery's low AND the bedroom AQI was unhealthy last night.
           Skip outdoor cardio today — try mobility + low-intensity strength indoors with HEPA running."

Most agents miss the room-quality variable entirely. wellness-air closes that gap.

Privacy

Run wellness-air doctor to inspect the local privacy posture. Highlights:

  • All readings cached under ~/.wellness-air (configurable).
  • Provider tokens never returned to the agent.
  • No biometric data — environmental only.
  • Tool outputs explicitly tagged with their data source for downstream auditability.

Roadmap

Shipped: AirGradient (public + owned) · AirThings · PurpleAir adapters · WHO/EPA/ASHRAE/UBA health bands · windowed trend analysis (air_trend) · shared Delx Wellness profile + onboarding.

Next:

  • IQAir AirVisual + Awair adapters.
  • Cross-correlation helper (e.g. air_correlate_with_sleep) against the rest of the Delx Wellness stack.
  • Webhook trigger for AQI thresholds (agent gets notified when AQI crosses a band).

📧 Contact & Support

License

MIT — see LICENSE.

wellness-air is an unofficial connector. AirGradient, AirThings, PurpleAir, IQAir, and Awair are trademarks of their respective owners. None of those companies are affiliated with or endorse this project.

Skill or MCP

Same package, two doors. MCP registers tools on stdio/HTTP. The skill can drive the same tools through the CLI when the client has no MCP:

npx -y wellness-air call air_connection_status --json '{}'

Copy skill/SKILL.md into your agent skills dir.

Installation

Source-derived launch command. Check the maintainer’s required arguments and credentials before running:

bash
npx -y wellness-air

Set up in your AI client

Merge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.

json
{
  "mcpServers": {
    "io-github-davidmosiah-wellness-air": {
      "command": "npx",
      "args": [
        "-y",
        "wellness-air"
      ]
    }
  }
}

Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.

Claude Desktop setup reference

Package

wellness-airnpm

Compatible MCP Clients

io.github.davidmosiah/wellness-air works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.

  • Claude Desktop~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.
  • Cursor~/.cursor/mcp.jsonRestart Cursor for changes to take effect.
  • VS Code.vscode/mcp.jsonReload VS Code window for changes to take effect.
  • Windsurf~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect.
  • Claude Code.mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.

Learn More