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
| Name | Required | Description | Default |
|---|---|---|---|
| latitude | Yes | Latitude of the location | |
| longitude | Yes | Longitude of the location |
Implementation Reference
- src/index.ts:119-163 (handler)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")}` }], }; }
- src/index.ts:115-118 (schema)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")}` }], }; } );
- src/index.ts:54-77 (schema)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[]; }; }
- src/index.ts:20-29 (helper)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; } }