Skip to main content
Glama
adarshem

MCP Weather Server

get-forecast

Fetch weather forecasts for any location using latitude and longitude coordinates via the MCP Weather Server, powered by the US National Weather Service API.

Instructions

Get weather forecast for a location

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
latitudeYesLatitude of the location
longitudeYesLongitude of the location

Implementation Reference

  • Handler function that fetches weather grid points, retrieves forecast data from NWS API, formats periods with temperature, wind, and short forecast, and returns formatted text response.
    async ({ latitude, longitude }) => {
      // Get grid point data
      const pointsUrl = `${NWS_API_BASE}/points/${latitude.toFixed(
        4
      )},${longitude.toFixed(4)}`;
      const pointsData = await makeNWSRequest<PointsResponse>(pointsUrl);
    
      if (!pointsData) {
        return {
          content: [
            {
              type: 'text',
              text: `Failed to retrieve grid point data for coordinates: ${latitude}, ${longitude}. This location may not be supported by the NWS API (only US locations are supported).`
            }
          ]
        };
      }
    
      const forecastUrl = pointsData.properties?.forecast;
      if (!forecastUrl) {
        return {
          content: [
            {
              type: 'text',
              text: 'Failed to get forecast URL from grid point data'
            }
          ]
        };
      }
    
      // Get forecast data
      const forecastData = await makeNWSRequest<ForecastResponse>(forecastUrl);
      if (!forecastData) {
        return {
          content: [
            {
              type: 'text',
              text: 'Failed to retrieve forecast data'
            }
          ]
        };
      }
    
      const periods = forecastData.properties?.periods || [];
      if (periods.length === 0) {
        return {
          content: [
            {
              type: 'text',
              text: 'No forecast periods available'
            }
          ]
        };
      }
    
      // Format forecast periods
      const formattedForecast = periods.map((period: ForecastPeriod) =>
        [
          `${period.name || 'Unknown'}:`,
          `Temperature: ${period.temperature || 'Unknown'}°${
            period.temperatureUnit || 'F'
          }`,
          `Wind: ${period.windSpeed || 'Unknown'} ${period.windDirection || ''}`,
          `${period.shortForecast || 'No forecast available'}`,
          '---'
        ].join('\n')
      );
    
      const forecastText = `Forecast for ${latitude}, ${longitude}:\n\n${formattedForecast.join(
        '\n'
      )}`;
    
      return {
        content: [
          {
            type: 'text',
            text: forecastText
          }
        ]
      };
    }
  • Zod input schema validating latitude (-90 to 90) and longitude (-180 to 180) parameters.
    {
      latitude: z.number().min(-90).max(90).describe('Latitude of the location'),
      longitude: z
        .number()
        .min(-180)
        .max(180)
        .describe('Longitude of the location')
    },
  • src/index.ts:136-228 (registration)
    Full tool registration using server.tool, including name, description, input schema, and inline handler function.
    server.tool(
      'get-forecast',
      'Get weather forecast for a location',
      {
        latitude: z.number().min(-90).max(90).describe('Latitude of the location'),
        longitude: z
          .number()
          .min(-180)
          .max(180)
          .describe('Longitude of the location')
      },
      async ({ latitude, longitude }) => {
        // Get grid point data
        const pointsUrl = `${NWS_API_BASE}/points/${latitude.toFixed(
          4
        )},${longitude.toFixed(4)}`;
        const pointsData = await makeNWSRequest<PointsResponse>(pointsUrl);
    
        if (!pointsData) {
          return {
            content: [
              {
                type: 'text',
                text: `Failed to retrieve grid point data for coordinates: ${latitude}, ${longitude}. This location may not be supported by the NWS API (only US locations are supported).`
              }
            ]
          };
        }
    
        const forecastUrl = pointsData.properties?.forecast;
        if (!forecastUrl) {
          return {
            content: [
              {
                type: 'text',
                text: 'Failed to get forecast URL from grid point data'
              }
            ]
          };
        }
    
        // Get forecast data
        const forecastData = await makeNWSRequest<ForecastResponse>(forecastUrl);
        if (!forecastData) {
          return {
            content: [
              {
                type: 'text',
                text: 'Failed to retrieve forecast data'
              }
            ]
          };
        }
    
        const periods = forecastData.properties?.periods || [];
        if (periods.length === 0) {
          return {
            content: [
              {
                type: 'text',
                text: 'No forecast periods available'
              }
            ]
          };
        }
    
        // Format forecast periods
        const formattedForecast = periods.map((period: ForecastPeriod) =>
          [
            `${period.name || 'Unknown'}:`,
            `Temperature: ${period.temperature || 'Unknown'}°${
              period.temperatureUnit || 'F'
            }`,
            `Wind: ${period.windSpeed || 'Unknown'} ${period.windDirection || ''}`,
            `${period.shortForecast || 'No forecast available'}`,
            '---'
          ].join('\n')
        );
    
        const forecastText = `Forecast for ${latitude}, ${longitude}:\n\n${formattedForecast.join(
          '\n'
        )}`;
    
        return {
          content: [
            {
              type: 'text',
              text: forecastText
            }
          ]
        };
      }
    );
  • Helper function to make authenticated fetch requests to the National Weather Service (NWS) API, handling errors and returning typed JSON or null.
    async function makeNWSRequest<T>(url: string): Promise<T | null> {
      const headers = {
        'User-Agent': USER_AGENT,
        Accept: 'application/geo+json'
      };
    
      try {
        const response = await fetch(url, { headers });
        if (!response.ok) {
          throw new Error(`HTTP error! status: ${response.status}`);
        }
        return (await response.json()) as T;
      } catch (error) {
        console.error('Error making NWS request:', error);
        return null;
      }
    }
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/adarshem/mcp-server-learn'

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