import type { Tool } from '@modelcontextprotocol/sdk/types.js';
export const WEATHER_FORECAST_TOOL: Tool = {
name: 'weather_forecast',
description:
'Get weather forecast data for coordinates using Open-Meteo API. Supports hourly and daily data with various weather variables. When no `models` parameter is provided, the API automatically selects the best model for the given location (recommended). Only one model per request is supported — for multi-model comparison, use provider-specific tools with parallel calls.',
inputSchema: {
type: 'object',
properties: {
latitude: {
type: 'number',
minimum: -90,
maximum: 90,
description: 'Latitude in WGS84 coordinate system',
},
longitude: {
type: 'number',
minimum: -180,
maximum: 180,
description: 'Longitude in WGS84 coordinate system',
},
hourly: {
type: 'array',
items: {
type: 'string',
enum: [
'temperature_2m',
'relative_humidity_2m',
'dewpoint_2m',
'apparent_temperature',
'precipitation_probability',
'precipitation',
'rain',
'showers',
'snowfall',
'snow_depth',
'weather_code',
'pressure_msl',
'surface_pressure',
'cloud_cover',
'cloud_cover_low',
'cloud_cover_mid',
'cloud_cover_high',
'visibility',
'evapotranspiration',
'et0_fao_evapotranspiration',
'vapour_pressure_deficit',
'wind_speed_10m',
'wind_speed_80m',
'wind_speed_120m',
'wind_speed_180m',
'wind_direction_10m',
'wind_direction_80m',
'wind_direction_120m',
'wind_direction_180m',
'wind_gusts_10m',
'temperature_80m',
'temperature_120m',
'temperature_180m',
'soil_temperature_0cm',
'soil_temperature_6cm',
'soil_temperature_18cm',
'soil_temperature_54cm',
'soil_moisture_0_to_1cm',
'soil_moisture_1_to_3cm',
'soil_moisture_3_to_9cm',
'soil_moisture_9_to_27cm',
'soil_moisture_27_to_81cm',
'uv_index',
'uv_index_clear_sky',
'is_day',
'sunshine_duration',
'wet_bulb_temperature_2m',
'total_column_integrated_water_vapour',
'cape',
'lifted_index',
'convective_inhibition',
'freezing_level_height',
'boundary_layer_height_pbl',
'shortwave_radiation',
'direct_radiation',
'diffuse_radiation',
'direct_normal_irradiance',
'global_tilted_irradiance',
'terrestrial_radiation',
'shortwave_radiation_instant',
'direct_radiation_instant',
'diffuse_radiation_instant',
'direct_normal_irradiance_instant',
'global_tilted_irradiance_instant',
'terrestrial_radiation_instant',
],
},
description: 'Hourly weather variables to retrieve',
},
daily: {
type: 'array',
items: {
type: 'string',
enum: [
'weather_code',
'temperature_2m_max',
'temperature_2m_min',
'apparent_temperature_max',
'apparent_temperature_min',
'sunrise',
'sunset',
'daylight_duration',
'sunshine_duration',
'uv_index_max',
'uv_index_clear_sky_max',
'rain_sum',
'showers_sum',
'snowfall_sum',
'precipitation_sum',
'precipitation_hours',
'precipitation_probability_max',
'wind_speed_10m_max',
'wind_gusts_10m_max',
'wind_direction_10m_dominant',
'shortwave_radiation_sum',
'et0_fao_evapotranspiration',
'temperature_2m_mean',
'apparent_temperature_mean',
'cape_mean',
'cape_max',
'cape_min',
'cloud_cover_mean',
'cloud_cover_max',
'cloud_cover_min',
'dewpoint_2m_mean',
'dewpoint_2m_max',
'dewpoint_2m_min',
'et0_fao_evapotranspiration_sum',
'growing_degree_days_base_0_limit_50',
'leaf_wetness_probability_mean',
'leaf_wetness_probability_max',
'leaf_wetness_probability_min',
'precipitation_probability_mean',
'precipitation_probability_min',
'relative_humidity_2m_mean',
'relative_humidity_2m_max',
'relative_humidity_2m_min',
'snowfall_water_equivalent_sum',
'pressure_msl_mean',
'pressure_msl_max',
'pressure_msl_min',
'surface_pressure_mean',
'surface_pressure_max',
'surface_pressure_min',
'updraft_max',
'visibility_mean',
'visibility_max',
'visibility_min',
'wind_gusts_10m_mean',
'wind_gusts_10m_min',
'wind_speed_10m_mean',
'wind_speed_10m_min',
'wet_bulb_temperature_2m_mean',
'wet_bulb_temperature_2m_max',
'wet_bulb_temperature_2m_min',
'vapour_pressure_deficit_max',
],
},
description: 'Daily weather variables to retrieve',
},
current_weather: {
type: 'boolean',
description: 'Include current weather conditions',
},
temperature_unit: {
type: 'string',
enum: ['celsius', 'fahrenheit'],
default: 'celsius',
description: 'Temperature unit',
},
wind_speed_unit: {
type: 'string',
enum: ['kmh', 'ms', 'mph', 'kn'],
default: 'kmh',
description: 'Wind speed unit',
},
precipitation_unit: {
type: 'string',
enum: ['mm', 'inch'],
default: 'mm',
description: 'Precipitation unit',
},
timezone: {
type: 'string',
description: 'Timezone for timestamps (e.g., Europe/Paris, America/New_York)',
},
past_days: {
type: 'integer',
enum: [1, 2],
description: 'Include past days data',
},
forecast_days: {
type: 'integer',
minimum: 1,
maximum: 16,
default: 7,
description: 'Number of forecast days',
},
models: {
type: 'string',
enum: [
'ecmwf_ifs_hres_9km',
'ecmwf_ifs_025',
'ecmwf_aifs_025_single',
'cma_grapes_global',
'bom_access_global',
'ncep_gfs_seamless',
'ncep_gfs_global',
'ncep_hrrr_us_conus',
'ncep_nbm_us_conus',
'ncep_nam_us_conus',
'ncep_gfs_graphcast',
'ncep_aigfs_025',
'ncep_hgefs_025_ensemble_mean',
'jma_seamless',
'jma_msm',
'jma_gsm',
'kma_seamless',
'kma_ldps',
'kma_gdps',
'dwd_icon_seamless',
'dwd_icon_global',
'dwd_icon_eu',
'dwd_icon_d2',
'gem_seamless',
'gem_global',
'gem_regional',
'gem_hrdps_continental',
'gem_hrdps_west',
'meteofrance_seamless',
'meteofrance_arpege_world',
'meteofrance_arpege_europe',
'meteofrance_arome_france',
'meteofrance_arome_france_hd',
'italiameteo_arpae_icon_2i',
'met_norway_nordic_seamless',
'met_norway_nordic',
'knmi_seamless',
'knmi_harmonie_arome_europe',
'knmi_harmonie_arome_netherlands',
'dmi_seamless',
'dmi_harmonie_arome_europe',
'uk_met_office_seamless',
'uk_met_office_global_10km',
'uk_met_office_uk_2km',
'meteoswiss_icon_seamless',
'meteoswiss_icon_ch1',
'meteoswiss_icon_ch2',
],
description:
'Weather model to use. Only one model per request — multi-value arrays are not supported by the API. Omit this parameter to let the API automatically select the best model for the location (recommended). For multi-model comparison, make one parallel tool call per model using the appropriate provider-specific tool.',
},
},
required: ['latitude', 'longitude'],
},
};
export const WEATHER_ARCHIVE_TOOL: Tool = {
name: 'weather_archive',
description:
'Get historical weather data from ERA5 reanalysis (1940-present) for specific coordinates and date range.',
inputSchema: {
type: 'object',
properties: {
latitude: {
type: 'number',
minimum: -90,
maximum: 90,
description: 'Latitude in WGS84 coordinate system',
},
longitude: {
type: 'number',
minimum: -180,
maximum: 180,
description: 'Longitude in WGS84 coordinate system',
},
start_date: {
type: 'string',
pattern: '^\\d{4}-\\d{2}-\\d{2}$',
description: 'Start date in YYYY-MM-DD format',
},
end_date: {
type: 'string',
pattern: '^\\d{4}-\\d{2}-\\d{2}$',
description: 'End date in YYYY-MM-DD format',
},
hourly: {
type: 'array',
items: {
type: 'string',
enum: [
'temperature_2m',
'relative_humidity_2m',
'precipitation',
'pressure_msl',
'wind_speed_10m',
'wind_direction_10m',
'shortwave_radiation',
],
},
description: 'Hourly weather variables to retrieve',
},
daily: {
type: 'array',
items: {
type: 'string',
enum: [
'temperature_2m_max',
'temperature_2m_min',
'precipitation_sum',
'wind_speed_10m_max',
'shortwave_radiation_sum',
],
},
description: 'Daily weather variables to retrieve',
},
temperature_unit: {
type: 'string',
enum: ['celsius', 'fahrenheit'],
default: 'celsius',
},
timezone: {
type: 'string',
description: 'Timezone for timestamps',
},
},
required: ['latitude', 'longitude', 'start_date', 'end_date'],
},
};
export const AIR_QUALITY_TOOL: Tool = {
name: 'air_quality',
description:
'Get air quality forecast data including PM2.5, PM10, ozone, nitrogen dioxide, pollen, European/US AQI indices, UV index and other pollutants.',
inputSchema: {
type: 'object',
properties: {
latitude: {
type: 'number',
minimum: -90,
maximum: 90,
description: 'Latitude in WGS84 coordinate system',
},
longitude: {
type: 'number',
minimum: -180,
maximum: 180,
description: 'Longitude in WGS84 coordinate system',
},
hourly: {
type: 'array',
items: {
type: 'string',
enum: [
'pm10',
'pm2_5',
'carbon_monoxide',
'nitrogen_dioxide',
'ozone',
'sulphur_dioxide',
'ammonia',
'dust',
'aerosol_optical_depth',
'carbon_dioxide',
'methane',
'alder_pollen',
'birch_pollen',
'grass_pollen',
'mugwort_pollen',
'olive_pollen',
'ragweed_pollen',
'european_aqi',
'european_aqi_pm2_5',
'european_aqi_pm10',
'european_aqi_nitrogen_dioxide',
'european_aqi_ozone',
'european_aqi_sulphur_dioxide',
'us_aqi',
'us_aqi_pm2_5',
'us_aqi_pm10',
'us_aqi_nitrogen_dioxide',
'us_aqi_ozone',
'us_aqi_sulphur_dioxide',
'us_aqi_carbon_monoxide',
'uv_index',
'uv_index_clear_sky',
],
},
description: 'Air quality variables to retrieve',
},
timezone: {
type: 'string',
description: 'Timezone for timestamps',
},
past_days: {
type: 'integer',
minimum: 1,
maximum: 7,
description: 'Include past days data',
},
forecast_days: {
type: 'integer',
minimum: 1,
maximum: 16,
default: 7,
description: 'Number of forecast days',
},
},
required: ['latitude', 'longitude'],
},
};
export const MARINE_WEATHER_TOOL: Tool = {
name: 'marine_weather',
description:
'Get marine weather forecast including wave height, wave period, wave direction and sea surface temperature.',
inputSchema: {
type: 'object',
properties: {
latitude: {
type: 'number',
minimum: -90,
maximum: 90,
description: 'Latitude in WGS84 coordinate system',
},
longitude: {
type: 'number',
minimum: -180,
maximum: 180,
description: 'Longitude in WGS84 coordinate system',
},
hourly: {
type: 'array',
items: {
type: 'string',
enum: [
'wave_height',
'wave_direction',
'wave_period',
'wave_peak_period',
'wind_wave_height',
'wind_wave_direction',
'wind_wave_period',
'wind_wave_peak_period',
'swell_wave_height',
'swell_wave_direction',
'swell_wave_period',
'swell_wave_peak_period',
'secondary_swell_wave_height',
'secondary_swell_wave_period',
'secondary_swell_wave_direction',
'tertiary_swell_wave_height',
'tertiary_swell_wave_period',
'tertiary_swell_wave_direction',
'sea_level_height_msl',
'sea_surface_temperature',
'ocean_current_velocity',
'ocean_current_direction',
'invert_barometer_height',
],
},
description: 'Marine weather variables to retrieve',
},
daily: {
type: 'array',
items: {
type: 'string',
enum: [
'wave_height_max',
'wave_direction_dominant',
'wave_period_max',
'wind_wave_height_max',
'wind_wave_direction_dominant',
'wind_wave_period_max',
'wind_wave_peak_period_max',
'swell_wave_height_max',
'swell_wave_direction_dominant',
'swell_wave_period_max',
'swell_wave_peak_period_max',
],
},
description: 'Daily marine weather variables to retrieve',
},
timezone: {
type: 'string',
description: 'Timezone for timestamps',
},
past_days: {
type: 'integer',
minimum: 1,
maximum: 7,
description: 'Include past days data',
},
forecast_days: {
type: 'integer',
minimum: 1,
maximum: 16,
default: 7,
description: 'Number of forecast days',
},
},
required: ['latitude', 'longitude'],
},
};
export const ELEVATION_TOOL: Tool = {
name: 'elevation',
description: 'Get elevation data for given coordinates using digital elevation models.',
inputSchema: {
type: 'object',
properties: {
latitude: {
type: 'number',
minimum: -90,
maximum: 90,
description: 'Latitude in WGS84 coordinate system',
},
longitude: {
type: 'number',
minimum: -180,
maximum: 180,
description: 'Longitude in WGS84 coordinate system',
},
},
required: ['latitude', 'longitude'],
},
};
export const WEATHER_MODEL_TOOLS: Tool[] = [
{
name: 'dwd_icon_forecast',
description:
'Get weather forecast from German DWD ICON model. IMPORTANT: Specify exactly one DWD model in the `models` parameter (e.g., "dwd_icon_global") — only one model per request is supported. For multi-model comparison, make one parallel tool call per model using the appropriate provider-specific tool.',
inputSchema: WEATHER_FORECAST_TOOL.inputSchema,
},
{
name: 'gfs_forecast',
description:
'Get weather forecast from US NOAA GFS model. IMPORTANT: Specify exactly one GFS model in the `models` parameter (e.g., "ncep_gfs_global") — only one model per request is supported. For multi-model comparison, make one parallel tool call per model using the appropriate provider-specific tool.',
inputSchema: WEATHER_FORECAST_TOOL.inputSchema,
},
{
name: 'meteofrance_forecast',
description:
'Get weather forecast from French Météo-France models. IMPORTANT: Specify exactly one Météo-France model in the `models` parameter (e.g., "meteofrance_arome_france" or "meteofrance_arpege_europe") — only one model per request is supported. For multi-model comparison, make one parallel tool call per model using the appropriate provider-specific tool.',
inputSchema: WEATHER_FORECAST_TOOL.inputSchema,
},
{
name: 'ecmwf_forecast',
description:
'Get weather forecast from ECMWF models via the dedicated /v1/ecmwf endpoint. IMPORTANT: Specify exactly one model in the `models` parameter — only one model per request is supported. Valid model IDs for this endpoint are: "ecmwf_ifs" (IFS HRES, high-resolution), "ecmwf_ifs025" (IFS open-data at 0.25°), "best_match". Note: "ecmwf_ifs_025", "ecmwf_ifs_hres_9km", and "ecmwf_aifs_025_single" are NOT valid on this endpoint and will return 400. For multi-model comparison, make one parallel tool call per model using the appropriate provider-specific tool.',
inputSchema: {
...WEATHER_FORECAST_TOOL.inputSchema,
properties: {
...(WEATHER_FORECAST_TOOL.inputSchema.properties as Record<string, unknown>),
models: {
type: 'string',
enum: ['ecmwf_ifs', 'ecmwf_ifs025', 'best_match'],
description:
'ECMWF model to use on the /v1/ecmwf endpoint. Only one model per request. Valid values: "ecmwf_ifs" (IFS HRES high-resolution), "ecmwf_ifs025" (IFS open-data 0.25°), "best_match". Omit to use the endpoint default.',
},
},
},
},
{
name: 'jma_forecast',
description:
'Get weather forecast from Japan Meteorological Agency (JMA) models. IMPORTANT: Specify exactly one JMA model in the `models` parameter (e.g., "jma_msm" or "jma_gsm") — only one model per request is supported. For multi-model comparison, make one parallel tool call per model using the appropriate provider-specific tool.',
inputSchema: WEATHER_FORECAST_TOOL.inputSchema,
},
{
name: 'metno_forecast',
description:
'Get weather forecast from Norwegian Meteorological Institute models. IMPORTANT: Specify exactly one Met.no model in the `models` parameter (e.g., "met_norway_nordic") — only one model per request is supported. For multi-model comparison, make one parallel tool call per model using the appropriate provider-specific tool.',
inputSchema: WEATHER_FORECAST_TOOL.inputSchema,
},
{
name: 'gem_forecast',
description:
'Get weather forecast from Canadian Meteorological Centre (GEM) models. IMPORTANT: Specify exactly one GEM model in the `models` parameter (e.g., "gem_global" or "gem_regional") — only one model per request is supported. For multi-model comparison, make one parallel tool call per model using the appropriate provider-specific tool.',
inputSchema: WEATHER_FORECAST_TOOL.inputSchema,
},
];
export const FLOOD_FORECAST_TOOL: Tool = {
name: 'flood_forecast',
description:
'Get river discharge and flood forecasts from GloFAS (Global Flood Awareness System).',
inputSchema: {
type: 'object',
properties: {
latitude: {
type: 'number',
minimum: -90,
maximum: 90,
description: 'Latitude in WGS84 coordinate system',
},
longitude: {
type: 'number',
minimum: -180,
maximum: 180,
description: 'Longitude in WGS84 coordinate system',
},
daily: {
type: 'array',
items: {
type: 'string',
enum: [
'river_discharge',
'river_discharge_mean',
'river_discharge_median',
'river_discharge_max',
'river_discharge_min',
'river_discharge_p25',
'river_discharge_p75',
],
},
description: 'River discharge variables to retrieve',
},
timezone: {
type: 'string',
description: 'Timezone for timestamps',
},
past_days: {
type: 'integer',
minimum: 1,
maximum: 7,
description: 'Include past days data',
},
forecast_days: {
type: 'integer',
minimum: 1,
maximum: 210,
default: 92,
description: 'Number of forecast days (up to 210 days possible)',
},
ensemble: {
type: 'boolean',
description: 'If true, all forecast ensemble members will be returned',
},
},
required: ['latitude', 'longitude'],
},
};
export const SEASONAL_FORECAST_TOOL: Tool = {
name: 'seasonal_forecast',
description:
'Get long-range seasonal forecasts for temperature and precipitation up to 9 months ahead.',
inputSchema: {
type: 'object',
properties: {
latitude: {
type: 'number',
minimum: -90,
maximum: 90,
description: 'Latitude in WGS84 coordinate system',
},
longitude: {
type: 'number',
minimum: -180,
maximum: 180,
description: 'Longitude in WGS84 coordinate system',
},
hourly: {
type: 'array',
items: {
type: 'string',
enum: [
'pressure_msl',
'temperature_2m',
'temperature_2m_max',
'temperature_2m_min',
'shortwave_radiation',
'cloud_cover',
'precipitation',
'showers',
'wind_speed_10m',
'wind_direction_10m',
'relative_humidity_2m',
'soil_temperature_0_to_10cm',
'soil_moisture_0_to_10cm',
'soil_moisture_10_to_40cm',
'soil_moisture_40_to_100cm',
'soil_moisture_100_to_200cm',
],
},
description: '6-hourly weather variables to retrieve',
},
daily: {
type: 'array',
items: {
type: 'string',
enum: [
'temperature_2m_max',
'temperature_2m_min',
'shortwave_radiation_sum',
'precipitation_sum',
'rain_sum',
'precipitation_hours',
'wind_speed_10m_max',
'wind_direction_10m_dominant',
],
},
description: 'Daily weather variables to retrieve',
},
forecast_days: {
type: 'integer',
enum: [45, 92, 183, 274],
default: 92,
description: 'Number of forecast days: 45 days, 3 months (default), 6 months, or 9 months',
},
past_days: {
type: 'integer',
minimum: 0,
maximum: 92,
description: 'Include past days data',
},
start_date: {
type: 'string',
pattern: '^\\d{4}-\\d{2}-\\d{2}$',
description: 'Start date in YYYY-MM-DD format',
},
end_date: {
type: 'string',
pattern: '^\\d{4}-\\d{2}-\\d{2}$',
description: 'End date in YYYY-MM-DD format',
},
temperature_unit: {
type: 'string',
enum: ['celsius', 'fahrenheit'],
default: 'celsius',
},
wind_speed_unit: {
type: 'string',
enum: ['kmh', 'ms', 'mph', 'kn'],
default: 'kmh',
},
precipitation_unit: {
type: 'string',
enum: ['mm', 'inch'],
default: 'mm',
},
timezone: {
type: 'string',
description: 'Timezone for timestamps',
},
},
required: ['latitude', 'longitude'],
},
};
export const CLIMATE_PROJECTION_TOOL: Tool = {
name: 'climate_projection',
description: 'Get climate change projections from CMIP6 models for different warming scenarios.',
inputSchema: {
type: 'object',
properties: {
latitude: {
type: 'number',
minimum: -90,
maximum: 90,
description: 'Latitude in WGS84 coordinate system',
},
longitude: {
type: 'number',
minimum: -180,
maximum: 180,
description: 'Longitude in WGS84 coordinate system',
},
daily: {
type: 'array',
items: {
type: 'string',
enum: [
'temperature_2m_max',
'temperature_2m_min',
'temperature_2m_mean',
'cloud_cover_mean',
'relative_humidity_2m_max',
'relative_humidity_2m_min',
'relative_humidity_2m_mean',
'soil_moisture_0_to_10cm_mean',
'precipitation_sum',
'rain_sum',
'snowfall_sum',
'wind_speed_10m_mean',
'wind_speed_10m_max',
'pressure_msl_mean',
'shortwave_radiation_sum',
],
},
description: 'Climate projection variables to retrieve',
},
start_date: {
type: 'string',
pattern: '^\\d{4}-\\d{2}-\\d{2}$',
description: 'Start date in YYYY-MM-DD format',
},
end_date: {
type: 'string',
pattern: '^\\d{4}-\\d{2}-\\d{2}$',
description: 'End date in YYYY-MM-DD format',
},
models: {
type: 'array',
items: {
type: 'string',
enum: [
'CMCC_CM2_VHR4',
'FGOALS_f3_H',
'HiRAM_SIT_HR',
'MRI_AGCM3_2_S',
'EC_Earth3P_HR',
'MPI_ESM1_2_XR',
'NICAM16_8S',
],
},
description: 'CMIP6 climate models to use',
},
temperature_unit: {
type: 'string',
enum: ['celsius', 'fahrenheit'],
default: 'celsius',
},
wind_speed_unit: {
type: 'string',
enum: ['kmh', 'ms', 'mph', 'kn'],
default: 'kmh',
},
precipitation_unit: {
type: 'string',
enum: ['mm', 'inch'],
default: 'mm',
},
disable_bias_correction: {
type: 'boolean',
default: false,
description: 'Disable statistical downscaling and bias correction',
},
},
required: ['latitude', 'longitude', 'start_date', 'end_date', 'models', 'daily'],
},
};
export const ENSEMBLE_FORECAST_TOOL: Tool = {
name: 'ensemble_forecast',
description: 'Get ensemble forecasts showing forecast uncertainty with multiple model runs.',
inputSchema: {
type: 'object',
properties: {
latitude: {
type: 'number',
minimum: -90,
maximum: 90,
description: 'Latitude in WGS84 coordinate system',
},
longitude: {
type: 'number',
minimum: -180,
maximum: 180,
description: 'Longitude in WGS84 coordinate system',
},
models: {
type: 'array',
items: {
type: 'string',
enum: [
'icon_seamless_eps',
'icon_global_eps',
'icon_eu_eps',
'icon_d2_eps',
'gfs_seamless',
'gfs_ensemble_025',
'gfs_ensemble_05',
'aigefs_025',
'ecmwf_ifs_025',
'ecmwf_aifs_025',
'gem_global',
'bom_access_global',
'ukmo_global_20km',
'ukmo_uk_2km',
'meteoswiss_icon_ch1',
'meteoswiss_icon_ch2',
],
},
description:
'Ensemble model to use. Only one model per request — multi-value arrays are not supported by the API.',
},
hourly: {
type: 'array',
items: {
type: 'string',
enum: [
'temperature_2m',
'relative_humidity_2m',
'dew_point_2m',
'apparent_temperature',
'precipitation',
'rain',
'snowfall',
'snow_depth',
'weather_code',
'pressure_msl',
'surface_pressure',
'cloud_cover',
'visibility',
'wind_speed_10m',
'wind_direction_10m',
'wind_gusts_10m',
'wind_speed_80m',
'wind_direction_80m',
'wind_speed_100m',
'wind_direction_100m',
'surface_temperature',
'soil_temperature_0_to_10cm',
'cape',
'et0_fao_evapotranspiration',
'vapour_pressure_deficit',
'shortwave_radiation',
'uv_index',
'uv_index_clear_sky',
'temperature_3h_min_2m',
'temperature_3h_max_2m',
'wet_bulb_temperature_2m',
'convective_inhibition',
'freezing_level_height',
'snowfall_height',
'sunshine_duration',
'snowfall_water_equivalent',
'snow_depth_water_equivalent',
],
},
description: 'Hourly weather variables to retrieve',
},
daily: {
type: 'array',
items: {
type: 'string',
enum: [
'temperature_2m_mean',
'temperature_2m_min',
'temperature_2m_max',
'apparent_temperature_mean',
'apparent_temperature_min',
'apparent_temperature_max',
'wind_speed_10m_mean',
'wind_speed_10m_min',
'wind_speed_10m_max',
'wind_direction_10m_dominant',
'wind_gusts_10m_mean',
'wind_gusts_10m_min',
'wind_gusts_10m_max',
'wind_speed_100m_mean',
'wind_speed_100m_min',
'wind_speed_100m_max',
'wind_direction_100m_dominant',
'precipitation_sum',
'precipitation_hours',
'rain_sum',
'snowfall_sum',
'pressure_msl_mean',
'pressure_msl_min',
'pressure_msl_max',
'surface_pressure_mean',
'surface_pressure_min',
'surface_pressure_max',
'cloud_cover_mean',
'cloud_cover_min',
'cloud_cover_max',
'relative_humidity_2m_mean',
'relative_humidity_2m_min',
'relative_humidity_2m_max',
'dew_point_2m_mean',
'dew_point_2m_min',
'dew_point_2m_max',
'cape_mean',
'cape_min',
'cape_max',
'shortwave_radiation_sum',
],
},
description: 'Daily weather variables to retrieve',
},
forecast_days: {
type: 'integer',
minimum: 1,
maximum: 35,
default: 7,
description: 'Number of forecast days',
},
temperature_unit: {
type: 'string',
enum: ['celsius', 'fahrenheit'],
default: 'celsius',
},
wind_speed_unit: {
type: 'string',
enum: ['kmh', 'ms', 'mph', 'kn'],
default: 'kmh',
},
precipitation_unit: {
type: 'string',
enum: ['mm', 'inch'],
default: 'mm',
},
timezone: {
type: 'string',
description: 'Timezone for timestamps',
},
},
required: ['latitude', 'longitude', 'models'],
},
};
export const GEOCODING_TOOL: Tool = {
name: 'geocoding',
description:
'Search for locations worldwide by place name or postal code. Returns geographic coordinates (latitude and longitude) and detailed location information. Use this tool when you need to convert a location name (e.g., "Paris", "New York") into precise coordinates (latitude/longitude) that are required by other tools. This is essential when you have a location name but need coordinates for data fetching tools.',
inputSchema: {
type: 'object',
properties: {
name: {
type: 'string',
minLength: 2,
description:
'Place name or postal code to search for. Minimum 2 characters required. Examples: "Paris", "Berlin", "75001", "10967"',
},
count: {
type: 'integer',
minimum: 1,
maximum: 100,
default: 10,
description: 'Number of search results to return (maximum 100)',
},
language: {
type: 'string',
description:
'Language code for translated results (e.g., "fr", "en", "de"). Returns translated results if available, otherwise in English or native language.',
},
countryCode: {
type: 'string',
pattern: '^[A-Z]{2}$',
description:
'ISO-3166-1 alpha2 country code to filter results (e.g., "FR", "DE", "US"). Limits search to a specific country.',
},
format: {
type: 'string',
enum: ['json', 'protobuf'],
default: 'json',
description: 'Return format for results',
},
},
required: ['name'],
},
};
export const ALL_TOOLS: Tool[] = [
WEATHER_FORECAST_TOOL,
WEATHER_ARCHIVE_TOOL,
AIR_QUALITY_TOOL,
MARINE_WEATHER_TOOL,
ELEVATION_TOOL,
FLOOD_FORECAST_TOOL,
SEASONAL_FORECAST_TOOL,
CLIMATE_PROJECTION_TOOL,
ENSEMBLE_FORECAST_TOOL,
GEOCODING_TOOL,
...WEATHER_MODEL_TOOLS,
];