docs/brainstorms/2026-03-27-pro-mcp-server-requirements.md
WorldMonitor accumulates, curates, and caches real-time intelligence across 25+ domains. PRO users currently access this data only through the web UI or desktop app. They cannot query it from Claude Desktop, Cursor, Windsurf, or any MCP-compatible AI agent. This creates a hard wall between WorldMonitor's data layer and AI workflows. The MCP server removes that wall: PRO API key holders point their MCP client at https://api.worldmonitor.app/mcp and WorldMonitor data becomes natively queryable from any AI agent.
api/mcp.ts implements the MCP Streamable HTTP transport (protocol version 2025-03-26), handling initialize, tools/list, and tools/call JSON-RPC methods.X-WorldMonitor-Key header, validated against WORLDMONITOR_VALID_KEYS using the existing validateApiKey() helper. Unauthenticated requests return a JSON-RPC error (code -32001).tools/list returns all tools regardless of which domains have fresh cache data. Stale or empty cache is a tool-call concern, not a registration concern.cached_at timestamp and a stale boolean (true when cache age exceeds the domain's expected refresh interval) so agents can reason about data freshness.message fields, never raw exceptions.| Tool name | Data sources | Description |
|---|---|---|
get_market_data | stocks, commodities, crypto, sectors, ETFs, gulf | Equity quotes, commodity prices, crypto prices, sector performance |
get_conflict_events | ACLED, UCDP, unrest scores | Active conflict events with geo coordinates and country risk scores |
get_aviation_status | FAA delays, NOTAM, military flights | Airport delays, airspace closures, tracked military aircraft |
get_news_intelligence | news threat summaries, CII, top headlines | AI-classified threat news, country instability index, top geopolitical signals |
get_natural_disasters | USGS seismology, FIRMS wildfire, thermal | Earthquakes, wildfires, thermal anomalies |
get_maritime_status | NGA warnings, AIS snapshot, vessel data | Navigation warnings, vessel positions and anomalies |
get_military_posture | military bases, GPS jamming, satellites | Tracked assets, GPS degradation zones, satellite positions |
get_cyber_threats | URLhaus, CISA KEV, Feodotracker | Active malware IOCs, CISA known exploited vulnerabilities |
get_economic_data | FRED, EIA, consumer prices, central banks | Macro indicators, energy prices, inflation, central bank rates |
get_prediction_markets | Polymarket | Active event contracts and probabilities |
get_sanctions_data | OFAC SDN | Sanctioned entities with name-search support |
get_climate_data | Open-Meteo, NASA EONET, GDACS | Temperature anomalies, environmental alerts, disaster alerts |
get_displacement_data | UNHCR | Refugee and IDP counts by country |
get_infrastructure_status | Cloudflare Radar, submarine cables | Internet health, cable disruptions |
get_supply_chain_data | shipping stress, trade routes | Dry bulk shipping stress index, chokepoint pressure |
get_positive_events | positive geo-events bootstrap | Diplomatic, humanitarian, and development positive signals |
get_webcams | live webcam feeds | Active public webcam feed URLs by region |
https://api.worldmonitor.app/mcp as the URL — no install, no CLI.tools/list response is < 500ms (served from in-memory registry, no Redis calls).stale: true).api/mcp-proxy.js (external MCP proxy for the widget agent) is unrelated and untouched.stale flag in responses: Agents need to know data freshness to decide whether to trust or re-query. The bootstrap intervals are known (market: 5min, conflict: 30min, etc.) so this is computable.WORLDMONITOR_VALID_KEYS env var is already set in Vercel production (it is — used by desktop auth).@upstash/redis) is already in package.json (it is).api/mcp-proxy.js).api/bootstrap.js and api/health.js BOOTSTRAP_KEYS to map tool → cache key → expected shape.api/mcp.ts live at a flat path or use a catch-all route (api/mcp/[...path].ts)? Depends on whether the MCP client sends sub-paths (e.g. /mcp/sse). Planner should check the MCP 2025-03-26 spec for path requirements.api/_rate-limit.js. Planner should verify it's edge-compatible (no Node.js APIs) before wiring it in.maxStaleMin from api/health.js BOOTSTRAP_KEYS to compute stale flag per tool.→ /ce:plan for structured implementation planning