{"name":"io.github.smarterweather/weather","slug":"smarterweather-weather","title":"Smarter Weather","description":"Smarter Weather MCP: forecasts, alerts, outlooks, observations, AQI, grids, and map imagery.","url":"https://mcp.market/server/smarterweather-weather","rating":null,"grade":"A","score":85,"certified":false,"status":"active","category":"maps","tags":["maps"],"presence":{"score":35,"stars":1,"forks":0,"downloads_week":82,"last_push_at":"2026-10-30T22:22:29.000Z","license":"MIT"},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-05T13:00:25.246Z","last_ok_at":"2026-11-05T13:00:25.246Z","latency_ms":134},"claimed":false,"transport":"mixed","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/smarterweather/developer","website":"https://smarterweather.com/developers","version":"0.1.1","remotes":[{"type":"streamable-http","url":"https://mcp.smarterweather.com"}],"packages":[{"registryType":"npm","identifier":"@smarterweather/mcp-weather","version":"0.1.1","transport":{"type":"stdio"},"environmentVariables":[{"description":"Smarter Weather API key (sw_live_* or sw_test_*) with the 'mcp' scope. When set (and not an unexpanded ${…} placeholder), the bridge forwards Authorization via SMARTERWEATHER_AUTH_HEADER in the child env — never on argv. When unset, falls through to SMARTERWEATHER_ENV_FILE then cwd/.env; with no key, discovery tools stay free and other tool calls return x402 payment requirements. Mint with `npx -y @smarterweather/mcp-onboarding@latest login` or trial.","format":"string","isSecret":true,"name":"SMARTERWEATHER_API_KEY"},{"description":"Override the target MCP endpoint. Useful for development or staging against a non-production sw-mcp deployment. Precedence: positional argument > SMARTERWEATHER_MCP_URL > package default (https://mcp.smarterweather.com).","format":"string","default":"https://mcp.smarterweather.com","name":"SMARTERWEATHER_MCP_URL"}]}],"tools":[{"name":"call_tool","description":"Runs a tool find_tools lists, by name: same price, limits and result as calling it directly. Tools already in your list are called directly, not through this. `arguments` follows that tool's input schema.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"tool":{"type":"string","minLength":1,"maxLength":64,"description":"Tool name, from find_tools."},"arguments":{"description":"That tool's arguments.","type":"object","properties":{},"additionalProperties":{}}},"required":["tool"],"additionalProperties":false}},{"name":"describe_data","description":"A dataset's variables or properties (standard names, units, categories, bands, aggregates), horizon, step, cadence, freshness, cost class, verified `examples` and an example_query to read its values. Free; call it after search_data, before get_data. Example: {\"dataset_id\": \"<from search_data>\"}.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"dataset_id":{"type":"string","description":"A dataset id from search_data or get_data (1-80 characters)."}},"required":["dataset_id"],"additionalProperties":false}},{"name":"find_places","description":"Find places: a name, ZIP, venue or address to ranked candidates with lat/lon, or coordinates to the place and timezone. Pass `query` (fuzzy=true for partial input) or `lat`+`lon`; rows carry `type` place|zip|address|poi, `matched_via: \"autosuggest\"` marks fallback rows and `partial` a timed-out section. Weather tools take `location`; use this to disambiguate or name a point. Example: {\"lat\": 39.74, \"lon\": -104.99} -> Denver, Colorado, America/Denver.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"description":"Place name, ZIP or venue/address (1-200 characters); not with lat/lon.","type":"string"},"lat":{"description":"Latitude (-90 to 90), with lon; not with query.","type":"number"},"lon":{"description":"Longitude (-180 to 180), with lat.","type":"number"},"fuzzy":{"description":"Query only: autosuggest for partial or misspelled input. Default false.","type":"boolean"},"limit":{"description":"Query only: how many candidates (1-10). Default 5.","type":"integer"},"near_lat":{"description":"Query only: rank near this point (-90 to 90); with near_lon.","type":"number"},"near_lon":{"description":"Longitude of near_lat (-180 to 180).","type":"number"},"include":{"description":"boundaries: each row's state, county and zone ids for get_data's area.","type":"array","items":{"type":"string","enum":["boundaries"]}}},"additionalProperties":false}},{"name":"find_tools","description":"Lists the weather tools this connection does not show (best times, routes, air quality; station observations, soundings, hurricane recon; lightning, storm cells, storm reports; outlooks, forecaster text, hurricanes; climate records and normals; forecast accuracy; maps and charts; crop heat units), with when to use each and its required arguments. Run one with call_tool, in this session, no reconnect. With `tools`, returns their full input schemas. Free; no network call.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tools":{"description":"Tool names: return their full input schemas instead of the list.","minItems":1,"maxItems":5,"type":"array","items":{"type":"string","maxLength":64}}}}},{"name":"get_alerts","description":"NWS watches, warnings, advisories. Point (city/ZIP/lat+lon): containing polygons. BBox or US state/DC/CONUS (codes, full names, US/national): intersecting polygons. A city miss is not a statewide all-clear — query the state or a bbox; never say regional inventory is impossible. NY/WA and \"New York State\"/\"Washington State\" are states; \"New York\"/\"Washington\" stay cities. Omit at for now; at (ISO-8601 UTC) is the snapshot then. Empty = all-clear or purged (~24h). alert_id = detail+geometry, ignores at. Ex: {\"location\":\"WI\",\"events\":[\"Tornado Warning\"]}.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"location":{"type":"string","minLength":1,"maxLength":200,"description":"Free-text place: \"City, ST\" (e.g. \"Portland, OR\"), US ZIP, venue/address where enabled, or \"lat,lon\". Use this OR lat+lon, not both."},"lat":{"type":"number","description":"Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon."},"lon":{"type":"number","description":"Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."},"bbox":{"description":"Bounding box {west,south,east,north}; west/east are negative in the US. Skips geocoding; intersecting polygons.","type":"object","properties":{"west":{"type":"number","minimum":-180,"maximum":180},"south":{"type":"number","minimum":-90,"maximum":90},"east":{"type":"number","minimum":-180,"maximum":180},"north":{"type":"number","minimum":-90,"maximum":90}},"required":["west","south","east","north"]},"events":{"description":"Optional event-name filter, e.g. [\"Tornado Warning\"].","type":"array","items":{"type":"string"}},"alert_id":{"description":"Alert identifier for detail mode. When set, location is ignored.","type":"string"},"at":{"description":"ISO-8601 UTC past instant for the in-effect snapshot. Ignored with alert_id.","type":"string"}}}},{"name":"get_current_conditions","description":"Current weather right now at a location from two independent sources in one call: the RTMA gridded analysis (exact-point values, updated sub-hourly) and the nearest METAR station observation (ground truth with raw METAR, flight category). Use the analysis for point-accurate values and the station for verification. Analysis fields: temperature_2m, dew_point_2m, relative_humidity_2m (derived here from temperature and dew point; listed in analysis.derived), wind_speed_10m, wind_direction_10m, wind_gusts_10m, surface_pressure (station pressure at ground level, not sea-level pressure), visibility, cloud_cover, cloud_ceiling, in units (labels in analysis.unit_labels). nearest_station is the station's own report, unconverted. For a forecast, use get_forecast. Example: {\"location\": \"Pella, IA\"}.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"location":{"type":"string","minLength":1,"maxLength":200,"description":"Free-text place: \"City, ST\" (e.g. \"Portland, OR\"), US ZIP, venue/address where enabled, or \"lat,lon\". Use this OR lat+lon, not both."},"lat":{"type":"number","description":"Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon."},"lon":{"type":"number","description":"Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."},"units":{"default":"imperial","description":"imperial (default; °F, mph, inHg, mi, ft) or metric (°C, km/h, hPa, km, m); si returns K, m/s, Pa, m. si is deprecated and will be removed; use metric. Not applied to nearest_station.","type":"string","enum":["imperial","metric","si"]}}}},{"name":"get_data","description":"Values, totals, comparisons, people and POI counts from any catalog dataset (models, radar, alerts, outlooks, reference layers) at a place or several, over a bbox or area, or as items. `select` takes `product:variable` or `product:property` tokens, a standard name or a concept such as `population`; send one space word (an `area` reference is `{product, feature_id}`) and at most one time word (hours, start+end or at; run pins a cycle); `stats` reduces per `step` or over the area; omit units for SI. Example: {\"select\": [\"nbm_conus:temperature_2m\"], \"location\": \"Denver, CO\", \"hours\": 24}.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"select":{"description":"What to read: `product:variable`, `product:*`, `product` (a feature or text product's properties), a bare standard_name (resolved in the place's domain), or `@observed:<standard_name>` / `@forecast:<standard_name>` (at most 25 items).","type":"array","minItems":1,"items":{"type":"string"}},"location":{"description":"Space: one place (place text, ZIP or `lat,lon`). EDR position; `nearest` on a feature product (non-empty).","type":"string"},"locations":{"description":"Space: up to 25 places; one result element per place (at most 25 items).","type":"array","minItems":1,"items":{"type":"string","description":"Non-empty."}},"bbox":{"description":"Space: [west, south, east, north] in degrees. Items on a feature or text product; a grid needs `stats` (exactly 4 items).","type":"array","items":{"type":"number"}},"area":{"description":"Space: a polygon by reference ({product, feature_id | feature_ids | filter}; the product must declare query.area_as_reference) or inline ({geometry}). Over a feature product, the overlay; over a grid, zonal statistics.","type":"object","additionalProperties":false,"properties":{"product":{"type":"string","description":"The referenced product (one that declares query.area_as_reference), or omitted with `geometry`."},"feature_id":{"description":"The referenced product's portable feature id (FIPS geoid, UGC zone, alert id) (non-empty).","type":"string"},"feature_ids":{"description":"Up to 25 feature ids; one result element per feature (at most 25 items).","type":"array","minItems":1,"items":{"type":"string","description":"Non-empty."}},"filter":{"description":"Selects the referenced product's features; the area is their union (overlaps dissolved), one result element. Per feature: feature_ids, or select the per-feature product over this area.","type":"array","minItems":1,"items":{"description":"`<name> <op> <value>`, op one of == != > >= < <= in (`in`: a comma-separated list); values in request units.","type":"string"}},"geometry":{"description":"An inline MultiPolygon, <= 10,000 vertices; send a Polygon as a one-member MultiPolygon.","type":"object","additionalProperties":false,"required":["type","coordinates"],"properties":{"type":{"const":"MultiPolygon","description":"Always MultiPolygon."},"coordinates":{"type":"array","minItems":1,"items":{"type":"array","minItems":1,"items":{"type":"array","items":{"type":"array","items":{"type":"number"},"description":"At least 2 items; at most 3 items."},"description":"At least 4 items."}},"description":"Polygons of closed [lon, lat] rings, outer ring first."}}}}},"path":{"description":"Space: a trajectory sampled at each vertex's ETA: geometry or polyline with times, or departure + speed; departures fans out one element per departure.","type":"object","additionalProperties":false,"properties":{"geometry":{"description":"The route as a LineString (or send polyline).","type":"object","additionalProperties":false,"required":["type","coordinates"],"properties":{"type":{"const":"LineString","description":"Always LineString."},"coordinates":{"type":"array","items":{"type":"array","items":{"type":"number"},"description":"At least 2 items; at most 3 items."},"description":"[lon, lat] positions in travel order (at least 2 items)."}}},"polyline":{"type":"string","description":"The route as an encoded polyline (precision 5), instead of geometry (non-empty)."},"times":{"type":"array","items":{"description":"ISO 8601 date or date-time; a local offset is accepted (at least 10 characters).","type":"string"},"description":"The time at each vertex, in vertex order (instead of departure + speed)."},"departure":{"description":"Start time; ETAs follow from speed (at least 10 characters).","type":"string"},"departures":{"type":"array","minItems":1,"items":{"description":"ISO 8601 date or date-time; a local offset is accepted (at least 10 characters).","type":"string"},"description":"Up to 3 start times to compare; one result element per departure (at most 3 items)."},"speed":{"description":"Travel speed for departure, in the request units (km/h, or mph with imperial) (> 0).","type":"number"}}},"hours":{"description":"Time: a rolling window of this many hours (ahead for a forecast, back for an analysis) (>= 1).","type":"integer"},"start":{"description":"Time: window start (with `end`) (at least 10 characters).","type":"string"},"end":{"description":"Time: window end (with `start`) (at least 10 characters).","type":"string"},"at":{"description":"Time: one instant (at least 10 characters).","type":"string"},"run":{"description":"Time: a model run (reference time), or `latest` (non-empty).","type":"string"},"step":{"description":"Bucket size for `stats`, an ISO 8601 duration.","type":"string"},"stats":{"description":"Reducers per `step` bucket, over the whole window, or over the area's cells and features. `cumulative:` prefixes sum and degree_days only (a running total).","type":"array","minItems":1,"items":{"type":"string"}},"filter":{"description":"On a feature product: expressions over its filterable properties, applied before aggregation.","type":"array","minItems":1,"items":{"description":"`<name> <op> <value>`, op one of == != > >= < <= in (`in`: a comma-separated list); values in request units.","type":"string"}},"where":{"description":"Value criteria over the selected variables' standard_names, tested per sample: they mask the series, or are the predicate for windows and count reducers.","type":"array","minItems":1,"items":{"description":"`<name> <op> <value>`, op one of == != > >= < <= in (`in`: a comma-separated list); values in request units.","type":"string"}},"windows":{"description":"Window search over `where`: consecutive runs of at least min_hours.","type":"object","additionalProperties":false,"properties":{"min_hours":{"type":"integer","description":"Shortest run of consecutive hours meeting every `where` expression (>= 1)."},"light":{"enum":["day","night","any"],"description":"Restrict windows to daylight (day), darkness (night) or neither (any)."},"max_windows":{"type":"integer","description":"Most windows to return, earliest first (>= 1)."}}},"units":{"description":"metric or imperial; omitted returns each variable's catalog `units` (SI), the generic door's default.","enum":["metric","imperial"]},"view":{"description":"concise (default): values and feature properties with a centroid and bbox; detailed adds simplified geometry, provenance and raw encodings.","enum":["concise","detailed"]},"limit":{"type":"integer","description":"Frames per series element (default and max 168), or features per element (max 50); next_cursor continues (>= 1)."},"cursor":{"type":"string","description":"next_cursor of the previous page, with the same arguments (non-empty)."}},"required":["select"],"additionalProperties":false}},{"name":"get_forecast","description":"Forecast for a US place: current conditions, daily forecast with sunrise and sunset, active alerts and outlooks in one call, and hour by hour with include=hourly. Blended across NBM, HRRR, GFS, RTMA and SPC and unit-converted server-side; times are UTC ISO 8601, quote daily[].astro.local as local, and if forecast.location.timezone_resolved is false state times as UTC. For hours set `hours` (next N, default 48) or `start`+`end` for one stretch hour by hour, and check hourly_coverage (first_time, last_time, sample_interval_hours, truncated) before answering about a specific hour; past last_time say the forecast does not reach that far. Example: {\"location\": \"Portland, OR\", \"include\": \"hourly\", \"hours\": 24}.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"location":{"type":"string","minLength":1,"maxLength":200,"description":"Free-text place: \"City, ST\" (e.g. \"Portland, OR\"), US ZIP, venue/address where enabled, or \"lat,lon\". Use this OR lat+lon, not both."},"lat":{"type":"number","description":"Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon."},"lon":{"type":"number","description":"Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."},"days":{"default":10,"description":"Daily rows (1-14). Default 10. Does not limit hourly reach.","type":"integer","minimum":1,"maximum":14},"units":{"default":"imperial","description":"Units of every value in and out: imperial (default; °F, mph, in) or metric (°C, km/h, mm). si is deprecated and will be removed; use metric.","type":"string","enum":["imperial","metric","si"]},"include":{"default":"current,daily,alerts,outlooks","description":"Comma-separated sections: current, daily, hourly, alerts, outlooks. Default \"current,daily,alerts,outlooks\". hours, start or end add hourly.","type":"string"},"hours":{"description":"Hourly rows for the next N hours (1-168; default 48 when hourly is asked). Adds hourly.","type":"integer","minimum":1,"maximum":168},"start":{"description":"UTC ISO 8601 start of one stretch, returned hour by hour; needs end, not with hours. Adds hourly.","type":"string"},"end":{"description":"UTC ISO 8601 end of the stretch, exclusive; at most 168 h past the current hour.","type":"string"},"view":{"description":"concise (default; REST's is detailed): daily has day_precip_probability / night_precip_probability (precip_probability is their max); hourly is sampled past 24h. detailed: adds CAPE, UV, full day/night periods; hourly adds ceiling, gust and thunderstorm probability, every hour for 48h.","type":"string","enum":["concise","detailed"]}}}},{"name":"get_forecast_distribution","description":"NBM probabilistic guidance for one weather aspect: percentiles (p10-p90), exceedance probabilities and ensemble spread. Use this for any question about odds, ranges, potential or confidence (\"how much could we get\", \"range of possible highs\", \"how sure is this\") -- a deterministic forecast value cannot answer one. Reading the percentiles: p50 is the most likely outcome, p90 is the reasonable worst case when the risk is the high end (snow totals, wind, rainfall), and p10 when the risk is the low end (cold, visibility, ceiling). A single percentile is not the forecast -- report the likely value with the tail that matters, and label which is which. Aspects: precip (PoP, QPF + percentiles), snow (accumulation percentiles, >1/2/4in probabilities, snow level, snow-type probability), ice (ice accretion, freezing-rain / ice-pellet probabilities), temperature (`daily` high/low p10/p50/p90: the NBM value -/+ 1.28 stddev; hourly temp + stddev), wind (speed/gust percentiles), severe (thunderstorm probability plus NBM CWASP, a severe-environment index, both in percent: severe_weather_prob_p50 is the median CWASP value and severe_weather_prob_above_75 the probability CWASP exceeds 75; NBM has no tornado, hail or damaging-wind odds; SPC's: get_outlooks (guidance) hazard=severe), aviation (LIFR/IFR/MVFR visibility + ceiling odds), confidence (ensemble stddev; low = settled, high = details still in play). Labels in unit_labels. Example: {\"location\": \"Denver, CO\", \"aspect\": \"snow\", \"hours\": 72}.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"location":{"type":"string","minLength":1,"maxLength":200,"description":"Free-text place: \"City, ST\" (e.g. \"Portland, OR\"), US ZIP, venue/address where enabled, or \"lat,lon\". Use this OR lat+lon, not both."},"lat":{"type":"number","description":"Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon."},"lon":{"type":"number","description":"Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."},"aspect":{"type":"string","enum":["precip","snow","ice","temperature","wind","severe","aviation","confidence"],"description":"Distribution family (see description)."},"hours":{"description":"Forecast hours; default 48-72 by aspect.","type":"integer","minimum":1,"maximum":264},"units":{"default":"imperial","description":"imperial (default; °F, mph, in) or metric. si is deprecated and will be removed; use metric.","type":"string","enum":["imperial","metric","si"]}},"required":["aspect"]}},{"name":"get_observed_precipitation","description":"How much rain fell: observed precipitation totals at a location. Use for \"did it rain\", \"how much rain fell\", \"rain in the last 24 hours / since yesterday\". Source: MRMS MultiSensor QPE Pass2 (radar bias-corrected to rain gauges) over 1/3/6/24/48/72 h windows (CONUS; 1 h only in Alaska and Hawaii). Values have about 2 mm (0.08 in) resolution, so 0 means under about 1 mm; data runs about an hour behind real time. Pass `at` (within 33 h) for totals ending at a past time (newest frame up to 3 h before it). With include_nowcast (default) it also returns a next-hour radar nowcast (CONUS): peak intensity (light/moderate/heavy), type and start time, not an amount. Forecast totals past the next hour: get_data (catalog); station reports: get_observations (observed).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"location":{"type":"string","minLength":1,"maxLength":200,"description":"Free-text place: \"City, ST\" (e.g. \"Portland, OR\"), US ZIP, venue/address where enabled, or \"lat,lon\". Use this OR lat+lon, not both."},"lat":{"type":"number","description":"Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon."},"lon":{"type":"number","description":"Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."},"windows":{"default":["1h","24h"],"description":"Accumulation windows ending at the latest frame (or at `at`).","minItems":1,"maxItems":6,"type":"array","items":{"type":"string","enum":["1h","3h","6h","24h","48h","72h"]}},"units":{"default":"imperial","description":"Units of every value in and out: imperial (default; °F, mph, in) or metric (°C, km/h, mm). si is deprecated and will be removed; use metric.","type":"string","enum":["imperial","metric","si"]},"at":{"description":"RFC3339 end time within the last 33 h. Default: latest.","type":"string","format":"date-time"},"include_nowcast":{"default":true,"description":"Next-hour radar nowcast (CONUS; ignored with `at`).","type":"boolean"}}}},{"name":"get_status","description":"Data freshness of the weather platform (no inputs needed; refreshed about every 5 minutes): overall state, per-source states (ok / degraded / outage / no_signal), open incidents with their cause (provider outage vs internal processing delay) and active provider advisories. Use it when asked whether data is current, when other tools return stale-looking data, or before presenting time-critical weather. If a source is degraded or in outage, say the data may be stale rather than presenting it as live. Example: {}.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"include_ok":{"default":false,"description":"true: every monitored source, healthy ones too. false (default): only sources that are not ok.","type":"boolean"}},"additionalProperties":false}},{"name":"get_time_context","description":"Complete temporal context for a location: local time, timezone, 14-day calendar with day names and Today/Tomorrow offsets, sunrise/sunset/solar times (from the weather pipeline's astro product), and moon phase. Use whenever you need to reason about dates, times, or daylight for a location -- including \"what time is sunset?\", \"is it dark there now?\", or \"what day of the week is the 4th-day forecast?\". If current_time.timezone_resolved is false, zone unknown: state times as UTC, never as local. Accepts a place name directly. Example: {\"location\": \"Seattle, WA\"}.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"location":{"type":"string","minLength":1,"maxLength":200,"description":"Free-text place: \"City, ST\" (e.g. \"Portland, OR\"), US ZIP, venue/address where enabled, or \"lat,lon\". Use this OR lat+lon, not both."},"lat":{"type":"number","description":"Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon."},"lon":{"type":"number","description":"Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."}}}},{"name":"search_data","description":"Search the data catalog: which dataset's values answer a weather question, or what data exists at a point. With `query` it ranks grids, radar, satellite, outlooks and observations and returns hits with variable, units, cadence, why, the exact `call` to run next and any verified `example`; without it, it lists datasets at the place with freshness, or every public one. A place (`location` or lat/lon) or `domain` keeps datasets covering it; variables come from describe_data. Example: {\"location\": \"Anchorage, AK\"}.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"description":"The question in the user's words (2-200 characters); omit to list.","type":"string"},"location":{"description":"\"City, ST\", ZIP or \"lat,lon\" (up to 200 chars); not with lat/lon.","type":"string"},"lat":{"description":"Latitude (-90 to 90), with lon.","type":"number"},"lon":{"description":"Longitude (-180 to 180), with lat.","type":"number"},"domain":{"description":"Coverage filter without a place.","type":"string","enum":["conus","alaska","hawaii","carib","global"]},"kind":{"description":"Only this dataset kind.","type":"string","enum":["grid","snapshot","feature","text"]},"family":{"description":"Only this source family, describe_data's `family` (1-40 characters).","type":"string"},"limit":{"description":"Rows (1-10); default 5 with query, all without.","type":"integer"}},"additionalProperties":false}}],"scan":{"score":85,"grade":"A","scanned_at":"2026-10-31T17:29:20.353Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-31T17:29:20.286Z","components":{"code":{"score":25,"max":25,"notes":["7 source files scanned"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 784ms"]},"poisoning":{"score":15,"max":15,"notes":["13 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 1 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 1 days ago"]},"identity":{"score":7,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://mcp.smarterweather.com","reachable":true,"authRequired":false,"latencyMs":784,"serverInfo":{"name":"sw-mcp","version":"0.0.0.303"}}],"packages":[{"registryType":"npm","identifier":"@smarterweather/mcp-weather","version":"0.1.1","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":1,"publishedAt":"2026-10-20T20:14:43.563Z","repositoryUrl":"git+https://github.com/smarterweather/developer.git","weeklyDownloads":82}],"repo":{"found":true,"owner":"smarterweather","repo":"developer","archived":false,"pushedAt":"2026-10-30T22:22:29Z","stars":1,"forks":0,"openIssues":4,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/277547233?v=4","ownerCreatedAt":"2026-04-19T20:07:41Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/277547233?v=4&s=128","source":"registry","width":128,"height":128},"presence":{"stars":1,"forks":0,"downloadsWeek":82,"license":"MIT","lastPushAt":"2026-10-30T22:22:29.000Z","score":35}}}},"grade_history":[],"reviews":[]}