UNPKG

@minjunkwon/public-housing-mcp-server

Version:

MCP server for public housing information in South Korea - 한국 공공주택 정보 조회 MCP 서버

137 lines 6.08 kB
import axios from 'axios'; import { XMLParser } from 'fast-xml-parser'; const SERVICE_KEY = 'Z/bWsLsT6z7AAvV4XvUvq9Qb/hDVfAV9/oRoHOcRFf/bsRPdyCRi+E3J5oJ/GpS/lW+7G0S8ecCcc5NlcJFzbw=='; const BASE_URL = 'https://apis.data.go.kr/1613000/HWSPR02'; export class PublicHousingAPI { xmlParser; constructor() { this.xmlParser = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: '@_', textNodeName: '#text', parseAttributeValue: true, trimValues: true }); } /** * 공공임대주택 모집공고 조회 */ async getRentalHousingAnnouncements(params) { const queryParams = { serviceKey: SERVICE_KEY, numOfRows: params.numOfRows || 10, pageNo: params.pageNo || 1, ...params }; try { const response = await axios.get(`${BASE_URL}/rsdtRcritNtcList`, { params: queryParams, timeout: 10000 }); // API는 JSON 형태로 응답 const result = response.data.response; if (!result) { throw new Error('Invalid API response structure'); } return { header: result.header || { resultCode: '00', resultMsg: 'SUCCESS' }, body: { items: Array.isArray(result.body?.item) ? result.body.item : result.body?.item ? [result.body.item] : [], numOfRows: parseInt(result.body?.numOfRows || '0'), pageNo: parseInt(result.body?.pageNo || '1'), totalCount: parseInt(result.body?.totalCount || '0') } }; } catch (error) { console.error('Error fetching rental housing data:', error); throw new Error(`API 호출 실패: ${error instanceof Error ? error.message : '알 수 없는 오류'}`); } } /** * 공공분양주택 모집공고 조회 */ async getSaleHousingAnnouncements(params) { const queryParams = { serviceKey: SERVICE_KEY, numOfRows: params.numOfRows || 10, pageNo: params.pageNo || 1, ...params }; try { const response = await axios.get(`${BASE_URL}/ltRsdtRcritNtcList`, { params: queryParams, timeout: 10000 }); // API는 JSON 형태로 응답 const result = response.data.response; if (!result) { throw new Error('Invalid API response structure'); } return { header: result.header || { resultCode: '00', resultMsg: 'SUCCESS' }, body: { items: Array.isArray(result.body?.item) ? result.body.item : result.body?.item ? [result.body.item] : [], numOfRows: parseInt(result.body?.numOfRows || '0'), pageNo: parseInt(result.body?.pageNo || '1'), totalCount: parseInt(result.body?.totalCount || '0') } }; } catch (error) { console.error('Error fetching sale housing data:', error); throw new Error(`API 호출 실패: ${error instanceof Error ? error.message : '알 수 없는 오류'}`); } } /** * 임대주택 데이터 포맷팅 */ formatRentalHousingData(items) { if (!items || items.length === 0) { return '조회된 공고가 없습니다.'; } return items.map((item, index) => { const fields = [ `${index + 1}. 공고명: ${item.pblancNm || '정보 없음'}`, ` 위치: ${item.brtcNm || ''} ${item.signguNm || ''}`, ` 공급유형: ${item.suplyTyNm || '정보 없음'}`, ` 주택유형: ${item.houseTyNm || '정보 없음'}`, ` 공급세대: ${item.sumSuplyCo || '정보 없음'}세대`, ` 접수기간: ${item.beginDe || '정보 없음'} ~ ${item.endDe || '정보 없음'}`, ` 공고일: ${item.rcritPblancDe || '정보 없음'}`, ` 월임대료: ${item.mtRntchrg ? `${item.mtRntchrg.toLocaleString()}원` : '정보 없음'}`, ` 보증금: ${item.rentGtn ? `${item.rentGtn.toLocaleString()}원` : '정보 없음'}`, ` 상세링크: ${item.pcUrl || '정보 없음'}` ]; return fields.join('\n'); }).join('\n\n'); } /** * 분양주택 데이터 포맷팅 */ formatSaleHousingData(items) { if (!items || items.length === 0) { return '조회된 공고가 없습니다.'; } return items.map((item, index) => { const totalPrice = (item.enty || 0) + (item.prtpay || 0) + (item.surlus || 0); const fields = [ `${index + 1}. 공고명: ${item.pblancNm || '정보 없음'}`, ` 단지명: ${item.hsmpNm || '정보 없음'}`, ` 위치: ${item.brtcNm || ''} ${item.signguNm || ''} ${item.fullAdres || ''}`, ` 주택유형: ${item.houseTyNm || '정보 없음'}`, ` 공급세대: ${item.sumSuplyCo || '정보 없음'}세대`, ` 분양가: ${totalPrice ? `${totalPrice.toLocaleString()}원` : '정보 없음'}`, ` - 계약금: ${item.enty ? `${item.enty.toLocaleString()}원` : '정보 없음'}`, ` - 잔금: ${item.surlus ? `${item.surlus.toLocaleString()}원` : '정보 없음'}`, ` 접수기간: ${item.beginDe || '정보 없음'} ~ ${item.endDe || '정보 없음'}`, ` 공고일: ${item.rcritPblancDe || '정보 없음'}`, ` 상세링크: ${item.pcUrl || '정보 없음'}` ]; return fields.join('\n'); }).join('\n\n'); } } //# sourceMappingURL=api.js.map