io.b3os/open-meteo 1.0.0 · weather, geocoding · MIT

Weather for any coordinate on Earth from the Open-Meteo API: current conditions, hourly and daily forecasts up to 16 days, historical weather back to 1940, air quality, and place search to turn a name into coordinates. Keyless: no connection needed. Open-Meteo's free tier is for non-commercial use under 10,000 calls a day; commercial use needs your own Open-Meteo plan. For US locations, io.b3os/nws (the National Weather Service) adds official alerts.

Every call's result carries upstream_status and timing: validate_ms, inject_ms, render_ms, upstream_ms, map_ms and total_ms. upstream is the service's time; the others are B3OS's own (call actions). The snippets below show no timing values, because a fixture records none.

Connection

No credential: a keyless public API. Calls name no connection.

Hosts it reaches: api.open-meteo.com, geocoding-api.open-meteo.com, air-quality-api.open-meteo.com, archive-api.open-meteo.com.

Actions

ActionEffectMCP toolTitle
search-placesreadopen-meteo__search-placesSearch places
get-current-weatherreadopen-meteo__get-current-weatherGet current weather
get-daily-forecastreadopen-meteo__get-daily-forecastGet daily forecast
get-hourly-forecastreadopen-meteo__get-hourly-forecastGet hourly forecast
get-historical-weatherreadopen-meteo__get-historical-weatherGet historical weather
get-air-qualityreadopen-meteo__get-air-qualityGet air quality

search-places

Search places. Find places by name and get their coordinates, country code, region and time zone, best match first. Use it first when you only have a place name: every weather action in this pack takes latitude and longitude.

Ref io.b3os/open-meteo/search-places@1.0.0 · effect read · no connection · MCP tool open-meteo__search-places

bash
curl -s https://beta-api.b3os.org/v1/actions/call \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ref": "io.b3os/open-meteo/search-places@1", "input": {"name": "Eugene", "count": 2} }'

Output, labeled fixture: Search places (response recorded 2026-10-26). From the bundle's fixtures/search-places.json, not a live call.

json
{ "places": [ { "id": 5725846, "name": "Eugene", "latitude": 44.05207, "longitude": -123.08675, "country_code": "US", "region": "Oregon", "timezone": "America/Los_Angeles", "population": 176654 }, { "id": 4385819, "name": "Eugene", "latitude": 38.35281, "longitude": -92.40379, "country_code": "US", "region": "Missouri", "timezone": "America/Chicago", "population": 156 } ]}

When the service answers with an error, the call fails with upstream_error and pack_error.code is one of:

pack_error.codeService statusRetryableMessage
invalid_request400nobuilt from the service's response
rate_limited429yesOpen-Meteo rate limit reached (the free tier allows 10,000 calls a day per client).

get-current-weather

Get current weather. Current conditions at a coordinate: temperature, feels-like temperature, humidity, precipitation, cloud cover, wind and a plain-words description of the WMO weather code. Values are model data updated every 15 minutes, in the units you ask for.

Ref io.b3os/open-meteo/get-current-weather@1.0.0 · effect read · no connection · MCP tool open-meteo__get-current-weather

bash
curl -s https://beta-api.b3os.org/v1/actions/call \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ref": "io.b3os/open-meteo/get-current-weather@1", "input": {"latitude": 44.05, "longitude": -123.09} }'

Output, labeled fixture: Get current weather (response recorded 2026-10-26). From the bundle's fixtures/get-current-weather.json, not a live call.

json
{ "time": "2026-10-26T00:00", "timezone": "America/Los_Angeles", "temperature": 10.2, "apparent_temperature": 8.8, "relative_humidity_percent": 90, "precipitation": 0, "cloud_cover_percent": 100, "wind_speed": 7.1, "wind_direction_degrees": 149, "is_day": false, "weather_code": 3, "conditions": "Overcast", "units": {"temperature": "°C", "precipitation": "mm", "wind_speed": "km/h"}}

When the service answers with an error, the call fails with upstream_error and pack_error.code is one of:

pack_error.codeService statusRetryableMessage
invalid_request400nobuilt from the service's response
rate_limited429yesOpen-Meteo rate limit reached (the free tier allows 10,000 calls a day per client).

get-daily-forecast

Get daily forecast. Daily forecast for up to 16 days at a coordinate: high and low temperature, precipitation total and maximum probability, maximum wind, sunrise, sunset and conditions in words. The days come as parallel arrays: index i of every list in days describes the date days.date[i].

Ref io.b3os/open-meteo/get-daily-forecast@1.0.0 · effect read · no connection · MCP tool open-meteo__get-daily-forecast

bash
curl -s https://beta-api.b3os.org/v1/actions/call \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ref": "io.b3os/open-meteo/get-daily-forecast@1", "input": {"latitude": 52.52, "longitude": 13.41, "days": 3} }'

Output, labeled fixture: Get daily forecast (response recorded 2026-10-26). From the bundle's fixtures/get-daily-forecast.json, not a live call.

json
{ "timezone": "Europe/Berlin", "days": { "date": ["2026-10-26", "2026-10-27", "2026-10-28"], "temperature_max": [13.2, 15.4, 13.7], "temperature_min": [7.7, 7.9, 8.6], "precipitation_sum": [0, 0, 2], "precipitation_probability_max_percent": [5, 3, 32], "wind_speed_max": [17.6, 12.4, 11.3], "sunrise": ["2026-10-26T06:51", "2026-10-27T06:53", "2026-10-28T06:55"], "sunset": ["2026-10-26T16:48", "2026-10-27T16:46", "2026-10-28T16:44"], "weather_code": [3, 3, 61], "conditions": ["Overcast", "Overcast", "Slight rain"] }, "units": {"temperature": "°C", "precipitation": "mm", "wind_speed": "km/h"}}

When the service answers with an error, the call fails with upstream_error and pack_error.code is one of:

pack_error.codeService statusRetryableMessage
invalid_request400nobuilt from the service's response
rate_limited429yesOpen-Meteo rate limit reached (the free tier allows 10,000 calls a day per client).

get-hourly-forecast

Get hourly forecast. Hour-by-hour forecast for the next 1 to 168 hours at a coordinate: temperature, precipitation and its probability, cloud cover, wind and conditions in words. Parallel arrays: index i of every list in hours describes the hour hours.time[i] (local time).

Ref io.b3os/open-meteo/get-hourly-forecast@1.0.0 · effect read · no connection · MCP tool open-meteo__get-hourly-forecast

bash
curl -s https://beta-api.b3os.org/v1/actions/call \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ref": "io.b3os/open-meteo/get-hourly-forecast@1", "input": {"latitude": 35.68, "longitude": 139.69, "hours": 4} }'

Output, labeled fixture: Get hourly forecast (response recorded 2026-10-26). From the bundle's fixtures/get-hourly-forecast.json, not a live call.

json
{ "timezone": "Asia/Tokyo", "hours": { "time": [ "2026-10-26T16:00", "2026-10-26T17:00", "2026-10-26T18:00", "2026-10-26T19:00" ], "temperature": [16.7, 16.5, 16.4, 16.3], "precipitation_probability_percent": [100, 100, 100, 100], "precipitation": [3.3, 3.4, 1.7, 3.8], "cloud_cover_percent": [88, 74, 84, 93], "wind_speed": [4.6, 3.1, 2.9, 4.4], "weather_code": [63, 63, 61, 63], "conditions": ["Moderate rain", "Moderate rain", "Slight rain", "Moderate rain"] }, "units": {"temperature": "°C", "precipitation": "mm", "wind_speed": "km/h"}}

When the service answers with an error, the call fails with upstream_error and pack_error.code is one of:

pack_error.codeService statusRetryableMessage
invalid_request400nobuilt from the service's response
rate_limited429yesOpen-Meteo rate limit reached (the free tier allows 10,000 calls a day per client).

get-historical-weather

Get historical weather. Daily weather observed (reanalysis) between two past dates at a coordinate, from 1940 up to about five days ago: high and low temperature, precipitation total, maximum wind and conditions in words. At most 366 days per call. Parallel arrays: index i of every list in days describes days.date[i].

Ref io.b3os/open-meteo/get-historical-weather@1.0.0 · effect read · no connection · MCP tool open-meteo__get-historical-weather

bash
curl -s https://beta-api.b3os.org/v1/actions/call \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ref": "io.b3os/open-meteo/get-historical-weather@1", "input": { "latitude": 44.05, "longitude": -123.09, "start_date": "2026-01-01", "end_date": "2026-01-03", "temperature_unit": "fahrenheit", "precipitation_unit": "inch" } }'

Output, labeled fixture: Get historical weather (response recorded 2026-10-26). From the bundle's fixtures/get-historical-weather.json, not a live call.

json
{ "timezone": "America/Los_Angeles", "days": { "date": ["2026-01-01", "2026-01-02", "2026-01-03"], "temperature_max": [41.5, 51.6, 56.4], "temperature_min": [32.2, 40.5, 39.9], "precipitation_sum": [0.539, 0.11, 0.602], "wind_speed_max": [5.6, 10.2, 22.4], "weather_code": [61, 61, 63], "conditions": ["Slight rain", "Slight rain", "Moderate rain"] }, "units": {"temperature": "°F", "precipitation": "inch", "wind_speed": "km/h"}}

When the service answers with an error, the call fails with upstream_error and pack_error.code is one of:

pack_error.codeService statusRetryableMessage
invalid_request400nobuilt from the service's response
rate_limited429yesOpen-Meteo rate limit reached (the free tier allows 10,000 calls a day per client).

get-air-quality

Get air quality. Current air quality at a coordinate from the CAMS models: US and European AQI, PM2.5, PM10, ozone, nitrogen dioxide, sulphur dioxide and carbon monoxide in micrograms per cubic metre. Coverage is global at about 11 km resolution, finer over Europe.

Ref io.b3os/open-meteo/get-air-quality@1.0.0 · effect read · no connection · MCP tool open-meteo__get-air-quality

bash
curl -s https://beta-api.b3os.org/v1/actions/call \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ref": "io.b3os/open-meteo/get-air-quality@1", "input": {"latitude": 34.05, "longitude": -118.24} }'

Output, labeled fixture: Get air quality (response recorded 2026-10-26). From the bundle's fixtures/get-air-quality.json, not a live call.

json
{ "time": "2026-10-26T00:00", "timezone": "America/Los_Angeles", "us_aqi": 69, "european_aqi": 70, "pm2_5": 25.1, "pm10": 25.8, "ozone": 0, "nitrogen_dioxide": 80.7, "sulphur_dioxide": 4.3, "carbon_monoxide": 359}

When the service answers with an error, the call fails with upstream_error and pack_error.code is one of:

pack_error.codeService statusRetryableMessage
invalid_request400nobuilt from the service's response
rate_limited429yesOpen-Meteo rate limit reached (the free tier allows 10,000 calls a day per client).
Ask a question... ⌘I