epwforge-mcp
EPW/DDY weather files - TMY/AMY/CMIP6 morphing, UHI, events, smoke. 3 of 4 tools anon-free.
사용해야 할까요
품질 및 안전성
도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.
컨텍스트 비용
이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.
설치
원클릭 설치
`claude_desktop_config.json` 파일에 다음을 추가하세요:
{
"mcpServers": {
"epwforge-mcp": {
"command": "uvx",
"args": [
"epwforge-mcp"
]
}
}
}실행 가능한 패키지
0.3.1stdio원격 엔드포인트
https://epwforge.com/api/mcpstreamable-http할 수 있는 일
도구 목록
도구 (6)
🟢find_station(query, lat, lon, country, site_elevation_m, ...)
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.
입력 스키마
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Search by city / state (case-insensitive partial match)"
},
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude — when set, results sorted by proximity"
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180
},
"country": {
"type": "string",
"description": "ISO 3-letter country code filter, e.g. 'USA', 'GBR'"
},
"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."
},
"max_results": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"description": "Max stations (default: 10)"
},
"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."
},
"ssp": {
"type": "string",
"enum": [
"ssp126",
"ssp245",
"ssp370",
"ssp585"
],
"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": {
"type": "integer",
"enum": [
2030,
2035,
2040,
2045,
2050,
2060,
2070,
2080,
2090,
2100
],
"description": "Future horizon (only used with include_climate_deltas)"
},
"percentile": {
"type": "integer",
"enum": [
5,
10,
25,
50,
75,
90,
95
],
"description": "Warming percentile (only used with include_climate_deltas, default 50)"
}
}
}🟢analyze_weather(url, urls, config, compact, include_full_ashrae, ...)
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, dashboards, or when chaining many calls; full when you need monthly arrays / peak days / full ASHRAE. Optional `include_full_ashrae` adds ASHRAE 0.4/1/2% cooling + 99.6/99% heating design conditions with mean coincident dewpoint. Optional `include_improbability` (config mode) adds a stress-test score. Optional `include_idf` adds ready-to-paste EnergyPlus SizingPeriod:DesignDay objects. Optional `units` ('imperial' default | 'metric'). **Presentation: when calling with `urls` (multiple files), the response includes a `comparisons` array — render it as a markdown table to the user. Lead with the headline delta, not the raw data.** No auth required; no credits charged.
입력 스키마
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "EPW URL to analyze (single file)"
},
"urls": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 2,
"maxItems": 10,
"description": "Multiple EPW URLs for comparison (first = baseline). Max 10."
},
"config": {
"type": "object",
"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.",
"properties": {
"lat": {
"type": "number",
"description": "Latitude, decimal degrees",
"minimum": -90,
"maximum": 90
},
"lon": {
"type": "number",
"description": "Longitude, decimal degrees",
"minimum": -180,
"maximum": 180
},
"basis": {
"type": "string",
"enum": [
"tmy",
"amy"
],
"description": "Weather file basis (default: tmy)"
},
"amy_year": {
"type": "integer",
"description": "Year for AMY basis"
},
"ssp": {
"type": "string",
"enum": [
"ssp126",
"ssp245",
"ssp370",
"ssp585"
],
"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."
},
"year": {
"type": "integer",
"enum": [
2030,
2035,
2040,
2045,
2050,
2060,
2070,
2080,
2090,
2100
],
"description": "Future horizon"
},
"percentile": {
"type": "integer",
"enum": [
5,
10,
25,
50,
75,
90,
95
],
"description": "Warming percentile (default: 50)"
},
"uhi": {
"type": "string",
"enum": [
"none",
"suburban",
"urban",
"dense_urban"
],
"description": "Urban Heat Island preset"
},
"events": {
"type": "string",
"description": "Comma-separated events. Valid: heatwave, coldsnap, hothumid, coldwindy. Pairs auto-compound (heat+humid, cold+wind)."
},
"event_duration": {
"type": "integer",
"minimum": 3,
"maximum": 30,
"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": {
"type": "string",
"description": "Per-event \"type:1-7\" intensity (1-10 with stress_test=true). 5 = typical extreme, 7 = severe ~50-yr return."
},
"intensity_auto": {
"type": "boolean",
"description": "Auto-fill unspecified intensities from IPCC AR6 (default: true)"
},
"smoke": {
"type": "boolean",
"description": "Enable wildfire smoke overlay"
},
"smoke_intensity": {
"type": "integer",
"minimum": 1,
"maximum": 10,
"description": "Smoke severity 1-10 → peak AOD 0.1-6.0"
},
"smoke_duration": {
"type": "integer",
"minimum": 3,
"maximum": 30,
"description": "Smoke days (3-30, default: 7)"
},
"tmy_period": {
"type": "string",
"enum": [
"full",
"2011-2025",
"2009-2023",
"2007-2021",
"2004-2018"
],
"description": "TMYx vintage. Default 2011-2025."
}
},
"required": [
"lat",
"lon"
]
},
"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_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."
},
"include_idf": {
"type": "boolean",
"description": "Add ready-to-paste EnergyPlus SizingPeriod:DesignDay IDF objects to the response. AEC-facing. Ignored when compact=true."
},
"units": {
"type": "string",
"enum": [
"imperial",
"metric"
],
"description": "Output units (default: imperial). When 'metric', temperatures are °C, wind m/s, precip mm, distance km/m."
}
}
}🟡chart_weather(url, urls, config, chart_type, resolution, ...)
Render an SVG chart from EPW data. Eight chart types: `diurnal` (~10 KB, monthly hourly profile), `temp_carpet` (heatmap of hour × day-of-year — ~30 KB preview / ~150 KB full), `wind_rose` (~12 KB, polar bars by direction × speed), `monthly_boxplot` (~6 KB, Q1/median/Q3 + whiskers per month), `utci_carpet` (~90 KB, outdoor heat-stress hour × day, colored by UTCI category — Bröde 2012, shaded Tmrt), `economizer_carpet` (~90 KB, air-side economizer free / integrated / locked-out hour × day under ASHRAE 90.1 high-limit), `pv_tilt_azimuth` (~60 KB, annual PV generation across full tilt × azimuth space, isotropic-sky POA at lat from EPW header — optimum orientation marked), `solar_under_events` (~12 KB, weekly GHI of the modified scenario vs the no-overlay reference; bands color event-affected weeks. Requires `config` — server runs the pipeline twice, with and without overlays), `comparison` (~10 KB, design-condition deltas across EPWs). Accepts `url` (single), `urls` (2+ for comparison), or `config` (synthesize on the fly). Config mode is anon-safe — runs pipeline, returns SVG only. No auth required. **Token budget**: SVGs are returned inline by default. Large outputs (>50 KB) auto-upload to Blob storage (when configured) and return a URL instead, keeping your context lean. Always check `svg_size_kb` in the response. **Presentation: when handing the chart to the user, just link or embed it — don't narrate what's in it. Let the chart speak.**
입력 스키마
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "EPW URL (single-EPW charts: diurnal, temp_carpet, wind_rose, monthly_boxplot, utci_carpet, economizer_carpet, pv_tilt_azimuth)"
},
"urls": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 2,
"maxItems": 10,
"description": "EPW URLs for chart_type=comparison (first = baseline)"
},
"config": {
"type": "object",
"description": "Synthesize an EPW and chart it. Same params as generate_weather_file. SVG only — no file delivery.",
"properties": {
"lat": {
"type": "number",
"description": "Latitude, decimal degrees",
"minimum": -90,
"maximum": 90
},
"lon": {
"type": "number",
"description": "Longitude, decimal degrees",
"minimum": -180,
"maximum": 180
},
"basis": {
"type": "string",
"enum": [
"tmy",
"amy"
],
"description": "Weather file basis (default: tmy)"
},
"amy_year": {
"type": "integer",
"description": "Year for AMY basis"
},
"ssp": {
"type": "string",
"enum": [
"ssp126",
"ssp245",
"ssp370",
"ssp585"
],
"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."
},
"year": {
"type": "integer",
"enum": [
2030,
2035,
2040,
2045,
2050,
2060,
2070,
2080,
2090,
2100
],
"description": "Future horizon"
},
"percentile": {
"type": "integer",
"enum": [
5,
10,
25,
50,
75,
90,
95
],
"description": "Warming percentile (default: 50)"
},
"uhi": {
"type": "string",
"enum": [
"none",
"suburban",
"urban",
"dense_urban"
],
"description": "Urban Heat Island preset"
},
"events": {
"type": "string",
"description": "Comma-separated events. Valid: heatwave, coldsnap, hothumid, coldwindy. Pairs auto-compound (heat+humid, cold+wind)."
},
"event_duration": {
"type": "integer",
"minimum": 3,
"maximum": 30,
"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": {
"type": "string",
"description": "Per-event \"type:1-7\" intensity (1-10 with stress_test=true). 5 = typical extreme, 7 = severe ~50-yr return."
},
"intensity_auto": {
"type": "boolean",
"description": "Auto-fill unspecified intensities from IPCC AR6 (default: true)"
},
"smoke": {
"type": "boolean",
"description": "Enable wildfire smoke overlay"
},
"smoke_intensity": {
"type": "integer",
"minimum": 1,
"maximum": 10,
"description": "Smoke severity 1-10 → peak AOD 0.1-6.0"
},
"smoke_duration": {
"type": "integer",
"minimum": 3,
"maximum": 30,
"description": "Smoke days (3-30, default: 7)"
},
"tmy_period": {
"type": "string",
"enum": [
"full",
"2011-2025",
"2009-2023",
"2007-2021",
"2004-2018"
],
"description": "TMYx vintage. Default 2011-2025."
}
},
"required": [
"lat",
"lon"
]
},
"chart_type": {
"type": "string",
"enum": [
"diurnal",
"temp_carpet",
"wind_rose",
"monthly_boxplot",
"utci_carpet",
"economizer_carpet",
"pv_tilt_azimuth",
"solar_under_events",
"comparison"
],
"description": "Default: diurnal"
},
"resolution": {
"type": "string",
"enum": [
"preview",
"full"
],
"description": "temp_carpet only. 'preview' (default) ~30 KB with 32 color buckets — visually identical at typical render sizes. 'full' ~150 KB with per-cell rgb() — use only when saving to file or when you specifically need exact color fidelity."
},
"econ_mode": {
"type": "string",
"enum": [
"drybulb",
"enthalpy"
],
"description": "economizer_carpet only. 'drybulb' (default) limits OA by Tdb; 'enthalpy' limits by moist-air enthalpy — more honest in humid climates (captures latent load)."
},
"econ_high_limit_f": {
"type": "number",
"description": "economizer_carpet only. ASHRAE 90.1 high-limit shutoff. Defaults: 75°F (drybulb mode) or 28 BTU/lb (enthalpy mode)."
},
"econ_supply_air_f": {
"type": "number",
"description": "economizer_carpet only. Supply-air temperature setpoint (°F). Default 55."
},
"pv_tilt": {
"type": "number",
"description": "pv_tilt_azimuth only. Optional — marks the user's planned tilt (deg, 0=horizontal) on the heatmap alongside the optimum."
},
"pv_azimuth": {
"type": "number",
"description": "pv_tilt_azimuth only. Optional — marks the user's planned compass azimuth (deg, 0=N, 180=S) on the heatmap."
}
}
}🟢explore_design_conditions(lat, lon, ssp, year, percentile, ...)
Interactive single-site design-conditions explorer. Returns full ASHRAE design conditions + diurnal chart for the requested scenario. In MCP Apps-capable hosts (Claude Desktop, ChatGPT, VS Code, Goose), the response renders as a widget with sliders for SSP / year / percentile / UHI — dragging a slider re-calls this tool live. Use when a user wants to interactively tune a single site. For multi-site comparison, use analyze_weather(urls=[...]) instead. Defaults to present-day TMY (no morph) — pass ssp+year for future scenarios. P75 default percentile is design-realistic; P50 underestimates the tail. No auth required.
입력 스키마
{
"type": "object",
"properties": {
"lat": {
"type": "number",
"minimum": -90,
"maximum": 90,
"description": "Latitude, decimal degrees"
},
"lon": {
"type": "number",
"minimum": -180,
"maximum": 180,
"description": "Longitude, decimal degrees"
},
"ssp": {
"type": "string",
"enum": [
"ssp126",
"ssp245",
"ssp370",
"ssp585"
],
"description": "CMIP6 emission scenario. Omit for present-day TMY. ssp370 is the recommended high-end; ssp585 (SSP5-8.5) is an opt-in extreme stress-test pathway for worst-case analysis."
},
"year": {
"type": "integer",
"enum": [
2030,
2035,
2040,
2045,
2050,
2060,
2070,
2080,
2090,
2100
],
"description": "Future horizon. Pair with ssp."
},
"percentile": {
"type": "integer",
"minimum": 5,
"maximum": 95,
"description": "Warming percentile. P75 design-realistic; P50 median."
},
"uhi": {
"type": "string",
"enum": [
"none",
"suburban",
"urban",
"dense_urban"
],
"description": "Urban Heat Island preset"
},
"allow_custom_location": {
"type": "boolean",
"description": "Required when no OneBuilding station within 50 km"
}
},
"required": [
"lat",
"lon"
]
}🟢generate_weather_file(lat, lon, basis, amy_year, ssp, ...)
Generate and deliver an EPW or DDY file. A paid tool — charges credits per call: 1 for a single file, 1 per scenario for a scenarios batch (max 10), 10 for a per-model CMIP6 ensemble. Requires auth (Bearer API key or OAuth). Credits come from a Forge pass ($9.99/wk = 2 non-expiring credits, or $99/yr) or a top-up pack; see the epwforge://catalog/pricing resource. No account? Buy a fixed-price guest bundle — see preview_forge_bundle. For free analysis without credits, use analyze_weather or chart_weather on a real published EPW URL.
입력 스키마
{
"type": "object",
"properties": {
"lat": {
"type": "number",
"description": "Latitude, decimal degrees",
"minimum": -90,
"maximum": 90
},
"lon": {
"type": "number",
"description": "Longitude, decimal degrees",
"minimum": -180,
"maximum": 180
},
"basis": {
"type": "string",
"enum": [
"tmy",
"amy"
],
"description": "Weather file basis (default: tmy)"
},
"amy_year": {
"type": "integer",
"description": "Year for AMY basis"
},
"ssp": {
"type": "string",
"enum": [
"ssp126",
"ssp245",
"ssp370",
"ssp585"
],
"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."
},
"year": {
"type": "integer",
"enum": [
2030,
2035,
2040,
2045,
2050,
2060,
2070,
2080,
2090,
2100
],
"description": "Future horizon"
},
"percentile": {
"type": "integer",
"enum": [
5,
10,
25,
50,
75,
90,
95
],
"description": "Warming percentile (default: 50)"
},
"uhi": {
"type": "string",
"enum": [
"none",
"suburban",
"urban",
"dense_urban"
],
"description": "Urban Heat Island preset"
},
"events": {
"type": "string",
"description": "Comma-separated events. Valid: heatwave, coldsnap, hothumid, coldwindy. Pairs auto-compound (heat+humid, cold+wind)."
},
"event_duration": {
"type": "integer",
"minimum": 3,
"maximum": 30,
"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": {
"type": "string",
"description": "Per-event \"type:1-7\" intensity (1-10 with stress_test=true). 5 = typical extreme, 7 = severe ~50-yr return."
},
"intensity_auto": {
"type": "boolean",
"description": "Auto-fill unspecified intensities from IPCC AR6 (default: true)"
},
"smoke": {
"type": "boolean",
"description": "Enable wildfire smoke overlay"
},
"smoke_intensity": {
"type": "integer",
"minimum": 1,
"maximum": 10,
"description": "Smoke severity 1-10 → peak AOD 0.1-6.0"
},
"smoke_duration": {
"type": "integer",
"minimum": 3,
"maximum": 30,
"description": "Smoke days (3-30, default: 7)"
},
"tmy_period": {
"type": "string",
"enum": [
"full",
"2011-2025",
"2009-2023",
"2007-2021",
"2004-2018"
],
"description": "TMYx vintage. Default 2011-2025."
},
"format": {
"type": "string",
"enum": [
"epw",
"ddy"
],
"description": "Output format (default: epw)"
},
"ensemble": {
"type": "boolean",
"description": "Generate a per-model CMIP6 ensemble (~20 EPWs, one per climate model). Costs 10 credits. Requires ssp + year."
},
"scenarios": {
"type": "array",
"maxItems": 10,
"description": "Batch mode — array of configs, each generated in parallel. Same shape as the top-level config. When set, top-level config params are ignored. Costs 1 credit per scenario (up to 10).",
"items": {
"type": "object",
"properties": {
"lat": {
"type": "number",
"description": "Latitude, decimal degrees",
"minimum": -90,
"maximum": 90
},
"lon": {
"type": "number",
"description": "Longitude, decimal degrees",
"minimum": -180,
"maximum": 180
},
"basis": {
"type": "string",
"enum": [
"tmy",
"amy"
],
"description": "Weather file basis (default: tmy)"
},
"amy_year": {
"type": "integer",
"description": "Year for AMY basis"
},
"ssp": {
"type": "string",
"enum": [
"ssp126",
"ssp245",
"ssp370",
"ssp585"
],
"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."
},
"year": {
"type": "integer",
"enum": [
2030,
2035,
2040,
2045,
2050,
2060,
2070,
2080,
2090,
2100
],
"description": "Future horizon"
},
"percentile": {
"type": "integer",
"enum": [
5,
10,
25,
50,
75,
90,
95
],
"description": "Warming percentile (default: 50)"
},
"uhi": {
"type": "string",
"enum": [
"none",
"suburban",
"urban",
"dense_urban"
],
"description": "Urban Heat Island preset"
},
"events": {
"type": "string",
"description": "Comma-separated events. Valid: heatwave, coldsnap, hothumid, coldwindy. Pairs auto-compound (heat+humid, cold+wind)."
},
"event_duration": {
"type": "integer",
"minimum": 3,
"maximum": 30,
"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": {
"type": "string",
"description": "Per-event \"type:1-7\" intensity (1-10 with stress_test=true). 5 = typical extreme, 7 = severe ~50-yr return."
},
"intensity_auto": {
"type": "boolean",
"description": "Auto-fill unspecified intensities from IPCC AR6 (default: true)"
},
"smoke": {
"type": "boolean",
"description": "Enable wildfire smoke overlay"
},
"smoke_intensity": {
"type": "integer",
"minimum": 1,
"maximum": 10,
"description": "Smoke severity 1-10 → peak AOD 0.1-6.0"
},
"smoke_duration": {
"type": "integer",
"minimum": 3,
"maximum": 30,
"description": "Smoke days (3-30, default: 7)"
},
"tmy_period": {
"type": "string",
"enum": [
"full",
"2011-2025",
"2009-2023",
"2007-2021",
"2004-2018"
],
"description": "TMYx vintage. Default 2011-2025."
},
"label": {
"type": "string"
}
},
"required": [
"lat",
"lon"
]
}
},
"stress_test": {
"type": "boolean",
"description": "Unlock intensity 8-10. Default false."
},
"include_ddy": {
"type": "boolean",
"description": "When format=epw, also include the matching DDY in the response (single-file only)."
}
},
"required": [
"lat",
"lon"
]
}⚪preview_forge_bundle(bundle_id, lat, lon, location)
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.
입력 스키마
{
"type": "object",
"properties": {
"bundle_id": {
"type": "string",
"enum": [
"carbon",
"titanium",
"damascus"
],
"description": "Which bundle to preview."
},
"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'."
}
},
"required": [
"bundle_id"
]
}커뮤니티
증거