guru
Windguru CLI + MCP + Python library. Same idea as fli: reverse-engineered JSON, zero HTML scraping, agent-first.
Free only — named spots + WINDGURU DEFAULT Tune top-3. No PRO lat/lon click-forecast.
Install
# CLI (recommended)
pipx install windguru
# CLI + MCP server
pipx install 'windguru[mcp]'
guru --help
guru instruct --json
Until the PyPI release is live, install from GitHub:
pipx install 'windguru @ git+https://github.com/berendgort/guru.git'
pipx install 'windguru[mcp] @ git+https://github.com/berendgort/guru.git'
PyPI name windguru, command guru, MCP guru-mcp.
Or with pip:
pip install windguru
pip install 'windguru[mcp]'
MCP Server
pipx install 'windguru[mcp]'
# STDIO (Cursor / Claude Desktop)
guru-mcp
# HTTP (streamable)
guru-mcp-http # http://127.0.0.1:8000/mcp/
Connecting to Claude Desktop / Cursor
{
"mcpServers": {
"guru": {
"command": "guru-mcp"
}
}
}
Tip: if the binary is not on PATH, use the full path from
which guru-mcp(often~/.local/bin/guru-mcp).
MCP tools
| Tool | Description |
|---|---|
instruct |
Agent recipe (WINDGURU_DEFAULT → top 3) |
search_spots |
Named spot search |
near_spots |
Free map markers near lat/lon |
resolve_spot |
Name/id → spot (ambiguous + candidates) |
best_forecast |
Tune weights → top models → forecasts |
get_forecast |
Single-model escape hatch |
list_models |
Known aliases |
Agent recipe
guru instruct --json
guru spots "castelldefels" --json
guru best 201 --json
guru near --lat 51.9 --lon 4.1 --json
guru best 48309 -H 24 --json # De Slufter
guru best always uses WINDGURU_DEFAULT Tune weights and returns the top 3 models + forecasts. Prefer that over raw GFS.
JSON envelope: {"ok": true|false, "api_version": 1, "data"|error fields}. Shared error_type / retryable with MCP.
CLI
| Command | Role |
|---|---|
guru instruct |
Teach agents the workflow |
guru spots <q> |
Name search |
guru near --lat --lon |
Free map markers near a point |
guru best <spot> |
WINDGURU_DEFAULT → top 3 → forecasts |
guru forecast <spot> -m gfs |
Single model |
guru models / schema / doctor |
Discoverability |
Ambiguous names fail with error_type: ambiguous + candidates (pass numeric id or --pick).
Library
from guru import search_spots, get_best_forecast, spots_near
spots = search_spots("castelldefels")
best = get_best_forecast(201, top=3, hours=24)
print(best.models[0].name, best.models[0].weight_pct)
print(best.forecasts[0].hours[0].wind_kn)
Architecture
| Layer | Path | Role |
|---|---|---|
| Core | guru/core/ |
Shared envelope, errors, instruct recipe |
| CLI | guru/cli/ |
Typer + Rich + --json (thin over core) |
| MCP | guru/mcp/ |
FastMCP over core (no CLI imports) |
| Search | guru/search/ |
HTTP (curl_cffi), blend_math, near, forecast |
| Models | guru/models/ |
Pydantic + aliases only |
| Wire | docs/WIRE.md |
Captured iapi.php |
| MCP | docs/mcp.md |
guru-mcp setup + tools |
Read AGENTS.md before extending. Capture Network → fixtures → tests.
Engineering standards (kept in-repo):
docs/code_quality.md— Korotkevich / Tourist bar (layers, size caps, pure core)docs/data_engineering_standards.md— Gray / Stonebraker bar (one writer, clocks, contracts)
Disclaimer
Unofficial. Not affiliated with Windguru. Personal / research use; respect ToS and rate limits.
License
MIT
Metadata
Release files for windguru 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| windguru-0.2.0.tar.gz | 57.4 kB | Without provenance | Details for windguru-0.2.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| windguru-0.2.0-py3-none-any.whl | Python 3 | none | any | Details for windguru-0.2.0-py3-none-any.whl |
Total release size: 82.1 kB
Release files / windguru-0.2.0.tar.gz
| Download URL | windguru-0.2.0.tar.gz |
|---|---|
| Size | 57.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d72ff7b5e777524c2a55d68c1a76f5b38622c6d74529b37f317eac11bb2032cf
|
|
BLAKE2b-256 checksum How to use checksums |
b29ceeb1b5b9ecbeebe4390190815ab9627b1ca2ffbec17868bf86f6638fbd5b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / windguru-0.2.0-py3-none-any.whl
| Download URL | windguru-0.2.0-py3-none-any.whl |
|---|---|
| Size | 24.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ddd3ad341fae7b1b3768582c6df04c62a0858c5f55a24fe8c38b022d510e14c5
|
|
BLAKE2b-256 checksum How to use checksums |
48f9f656409798b04b569fc3bf706d8c8c311a0d353d667dfb1902f7b5c64534
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Security for windguru 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.