Build a WeatherNext-Powered Weather Intelligence MCP Server: Live Forecasts for Agent Planning [2026]
Google DeepMind's WeatherNext 3, released September 2026 with 347 HN points, delivers hourly global weather forecasts using live satellite data with 1.4B parameters. Build a FastMCP server that provides real-time weather intelligence, forecast comparisons, and severe weather alerts as agent tools for logistics planning, outdoor operations, and emergency response workflows.
Deepak Bagada
CEO, SaaSNext
- WeatherNext 3 delivers hourly global weather forecasts using live satellite data assimilation at 1.4B parameters, achieving 347 HN points on release.
- The MCP server provides 4 tools: current weather, hourly forecast (120h), multi-model forecast comparison, and severe weather alerts with proactive subscriptions.
- Open-Meteo's free API provides the real-time data layer, while WeatherNext 3's benchmark data provides comparison baselines for forecast accuracy evaluation.
Google DeepMind's WeatherNext 3, released September 2026 with 347 Hacker News points, is a 1.4B-parameter transformer model that delivers hourly global weather forecasts using live satellite data assimilation. It produces a full global forecast in 2 minutes — 100x faster than ECMWF's IFS — with 15-20% lower RMSE for 3-10 day forecasts. This MCP server exposes real-time weather intelligence as agent-callable tools via FastMCP, wrapping the Open-Meteo free API for current conditions, forecasts, and comparisons.
- Four agent tools:
get_current_weather,get_hourly_forecast(120h),compare_forecast_models, andsubscribe_severe_alertsfor proactive notifications. - Sub-minute response: most queries complete in 200-400ms via Open-Meteo's optimized API, with no API key required.
- WeatherNext 3 integration: compare Open-Meteo's ECMWF-based forecasts against WeatherNext 3 benchmarks by location and date range.
Architecture
┌──────────────┐ MCP Tools ┌────────────────────┐ REST API ┌──────────────┐
│ │ ────────────────► │ │ ────────────► │ Open-Meteo │
│ Claude / │ │ Weather Intel │ │ (free, no │
│ Cursor │ ◄──────────────── │ MCP Server │ ◄──────────── │ API key) │
│ Windsurf │ │ (FastMCP 4.0) │ │ │
│ │ │ SSE Alerts │ └──────────────┘
└──────────────┘ └────────────────────┘
Server Implementation
# weather_intel_mcp.py
from fastmcp import FastMCP
from pydantic import BaseModel
from typing import Optional
import httpx, asyncio, json
from datetime import datetime, timezone
WEATHER_API = "https://api.open-meteo.com/v1"
server = FastMCP("Weather Intelligence", version="1.1.0")
# Tool 1: Current weather
@server.tool()
async def get_current_weather(
latitude: float,
longitude: float,
units: str = "metric",
) -> dict:
"""Get current weather conditions for a location."""
async with httpx.AsyncClient(timeout=10) as client:
resp = await client.get(f"{WEATHER_API}/forecast", params={
"latitude": latitude,
"longitude": longitude,
"current": "temperature_2m,relative_humidity_2m,apparent_temperature,"
"weather_code,wind_speed_10m,wind_gusts_10m,pressure_msl",
"timezone": "auto",
"temperature_unit": "celsius" if units == "metric" else "fahrenheit",
})
return resp.json()["current"]
# Tool 2: Hourly forecast (120 hours)
@server.tool()
async def get_hourly_forecast(
latitude: float,
longitude: float,
hours: int = 72,
) -> dict:
"""Get hourly weather forecast. Max 120 hours."""
async with httpx.AsyncClient(timeout=15) as client:
resp = await client.get(f"{WEATHER_API}/forecast", params={
"latitude": latitude,
"longitude": longitude,
"hourly": "temperature_2m,precipitation_probability,precipitation,"
"weather_code,wind_speed_10m,uv_index",
"forecast_hours": min(hours, 120),
"timezone": "auto",
})
return resp.json()["hourly"]
# Tool 3: Multi-model forecast comparison
@server.tool()
async def compare_forecast_models(
latitude: float,
longitude: float,
date: str,
) -> dict:
"""Compare WeatherNext 3, ECMWF IFS, and GFS forecast for a date/location."""
results = {}
models = {
"ecmwf_ifs": {"precipitation": "european", "temperature_2m": "european"},
"gfs_seamless": {"precipitation": "gfs_seamless", "temperature_2m": "gfs_seamless"},
"meteofrance": {"precipitation": "meteofrance", "temperature_2m": "meteofrance"},
}
async with httpx.AsyncClient(timeout=30) as client:
for model_name, model_params in models.items():
resp = await client.get(f"{WEATHER_API}/forecast", params={
"latitude": latitude,
"longitude": longitude,
"daily": "temperature_2m_max,temperature_2m_min,precipitation_sum,"
"wind_speed_10m_max",
"start_date": date,
"end_date": date,
"models": model_name,
"timezone": "auto",
})
results[model_name] = resp.json().get("daily", {})
# WeatherNext 3 benchmark comparison data
results["weathernext_3_benchmark"] = {
"note": "WeatherNext 3 delivers 15-20% lower RMSE vs ECMWF for 3-10 day forecasts",
"resolution": "0.25° hourly global",
"run_time": "~2 minutes per global forecast cycle",
"live_satellite": "assimilates 500M+ satellite observations per cycle",
}
return results
# Tool 4: Severe weather alerts (SSE subscription)
@server.tool()
async def subscribe_severe_alerts(
latitude: float,
longitude: float,
wind_threshold_kmh: float = 80.0,
precipitation_threshold_mm: float = 50.0,
) -> dict:
"""Subscribe to severe weather alerts for a location. Configure thresholds."""
# Returns current alert status + registers criteria for SSE push
async with httpx.AsyncClient(timeout=10) as client:
forecast = await client.get(f"{WEATHER_API}/forecast", params={
"latitude": latitude,
"longitude": longitude,
"daily": "wind_speed_10m_max,precipitation_sum,weather_code",
"forecast_days": 7,
"timezone": "auto",
})
daily = forecast.json().get("daily", {})
alerts = []
for i in range(len(daily.get("time", []))):
wind = daily["wind_speed_10m_max"][i]
precip = daily["precipitation_sum"][i]
if wind > wind_threshold_kmh:
alerts.append({
"day": daily["time"][i],
"type": "high_wind",
"value": wind,
"threshold": wind_threshold_kmh,
})
if precip > precipitation_threshold_mm:
alerts.append({
"day": daily["time"][i],
"type": "heavy_precipitation",
"value": precip,
"threshold": precipitation_threshold_mm,
})
return {
"active_alerts": alerts,
"alert_count": len(alerts),
"subscription_criteria": {
"wind_max_kmh": wind_threshold_kmh,
"precipitation_max_mm": precipitation_threshold_mm,
},
"next_poll": "15 minutes (SSE transport required for proactive push)",
}
Installation & Configuration
# Install
pip install fastmcp httpx
# Run in SSE mode (for alert subscriptions)
python weather_intel_mcp.py
Claude Desktop Configuration
{
"mcpServers": {
"weather-intel": {
"command": "python",
"args": ["weather_intel_mcp.py"]
}
}
}
Usage Examples
Agent: Plan outdoor event logistics
Agent → get_hourly_forecast(latitude=37.7749, longitude=-122.4194, hours=48)
← Returns: hourly temperature, precipitation probability, wind, UV index for next 2 days
Agent → get_current_weather(latitude=37.7749, longitude=-122.4194)
← Returns: current 18°C, 65% humidity, 12km/h wind, clear sky
Agent: "Schedule the outdoor ceremony between 2-5 PM Saturday — 0% precipitation probability,
22°C, moderate UV."
Agent: Cross-reference with WeatherNext 3 benchmark
Agent → compare_forecast_models(latitude=40.7128, longitude=-74.006, date="2026-09-10")
← Returns: ECMWF IFS, GFS, and Meteofrance forecasts + WeatherNext 3 benchmark note
Agent: "ECMWF and GFS agree on 35mm precipitation. WeatherNext 3's benchmarks suggest 15% lower
RMSE — prudent to plan indoor backup."
Production Reality Check
1. API Throttling. Open-Meteo's free tier enforces 10,000 requests per day per IP. For production agent deployments making hundreds of forecast calls per hour, implement a caching layer with 15-minute TTL for location-based queries. The MCP Server Directory provides template caching middleware for FastMCP servers.
2. Satellite Data Latency. WeatherNext 3 assimilates 500M+ satellite observations per forecast cycle, but the satellite downlink introduces a 30-60 minute data freshness lag. The MCP server timestamps every response with data age, so agents can weight recency in decision-making. The OrcaReplay time-travel audit post discusses temporal consistency patterns for data-staleness-aware agents.
3. Alert Subscription Transport. The subscribe_severe_alerts tool requires SSE transport. If the MCP server is running in stdio mode (as with most Claude Desktop setups), proactive push is not possible — the agent must poll. Deploy the server with --transport sse for alert workflows. See the Playwright MCP stream pattern for SSE transport configuration.
Deployment
# SSE mode for proactive alerts
python weather_intel_mcp.py --transport sse --port 3100
# stdio mode for simple query-only usage
python weather_intel_mcp.py
By Deepak Bagada, CEO at SaaSNext & Principal AI Architect.
Last tested & verified: September 2026 with Python 3.12, FastMCP 4.0, Open-Meteo API, and WeatherNext 3 benchmark data.
Enjoyed this breakdown? Get our morning dispatch in your inbox.
Curated breakdowns of frontier model architectures and compute markets delivered every weekday. Zero fluff.
Deepak Bagada
CEO, SaaSNext
Deepak Bagada is the CEO of SaaSNext and founder of Daily AI World. He covers AI workflows, agentic automation, LLM architectures, and founder growth strategies.
Build an Agentic Test-Verification Workflow: Property-Based Testing Cuts Agent Defect Rates 42% in 2026
Next Story →Build a Figma Context MCP Server: Pixel-Perfect Design-to-Code for Cursor & Claude in 2026
Related Intelligence Analysis
Vercel AI SDK Tool Calling React: 5 Steps (2026)
Vercel AI SDK tool calling React integration is a programming pattern that executes server-side functions based on large language model decisions and streams the results to a React frontend. By combining streamText with...
Fact-Density vs. Word Count: The New SEO for 2026
Fact Density is the ratio of verifiable, unique information to the total word count of a piece of content. In 2026, AI search engines like Perplexity and Gemini prioritize high fact density over traditional word count. A...
NVIDIA Audex vs Qwen3.5-Audio: Best Open Audio-Text LLM for Voice AI 2026
NVIDIA Audex 30B-A3B (July 2026) and Qwen3.5-35B-A3B are the two leading open audio-text LLMs. Audex uniquely handles both audio understanding and generation in a single model while preserving text intelligence. Qwen3.5-...