← Back to search

io.github.davidmosiah/wellness-air

davidmosiah Scanned 25d ago

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

B
79.2 / 100

Versions

0.5.6latest
first seen Jul 8, 2026
PermissionsTool SafetyAuthAnnotationsCode QualityStabilitySpecVuln HistoryAuthorTransparencyCommunity

Tools 19

air_agent_manifest
annotations: none low

Returns the wellness-air agent manifest: tool list, supported clients, env vars, recommended first calls, capabilities, privacy posture, and community links.

air_capabilities
annotations: none low

Lists supported providers, configured providers (via env vars), available metrics, and privacy modes.

air_connection_status
annotations: none low

Reports which providers are configured, which is the default, and any warnings the agent should surface to the user.

air_privacy_audit
annotations: none low

Returns what wellness-air stores locally, what it sends to providers, what it never logs, and agent rules.

air_data_inventory
annotations: none low

Returns the inventory of air-quality metrics this connector exposes plus per-provider availability hints (no remote calls).

air_current_reading
annotations: none low

Fetches the most recent air-quality reading for a location. Defaults to the AirGradient public sensor at WELLNESS_AIR_DEFAULT_LOCATION (or pass locationId).

provider enum locationId string
air_list_devices
annotations: none low

Lists devices owned by the configured provider account. v0.3 supports AirThings (requires AIRTHINGS_CLIENT_ID/SECRET). For AirGradient owned sensors use air_search_public_sensors instead.

provider enum
air_aqi_check
annotations: none low

Returns just the AQI number + band for the configured location. Use for fast 'is the air OK to go outside?' prompts.

locationId string
air_daily_summary
annotations: none low

Returns a synthesized daily snapshot for a location. v0.1 returns the current reading framed as a daily snapshot; richer multi-hour aggregation arrives in v0.2.

date string locationId string
air_compare_locations
annotations: none low

Compare current readings across multiple location IDs (default: AirGradient public sensors).

locationIds array
air_search_public_sensors
annotations: none low

Helper for discovering AirGradient public sensors. Returns a curated list of well-maintained public sensors plus a hint to the AirGradient map for finding more.

query string
air_quickstart
annotations: none low

Returns a personalized 3-step setup walkthrough for the human based on the current agent/env state. Call this first when the user asks 'how do I use this?'

air_profile_get
annotations: none low

Returns the shared Delx Wellness profile (~/.delx-wellness/profile.json). Read-only. Surfaces the user's preferred location, sensitivity flags (asthma, etc.), and units so wellness-air can choose tighter AQI thresholds.

air_profile_update
annotations: none low

Persist a partial patch to the shared Delx Wellness profile. Requires explicit_user_intent: true. Rejects any field containing oauth/token/secret/password/cookie/refresh/api_key/session — the profile is for non-secret wellness context only.

air_onboarding
annotations: none low

Returns the 11-question onboarding flow for the shared Delx Wellness profile. Read-only. The agent should ask these questions next so wellness-air (and the rest of the wellness stack) can personalize responses — non-secret data only, stored at ~/.delx-wellness/profile.json.

locale enum
air_demo
annotations: none low

Returns a realistic example payload of what air_current_reading + air_aqi_check + air_daily_summary look like in practice. Use this to help users understand what the connector will return BEFORE they configure anything. The field names and nesting are not hand-maintained guesses: scripts/demo-contract-test.mjs runs the real handlers over a synthetic sensor fixture and fails the build if this sample invents a key or omits one.

air_health_recommendation
annotations: none low

Quick PM2.5-centric health recommendation. Pass current PM2.5 (µg/m³) and optionally CO2 (ppm) and VOC index; returns WHO/EPA-aligned bands per pollutant, the overall worst band, and a deduplicated list of plain-language actions. Use this when you have a reading already and just want a 'what should I do?' answer. For richer four-pollutant classification with full source citations use air_health_bands.

co2_ppm number voc_index number pm25_ug_m3 number response_format enum
air_health_bands
annotations: none low

Classify PM2.5, PM10, CO2, and VOC readings into WHO 2021 / EPA / ASHRAE / UBA health bands. Pass readings directly, or omit them and the tool will fetch the current reading from the default provider (PM2.5, PM10, CO2, VOC where available). Returns per-pollutant band + the worst signal across pollutants + deduplicated recommended actions + source citations.

co2 number voc number pm10 number pm25 number provider enum locationId string
air_trend
annotations: verified low

Windowed trend analysis for PM2.5 / CO2 / VOC. Pulls past measurements from AirGradient (public or owned) and returns per-pollutant mean / median / min / max / current / rate_of_change_per_hour / peak_at / trough_at / time_above_threshold_minutes plus an optional natural-language observation (only when the data supports one). `time_above_threshold_minutes` integrates real sample spacing, so sensor downtime lowers it instead of inflating it; check `coverage_ratio` (0–1 fraction of the window the sensor actually reported) and `last_sample_at` before treating it — or `current` — as a full-window figure. Pass `pollutant: 'all'` (default) for an array of per-pollutant trends plus `worst_pollutant` per current WHO/ASHRAE bands. Use this for 'is PM2.5 climbing?' / 'was CO2 stable overnight?' / 'when did VOC spike?' kinds of questions.

readOnlyHint true openWorldHint true

Permissions 2

shell high
Server uses shell capabilities via: child_process, spawn()
env_vars low
Server uses env_vars capabilities via: process.env

Scan Findings 48

low
Tool 'air_agent_manifest' has no annotations annotation_checker · 100%
low
Tool 'air_capabilities' has no annotations annotation_checker · 100%
low
Tool 'air_connection_status' has no annotations annotation_checker · 100%
low
Tool 'air_privacy_audit' has no annotations annotation_checker · 100%
low
Tool 'air_data_inventory' has no annotations annotation_checker · 100%
low
Tool 'air_current_reading' has no annotations annotation_checker · 100%
low
Tool 'air_list_devices' has no annotations annotation_checker · 100%
low
Tool 'air_aqi_check' has no annotations annotation_checker · 100%
low
Tool 'air_daily_summary' has no annotations annotation_checker · 100%
low
Tool 'air_compare_locations' has no annotations annotation_checker · 100%
low
Tool 'air_search_public_sensors' has no annotations annotation_checker · 100%
low
Tool 'air_quickstart' has no annotations annotation_checker · 100%
low
Tool 'air_profile_get' has no annotations annotation_checker · 100%
low
Tool 'air_profile_update' has no annotations annotation_checker · 100%
low
Tool 'air_onboarding' has no annotations annotation_checker · 100%
low
Tool 'air_demo' has no annotations annotation_checker · 100%
low
Tool 'air_health_recommendation' has no annotations annotation_checker · 100%
low
Tool 'air_health_bands' has no annotations annotation_checker · 100%
info
Tool 'air_trend' annotations are consistent annotation_checker · 80%
medium
OAuth implementation without PKCE auth_checker · 75%
info
Sandbox failed to start for behavioral verification behavioral_verifier · 100%
info
package.json metadata manifest_parser · 100%
info
Tool: air_agent_manifest manifest_parser · 85%
info
Tool: air_capabilities manifest_parser · 85%
info
Tool: air_connection_status manifest_parser · 85%
info
Tool: air_privacy_audit manifest_parser · 85%
info
Tool: air_data_inventory manifest_parser · 85%
info
Tool: air_current_reading manifest_parser · 85%
info
Tool: air_list_devices manifest_parser · 85%
info
Tool: air_aqi_check manifest_parser · 85%
info
Tool: air_daily_summary manifest_parser · 85%
info
Tool: air_compare_locations manifest_parser · 85%
info
Tool: air_search_public_sensors manifest_parser · 85%
info
Tool: air_quickstart manifest_parser · 85%
info
Tool: air_profile_get manifest_parser · 85%
info
Tool: air_profile_update manifest_parser · 85%
info
Tool: air_onboarding manifest_parser · 85%
info
Tool: air_demo manifest_parser · 85%
info
Tool: air_health_recommendation manifest_parser · 85%
info
Tool: air_health_bands manifest_parser · 85%
info
Tool: air_trend manifest_parser · 85%
info
Transport: stdio manifest_parser · 90%
info
Required env vars (13) manifest_parser · 80%
info
Sandbox failed to start for output poisoning scan output_poisoning · 100%
high
Permission: shell access detected permission_analyzer · 95%
low
Permission: env_vars access detected permission_analyzer · 90%
info
SBOM generated: 134 components sbom_generator · 100%
medium
No build provenance detected (SLSA L0) slsa_assessor · 90%