Skip to main content
Glama
Yarflam

Weather MCP Server

by Yarflam

get_weather_by_coordinates

Retrieve weather data and forecasts for specific geographic coordinates using latitude and longitude values.

Instructions

Récupère la météo selon les coordonnées géographiques

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
latNoLatitude (-33.8688 pour Sydney par défaut)
lonNoLongitude (151.2093 pour Sydney par défaut)
daysNoNombre de jours de prévision (1-7)

Implementation Reference

  • The primary handler function executing the tool logic. Fetches current weather (days=1) or forecast (days>1) using Open-Meteo API for given coordinates, formats and returns formatted text response.
      async getWeatherByCoordinates(lat, lon, days) {
        const currentUrl = `${WEATHER_API}?latitude=${lat}&longitude=${lon}¤t=temperature_2m,relative_humidity_2m,apparent_temperature,is_day,precipitation,weather_code,cloud_cover,pressure_msl,wind_speed_10m,wind_direction_10m&timezone=auto`;
        
        if (days === 1) {
          const response = await fetch(currentUrl);
          const data = await response.json();
    
          if (!response.ok) {
            throw new Error('Erreur lors de la récupération de la météo');
          }
    
          const current = data.current;
          const weatherDesc = this.getWeatherDescription(current.weather_code);
          const windDir = this.getWindDirection(current.wind_direction_10m);
          
          return {
            content: [
              {
                type: 'text',
                text: `🌤️ Météo actuelle aux coordonnées ${lat}°, ${lon}°
    
    🌡️ **Température:** ${Math.round(current.temperature_2m)}°C
    🤔 **Ressenti:** ${Math.round(current.apparent_temperature)}°C
    ☁️ **Conditions:** ${weatherDesc} ${current.is_day ? '☀️' : '🌙'}
    💧 **Humidité:** ${current.relative_humidity_2m}%
    🌬️ **Vent:** ${Math.round(current.wind_speed_10m)} km/h ${windDir}
    🔽 **Pression:** ${Math.round(current.pressure_msl)} hPa
    ☁️ **Couverture nuageuse:** ${current.cloud_cover}%
    
    ⏰ **Dernière mise à jour:** ${new Date(current.time).toLocaleString('fr-FR')}`,
              },
            ],
          };
        } else {
          // Prévisions multi-jours
          const forecastUrl = `${WEATHER_API}?latitude=${lat}&longitude=${lon}&daily=weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,wind_speed_10m_max&timezone=auto&forecast_days=${days}`;
          const response = await fetch(forecastUrl);
          const data = await response.json();
    
          if (!response.ok) {
            throw new Error('Erreur lors de la récupération des prévisions');
          }
    
          const daily = data.daily;
          let forecastText = `🗓️ Prévisions ${days} jours aux coordonnées ${lat}°, ${lon}°\n\n`;
          
          for (let i = 0; i < days; i++) {
            const date = new Date(daily.time[i]);
            const dayName = date.toLocaleDateString('fr-FR', { weekday: 'long' });
            const dateStr = date.toLocaleDateString('fr-FR');
            const weatherDesc = this.getWeatherDescription(daily.weather_code[i]);
            
            forecastText += `📅 **${dayName.charAt(0).toUpperCase() + dayName.slice(1)} ${dateStr}**\n`;
            forecastText += `🌡️ ${Math.round(daily.temperature_2m_min[i])}°C → ${Math.round(daily.temperature_2m_max[i])}°C\n`;
            forecastText += `☁️ ${weatherDesc}\n`;
            if (daily.precipitation_sum[i] > 0) {
              forecastText += `🌧️ ${daily.precipitation_sum[i]}mm\n`;
            }
            forecastText += `\n`;
          }
    
          return {
            content: [
              {
                type: 'text',
                text: forecastText.trim(),
              },
            ],
          };
        }
      }
  • Input schema defining parameters: lat (number, default -33.8688), lon (number, default 151.2093), days (number 1-7, default 1). No required fields.
    inputSchema: {
      type: 'object',
      properties: {
        lat: {
          type: 'number',
          description: 'Latitude (-33.8688 pour Sydney par défaut)',
          default: -33.8688
        },
        lon: {
          type: 'number',
          description: 'Longitude (151.2093 pour Sydney par défaut)',
          default: 151.2093
        },
        days: {
          type: 'number',
          description: 'Nombre de jours de prévision (1-7)',
          default: 1,
          minimum: 1,
          maximum: 7
        }
      },
      required: [],
    },
  • src/index.js:96-122 (registration)
    Tool registration in the ListTools response, specifying name, description, and input schema.
    {
      name: 'get_weather_by_coordinates',
      description: 'Récupère la météo selon les coordonnées géographiques',
      inputSchema: {
        type: 'object',
        properties: {
          lat: {
            type: 'number',
            description: 'Latitude (-33.8688 pour Sydney par défaut)',
            default: -33.8688
          },
          lon: {
            type: 'number',
            description: 'Longitude (151.2093 pour Sydney par défaut)',
            default: 151.2093
          },
          days: {
            type: 'number',
            description: 'Nombre de jours de prévision (1-7)',
            default: 1,
            minimum: 1,
            maximum: 7
          }
        },
        required: [],
      },
    },
  • src/index.js:152-157 (registration)
    Dispatch logic in CallToolRequest handler switch statement, mapping tool name to the getWeatherByCoordinates method with default args.
    case 'get_weather_by_coordinates':
      return await this.getWeatherByCoordinates(
        args.lat || DEFAULT_LOCATION.latitude, 
        args.lon || DEFAULT_LOCATION.longitude, 
        args.days || 1
      );
  • Helper function to translate weather codes to French descriptions, used in getWeatherByCoordinates.
    getWeatherDescription(code) {
      const descriptions = {
        0: 'Ciel dégagé',
        1: 'Principalement dégagé',
        2: 'Partiellement nuageux',
        3: 'Couvert',
        45: 'Brouillard',
        48: 'Brouillard givrant',
        51: 'Bruine légère',
        53: 'Bruine modérée',
        55: 'Bruine dense',
        56: 'Bruine verglaçante légère',
        57: 'Bruine verglaçante dense',
        61: 'Pluie légère',
        63: 'Pluie modérée',
        65: 'Pluie forte',
        66: 'Pluie verglaçante légère',
        67: 'Pluie verglaçante forte',
        71: 'Neige légère',
        73: 'Neige modérée',
        75: 'Neige forte',
        77: 'Grains de neige',
        80: 'Averses légères',
        81: 'Averses modérées',
        82: 'Averses violentes',
        85: 'Averses de neige légères',
        86: 'Averses de neige fortes',
        95: 'Orage',
        96: 'Orage avec grêle légère',
        99: 'Orage avec grêle forte'
      };
      
      return descriptions[code] || 'Conditions inconnues';
    }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Yarflam/weather-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server