Skill: deiu/open-meteo-weather (version 1.0.0)

--- name: open-meteo-weather description: >- Fetch current weather conditions and 7-day daily forecasts for any location using the Open-Meteo API. Includes geocoding to resolve city names to coordinates. Free, no API key required. --- # Open-Meteo Weather Current weather conditions and 7-day daily forecasts for any location. Uses the free Open-Meteo API with built-in geocoding. No API key, no authentication, no rate limits for non-commercial use. ## Quick Reference | Action | Endpoint | |--------|----------| | Geocode city to lat/lon | `GET https://geocoding-api.open-meteo.com/v1/search?name={city}&count=1&language=en` | | Current + 7-day forecast | `GET https://api.open-meteo.com/v1/forecast?latitude={lat}&longitude={lon}&current=temperature_2m,relative_humidity_2m,apparent_temperature,weather_code,wind_speed_10m,wind_direction_10m,precipitation&daily=temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,sunrise,sunset,wind_speed_10m_max,weather_code&timezone=auto` | ## Units Default to metric. On the first weather request in a session, ask the user: "Do you prefer Celsius or Fahrenheit?" Remember their answer for the rest of the session. For metric (default), no extra parameters needed. For imperial, append these parameters to the forecast URL: ``` &temperature_unit=fahrenheit&wind_speed_unit=mph&precipitation_unit=inch ``` The response `current_units` and `daily_units` objects reflect the chosen system. ## Geocoding Resolve a city name to latitude/longitude before calling the forecast API. **Endpoint:** `GET https://geocoding-api.open-meteo.com/v1/search` | Parameter | Required | Description | |-----------|----------|-------------| | `name` | Yes | City name (minimum 2 characters) | | `count` | No | Number of results (default 10, max 100). Use `1` for best match. | | `language` | No | Response language (default `en`) | **Example:** ```bash curl "https://geocoding-api.open-meteo.com/v1/search?name=Berlin&count=1&language=en" ``` **Extract from the response:** | Field | Description | |-------|-------------| | `results[0].latitude` | Latitude (WGS84) | | `results[0].longitude` | Longitude (WGS84) | | `results[0].name` | Resolved city name | | `results[0].country` | Country name | | `results[0].admin1` | State/province | If `results` is empty or missing, tell the user the location was not found and ask them to be more specific. If multiple cities share the same name, use `count=5` and present the options (name, admin1, country) so the user can pick the right one. ## Current Conditions Include the `current` parameter in the forecast call. **Parameters to request:** ``` current=temperature_2m,relative_humidity_2m,apparent_temperature,weather_code,wind_speed_10m,wind_direction_10m,precipitation ``` **Response fields:** | Field | Description | |-------|-------------| | `current.temperature_2m` | Temperature at 2m height | | `current.apparent_temperature` | Feels-like temperature (wind chill / heat index) | | `current.relative_humidity_2m` | Relative humidity percentage | | `current.weather_code` | WMO code (see Weather Codes below) | | `current.wind_speed_10m` | Wind speed at 10m height | | `current.wind_direction_10m` | Wind direction in degrees | | `current.precipitation` | Precipitation in the last hour | Units are in the `current_units` object. Always include the unit when presenting values. Convert `wind_direction_10m` degrees to the nearest compass direction: N (338-22), NE (23-67), E (68-112), SE (113-157), S (158-202), SW (203-247), W (248-292), NW (293-337). ## Daily Forecast Include the `daily` parameter. Always add `timezone=auto` so times are in the location's local timezone. **Parameters to request:** ``` daily=temperature_2m_max,temperature_2m_min,precipitation_sum,precipitation_probability_max,sunrise,sunset,wind_speed_10m_max,weather_code&timezone=auto ``` All `daily` fields are arrays indexed by day. `daily.time` contains date strings (YYYY-MM-DD). | Field | Description | |-------|-------------| | `daily.time[i]` | Date | | `daily.weather_code[i]` | WMO code for the day | | `daily.temperature_2m_max[i]` | High temperature | | `daily.temperature_2m_min[i]` | Low temperature | | `daily.precipitation_sum[i]` | Total precipitation | | `daily.precipitation_probability_max[i]` | Max precipitation probability (%) | | `daily.sunrise[i]` | Sunrise time (ISO 8601, local) | | `daily.sunset[i]` | Sunset time (ISO 8601, local) | | `daily.wind_speed_10m_max[i]` | Max wind speed | ## Weather Codes WMO weather interpretation codes returned in `weather_code` fields: | Code | Description | |------|-------------| | 0 | Clear sky | | 1 | Mainly clear | | 2 | Partly cloudy | | 3 | Overcast | | 45 | Fog | | 48 | Depositing rime fog | | 51 | Light drizzle | | 53 | Moderate drizzle | | 55 | Dense drizzle | | 56 | Light freezing drizzle | | 57 | Dense freezing drizzle | | 61 | Slight rain | | 63 | Moderate rain | | 65 | Heavy rain | | 66 | Light freezing rain | | 67 | Heavy freezing rain | | 71 | Slight snow | | 73 | Moderate snow | | 75 | Heavy snow | | 77 | Snow grains | | 80 | Slight rain showers | | 81 | Moderate rain showers | | 82 | Violent rain showers | | 85 | Slight snow showers | | 86 | Heavy snow showers | | 95 | Thunderstorm | | 96 | Thunderstorm with slight hail | | 99 | Thunderstorm with heavy hail | Use the description when presenting weather to the user. Do NOT show the numeric code. ## Response Formatting Present a concise summary. Do NOT show raw JSON, API URLs, or technical details. **Current conditions format:** ``` Weather in {city}, {country} {weather description}, {temperature} (feels like {apparent_temperature}) Humidity: {humidity}% Wind: {speed} from the {compass_direction} Precipitation: {amount} ``` **Forecast format:** After current conditions, show the 7-day outlook as a compact list with one line per day: ``` Mon Feb 24: Partly cloudy, 8/3C, 10% rain, wind 15 km/h Tue Feb 25: Rain, 6/2C, 80% rain, 4.2mm, wind 25 km/h ``` If the user asks a specific question ("Will it rain tomorrow?", "What's the temperature on Friday?"), answer directly instead of showing the full forecast. ## Error Handling If any API call returns a non-200 status or the response cannot be parsed, inform the user that the weather service is temporarily unavailable and suggest trying again in a few minutes. Do NOT show raw error messages or status codes.


Security scan verdicts — ClawScan: clean | static analysis:  | VirusTotal: clean | SkillSpector: clean (LOW)