get-weather
Retrieve current weather conditions and daily forecasts by providing latitude and longitude coordinates with optional forecast duration.
Instructions
위도·경도 좌표와 예보 기간을 입력받아 현재 날씨와 일별 예보를 반환합니다. (Open-Meteo)
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| latitude | Yes | WGS84 위도 | |
| longitude | Yes | WGS84 경도 | |
| forecast_days | No | 예보 일수 (기본값: 3, 최대: 7) |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | 날씨 정보 |
Implementation Reference
- src/index.ts:220-315 (handler)The implementation of the 'get-weather' tool, including tool registration, input/output schemas using Zod, and the handler function that fetches and processes data from the Open-Meteo API.
server.registerTool( 'get-weather', { description: '위도·경도 좌표와 예보 기간을 입력받아 현재 날씨와 일별 예보를 반환합니다. (Open-Meteo)', inputSchema: z.object({ latitude: z.number().describe('WGS84 위도'), longitude: z.number().describe('WGS84 경도'), forecast_days: z .number() .int() .min(1) .max(7) .optional() .default(3) .describe('예보 일수 (기본값: 3, 최대: 7)') }), outputSchema: z.object({ content: z .array( z.object({ type: z.literal('text'), text: z.string().describe('날씨 정보') }) ) .describe('날씨 정보') }) }, async ({ latitude, longitude, forecast_days }) => { type WeatherResponse = | { timezone: string current: { temperature_2m: number relative_humidity_2m: number weather_code: number wind_speed_10m: number precipitation: number } daily: { time: string[] temperature_2m_max: number[] temperature_2m_min: number[] precipitation_sum: number[] weather_code: number[] } } | { error: true; reason: string } const url = new URL('https://api.open-meteo.com/v1/forecast') url.searchParams.set('latitude', String(latitude)) url.searchParams.set('longitude', String(longitude)) url.searchParams.set( 'current', 'temperature_2m,relative_humidity_2m,weather_code,wind_speed_10m,precipitation' ) url.searchParams.set( 'daily', 'temperature_2m_max,temperature_2m_min,precipitation_sum,weather_code' ) url.searchParams.set('forecast_days', String(forecast_days)) url.searchParams.set('timezone', 'auto') const res = await fetch(url.toString()) const data = (await res.json()) as WeatherResponse if ('error' in data) throw new Error(data.reason) const DAY_NAMES = ['일', '월', '화', '수', '목', '금', '토'] const { current, daily, timezone } = data const currentLines = [ `현재 날씨 (${timezone})`, ` 기온: ${current.temperature_2m}°C | 습도: ${current.relative_humidity_2m}% | 풍속: ${current.wind_speed_10m} km/h | 강수: ${current.precipitation}mm` ] const dailyLines = daily.time.map((date, i) => { const dayName = DAY_NAMES[new Date(date).getDay()] return ` ${date} (${dayName}): 최고 ${daily.temperature_2m_max[i]}°C / 최저 ${daily.temperature_2m_min[i]}°C, 강수 ${daily.precipitation_sum[i]}mm` }) const text = [ ...currentLines, '', '일별 예보:', ...dailyLines ].join('\n') return { content: [{ type: 'text' as const, text }], structuredContent: { content: [{ type: 'text' as const, text }] } } } )