Aemet Mcp

io.github.jocarrdPublished by GitHub account jocarrdv0.3.3Updated Oct 29, 2026

MCP server for AEMET: Spain's official forecasts, warnings, observations and climate data.

VerifiedSTDIODesktop onlyLocation & LifestyleData & Analytics

Overview

AI-generated overview

Local MCP server that gives an assistant Spain's official AEMET weather forecasts, warnings, observations, climate history, beach, mountain, maritime and…

What you can do
  • Look up forecasts for Spain's municipalities, daily or hourly, by name, INE code or coordinates
  • Retrieve active CAP weather warnings for an autonomous community or the whole country, filtered by severity and language
  • Read the latest observation from the nearest AEMET station, plus climate history as daily records or monthly normals
  • Get beach, mountain and maritime bulletins, including water temperature, UV index, freezing levels and sea state
  • Check background air pollution readings from AEMET's rural reference network
When to use it
Useful when you want an assistant to answer questions about Spanish weather and climate with official data: this week's forecast for a town, active warnings in a region, how much it rained somewhere last month, or conditions at a beach or in the mountains.
Requirements
Runs locally over stdio via npx, so Node.js 20.19 or higher is needed. Requires a free AEMET OpenData API key supplied in the AEMET_API_KEY environment variable; each user supplies their own. Network access to AEMET is required. Optional AEMET_CACHE_TTL sets the in-memory cache lifetime in seconds.
Before you install
The AEMET_API_KEY is a personal credential and must be placed in the client's env block; keep it out of shared configs. AEMET rate-limits its API, so heavy use may be throttled; responses are cached in memory for 10 minutes by default. Air-quality data is rural background pollution, not urban air quality, and invalid readings are flagged.

Installation

In SourceWeft

  1. Open Aemet Mcp in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

aemet-mcp

[npm version] [License: MIT]

A Model Context Protocol server that lets LLM clients — Claude Desktop, Cursor, Windsurf, Zed, custom agents — answer questions about Spain's weather using real data from AEMET, the State Meteorological Agency.

Versión en español · Servidor MCP con ocho herramientas sobre los datos abiertos de AEMET. Requiere Node.js 20.19 o superior.

Built on top of aemet-client, the same TypeScript SDK that powers snowy.es.

Runs locally over stdio — no hosted infrastructure, no shared API key. Every user supplies their own free AEMET key.

Get an AEMET API key

Free, takes about a minute:

  1. Open opendata.aemet.es/centrodedescargas/altaUsuario
  2. Enter your email
  3. They send you the key as a JWT — copy it

Use it from Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json on macOS or %APPDATA%\Claude\claude_desktop_config.json on Windows and add:

json
{  "mcpServers": {    "aemet": {      "command": "npx",      "args": ["-y", "aemet-mcp"],      "env": {        "AEMET_API_KEY": "paste-your-key-here"      }    }  }}

Restart Claude Desktop and ask: "What's the weather forecast for Madrid this week?", "Are there any active weather warnings in Catalonia right now?", "How much did it rain in Logroño last August?" or "What's the water temperature at La Concha?".

Use it from Cursor / Windsurf / Zed

Same config object — every MCP-capable client accepts the { command, args, env } shape. See their docs for where the config file lives.

Tools

get_forecast

AEMET's official forecast for any of Spain's 8000+ municipalities.

ArgumentTypeNotes
locationstringName ("Madrid", "Logroño", "A Coruña") or 5-digit INE code
daysinteger 1-7 (optional)Defaults to 3. Ignored when granularity="hourly"
granularity"daily" | "hourly"Daily summary or next ~40h hour-by-hour

get_warnings

Active CAP (Common Alerting Protocol) warnings for an autonomous community or the whole country.

ArgumentTypeNotes
areastring"Cataluña", "Madrid", "73" (La Rioja), "esp" …
language"es" | "en" | "ca" | "gl" | "eu" | "any"Preferred warning language. Defaults to "es"
minSeverity"Minor" | "Moderate" | "Severe" | "Extreme"Drop warnings below this threshold

get_nearest_observation

Latest real-time observation (temperature, humidity, wind, precipitation, pressure, visibility) from the AEMET station closest to a location.

ArgumentTypeNotes
locationstringMunicipality name, INE code, or decimal coordinate pair ("40.4168,-3.7038")

get_climate_history

Historical climate data from the AEMET station closest to a location: either daily records over a date range or the station's long-term monthly normals.

ArgumentTypeNotes
locationstringMunicipality name, INE code, or decimal coordinate pair
mode"range" | "normals""range" (default) reads daily records. "normals" reads monthly averages
fromstringYYYY-MM-DD. Required for "range"
tostring (optional)YYYY-MM-DD, defaults to today

AEMET caps daily climate queries at 186 days per request, so longer ranges are rejected with a message explaining it. Ranges over a month come back aggregated by month (mean max/min, extremes, total precipitation, rain days) instead of one line per day.

get_beach_forecast

Three-day forecast for any of the 591 beaches AEMET covers during the bathing season: sky, wind and waves split into morning and afternoon, plus maximum temperature, water temperature, thermal sensation and UV index.

ArgumentTypeNotes
locationstringBeach name ("La Concha", "Es Trenc"), a coastal municipality to list its beaches, or the 7-digit AEMET beach code
municipalitystring (optional)Municipality or province, to disambiguate beaches that share a name
daysinteger 1-3Defaults to 3

Names resolve without accents and tolerate how people actually write them ("la kontxa", "playa de la concha, suances"). When a name matches more than one beach, the server answers with the candidates and their codes. Outside the bathing season AEMET stops publishing and the tool says so.

get_mountain_forecast

AEMET's mountain bulletin for the nine areas it covers: the forecast by section, freezing-level altitudes, free-atmosphere winds, and temperatures at named refuges and passes with their altitude. Also serves the last 24 hours.

ArgumentTypeNotes
areastringArea name or code: Picos de Europa (peu1), Pirineo Navarro (nav1), Pirineo Aragonés (arn1), Pirineo Catalán (cat1), Ibérica Riojana (rio1), Ibérica Aragonesa (arn2), Sierras de Guadarrama y Somosierra (mad2), Sierra de Gredos (gre1), Sierra Nevada (nev1)
mode"forecast" | "past"Forecast (default) or the last 24 hours
dayinteger 0-3Days ahead for the forecast, 0 (today) by default

Common aliases work: "Guadarrama", "Moncayo", "Urbión", "Peñibética", "Val d'Aran", "Gredos".

get_maritime_forecast

AEMET's marine bulletins: coastal waters (8 areas) and high seas (3 areas), with warnings, the synoptic situation, the forecast per zone and the trend for the following day.

ArgumentTypeNotes
areastringZone, coastal province or region ("Gipuzkoa", "Girona", "Mar Menor", "Gran Sol", "Alborán"), or a code: 40-47 coastal, 0-2 high seas
product"coastal" | "high_seas"Force one of the two products when a name exists in both

AEMET writes wind, sea state and visibility as a single text per zone, so the tool passes that text through rather than splitting it with guesswork.

get_air_quality

Background pollution from AEMET's rural EMEP/VAG/CAMP reference network: regional background air, not urban air quality.

ArgumentTypeNotes
stationstring (optional)Station name or 2-digit code ("Campisábalos", "Doñana", "09")
locationstring (optional)Municipality, INE code or coordinates; resolves the nearest station and reports the distance

Measurements carry AEMET's validation codes, and values flagged as invalid are labelled so a model does not quote them as real readings.

Caching

AEMET rate-limits its API and some responses are heavy: the station inventory alone is 926 entries, and the server reads it on every climate query. Responses are therefore cached in memory for 10 minutes by default, per endpoint.

Set AEMET_CACHE_TTL in the same env block as the API key to change it, in seconds, or to 0 to turn caching off:

json
"env": {  "AEMET_API_KEY": "paste-your-key-here",  "AEMET_CACHE_TTL": "1800"}

The cache lives in the server process, so it disappears when your MCP client closes it. Pass your own cache adapter through clientConfig if you need something shared or persistent.

Programmatic use

If you're building your own MCP integration, the server is also exposed as a library:

ts
import { createServer } from "aemet-mcp";import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const { server } = createServer({ apiKey: process.env.AEMET_API_KEY });await server.connect(new StdioServerTransport());

You can pass an existing AemetClient (for example one wired to a Redis cache) instead of an API key:

ts
import { AemetClient } from "aemet-client";import { createServer } from "aemet-mcp";
const client = new AemetClient({ apiKey, cache: { adapter: redisAdapter } });const { server } = createServer({ client });

How it resolves municipalities

location accepts free-form names because the package embeds the full INE municipality dataset (8000+ entries) shipped by aemet-client. Searching for "logrono", "Logroño" or "26089" all resolve to the same place. Decimal coordinates resolve to the nearest municipality.

For autonomous communities, common aliases work: "Cataluña", "catalunya", "Catalonia", "Euskadi", "País Vasco", "Comunitat Valenciana", etc.

License

MIT © Jorge Carrera

Source: packages/aemet-mcp/README.md at commit 279faac

Tools

8

get_forecast

Weather forecast for a Spanish municipality

Returns the AEMET forecast for any of Spain's 8000+ municipalities. Accepts a name (with or without accents) or INE code. Daily granularity returns temperature min/max, sky state, precipitation probability and wind for each day. Hourly returns the next ~40h.

Parametersdayslocationrequiredgranularity

get_warnings

Active CAP weather warnings for a Spanish region

Returns the most recent CAP (Common Alerting Protocol) weather warnings issued by AEMET for the given autonomous community, or for the whole country ('esp'). Severity follows the CAP standard: Minor, Moderate, Severe, Extreme.

ParametersarearequiredlanguageminSeverity

get_nearest_observation

Latest real-time observation from the nearest AEMET weather station

Finds the AEMET weather station closest to the requested location and returns its most recent reading (temperature, humidity, wind, precipitation, pressure). Useful for 'what's the weather right now' style questions.

Parameterslocationrequired

get_climate_history

Historical climate records from the nearest AEMET climatological station

Finds the AEMET climatological station closest to the requested location and returns its measured history. mode='range' returns daily records (temperature, precipitation, wind, humidity, sunshine) between two dates; AEMET serves at most 6 months (186 days) per call, so longer histories need several calls. Ranges longer than 31 days are condensed into one line per month (mean max/min, total precipitation, rainy days, extremes) instead of one line per day. mode='normals' returns the station's long-term monthly averages. Use this for past weather and climate questions, not for forecasts.

Parameterstofrommodelocationrequired

get_beach_forecast

Beach forecast for a Spanish beach

Returns the AEMET beach forecast for the next three days: sky, wind and waves for morning and afternoon, plus maximum temperature, water temperature, thermal sensation and maximum UV index. Covers the 591 beaches AEMET forecasts during the bathing season. Accepts a beach name (accents optional), optionally narrowed by municipality, or the 7-digit AEMET beach code.

Parametersdayslocationrequiredmunicipality

get_mountain_forecast

Mountain bulletin for a Spanish mountain area

Returns the AEMET mountain bulletin for one of Spain's nine mountain areas (Picos de Europa, the three Pyrenean areas, the two Iberian System areas, Guadarrama and Somosierra, Sierra de Gredos, Sierra Nevada). Written for mountaineers and skiers: sky state, precipitation, storms, temperature and wind as forecaster prose, plus the freezing and -10 °C levels, free-atmosphere winds at 1500 and 3000 m, and minimum and maximum temperatures with thermal sensation at named refuges, passes and resorts. mode='forecast' covers today (day 0) to day 3; mode='past' summarises the last 24 hours. These bulletins are year-round and cover the mountain range as a whole, so use them instead of get_forecast for anything above the valley floor.

Parametersdayarearequiredmode

get_maritime_forecast

Maritime forecast for Spanish coastal waters and high seas

Returns the AEMET maritime bulletin for a sea area: sea state, wind, visibility, warnings and the validity period. Two products are covered: coastal waters (8 bulletins, one per stretch of the Spanish coast, each split into per-province zones and carrying the marine warnings) and high seas (3 bulletins covering the Atlantic north of 30N, the Atlantic south of 35N and the Mediterranean). Areas can be named the way people and the media name them, or given as AEMET codes.

Parametersarearequiredproduct

get_air_quality

Background air pollution at an AEMET EMEP/VAG rural station

Returns the latest reading of AEMET's background pollution network (EMEP/VAG/CAMP): 13 rural reference stations that measure the regional baseline of O3, NO, NO2, SO2 and PM10, plus temperature, humidity, pressure, wind, radiation and precipitation. This is BACKGROUND pollution, measured far from towns and roads on purpose. It does NOT answer 'how is the air in Madrid/Barcelona today': urban air quality is measured by the city and regional networks, not by AEMET, and this tool must not be used as a proxy for it.

Parametersstationlocation

Version history

4
  1. v0.3.3LatestOct 22, 2026
  2. v0.3.2Oct 12, 2026
  3. v0.3.1Oct 2, 2026
  4. v0.3.0Sep 16, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts