aemet-mcp
# aemet-client monorepo
Tools for working with [AEMET OpenData](https://opendata.aemet.es/), the
public API of Spain's State Meteorological Agency.
| Package | Description | npm |
| --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| [`aemet-client`](packages/aemet-client) | Typed TypeScript SDK + CLI for AEMET OpenData. Used in production at [snowy.es](https://snowy.es). | [](https://www.npmjs.com/package/aemet-client) |
| [`aemet-mcp`](packages/aemet-mcp) | Model Context Protocol server: plug AEMET into Claude Desktop, Cursor, Windsurf or any MCP client. Forecasts, warnings, live observations, climate history and beach forecasts. Runs locally over stdio. | [](https://www.npmjs.com/package/aemet-mcp) |
## Quick links
- **Just want to use AEMET from code?** → [`packages/aemet-client/README.md`](packages/aemet-client/README.md)
- **Want your LLM to answer Spanish weather questions?** → [`packages/aemet-mcp/README.md`](packages/aemet-mcp/README.md)
- **Spanish docs** → [`packages/aemet-client/README.es.md`](packages/aemet-client/README.es.md)
## Develop
Requires Node.js ≥ 20.18 and pnpm ≥ 10.
```bash
pnpm install
pnpm -r build
pnpm -r test
pnpm -r typecheck
pnpm lint
```
To work on a single package:
```bash
pnpm --filter aemet-client test
pnpm --filter aemet-mcp dev
```
The E2E suite (`pnpm --filter aemet-client test:e2e`) hits the real AEMET
API and is skipped unless `AEMET_API_KEY` is set. CI runs it behind a
repository secret.
## Release
- **`aemet-client`** is released by pushing a tag `v<x.y.z>` or
`aemet-client-v<x.y.z>`. The release workflow checks the tag matches
`packages/aemet-client/package.json` before publishing to npm via
Trusted Publishing (OIDC, no token).
- **`aemet-mcp`** is released by pushing a tag `aemet-mcp-v<x.y.z>`
using the same Trusted Publishing setup. `pnpm publish` rewrites the
`workspace:^` dependency on `aemet-client` to a real semver range.
See [`CONTRIBUTING.md`](CONTRIBUTING.md) for development guidelines.
## License
MIT © [Jorge Carrera](https://github.com/jocarrd)
TDQS
Scored across 8 tools
Each tool maps to a distinct AEMET data product, from observations and municipal forecasts to warnings, climate history, and air quality. The only potential overlap is among the specialized forecast tools (beach, mountain, maritime) and the general get_forecast, but the descriptions clearly specify when to use each.
All tools follow the same get_<noun> snake_case pattern, making the set highly predictable. There are no mixed conventions, vague verbs, or irregular casing.
Eight tools is well-scoped for a national weather service server. Each tool represents a meaningful, non-redundant dataset and the count is neither bloated nor too thin.
The server covers the major AEMET public-facing products: current observations, forecasts, warnings, climate history, specialized forecasts, and air quality. Minor gaps such as radar/satellite imagery or more granular station metadata exist, but agents can still answer a wide range of weather and climate questions.