get_weather_forecast
Retrieve a 5-day weather forecast for any city with temperature data in Celsius or Fahrenheit units.
Instructions
Get 5-day weather forecast for a specific city
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | City name (e.g., "Taipei", "Tokyo", "New York") | |
| units | No | Temperature units: "metric" (Celsius) or "imperial" (Fahrenheit) | metric |
Implementation Reference
- index.js:204-257 (handler)The main handler function that fetches the 5-day weather forecast from the OpenWeatherMap API, groups data by day, computes high/low temps and dominant condition, and formats a textual response.async getWeatherForecast(city, units = 'metric') { const url = `${API_BASE_URL}/forecast?q=${encodeURIComponent(city)}&units=${units}&appid=${API_KEY}`; const response = await fetch(url); if (!response.ok) { if (response.status === 404) { throw new Error(`City "${city}" not found`); } throw new Error(`Weather API error: ${response.statusText}`); } const data = await response.json(); // Format the response const tempUnit = units === 'metric' ? 'ยฐC' : 'ยฐF'; // Group forecasts by day const dailyForecasts = {}; data.list.forEach(item => { const date = new Date(item.dt * 1000).toLocaleDateString(); if (!dailyForecasts[date]) { dailyForecasts[date] = []; } dailyForecasts[date].push(item); }); // Build forecast text let forecastText = `๐ 5-Day Weather Forecast for ${data.city.name}, ${data.city.country}\n\n`; Object.entries(dailyForecasts).slice(0, 5).forEach(([date, forecasts]) => { const temps = forecasts.map(f => f.main.temp); const maxTemp = Math.max(...temps); const minTemp = Math.min(...temps); const conditions = forecasts.map(f => f.weather[0].main); const mostCommon = conditions.sort((a,b) => conditions.filter(v => v===a).length - conditions.filter(v => v===b).length ).pop(); forecastText += `${date}:\n`; forecastText += ` High: ${maxTemp.toFixed(1)}${tempUnit} | Low: ${minTemp.toFixed(1)}${tempUnit}\n`; forecastText += ` Condition: ${mostCommon}\n\n`; }); return { content: [ { type: 'text', text: forecastText.trim(), }, ], }; }
- index.js:100-115 (schema)Input schema defining the required 'city' parameter and optional 'units' parameter (metric or imperial) for the tool.inputSchema: { type: 'object', properties: { city: { type: 'string', description: 'City name (e.g., "Taipei", "Tokyo", "New York")', }, units: { type: 'string', description: 'Temperature units: "metric" (Celsius) or "imperial" (Fahrenheit)', enum: ['metric', 'imperial'], default: 'metric', }, }, required: ['city'], },
- index.js:97-116 (registration)Tool registration in the ListTools response, including name, description, and input schema.{ name: 'get_weather_forecast', description: 'Get 5-day weather forecast for a specific city', inputSchema: { type: 'object', properties: { city: { type: 'string', description: 'City name (e.g., "Taipei", "Tokyo", "New York")', }, units: { type: 'string', description: 'Temperature units: "metric" (Celsius) or "imperial" (Fahrenheit)', enum: ['metric', 'imperial'], default: 'metric', }, }, required: ['city'], }, },
- index.js:129-130 (registration)Dispatch case in the CallToolRequestSchema handler that routes calls to the getWeatherForecast method.case 'get_weather_forecast': return await this.getWeatherForecast(args.city, args.units || 'metric');