Multi-agent environmental monitoring system for air quality, weather, pollen, and solar data using Google APIs and MCP tools
15 tools with consistent naming (verb_noun pattern: get_*, download_*) and reasonable descriptions (avg ~80 chars). All tools have input schemas with typed parameters and descriptions. However, output schemas are completely undocumented, no tool specifies what fields are returned, forcing LLMs to guess. Parameter descriptions lack constraints (enums, ranges, formats). No error handling guidance. Missing idempotency hints for read-only tools. Tool composition is reasonable (single responsibility), but no pagination guidance for list-like tools (e.g., get_air_quality_history accepts page_size but no cursor/offset or total_count return documented).
Get current weather conditions for a location.
Get daily forecast (up to 10 days).
Download GeoTIFF file from ID.
Get air quality forecast for a location. Max 96 hours (4 days). Use hours parameter.
Fetch an air quality heatmap tile (PNG). map_type options: uaqi, pm25, pm10, no2, o3
Get historical air quality data for a location. Time format: ISO-8601 (e.g. '2025-12-19T00:00:00Z'). Max 30 days (720 hours) range.
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract required fields (e.g., does get_coordinates return lat/lon as floats or strings? Does get_air_quality_history return a list or paginated object?). This violates pattern:tool and forces agents to guess.
Parameter descriptions lack constraints. 'hours' in get_air_quality_forecast says 'Number of forecast hours' but does not state the max (96 hours per description, but not in schema). 'zoom' in get_air_quality_heatmap_tile has no range. 'days' in get_pollen_forecast says '1-5' in description but no enum/min/max in schema. LLMs cannot validate inputs without formal constraints.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | <=2025-11-25 | v2 |
Get building insights for a location including solar potential.
Convert address to lat/lon using Google Geocoding API.
Get current air quality conditions for a specific location.
Get data layers with URLs to GeoTIFF files.
Fetch pollen forecast data for a specific location using Google Pollen API.
Fetch pollen heatmap tile image for specific coordinates and pollen type.
Get hourly forecast (up to 240 hours).
Get hourly history (up to 24 hours).
Get public weather alerts for a location.
No error handling guidance. Tools that call external APIs (Google Geocoding, Air Quality API, Weather API) can fail (rate limits, invalid coordinates, API outages), but no tool documents what errors are possible, whether they are retryable, or what the LLM should do next. Violates pattern:recovery-guide.
Pagination not fully specified. get_air_quality_history accepts page_size (default 100) but no description of how to fetch the next page (offset? cursor?). No total_count or next_cursor returned. Agents cannot reliably paginate large result sets. Violates pattern:paginated-result.
Tool naming inconsistency: 'current_conditions' lacks the 'get_' prefix used by all other tools. This breaks the verb_noun convention and makes the tool harder to discover in a large tool list. Should be 'get_current_conditions'.