get-weather
Retrieve current weather, air quality, and daily forecasts by providing latitude and longitude coordinates. Uses Open-Meteo API to deliver weather data for specified forecast periods.
Instructions
위도, 경도, 예보 기간을 입력하면 현재 날씨, 미세먼지, 일별 예보를 반환합니다. Open-Meteo API를 사용합니다.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| latitude | Yes | 위도 (예: 37.5665) | |
| longitude | Yes | 경도 (예: 126.9780) | |
| forecast_days | No | 예보 기간 (일수, 기본값: 3, 최대: 16) |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes |
Implementation Reference
- src/index.ts:251-363 (handler)The `get-weather` tool uses Open-Meteo API to fetch current weather, air quality, and daily forecasts, which are then formatted into a user-friendly text string.
server.registerTool( 'get-weather', { description: '위도, 경도, 예보 기간을 입력하면 현재 날씨, 미세먼지, 일별 예보를 반환합니다. Open-Meteo API를 사용합니다.', inputSchema: z.object({ latitude: z.number().describe('위도 (예: 37.5665)'), longitude: z.number().describe('경도 (예: 126.9780)'), forecast_days: z .number() .int() .min(1) .max(16) .optional() .default(3) .describe('예보 기간 (일수, 기본값: 3, 최대: 16)') }), outputSchema: z.object({ content: z.array( z.object({ type: z.literal('text'), text: z.string().describe('날씨 및 미세먼지 정보') }) ) }) }, async ({ latitude, longitude, forecast_days }) => { const weatherParams = new URLSearchParams({ latitude: String(latitude), longitude: String(longitude), current: 'temperature_2m,relative_humidity_2m,apparent_temperature,precipitation,weather_code,wind_speed_10m,is_day', daily: 'weather_code,temperature_2m_max,temperature_2m_min,precipitation_sum,wind_speed_10m_max', forecast_days: String(forecast_days), timezone: 'auto' }) const aqParams = new URLSearchParams({ latitude: String(latitude), longitude: String(longitude), current: 'pm10,pm2_5' }) const [weatherRes, aqRes] = await Promise.all([ fetch(`https://api.open-meteo.com/v1/forecast?${weatherParams}`), fetch(`https://air-quality-api.open-meteo.com/v1/air-quality?${aqParams}`) ]) if (!weatherRes.ok) { const errorText = `오류: 날씨 API 요청 실패 (상태 코드: ${weatherRes.status})` return { content: [{ type: 'text' as const, text: errorText }], structuredContent: { content: [{ type: 'text' as const, text: errorText }] } } } const data = (await weatherRes.json()) as { current: { temperature_2m: number relative_humidity_2m: number apparent_temperature: number precipitation: number weather_code: number wind_speed_10m: number is_day: number } daily: { time: string[] weather_code: number[] temperature_2m_max: number[] temperature_2m_min: number[] precipitation_sum: number[] wind_speed_10m_max: number[] } } const c = data.current const currentLines = [ `[현재 날씨]`, `기온: ${c.temperature_2m}°C (체감 ${c.apparent_temperature}°C)`, `습도: ${c.relative_humidity_2m}%`, `강수량: ${c.precipitation}mm`, `풍속: ${c.wind_speed_10m}km/h`, `날씨: ${getWeatherDesc(c.weather_code)} (${c.is_day ? '낮' : '밤'})` ] if (aqRes.ok) { const aq = (await aqRes.json()) as { current: { pm10: number; pm2_5: number } } const { pm10, pm2_5 } = aq.current currentLines.push( `\n[미세먼지]`, `PM10: ${pm10}㎍/㎥ (${getPm10Grade(pm10)})`, `PM2.5: ${pm2_5}㎍/㎥ (${getPm25Grade(pm2_5)})` ) } const d = data.daily const forecastLines = [`\n[일별 예보 (${forecast_days}일)]`] for (let i = 0; i < d.time.length; i++) { const date = new Date(d.time[i]) const dayName = DAY_NAMES[date.getDay()] forecastLines.push( `${d.time[i]} (${dayName}): 최고 ${d.temperature_2m_max[i]}°C / 최저 ${d.temperature_2m_min[i]}°C, 강수 ${d.precipitation_sum[i]}mm, 풍속 ${d.wind_speed_10m_max[i]}km/h, ${getWeatherDesc(d.weather_code[i])}` ) } const text = [...currentLines, ...forecastLines].join('\n') return { content: [{ type: 'text' as const, text }], structuredContent: { content: [{ type: 'text' as const, text }] } } } )