@minjunkwon/public-housing-mcp-server
Version:
MCP server for public housing information in South Korea - 한국 공공주택 정보 조회 MCP 서버
137 lines • 6.08 kB
JavaScript
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