{"serverId":"mcp-registry/io.github.guzz-labs/epwforge-mcp","tools":[{"name":"analyze_weather","fixed":{"name":"analyze_weather","description":"Compute design conditions, HDD/CDD, monthly stats, and peak heating/cooling days for one or more EPW files. Accepts a `url` (existing EPW), `urls` (compare 2+), or `config` (synthesize on the fly with morphing/UHI/events/smoke). Config mode runs the full generation pipeline server-side but returns only stats — never the EPW content. **Token-saver: pass `compact: true` to get a ~10-field headline response (~100 tokens) instead of the full ~800-token payload.** Use compact for sanity-checking, das","inputSchema":{"type":"object","properties":{"url":{"type":"string","description":"EPW URL to analyze (single file)"},"urls":{"type":"array","items":{"type":"string"},"maxItems":10,"minItems":2,"description":"Multiple EPW URLs for comparison (first = baseline). Max 10."},"units":{"enum":["imperial","metric"],"type":"string","description":"Output units (default: imperial). When 'metric', temperatures are °C, wind m/s, precip mm, distance km/m."},"config":{"type":"object","required":["lat","lon"],"properties":{"lat":{"type":"number","maximum":90,"minimum":-90,"description":"Latitude, decimal degrees"},"lon":{"type":"number","maximum":180,"minimum":-180,"description":"Longitude, decimal degrees"},"ssp":{"enum":["ssp126","ssp245","ssp370","ssp585"],"type":"string","description":"CMIP6 emission scenario. ssp370 is the recommended high-end for design; ssp585 (SSP5-8.5) is an opt-in extreme stress-test pathway (~4.4°C, low likelihood per IPCC AR6 / CMIP7) for worst-case analysis."},"uhi":{"enum":["none","suburban","urban","dense_urban"],"type":"string","description":"Urban Heat Island preset"},"year":{"enum":[2030,2035,2040,2045,2050,2060,2070,2080,2090,2100],"type":"integer","description":"Future horizon"},"basis":{"enum":["tmy","amy"],"type":"string","description":"Weather file basis (default: tmy)"},"smoke":{"type":"boolean","description":"Enable wildfire smoke overlay"},"events":{"type":"string","description":"Comma-separated events. Valid: heatwave, coldsnap, hothumid, coldwindy. Pairs auto-compound (heat+humid, cold+wind)."},"amy_year":{"type":"integer","description":"Year for AMY basis"},"intensity":{"type":"string","description":"Per-event \"type:1-7\" intensity (1-10 with stress_test=true). 5 = typical extreme, 7 = severe ~50-yr return."},"percentile":{"enum":[5,10,25,50,75,90,95],"type":"integer","description":"Warming percentile (default: 50)"},"tmy_period":{"enum":["full","2011-2025","2009-2023","2007-2021","2004-2018"],"type":"string","description":"TMYx vintage. Default 2011-2025."},"event_duration":{"type":"integer","maximum":30,"minimum":3,"description":"Event length in days (3-30, default 14). **For stress-test scenarios use 14-21 days** — shorter durations don't capture sustained operational impact (charging schedules, occupancy patterns, equipment cycling). 7 days is too short for any design or resilience analysis. Use 7-10 only for transient short-duration events."},"intensity_auto":{"type":"boolean","description":"Auto-fill unspecified intensities from IPCC AR6 (default: true)"},"smoke_duration":{"type":"integer","maximum":30,"minimum":3,"description":"Smoke days (3-30, default: 7)"},"smoke_intensity":{"type":"integer","maximum":10,"minimum":1,"description":"Smoke severity 1-10 → peak AOD 0.1-6.0"}},"description":"Synthesize an EPW server-side and analyze it. Stats only — file never returned. lat + lon required. Same morph/UHI/event params as generate_weather_file."},"compact":{"type":"boolean","description":"Return a ~10-field headline-only response (~100 tokens) instead of the full ~800-token payload. Drops monthly arrays, peak days, n_hours, weather_basis blob. Good for sanity checks, dashboards, batched chained calls. Set to false (default) when you need the full payload."},"include_idf":{"type":"boolean","description":"Add ready-to-paste EnergyPlus SizingPeriod:DesignDay IDF objects to the response. AEC-facing. Ignored when compact=true."},"include_full_ashrae":{"type":"boolean","description":"Add ASHRAE 0.4%/1%/2% cooling DB + 99.6%/99% heating DB design conditions to the response. Free. Ignored when compact=true."},"include_improbability":{"type":"boolean","description":"Add EPWForge's stress-test improbability score (config mode only). Indicates how extreme the synthesized scenario is vs historical baselines."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":1208,"tokensAfter":1208},{"name":"find_station","fixed":{"name":"find_station","description":"Search the GuzzStations catalog (17,000+ weather stations worldwide, self-hosted mirror of OneBuilding TMYx). Returns matching stations with EPW URLs ready to pass to analyze_weather or chart_weather. Optionally enriches with AMY extreme years (hottest / coldest / most-humid on record) and CMIP6 climate deltas. No auth required.","inputSchema":{"type":"object","properties":{"lat":{"type":"number","maximum":90,"minimum":-90,"description":"Latitude — when set, results sorted by proximity"},"lon":{"type":"number","maximum":180,"minimum":-180},"ssp":{"enum":["ssp126","ssp245","ssp370","ssp585"],"type":"string","description":"SSP scenario (only used with include_climate_deltas). ssp370 is the recommended high-end; ssp585 (SSP5-8.5) is an opt-in extreme stress-test pathway for worst-case analysis."},"year":{"enum":[2030,2035,2040,2045,2050,2060,2070,2080,2090,2100],"type":"integer","description":"Future horizon (only used with include_climate_deltas)"},"query":{"type":"string","description":"Search by city / state (case-insensitive partial match)"},"country":{"type":"string","description":"ISO 3-letter country code filter, e.g. 'USA', 'GBR'"},"percentile":{"enum":[5,10,25,50,75,90,95],"type":"integer","description":"Warming percentile (only used with include_climate_deltas, default 50)"},"max_results":{"type":"integer","maximum":50,"minimum":1,"description":"Max stations (default: 10)"},"site_elevation_m":{"type":"number","description":"Site elevation in metres. Strongly recommended when lat/lon are set: elevation difference predicts whether a station is representative about 3x better than distance does, and supplying it turns the recommendation from a distance guess into a measured call."},"include_amy_extremes":{"type":"boolean","description":"When true and lat+lon are set, also returns the hottest / coldest / most-humid years on record (per ERA5, 1950–present). Useful for picking AMY basis years."},"include_climate_deltas":{"type":"boolean","description":"When true with lat+lon+ssp+year, also returns the monthly CMIP6 delta-T per month and per variable. Lets agents reason about specific shifts before generating files."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":610,"tokensAfter":610},{"name":"preview_forge_bundle","fixed":{"name":"preview_forge_bundle","description":"Preview a fixed-price Forge bundle for a location — the no-account way to buy weather files. Returns the exact scenario breakdown, file count, price, and a purchase link the user opens for guest checkout. Bundles: Carbon (10 scenarios), Titanium (30), Damascus (64); each scenario delivered as EPW + DDY + STAT + PVsyst. Free, no auth, creates no order.","inputSchema":{"type":"object","required":["bundle_id"],"properties":{"lat":{"type":"number","description":"Site latitude (optional — for a location-specific summary)."},"lon":{"type":"number","description":"Site longitude."},"location":{"type":"string","description":"Optional human label for the site, e.g. 'Boston, MA'."},"bundle_id":{"enum":["carbon","titanium","damascus"],"type":"string","description":"Which bundle to preview."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":234,"tokensAfter":234}],"toolsChanged":3,"tokensSaved":0,"todo":[{"tool":"find_station","params":["lon"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}