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 分