@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
JavaScript
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;
}
}