Skip to main content
Glama
hafizrahman

Weather & WordPress MCP Server

by hafizrahman

get-forecast

Retrieve weather forecast data for specific coordinates using latitude and longitude inputs to support planning and decision-making.

Instructions

Get weather forecast for a location

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
latitudeYesLatitude of the location
longitudeYesLongitude of the location

Implementation Reference

  • The async handler function for the 'get-forecast' tool. It fetches the weather points URL from NWS API using lat/long, then retrieves and formats the forecast periods including temperature, wind, and short forecast.
    async ({ latitude, longitude }) => {
        const pointsUrl = `${NWS_API_BASE}/points/${latitude.toFixed(4)},${longitude.toFixed(4)}`;
        const pointsData = await fetchJson<PointsResponse>(pointsUrl, {
            Accept: "application/geo+json",
        });
    
        if (!pointsData || !pointsData.properties?.forecast) {
            return {
                content: [
                    {
                        type: "text",
                        text: `Failed to get forecast data for coordinates: ${latitude}, ${longitude}`,
                    },
                ],
            };
        }
    
        const forecastData = await fetchJson<ForecastResponse>(pointsData.properties.forecast);
        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" }],
            };
        }
    
        const formattedForecast = periods.map((period) =>
            [
                `${period.name || "Unknown"}:`,
                `Temperature: ${period.temperature || "Unknown"}°${period.temperatureUnit || "F"}`,
                `Wind: ${period.windSpeed || "Unknown"} ${period.windDirection || ""}`,
                `${period.shortForecast || "No forecast available"}`,
                "---",
            ].join("\n")
        );
    
        return {
            content: [{ type: "text", text: `Forecast for ${latitude}, ${longitude}:\n\n${formattedForecast.join("\n")}` }],
        };
    }
  • Input schema defined with Zod for latitude and longitude 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:112-164 (registration)
    Registration of the 'get-forecast' tool on the MCP server, specifying name, description, input schema, and 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 }) => {
            const pointsUrl = `${NWS_API_BASE}/points/${latitude.toFixed(4)},${longitude.toFixed(4)}`;
            const pointsData = await fetchJson<PointsResponse>(pointsUrl, {
                Accept: "application/geo+json",
            });
    
            if (!pointsData || !pointsData.properties?.forecast) {
                return {
                    content: [
                        {
                            type: "text",
                            text: `Failed to get forecast data for coordinates: ${latitude}, ${longitude}`,
                        },
                    ],
                };
            }
    
            const forecastData = await fetchJson<ForecastResponse>(pointsData.properties.forecast);
            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" }],
                };
            }
    
            const formattedForecast = periods.map((period) =>
                [
                    `${period.name || "Unknown"}:`,
                    `Temperature: ${period.temperature || "Unknown"}°${period.temperatureUnit || "F"}`,
                    `Wind: ${period.windSpeed || "Unknown"} ${period.windDirection || ""}`,
                    `${period.shortForecast || "No forecast available"}`,
                    "---",
                ].join("\n")
            );
    
            return {
                content: [{ type: "text", text: `Forecast for ${latitude}, ${longitude}:\n\n${formattedForecast.join("\n")}` }],
            };
        }
    );
  • TypeScript interfaces for NWS API responses: ForecastPeriod, PointsResponse, ForecastResponse (AlertsResponse is for another tool but in block). Used in get-forecast.
    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[];
        };
    }
  • Shared fetchJson utility function used to make API requests in the get-forecast handler.
    async function fetchJson<T>(url: string, headers: Record<string, string> = {}): Promise<T | null> {
        try {
            const response = await fetch(url, { headers: { "User-Agent": USER_AGENT, ...headers } });
            if (!response.ok) throw new Error(`HTTP error ${response.status}`);
            return (await response.json()) as T;
        } catch (err) {
            console.error("Fetch error:", err);
            return null;
        }
    }

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/hafizrahman/wp-mcp'

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