UNPKG

@minjunkwon/korea-welfare-mcp-server

Version:

MCP server for Korean Central Government Welfare Services - provides intelligent search and information retrieval for Korean social welfare programs

70 lines (69 loc) 3.5 kB
import { parseStringPromise } from 'xml2js'; const SERVICE_KEY = 'Z%2FbWsLsT6z7AAvV4XvUvq9Qb%2FhDVfAV9%2FoRoHOcRFf%2FbsRPdyCRi%2BE3J5oJ%2FGpS%2FlW%2B7G0S8ecCcc5NlcJFzbw%3D%3D'; // 실제 서비스키로 교체해주세요 const BASE_URL = 'http://apis.data.go.kr/B554287/NationalWelfareInformationsV001'; export class WelfareAPI { serviceKey; constructor(serviceKey) { this.serviceKey = serviceKey || SERVICE_KEY; } async makeRequest(endpoint, params) { const url = new URL(`${BASE_URL}/${endpoint}`); // 이미 인코딩된 서비스키를 그대로 추가 (searchParams.append는 추가 인코딩하므로 직접 설정) url.search = `serviceKey=${this.serviceKey}`; Object.entries(params).forEach(([key, value]) => { if (value !== undefined && value !== null) { url.searchParams.append(key, value.toString()); } }); // 디버깅을 위해 최종 URL 로깅 console.error('API Request URL:', url.toString()); try { const response = await fetch(url.toString()); if (!response.ok) { const errorText = await response.text(); console.error('HTTP Error Response:', errorText); throw new Error(`HTTP error! status: ${response.status}, response: ${errorText}`); } const xmlText = await response.text(); console.error('Raw XML Response:', xmlText.substring(0, 500) + '...'); const jsonResult = await parseStringPromise(xmlText, { explicitArray: false }); return jsonResult; } catch (error) { console.error('Request Error Details:', error); throw new Error(`API request failed: ${error}`); } } async getWelfareList(params) { const result = await this.makeRequest('NationalWelfarelistV001', params); // 디버깅을 위해 전체 응답 로깅 console.error('API Response:', JSON.stringify(result, null, 2)); // 다양한 응답 구조 확인 if (!result || !result.wantedList) { throw new Error(`API Error: Invalid response structure. Response: ${JSON.stringify(result)}`); } const resultCode = result.wantedList.resultCode; const resultMessage = result.wantedList.resultMessage; if (resultCode !== '0' && resultCode !== 0) { throw new Error(`API Error: ${resultMessage || 'Unknown error'} (Code: ${resultCode})`); } // 단일 항목을 배열로 변환 if (result.wantedList?.servList && !Array.isArray(result.wantedList.servList)) { result.wantedList.servList = [result.wantedList.servList]; } return result; } async getWelfareDetail(params) { const result = await this.makeRequest('NationalWelfaredetailedV001', params); if (result.wantedDtl?.resultCode !== '0' && result.wantedDtl?.resultCode !== 0) { throw new Error(`API Error: ${result.wantedDtl?.resultMessage || 'Unknown error'}`); } // 단일 항목을 배열로 변환 (필요한 경우) ['applmetList', 'inqplCtadrList', 'inqplHmpgReldList', 'basfrmList', 'baslawList'].forEach(listName => { if (result.wantedDtl[listName] && !Array.isArray(result.wantedDtl[listName])) { result.wantedDtl[listName] = [result.wantedDtl[listName]]; } }); return result; } }