Real-time global intelligence terminal: geopolitics, markets, shipping, airspace, disasters, cyber, space. $0/month stack.
Earth Monitor exposes 17 tools via HTTP API routes but lacks production-grade definition quality. Most tools have minimal descriptions (10-50 chars, well below the 194-char baseline). Input schemas are either empty objects {} or sparse (e.g., geocode has 5 params but no type constraints, enums, or ranges). No output schemas are documented. Error handling is absent, no recovery guidance, no categorization of retryable vs fatal errors. Tool names are verb-prefixed (get_, search_) but descriptions are too terse to guide LLM selection. No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Composition is weak: copilot_chat conflates multiple intents (geopolitics, markets, shipping, airspace) into one tool. No pagination support visible despite tools returning potentially large datasets (earthquakes, wildfires, webcams). Security: no evidence of rate limiting, input validation, or audit logging in the route handlers shown.
Real-time global intelligence assistant that answers questions about geopolitics, markets, shipping, airspace, disasters, power structure, and infrastructure with live data grounding
Geocode location names to coordinates or reverse geocode coordinates to location names
Fetch country dossier data including all countries or a specific country by code
Fetch geographic locations for all countries
Fetch real-time cryptocurrency market snapshot
Fetch earthquake data from the past week
Fetch press freedom and country freedom status data, optionally filtered by country code
Fetch foreign exchange rates snapshot or convert between currencies
Empty or missing input schemas on 10+ tools (get_military_airspace, get_country_locations, health_check, get_crypto_snapshot, get_market_snapshot, get_earthquakes, get_nasa_snapshot, get_live_unrest, get_live_webcams, get_live_wildfires). Tools with {} schema provide no type information, constraints, or parameter guidance to LLMs.
Descriptions are uniformly terse (10 - 35 chars), far below the 194-char baseline. Examples: 'Fetch real-time military aircraft data from airspace monitoring' (59 chars) lacks WHEN to use it or what fields are returned. LLMs cannot distinguish between similar tools (get_market_snapshot vs get_crypto_snapshot vs get_fx_snapshot) with such minimal guidance.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 32 | 2026-07-28+ | v2 |
Fetch country governance profile data from World Bank
Fetch live unrest and conflict data from ACLED or Guardian sources
Fetch live webcam feeds from around the world
Fetch real-time wildfire data and locations
Fetch market quotes and snapshot data
Fetch real-time military aircraft data from airspace monitoring
Fetch NASA space data snapshot including APOD and other space imagery
Check server health status, provider readiness, and Redis cache status
Search sanctions database by query or country
No output schemas documented. Tools return JSON but LLMs have no visibility into response structure (field names, types, nesting). This forces LLMs to guess what data is available and blocks downstream tool chaining (e.g., if get_country_dossier returns a country_code, update_country_profile must accept country_code, but without documented output, this mapping is invisible).
copilot_chat conflates multiple intents (geopolitics, markets, shipping, airspace, disasters, power structure, infrastructure) into a single tool. This violates single-responsibility principle. Should be split into domain-specific tools (query_geopolitics, query_markets, query_infrastructure) so agents can compose them independently.
No error handling guidance. Route handlers (e.g., src/app/api/airspace/military/route.ts) show bare NextResponse.json(data) with no try-catch, validation, or recovery hints. If an API call fails, LLMs receive no actionable error message, no indication whether to retry, ask the user, or abandon the task.