Skip to main content
Glama
omeirhaeghe
by omeirhaeghe

Eighty & Sunny ☀️

A colorful, weather-reactive MCP Apps server. It renders rich Open-Meteo weather widgets directly inside an MCP host (the same SEP-1865 "MCP App" pattern as the NewsAPI / Taboola demos) — and ships a plain JSON tool for agents that just want the data.

The whole thing runs with no API key: it's backed by Open-Meteo, which is free for non-commercial use and needs no signup.

Background gradients, glow orbs and accent colors react to the actual weather code and day/night at each location — clear skies glow gold and blue, storms go deep purple, snow turns icy, night dims to indigo.


Tools

Tool

Widget

What it shows

show_weather

ui://weather-current

Flagship current-conditions card: big temp, animated icon, feels-like, today's high/low, and a 6-stat grid (humidity, wind, UV, pressure, cloud, precip).

show_weather_forecast

ui://weather-forecast

7-day grid — one row per day with icon, condition, precip chance and an Apple-style high→low range bar.

show_weather_hourly

ui://weather-hourly

Next-24h scroll strip with an aligned SVG temperature curve, hourly icons and precip chance.

show_weather_dashboard

ui://weather-dashboard

Everything at once: current hero + 8-stat grid (adds gusts, sunrise, sunset) + hourly curve + 7-day grid.

get_weather

Plain tool. Returns the full structured payload (current + hourly + daily) as JSON, no widget.

All four widget tools accept:

  • city — city to show first. If it isn't one of the pre-fetched cities it's geocoded and added as the active tab. Blank → first configured city.

  • units"imperial" (°F, mph, in) or "metric" (°C, km/h, mm). Blank → server default. Every widget also has a live °F / °C toggle.

Restricted triggers

Like the NewsAPI/Taboola demos, the show_* tools are documented as restricted-trigger: only invoke them when the user wants to see a weather widget (e.g. "show me the weather in Paris", "open Eighty & Sunny", "hourly forecast for Tokyo", "full weather dashboard"). For plain data questions, prefer get_weather.


Related MCP server: Simple Weather MCP

How it works

host ──tool call──▶ server.py
                      │  geocode each city  (geocoding-api.open-meteo.com)
                      │  fetch forecast     (api.open-meteo.com)  ── current + hourly + 7-day
                      ▼
                 normalize → _last_payload (canonical METRIC values)
                      │
host ──resource read─▶ widget HTML  ◀── payload inlined into <script id="weather-payload">
  • One place per call (rate-limit friendly). By default a tool call fetches only the active city (≤2 Open-Meteo requests), not all six. The other chips fill in from cache as you visit cities, so switching stays instant without hammering the API. Set WEATHER_PREFETCH=all to eagerly fetch every configured city up front.

  • TTL cache + 429 backoff. Each city's forecast is cached for WEATHER_CACHE_TTL seconds (default 600); repeat requests make no API call. On a 429/5xx the server retries with backoff (honoring Retry-After) and, if that still fails, serves the last-good cached data instead of an error.

  • Metric-canonical. All numbers are stored in °C / km/h / mm so the in-widget °F/°C toggle converts client-side — no refetch needed.

  • Open-Meteo stays whitelisted in the widget CSP (connectDomains), so the app can also live-fetch if needed.


Run locally

uv sync
uv run python server/server.py            # http://localhost:8778/mcp
uv run python server/server.py --port 9000

Point your MCP host at http://localhost:8778/mcp (streamable HTTP).

Quick smoke test (no host needed)

uv run python -c "import asyncio, server.server as s; \
print(asyncio.run(s.get_weather('Paris'))['cities']['paris']['current'])"

Configuration

Everything is optional — see .env.example. Copy it to .env to override:

Env var

Default

Meaning

WEATHER_CITIES

San Francisco,New York,London,Tokyo,Sydney,Paris

The chip set. Only the active one is fetched per call (others warm from cache).

WEATHER_UNITS

imperial

Default unit system (imperial or metric).

WEATHER_CACHE_TTL

600

Seconds a forecast stays fresh in cache (0 disables).

WEATHER_PREFETCH

(off)

Set to all to eagerly fetch every WEATHER_CITIES entry per call.

WEATHER_FORECAST_DAYS

7

Days of daily forecast (1–16).

WEATHER_HOURLY_HOURS

48

Hours of hourly data inlined (12–72).

PORT

8778

Port (also accepted via --port).


Deploy

Render (one click via render.yaml)

Push to GitHub, then in Render: New → Blueprint, point it at the repo. The included render.yaml builds with uv and starts the server on $PORT. No env vars are required (Open-Meteo needs no key); uncomment the ones in render.yaml to customize cities/units.

Docker / Azure Container Apps

docker build -t es-weather-mcp .
docker run -p 8080:8080 es-weather-mcp        # http://localhost:8080/mcp

azure.yaml is included for azd up (Azure Container Apps).


Credits

F
license - not found
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/omeirhaeghe/EightyAndSunny'

If you have feedback or need assistance with the MCP directory API, please join our Discord server