Skip to main content
Glama
ivanbtrujillo

MCP Server Example

get-forecast

Retrieve weather forecast data for any location by providing latitude and longitude coordinates.

Instructions

Get weather forecast for a location

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
latitudeYesLatitude of the location
longitudeYesLongitude of the location

Implementation Reference

  • The core handler function for the 'get-forecast' tool. It takes latitude and longitude, fetches the NWS grid points to get the forecast URL, then fetches the forecast data, formats each period's details (name, temp, wind, shortForecast), and returns a formatted text response. Handles various error cases by returning error messages.
    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,
          },
        ],
      };
    },
  • Input schema using Zod for 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:135-137 (registration)
    Registration of the 'get-forecast' tool on the MCP server, specifying the tool name and description.
    server.tool(
      "get-forecast",
      "Get weather forecast for a location",
  • Reusable helper function for making authenticated fetch requests to the NWS API, returning typed JSON or null on error. Used twice in the get-forecast handler.
    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;
      }
    }
  • TypeScript interfaces defining the structure of NWS API responses used in the get-forecast tool (ForecastPeriod, PointsResponse, ForecastResponse).
    interface ForecastPeriod {
      name?: string;
      temperature?: number;
      temperatureUnit?: string;
      windSpeed?: string;
      windDirection?: string;
      shortForecast?: string;
    }
    
    interface AlertsResponse {
      features: AlertFeature[];
    }
    
    interface PointsResponse {
      properties: {
        forecast?: string;
      };
    }
    
    interface ForecastResponse {
      properties: {
        periods: ForecastPeriod[];
      };
    }
Install Server

Other 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/ivanbtrujillo/mcp-server-spike'

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