{"openapi":"3.1.0","info":{"title":"DMI Open Data (BYOK) API","version":"0.1.0","description":"DMI Open Data (BYOK) lets an AI assistant read your own DMI Open Data data through the DMI Open Data API with a key you supply (DMI Open Data API key). Read-only: 7 tools (list_weather_stations, get_weather_observations, list_climate_stations, get_station_climate_values, get_municipality_climate_values, get_country_climate_values, get_grid_climate_values). The BYOK key travels with each request,...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-dmi.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-dmi/docs"},"termsOfService":"https://connectorbay.com/byok-dmi/terms"},"servers":[{"url":"https://byok-dmi.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-dmi/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/list_weather_stations":{"post":{"operationId":"list_weather_stations","summary":"List DMI weather stations with id, name, type, country, status, height and measured parameters; filter by status, type o","description":"List DMI weather stations with id, name, type, country, status, height and measured parameters; filter by status, type or bounding box. Use for \"Which active DMI weather stations are around Copenhagen\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"status":{"anyOf":[{"maxLength":20,"type":"string"},{"type":"null"}],"default":null,"description":"Station status, for example Active.","title":"Status"},"type":{"anyOf":[{"maxLength":20,"type":"string"},{"type":"null"}],"default":null,"description":"Station type, for example Synop or Pluvio.","title":"Type"},"bbox":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Bounding box as west,south,east,north longitude/latitude in decimal degrees, for example '12.0,55.5,12.8,55.9'.","title":"Bbox"},"limit":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many features to return (1 to 1000 here; the service allows more).","title":"Limit"},"offset":{"anyOf":[{"maximum":500000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Features to skip, for paging (0 to 500000).","title":"Offset"}},"title":"list_weather_stationsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_weather_observations":{"post":{"operationId":"get_weather_observations","summary":"Get recent meteorological observations (10-minute and hourly values) for a station and parameter, newest first by defaul","description":"Get recent meteorological observations (10-minute and hourly values) for a station and parameter, newest first by default. Use for \"What is the latest temperature at station 06180\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"station_id":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Station id as text with leading zeros, for example '06180' (Copenhagen Airport).","title":"Station Id"},"parameter_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Weather parameter id, for example temp_dry or wind_speed or pressure_at_sea.","title":"Parameter Id"},"datetime":{"anyOf":[{"maxLength":70,"type":"string"},{"type":"null"}],"default":null,"description":"A date-time (ISO 8601) or inclusive range 'start/end'; '..' leaves one end open, for example 2026-10-01T00:00:00Z/2026-10-02T00:00:00Z.","title":"Datetime"},"bbox":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Bounding box as west,south,east,north longitude/latitude in decimal degrees, for example '12.0,55.5,12.8,55.9'.","title":"Bbox"},"sortorder":{"anyOf":[{"maxLength":30,"type":"string"},{"type":"null"}],"default":"observed,DESC","description":"Sort order, 'observed,DESC' for newest first (default).","title":"Sortorder"},"limit":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many features to return (1 to 1000 here; the service allows more).","title":"Limit"},"offset":{"anyOf":[{"maximum":500000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Features to skip, for paging (0 to 500000).","title":"Offset"}},"title":"get_weather_observationsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_climate_stations":{"post":{"operationId":"list_climate_stations","summary":"List DMI climate stations (used for daily, monthly and yearly statistics) with id, name, type, country and status. Use f","description":"List DMI climate stations (used for daily, monthly and yearly statistics) with id, name, type, country and status. Use for \"Which climate stations does DMI have in Greenland\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"status":{"anyOf":[{"maxLength":20,"type":"string"},{"type":"null"}],"default":null,"description":"Station status, for example Active.","title":"Status"},"bbox":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Bounding box as west,south,east,north longitude/latitude in decimal degrees, for example '12.0,55.5,12.8,55.9'.","title":"Bbox"},"limit":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many features to return (1 to 1000 here; the service allows more).","title":"Limit"},"offset":{"anyOf":[{"maximum":500000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Features to skip, for paging (0 to 500000).","title":"Offset"}},"title":"list_climate_stationsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_station_climate_values":{"post":{"operationId":"get_station_climate_values","summary":"Get aggregated climate values (hourly, daily, monthly or yearly) for one station and parameter such as mean_temp. Use fo","description":"Get aggregated climate values (hourly, daily, monthly or yearly) for one station and parameter such as mean_temp. Use for \"What was the daily mean temperature at station 05185 in October 2026\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"station_id":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Station id as text with leading zeros, for example '06180' (Copenhagen Airport).","title":"Station Id"},"parameter_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Weather parameter id, for example mean_temp, mean_wind_speed or mean_cloud_cover.","title":"Parameter Id"},"time_resolution":{"anyOf":[{"enum":["hour","day","month","year"],"type":"string"},{"type":"null"}],"default":null,"description":"Aggregation period: hour, day, month or year.","title":"Time Resolution"},"datetime":{"anyOf":[{"maxLength":70,"type":"string"},{"type":"null"}],"default":null,"description":"A date-time (ISO 8601) or inclusive range 'start/end'; '..' leaves one end open, for example 2026-10-01T00:00:00Z/2026-10-02T00:00:00Z.","title":"Datetime"},"limit":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many features to return (1 to 1000 here; the service allows more).","title":"Limit"},"offset":{"anyOf":[{"maximum":500000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Features to skip, for paging (0 to 500000).","title":"Offset"}},"title":"get_station_climate_valuesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_municipality_climate_values":{"post":{"operationId":"get_municipality_climate_values","summary":"Get aggregated climate values for a Danish municipality by four-digit municipality id. Use for \"What was the mean temper","description":"Get aggregated climate values for a Danish municipality by four-digit municipality id. Use for \"What was the mean temperature in Copenhagen municipality (0101) by month in 2025\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"municipality_id":{"anyOf":[{"maxLength":4,"type":"string"},{"type":"null"}],"default":null,"description":"Four-digit municipality id with leading zero, for example '0147'.","title":"Municipality Id"},"parameter_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Weather parameter id, for example mean_temp.","title":"Parameter Id"},"time_resolution":{"anyOf":[{"enum":["hour","day","month","year"],"type":"string"},{"type":"null"}],"default":null,"description":"Aggregation period: hour, day, month or year.","title":"Time Resolution"},"datetime":{"anyOf":[{"maxLength":70,"type":"string"},{"type":"null"}],"default":null,"description":"A date-time (ISO 8601) or inclusive range 'start/end'; '..' leaves one end open, for example 2026-10-01T00:00:00Z/2026-10-02T00:00:00Z.","title":"Datetime"},"limit":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many features to return (1 to 1000 here; the service allows more).","title":"Limit"},"offset":{"anyOf":[{"maximum":500000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Features to skip, for paging (0 to 500000).","title":"Offset"}},"title":"get_municipality_climate_valuesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_country_climate_values":{"post":{"operationId":"get_country_climate_values","summary":"Get aggregated climate values for the whole country (Denmark) for a parameter and period. Use for \"What was Denmark's me","description":"Get aggregated climate values for the whole country (Denmark) for a parameter and period. Use for \"What was Denmark's mean temperature each year since 2000\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"parameter_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Weather parameter id, for example mean_temp.","title":"Parameter Id"},"time_resolution":{"anyOf":[{"enum":["hour","day","month","year"],"type":"string"},{"type":"null"}],"default":null,"description":"Aggregation period: hour, day, month or year.","title":"Time Resolution"},"datetime":{"anyOf":[{"maxLength":70,"type":"string"},{"type":"null"}],"default":null,"description":"A date-time (ISO 8601) or inclusive range 'start/end'; '..' leaves one end open, for example 2026-10-01T00:00:00Z/2026-10-02T00:00:00Z.","title":"Datetime"},"limit":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many features to return (1 to 1000 here; the service allows more).","title":"Limit"},"offset":{"anyOf":[{"maximum":500000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Features to skip, for paging (0 to 500000).","title":"Offset"}},"title":"get_country_climate_valuesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_grid_climate_values":{"post":{"operationId":"get_grid_climate_values","summary":"Get aggregated climate values for a 10 km grid cell of the Danish national grid. Use for \"What was the daily mean temper","description":"Get aggregated climate values for a 10 km grid cell of the Danish national grid. Use for \"What was the daily mean temperature in grid cell 10km_612_68\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"cell_id":{"anyOf":[{"maxLength":30,"type":"string"},{"type":"null"}],"default":null,"description":"Grid cell id, for example '10km_612_68'.","title":"Cell Id"},"parameter_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Weather parameter id, for example mean_temp.","title":"Parameter Id"},"time_resolution":{"anyOf":[{"enum":["hour","day","month","year"],"type":"string"},{"type":"null"}],"default":null,"description":"Aggregation period: hour, day, month or year.","title":"Time Resolution"},"datetime":{"anyOf":[{"maxLength":70,"type":"string"},{"type":"null"}],"default":null,"description":"A date-time (ISO 8601) or inclusive range 'start/end'; '..' leaves one end open, for example 2026-10-01T00:00:00Z/2026-10-02T00:00:00Z.","title":"Datetime"},"limit":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":100,"description":"How many features to return (1 to 1000 here; the service allows more).","title":"Limit"},"offset":{"anyOf":[{"maximum":500000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Features to skip, for paging (0 to 500000).","title":"Offset"}},"title":"get_grid_climate_valuesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}