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
| Name | Required | Description | Default |
|---|---|---|---|
| latitude | Yes | Latitude of the location | |
| longitude | Yes | Longitude of the location |
Implementation Reference
- src/index.ts:147-227 (handler)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 } ] }; }
- src/index.ts:139-146 (schema)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 } ] }; } );
- src/index.ts:19-35 (helper)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; } }