Aemet Mcp

io.github.jocarrd由 GitHub 帳號 jocarrd 發布v0.3.3更新於 Oct 29, 2026

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

已驗證STDIO僅桌面位置與生活資料與分析

概覽

AI 產生的概覽

本機 MCP 伺服器,讓助理取得西班牙 AEMET 官方天氣預報、警報、即時觀測、氣候歷史,以及海灘、山區、海洋與空氣品質資料。

可以做什麼
  • 依名稱、INE 代碼或座標查詢西班牙各市鎮的逐日或逐小時預報
  • 取得某自治區或全國的 CAP 生效天氣警報,可依嚴重程度與語言篩選
  • 讀取最近 AEMET 氣象站的最新觀測,以及逐日紀錄或月常年值形式的氣候歷史
  • 取得海灘、山區與海洋公報,包含水溫、紫外線指數、零度層高度與海況
  • 查看 AEMET 鄉村背景監測網的背景空氣污染讀值
適用情境
適合希望助理以官方資料回答西班牙天氣與氣候問題的情境:某城鎮本週預報、某地區目前生效的警報、某地上個月降雨量,或海灘與山區的天氣狀況。
執行需求
透過 npx 以 stdio 在本機執行,需要 Node.js 20.19 或以上版本。需要免費的 AEMET OpenData API 金鑰,透過環境變數 AEMET_API_KEY 提供,每位使用者自備。需要能連線至 AEMET 的網路。選用環境變數 AEMET_CACHE_TTL 可設定記憶體快取時間(秒)。
安裝前請注意
AEMET_API_KEY 是個人憑證,需寫入用戶端的 env 設定,避免放進共用設定檔。AEMET 對 API 有速率限制,頻繁呼叫可能被限流;回應預設在記憶體快取 10 分鐘。空氣品質資料是鄉村背景污染,並非城市空氣品質,無效讀值會被標示。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Aemet Mcp,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

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

來源:packages/aemet-mcp/README.md,提交 279faac

工具

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.

輸入參數dayslocation必填granularity

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.

輸入參數area必填languageminSeverity

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.

輸入參數location必填

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.

輸入參數tofrommodelocation必填

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.

輸入參數dayslocation必填municipality

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.

輸入參數dayarea必填mode

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.

輸入參數area必填product

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.

輸入參數stationlocation

版本歷史

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

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分