Skip to main content

MCP server for EPWForge — let Claude and other AI agents generate climate-stressed weather files (EPW, DDY) for any global location. Custom TMYx / AMY synthesis from ERA5, CMIP6 future-climate morphing (SSPs, 7 percentiles, 21-model ensemble), urban heat island presets, extreme-event injection (heat waves, cold snaps, humidity & wind compound events with per-event intensity), and wildfire smoke overlays. For EnergyPlus, OpenStudio, IES VE, eQUEST and any EPW-consuming workflow.

Project description

epwforge-mcp

MCP server for EPWForge — give Claude, Cursor, and other AI agents the ability to search, analyze, chart, and generate weather files for building energy simulation.

v0.2.0 — 4-tool consolidation. Three of the four tools (find_station, analyze_weather, chart_weather) work without an API key, so anyone can explore EPWForge from Claude without signing up. Only generate_weather_file (which delivers actual EPW/DDY files) requires authentication and charges credits.

What is EPWForge?

EPWForge generates and morphs weather files (.epw, .ddy) for building energy simulation tools — EnergyPlus, OpenStudio, IES VE, eQUEST, and any workflow that consumes EPW. The platform supports:

  • TMYx generation anywhere — typical meteorological years synthesized from ERA5 reanalysis for any global lat/lon
  • AMY (Actual Meteorological Year) — historical hourly weather for hindcasting and calibration
  • CMIP6 climate morphing — apply future-scenario deltas (SSP1-2.6, SSP2-4.5, SSP3-7.0) at 7 warming percentiles. SSP5-8.5 was deprecated per CMIP7 (deemed implausible) — use SSP3-7.0 as the high-end scenario.
  • Urban Heat Island adjustment — Stewart & Oke LCZ presets (suburban / urban / dense_urban)
  • Extreme event injection — heat waves, cold snaps, humidity events, wind events, with auto-compound blending and per-event intensity (1-10 slider, AR6-auto-fill under SSP)
  • Wildfire smoke overlays — CAMS-derived AOD with Beer-Lambert solar attenuation
  • Per-model CMIP6 ensembles — ~20 morphed EPWs (one per model) for inter-model uncertainty

Tools

Tool Auth Cost What it does
find_station None Free Search the GuzzStations catalog (17k+ weather stations). Returns matches with epw_url ready to pass to analyze_weather / chart_weather.
analyze_weather None Free Design conditions, HDD/CDD, monthly stats, peak days. Accepts a url (existing EPW), urls (compare 2+), or config (synthesize on the fly with morphing/UHI/events/smoke — stats only, file never delivered).
chart_weather None Free SVG chart from EPW URL(s) or a synthesized config. chart_type="diurnal" (monthly hourly profile) or chart_type="comparison" (design-condition deltas).
generate_weather_file API key 1–10 credits Generates and delivers EPW or DDY. Single file (1 credit), scenarios batch up to 10 (1 credit each), or per-model CMIP6 ensemble (10 credits).

The 3 read tools route purely through public endpoints when given a URL — pure local fetch + parse. When given a config they route through the hosted EPWForge MCP at https://epwforge.com/api/mcp so the morph/UHI/event/smoke pipeline runs on EPWForge infrastructure (the synthesized EPW never reaches the caller).

Quick examples

No-auth: explore Boston's future climate

# 1. find a nearby station
stations = await find_station(query="Boston", max_results=3)
epw_url = stations["stations"][0]["files"][0]["epw_url"]

# 2. analyze that EPW (purely local — fetches and parses)
stats = await analyze_weather(url=epw_url)
# → cooling 89.1 F, heating 16.0 F, HDD/CDD 5265/914 ...

# 3. preview what a 2050 SSP3-7.0 + urban-UHI scenario looks like
# (routes through hosted MCP — runs the pipeline, returns stats only)
# SSP3-7.0 is the high-end scenario; SSP5-8.5 was deprecated per CMIP7.
future = await analyze_weather(config={
    "lat": 42.36, "lon": -71.06,
    "ssp": "ssp370", "year": 2050, "uhi": "urban",
})
# → cooling 91.4 F (+2.3), heating 23.8 F (+7.8) ...

# 4. chart it
svg = await chart_weather(config={
    "lat": 42.36, "lon": -71.06, "ssp": "ssp370", "year": 2050,
}, chart_type="diurnal")

With auth: deliver an EPW

# Requires EPWFORGE_API_KEY in env
await generate_weather_file(
    lat=40.71, lon=-74.01,
    ssp="ssp370", year=2090, percentile=90,
    uhi="urban",
    events="heatwave,hothumid",
    event_duration=14,
    smoke=True, smoke_intensity=5,
    save_to="/tmp/nyc_2090_worst_case.epw",
)
# → {saved_to, bytes_written, weather_basis, ...}

Install

pip install epwforge-mcp

Or use uvx (no install needed):

uvx epwforge-mcp

Requires Python ≥ 3.10.

Connecting to Claude / Cursor

Read-only (no signup)

{
  "mcpServers": {
    "epwforge": {
      "command": "epwforge-mcp"
    }
  }
}

That's it — find_station, analyze_weather, and chart_weather all work immediately. generate_weather_file will return a clear "API key required" message if invoked.

With API key (unlocks generate_weather_file)

{
  "mcpServers": {
    "epwforge": {
      "command": "epwforge-mcp",
      "env": {
        "EPWFORGE_API_KEY": "sk_live_..."
      }
    }
  }
}

Free signup at epwforge.com/account gets you an API key and 5 welcome credits.

One-command setup

# With API key
epwforge-mcp install --api-key sk_live_...

# Read-only (no key)
epwforge-mcp install --no-api-key

Auto-detects Claude Desktop / Claude Code / Cursor configs.

Pricing & credit costs

Generation is the only paid surface:

Action Credits
Unmodified TMY download via generate_weather_file 0 (free)
Single EPW / DDY / SSP / UHI / event-modified file 1
4-file scenarios batch 2 (50% bundle discount)
Per-model CMIP6 ensemble (~20 EPWs) 10
find_station, analyze_weather, chart_weather 0 (always free)

Plans: Free ($0, 5 lifetime credits) · Starter ($49/mo, 10) · Pro ($149/mo, 50) · Pro+ ($249/mo, 100). Full pricing at epwforge.com/pricing.

Breaking changes from 0.1.x

v0.2.0 is a tool-name rewrite. The old tool surface is gone — agents calling generate_design_day, generate_ensemble, generate_batch, get_station_epw, analyze_epw, compare_scenarios, chart_diurnal_profile, or chart_compare_scenarios will get "tool not found" errors.

Migration map:

Old tool New equivalent
generate_weather_file generate_weather_file (same name, same params)
generate_design_day generate_weather_file(format="ddy")
generate_ensemble generate_weather_file(ssp=, year=, ensemble=True)
generate_batch generate_weather_file(scenarios=[{...}, {...}])
get_station_epw(url) analyze_weather(url=url) for stats; chart_weather(url=url) for charts; or fetch the URL directly — find_station returns public epw_url fields anyone can httpx.get().
analyze_epw(url) analyze_weather(url=url)
compare_scenarios([cfg1, cfg2]) analyze_weather(urls=[url1, url2]) — or chart_weather(urls=[url1, url2], chart_type="comparison")
chart_diurnal_profile(url) chart_weather(url=url, chart_type="diurnal")
chart_compare_scenarios(...) chart_weather(urls=[...], chart_type="comparison")

Environment variables

Variable Purpose Default
EPWFORGE_API_KEY Bearer token (only needed for generate_weather_file) unset
EPWFORGE_BASE_URL Override the API host (mainly for testing) https://epwforge.com

Behavior notes

  • File output: generate_weather_file accepts save_to (single mode) or save_to_dir (ensemble / batch). When set, files write to disk and only paths/byte counts come back — keeps agent context lean. Without it, files return base64-encoded inline.
  • Compound events: events="heatwave,hothumid" automatically blends humidity onto the heatwave. events="coldsnap,coldwindy" does the same for wind onto cold. Folded into the primary stitch — not stitched separately.
  • Event placement: events anchor at the cell's hottest day (heat-family) or coldest day (cold-family) and are centered for the requested duration. The peak day's diurnal cycle is sustained across the event.
  • AR6 SSP auto-fill: with an SSP scenario active, unspecified event intensities auto-fill from IPCC AR6 ensemble factors. Cold events stay at intensity 5 (no future amplification — recent obs don't support cold-side dampening). Pass intensity_auto=False to disable.
  • Anon morphing safety: when analyze_weather or chart_weather is called with a config, the request routes to the hosted MCP at epwforge.com/api/mcp. The pipeline runs on EPWForge infra; the synthesized EPW never reaches the local client. Returns stats / SVG only.

Development

git clone https://github.com/guzz-labs/epwforge-mcp
cd epwforge-mcp/python
uv sync
uv run epwforge-mcp

To test against a local API:

EPWFORGE_BASE_URL=http://localhost:3000 \
EPWFORGE_API_KEY=sk_live_... \
uv run epwforge-mcp

Links

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

epwforge_mcp-0.6.1.tar.gz (48.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

epwforge_mcp-0.6.1-py3-none-any.whl (55.1 kB view details)

Uploaded Python 3

File details

Details for the file epwforge_mcp-0.6.1.tar.gz.

File metadata

  • Download URL: epwforge_mcp-0.6.1.tar.gz
  • Upload date:
  • Size: 48.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for epwforge_mcp-0.6.1.tar.gz
Algorithm Hash digest
SHA256 adbba929fda17a9b8b3af69d49be7d81371a0d97597880476fda532e76c4e7e2
MD5 20ee8e3a8ca7b0105e34b54a5ab2bd64
BLAKE2b-256 2398cf795912048f1783d8f383580df44ba9af797f0687b05b75f1b3d4a6af4e

See more details on using hashes here.

File details

Details for the file epwforge_mcp-0.6.1-py3-none-any.whl.

File metadata

  • Download URL: epwforge_mcp-0.6.1-py3-none-any.whl
  • Upload date:
  • Size: 55.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for epwforge_mcp-0.6.1-py3-none-any.whl
Algorithm Hash digest
SHA256 adaee4cfdaaeaee7711f27baa0308aebee1bc3a7b136591d8e8da5d7e5014316
MD5 998a8da65564def03b17cc86300e6d58
BLAKE2b-256 9317999ee07f243b0fb86e90e83e41bb00a0905d267e0c4ff15c01f5fa547d86

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page