Skip to main content
Glama
nabossha

LandiWetter MCP Server

by nabossha

getWeatherForecast

Retrieve precise weather forecasts for Swiss locations by specifying a location ID and optional date. Access detailed hourly and daily data with the LandiWetter MCP Server API.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
dateNoOptional: The date for the forecast (yyyy-MM-dd). Defaults to today
locationIdYesThe location ID (e.g., G2661552)

Implementation Reference

  • Primary execution logic for the getWeatherForecast tool: validates date, fetches data via helper, formats detailed forecast output, handles errors.
    async ({ locationId, date }) => {
      try {
        // Use provided date or default to today
        const forecastDate = date ? new Date(date) : new Date();
        
        // Validate date
        if (isNaN(forecastDate.getTime())) {
          return {
            content: [{ type: "text", text: "Invalid date format. Please use yyyy-MM-dd." }],
            isError: true
          };
        }
        
        const forecast = await getWeatherForecast(locationId, forecastDate);
        
        // Handle error if forecast data is incomplete
        if (!forecast || !forecast.datum) {
          console.error('Invalid forecast data:', forecast);
          return {
            content: [{ type: "text", text: "Received invalid forecast data from API." }],
            isError: true
          };
        }
        
        // Format the response nicely using the actual structure
        let formattedForecast = `Weather Forecast for date ${forecast.datum}:\n\n`;
        
        // Add general weather overview for the whole day
        if (forecast.ganzertag) {
          const dayData = forecast.ganzertag;
          formattedForecast += `### Daily Overview\n`;
          formattedForecast += `Temperature: ${dayData.uebersicht.mintemp} to ${dayData.uebersicht.maxtemp}\n`;
          formattedForecast += `Precipitation: ${dayData.niederschlag.menge} (Probability: ${dayData.niederschlag.wahrscheinlichkeit})\n`;
          formattedForecast += `Cloud coverage: ${dayData.niederschlag.wolken}\n`;
          formattedForecast += `Wind: ${dayData.wind.geschwindigkeit} from ${dayData.wind.richtung}\n`;
          formattedForecast += `Sunshine duration: ${dayData.sonne.dauer}\n\n`;
        }
        
        // Add time sections for detailed forecast
        if (forecast.abschnitte && forecast.abschnitte.length > 0) {
          formattedForecast += `### Hourly Forecast\n`;
          
          forecast.abschnitte.forEach(section => {
            formattedForecast += `\n${section.zeitvon} - ${section.zeitbis}:\n`;
            formattedForecast += `Temperature: ${section.uebersicht.mintemp} to ${section.uebersicht.maxtemp}\n`;
            formattedForecast += `Precipitation: ${section.niederschlag.menge} (Probability: ${section.niederschlag.wahrscheinlichkeit})\n`;
            formattedForecast += `Wind: ${section.wind.geschwindigkeit} from ${section.wind.richtung}\n`;
          });
        }
        
        // Add general weather situation and outlook if available
        if (forecast.allgemeineLage) {
          formattedForecast += `\n### General Weather Situation\n${forecast.allgemeineLage}\n`;
        }
        
        if (forecast.aussichten) {
          formattedForecast += `\n### Outlook\n${forecast.aussichten}\n`;
        }
        
        return {
          content: [{ type: "text", text: formattedForecast }]
        };
      } catch (error) {
        return {
          content: [{ type: "text", text: `Error: ${error.message}` }],
          isError: true
        };
      }
    }
  • Core helper function that constructs the API URL using locationId and formatted date, fetches forecast data from LandiWetter API via axios, returns raw data or throws error.
    async function getWeatherForecast(locationId, date) {
      try {
        const formattedDate = formatDate(date);
        const url = `https://www.landi.ch/weather/api/lokalprognose/de/${formattedDate}/${locationId}`;
        console.error('Weather API URL:', url);
        const response = await axios.get(url);
        console.error('Weather API Response:', JSON.stringify(response.data, null, 2));
        return response.data;
      } catch (error) {
        console.error("Error fetching weather forecast:", error.message);
        throw new Error(`Failed to fetch weather forecast: ${error.message}`);
      }
    }
  • Input schema using Zod for tool parameters: required locationId (string) and optional date (string).
    { 
      locationId: z.string().describe("The location ID (e.g., G2661552)"),
      date: z.string().optional().describe("Optional: The date for the forecast (yyyy-MM-dd). Defaults to today")
    },
  • src/index.js:77-152 (registration)
    Tool registration via server.tool() specifying name, input schema, and handler function.
    server.tool(
      "getWeatherForecast",
      { 
        locationId: z.string().describe("The location ID (e.g., G2661552)"),
        date: z.string().optional().describe("Optional: The date for the forecast (yyyy-MM-dd). Defaults to today")
      },
      async ({ locationId, date }) => {
        try {
          // Use provided date or default to today
          const forecastDate = date ? new Date(date) : new Date();
          
          // Validate date
          if (isNaN(forecastDate.getTime())) {
            return {
              content: [{ type: "text", text: "Invalid date format. Please use yyyy-MM-dd." }],
              isError: true
            };
          }
          
          const forecast = await getWeatherForecast(locationId, forecastDate);
          
          // Handle error if forecast data is incomplete
          if (!forecast || !forecast.datum) {
            console.error('Invalid forecast data:', forecast);
            return {
              content: [{ type: "text", text: "Received invalid forecast data from API." }],
              isError: true
            };
          }
          
          // Format the response nicely using the actual structure
          let formattedForecast = `Weather Forecast for date ${forecast.datum}:\n\n`;
          
          // Add general weather overview for the whole day
          if (forecast.ganzertag) {
            const dayData = forecast.ganzertag;
            formattedForecast += `### Daily Overview\n`;
            formattedForecast += `Temperature: ${dayData.uebersicht.mintemp} to ${dayData.uebersicht.maxtemp}\n`;
            formattedForecast += `Precipitation: ${dayData.niederschlag.menge} (Probability: ${dayData.niederschlag.wahrscheinlichkeit})\n`;
            formattedForecast += `Cloud coverage: ${dayData.niederschlag.wolken}\n`;
            formattedForecast += `Wind: ${dayData.wind.geschwindigkeit} from ${dayData.wind.richtung}\n`;
            formattedForecast += `Sunshine duration: ${dayData.sonne.dauer}\n\n`;
          }
          
          // Add time sections for detailed forecast
          if (forecast.abschnitte && forecast.abschnitte.length > 0) {
            formattedForecast += `### Hourly Forecast\n`;
            
            forecast.abschnitte.forEach(section => {
              formattedForecast += `\n${section.zeitvon} - ${section.zeitbis}:\n`;
              formattedForecast += `Temperature: ${section.uebersicht.mintemp} to ${section.uebersicht.maxtemp}\n`;
              formattedForecast += `Precipitation: ${section.niederschlag.menge} (Probability: ${section.niederschlag.wahrscheinlichkeit})\n`;
              formattedForecast += `Wind: ${section.wind.geschwindigkeit} from ${section.wind.richtung}\n`;
            });
          }
          
          // Add general weather situation and outlook if available
          if (forecast.allgemeineLage) {
            formattedForecast += `\n### General Weather Situation\n${forecast.allgemeineLage}\n`;
          }
          
          if (forecast.aussichten) {
            formattedForecast += `\n### Outlook\n${forecast.aussichten}\n`;
          }
          
          return {
            content: [{ type: "text", text: formattedForecast }]
          };
        } catch (error) {
          return {
            content: [{ type: "text", text: `Error: ${error.message}` }],
            isError: true
          };
        }
      }
    );
  • Utility helper to format a Date object to yyyy-MM-dd string used in API calls.
    function formatDate(date) {
      return date.toISOString().split('T')[0];
    }
Install Server

Other Tools

Related Tools

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/nabossha/mcp-landiwetter'

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