korean-stats-mcp 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +301 -0
- package/dist/api/client.d.ts +65 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +143 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/types.d.ts +157 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +5 -0
- package/dist/api/types.js.map +1 -0
- package/dist/cache/index.d.ts +55 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +102 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/config/index.d.ts +46 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +54 -0
- package/dist/config/index.js.map +1 -0
- package/dist/data/quickStatsParams.d.ts +76 -0
- package/dist/data/quickStatsParams.d.ts.map +1 -0
- package/dist/data/quickStatsParams.js +1344 -0
- package/dist/data/quickStatsParams.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +5 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +5 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/statisticsAssistant.d.ts +25 -0
- package/dist/prompts/statisticsAssistant.d.ts.map +1 -0
- package/dist/prompts/statisticsAssistant.js +43 -0
- package/dist/prompts/statisticsAssistant.js.map +1 -0
- package/dist/resources/categoryTree.d.ts +18 -0
- package/dist/resources/categoryTree.d.ts.map +1 -0
- package/dist/resources/categoryTree.js +80 -0
- package/dist/resources/categoryTree.js.map +1 -0
- package/dist/resources/index.d.ts +6 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +6 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/keyIndicators.d.ts +20 -0
- package/dist/resources/keyIndicators.d.ts.map +1 -0
- package/dist/resources/keyIndicators.js +108 -0
- package/dist/resources/keyIndicators.js.map +1 -0
- package/dist/server-http.d.ts +10 -0
- package/dist/server-http.d.ts.map +1 -0
- package/dist/server-http.js +134 -0
- package/dist/server-http.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +194 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/analyzeTimeSeries.d.ts +70 -0
- package/dist/tools/analyzeTimeSeries.d.ts.map +1 -0
- package/dist/tools/analyzeTimeSeries.js +204 -0
- package/dist/tools/analyzeTimeSeries.js.map +1 -0
- package/dist/tools/chains.d.ts +197 -0
- package/dist/tools/chains.d.ts.map +1 -0
- package/dist/tools/chains.js +369 -0
- package/dist/tools/chains.js.map +1 -0
- package/dist/tools/compareStatistics.d.ts +62 -0
- package/dist/tools/compareStatistics.d.ts.map +1 -0
- package/dist/tools/compareStatistics.js +190 -0
- package/dist/tools/compareStatistics.js.map +1 -0
- package/dist/tools/fetchKosisExcel.d.ts +62 -0
- package/dist/tools/fetchKosisExcel.d.ts.map +1 -0
- package/dist/tools/fetchKosisExcel.js +366 -0
- package/dist/tools/fetchKosisExcel.js.map +1 -0
- package/dist/tools/getRecommendedStats.d.ts +41 -0
- package/dist/tools/getRecommendedStats.d.ts.map +1 -0
- package/dist/tools/getRecommendedStats.js +251 -0
- package/dist/tools/getRecommendedStats.js.map +1 -0
- package/dist/tools/getStatisticsData.d.ts +75 -0
- package/dist/tools/getStatisticsData.d.ts.map +1 -0
- package/dist/tools/getStatisticsData.js +305 -0
- package/dist/tools/getStatisticsData.js.map +1 -0
- package/dist/tools/getStatisticsList.d.ts +69 -0
- package/dist/tools/getStatisticsList.d.ts.map +1 -0
- package/dist/tools/getStatisticsList.js +336 -0
- package/dist/tools/getStatisticsList.js.map +1 -0
- package/dist/tools/getTableInfo.d.ts +66 -0
- package/dist/tools/getTableInfo.d.ts.map +1 -0
- package/dist/tools/getTableInfo.js +85 -0
- package/dist/tools/getTableInfo.js.map +1 -0
- package/dist/tools/index.d.ts +14 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +19 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/quickStats.d.ts +71 -0
- package/dist/tools/quickStats.d.ts.map +1 -0
- package/dist/tools/quickStats.js +490 -0
- package/dist/tools/quickStats.js.map +1 -0
- package/dist/tools/quickTrend.d.ts +61 -0
- package/dist/tools/quickTrend.d.ts.map +1 -0
- package/dist/tools/quickTrend.js +328 -0
- package/dist/tools/quickTrend.js.map +1 -0
- package/dist/tools/searchStatistics.d.ts +41 -0
- package/dist/tools/searchStatistics.d.ts.map +1 -0
- package/dist/tools/searchStatistics.js +318 -0
- package/dist/tools/searchStatistics.js.map +1 -0
- package/dist/utils/dataFormatter.d.ts +40 -0
- package/dist/utils/dataFormatter.d.ts.map +1 -0
- package/dist/utils/dataFormatter.js +142 -0
- package/dist/utils/dataFormatter.js.map +1 -0
- package/dist/utils/errorHandler.d.ts +33 -0
- package/dist/utils/errorHandler.d.ts.map +1 -0
- package/dist/utils/errorHandler.js +94 -0
- package/dist/utils/errorHandler.js.map +1 -0
- package/dist/utils/metaLookup.d.ts +93 -0
- package/dist/utils/metaLookup.d.ts.map +1 -0
- package/dist/utils/metaLookup.js +170 -0
- package/dist/utils/metaLookup.js.map +1 -0
- package/dist/utils/queryParser.d.ts +45 -0
- package/dist/utils/queryParser.d.ts.map +1 -0
- package/dist/utils/queryParser.js +244 -0
- package/dist/utils/queryParser.js.map +1 -0
- package/dist/utils/regions.d.ts +70 -0
- package/dist/utils/regions.d.ts.map +1 -0
- package/dist/utils/regions.js +261 -0
- package/dist/utils/regions.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 빠른 통계 조회 도구
|
|
3
|
+
* 자연어 질문으로 한 번에 통계 데이터를 조회하고 자연어 응답을 생성
|
|
4
|
+
*
|
|
5
|
+
* 개선: 정적으로 검증된 파라미터 사용 (동적 조회 대신)
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { getKosisClient } from '../api/client.js';
|
|
9
|
+
import { getCacheManager } from '../cache/index.js';
|
|
10
|
+
import { QUICK_STATS_PARAMS, KEYWORD_ALIASES, KEYWORD_LOOKUP, getQuickStatsParam, getRegionCode, normalizeKeywordKey, } from '../data/quickStatsParams.js';
|
|
11
|
+
import { findProvinceByDistrict, PROVINCES, AMBIGUOUS_DISTRICTS } from '../utils/regions.js';
|
|
12
|
+
/**
|
|
13
|
+
* 자치구로 오판하면 안 되는 키워드 집합
|
|
14
|
+
* (예: "인구"는 "구"로 끝나지만 자치구 아님)
|
|
15
|
+
*/
|
|
16
|
+
const NON_DISTRICT_WORDS = new Set([
|
|
17
|
+
'인구', '총인구', '수입', '수출', '집값', '월급', '취업', '주가',
|
|
18
|
+
'노인구', '고령인구', '65세이상인구',
|
|
19
|
+
]);
|
|
20
|
+
export const quickStatsSchema = {
|
|
21
|
+
name: 'quick_stats',
|
|
22
|
+
description: `[빠른조회] 자연어 한 줄 → KOSIS 수치 즉답. 91개 키워드 + 17 시도 + 자치구·시군 자동 라우팅.
|
|
23
|
+
|
|
24
|
+
🔄 도구 라우팅:
|
|
25
|
+
• "~얼마/몇명/현황" → 이 도구
|
|
26
|
+
• "~추세/추이/변화/증감" → quick_trend
|
|
27
|
+
• 지역 한장 종합 브리핑 → chain_region_brief
|
|
28
|
+
• 다지역 비교 → chain_compare_regions
|
|
29
|
+
• 키워드 미지원 → search_statistics
|
|
30
|
+
• 자치구별 정밀 데이터 → fetch_kosis_excel
|
|
31
|
+
|
|
32
|
+
■ 지원 키워드: 인구, 출산율, 실업률, 고용률, GDP, GRDP, 물가, 아파트가격, 전세가격, 미세먼지, 교통사고, 의사수, 범죄율, 초혼연령, 노령화지수, 고령인구 등 91개
|
|
33
|
+
■ 지역: 17개 광역시도 + 자치구·시군 230+ → 광역시도 fallback + 안내
|
|
34
|
+
■ 별칭: 저출산→출산율, 고령화→고령인구, population/gdp 등 영문 18개
|
|
35
|
+
|
|
36
|
+
⚠️ 자연어 그대로 query에 넣어도 추출됨. region 명시 가능.`,
|
|
37
|
+
inputSchema: z.object({
|
|
38
|
+
query: z
|
|
39
|
+
.string()
|
|
40
|
+
.describe('통계 키워드만 입력 (감소/증가/추세/현황 등 수식어 제외). 예: "인구", "실업률", "GDP", "출산율", "고령인구"'),
|
|
41
|
+
region: z
|
|
42
|
+
.string()
|
|
43
|
+
.optional()
|
|
44
|
+
.describe('지역명. 예: "서울", "부산", "경기". 질문에 지역이 있으면 추출. "서울 인구" → region: "서울"'),
|
|
45
|
+
year: z
|
|
46
|
+
.number()
|
|
47
|
+
.optional()
|
|
48
|
+
.describe('조회 연도. 질문에 연도가 있으면 반드시 추출. "2020년 GDP" → year: 2020'),
|
|
49
|
+
period: z
|
|
50
|
+
.enum(['Y', 'Q', 'M'])
|
|
51
|
+
.optional()
|
|
52
|
+
.describe('조회 주기. Y=연간(기본), Q=분기, M=월별. "10월 출생아수" → period: "M"'),
|
|
53
|
+
month: z
|
|
54
|
+
.number()
|
|
55
|
+
.min(1)
|
|
56
|
+
.max(12)
|
|
57
|
+
.optional()
|
|
58
|
+
.describe('월 (period="M"일 때). "10월 출생아수" → month: 10'),
|
|
59
|
+
quarter: z
|
|
60
|
+
.number()
|
|
61
|
+
.min(1)
|
|
62
|
+
.max(4)
|
|
63
|
+
.optional()
|
|
64
|
+
.describe('분기 (period="Q"일 때). "3분기 실업률" → quarter: 3'),
|
|
65
|
+
}),
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* 지역명 목록 (쿼리에서 지역 추출용)
|
|
69
|
+
* - shortName: 17개 광역시도 약칭
|
|
70
|
+
* - fullName: 풀네임 (서울특별시, 경기도 등). 풀네임 매칭 우선.
|
|
71
|
+
*/
|
|
72
|
+
const PROVINCE_SHORT_NAMES = PROVINCES.map((p) => p.shortName);
|
|
73
|
+
const PROVINCE_FULL_NAMES = PROVINCES.map((p) => p.fullName);
|
|
74
|
+
/**
|
|
75
|
+
* 쿼리에서 광역시도 추출
|
|
76
|
+
*
|
|
77
|
+
* 부분매칭 버그 방지:
|
|
78
|
+
* 1. 자치구가 먼저 감지되면 광역시도 매칭은 스킵 (예: "해운대구"에 "대구" 부분매칭 방지)
|
|
79
|
+
* 2. 풀네임 우선 매칭 (예: "서울특별시" > "서울")
|
|
80
|
+
* 3. shortName은 단어 단위로 매칭 (앞뒤가 한글이 아니거나 끝)
|
|
81
|
+
*/
|
|
82
|
+
export function extractProvinceName(query, districtDetected) {
|
|
83
|
+
if (districtDetected)
|
|
84
|
+
return null;
|
|
85
|
+
// 풀네임 우선
|
|
86
|
+
for (const name of PROVINCE_FULL_NAMES) {
|
|
87
|
+
if (query.includes(name)) {
|
|
88
|
+
const idx = PROVINCE_FULL_NAMES.indexOf(name);
|
|
89
|
+
return PROVINCE_SHORT_NAMES[idx];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// shortName: 단어 단위 매칭 (앞뒤가 한글 자치구/시군 글자가 아닐 때만)
|
|
93
|
+
for (const name of PROVINCE_SHORT_NAMES) {
|
|
94
|
+
const idx = query.indexOf(name);
|
|
95
|
+
if (idx === -1)
|
|
96
|
+
continue;
|
|
97
|
+
const before = idx > 0 ? query[idx - 1] : '';
|
|
98
|
+
const after = idx + name.length < query.length ? query[idx + name.length] : '';
|
|
99
|
+
// 자치구/시/군 일부일 가능성: 뒤 글자가 '구/시/군'이면 잘못된 부분매칭
|
|
100
|
+
if (after === '구' || after === '시' || after === '군' || after === '도') {
|
|
101
|
+
// 단, "경기도", "강원도" 같은 패턴은 위 풀네임 매칭에서 잡혔어야 함.
|
|
102
|
+
// 여기서는 "해운대구"의 "대구"처럼 잘못 매칭되는 케이스 차단.
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
// 앞 글자가 한글이면 자치구 일부일 수 있음 (예: "해운대" + "구" 패턴은 위에서 거름)
|
|
106
|
+
return name;
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 쿼리에서 자치구 감지
|
|
112
|
+
* 반환: 자치구명 또는 null
|
|
113
|
+
*
|
|
114
|
+
* 보장:
|
|
115
|
+
* - "인구"/"수입"/"수출" 등 "구/군/시"로 끝나는 키워드는 자치구 아님
|
|
116
|
+
* - 광역시도 풀네임("서울특별시" 등) 자치구 아님
|
|
117
|
+
* - 정식 KOSIS 키워드/별칭은 자치구 아님
|
|
118
|
+
*/
|
|
119
|
+
export function extractDistrictName(query) {
|
|
120
|
+
// 단어 단위로 분리하여 검사 (공백 기준)
|
|
121
|
+
// "광진구 인구"에서 "광진구"만 자치구 후보로
|
|
122
|
+
const tokens = query.split(/\s+/);
|
|
123
|
+
for (const token of tokens) {
|
|
124
|
+
// 자치구 길이: "남구"(2) ~ "부산진구"(4) — "구/군/시" 포함 총 2~5글자
|
|
125
|
+
if (!/^[가-힣]{1,4}(구|군|시)$/.test(token))
|
|
126
|
+
continue;
|
|
127
|
+
if (PROVINCE_FULL_NAMES.includes(token))
|
|
128
|
+
continue;
|
|
129
|
+
if (PROVINCE_SHORT_NAMES.includes(token))
|
|
130
|
+
continue; // "대구" 같은 광역시 약칭 제외
|
|
131
|
+
if (NON_DISTRICT_WORDS.has(token))
|
|
132
|
+
continue;
|
|
133
|
+
if (QUICK_STATS_PARAMS[token])
|
|
134
|
+
continue;
|
|
135
|
+
if (KEYWORD_ALIASES[token])
|
|
136
|
+
continue;
|
|
137
|
+
return token;
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
export async function quickStats(input) {
|
|
142
|
+
const client = getKosisClient();
|
|
143
|
+
const cache = getCacheManager();
|
|
144
|
+
try {
|
|
145
|
+
// 0. 빈 쿼리 가드
|
|
146
|
+
const trimmedQuery = (input.query ?? '').trim();
|
|
147
|
+
if (!trimmedQuery) {
|
|
148
|
+
return {
|
|
149
|
+
success: false,
|
|
150
|
+
answer: '조회할 통계 키워드를 입력해주세요.',
|
|
151
|
+
note: '예: "인구", "실업률", "GDP", "서울 아파트가격". 카테고리별 키워드는 get_statistics_list(recommendedTopic) 참고.',
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
// 1. 쿼리에서 키워드 추출
|
|
155
|
+
const keyword = extractKeyword(trimmedQuery);
|
|
156
|
+
const param = getQuickStatsParam(keyword);
|
|
157
|
+
if (!param) {
|
|
158
|
+
// 매핑이 없으면 카테고리별 지원 키워드 안내
|
|
159
|
+
const keywordGuide = `
|
|
160
|
+
📊 지원 키워드 (카테고리별 대표 예시):
|
|
161
|
+
• 인구/출산: 인구, 출산율, 출생아수, 사망률, 기대수명
|
|
162
|
+
• 고령화: 고령인구, 노인인구, 노령화지수, 65세이상인구
|
|
163
|
+
• 고용/노동: 실업률, 고용률, 취업자수, 임금
|
|
164
|
+
• 경제: GDP, GRDP, 경제성장률, 물가
|
|
165
|
+
• 무역: 수출, 수입, 무역수지
|
|
166
|
+
• 혼인/이혼: 혼인율, 이혼율, 초혼연령, 여성초혼연령
|
|
167
|
+
• 부동산: 주택가격, 아파트가격, 전세가격
|
|
168
|
+
• 교통: 자동차, 교통사고
|
|
169
|
+
• 환경: 미세먼지, PM2.5, PM10
|
|
170
|
+
• 사회: 범죄율, 의사수, 외래관광객
|
|
171
|
+
|
|
172
|
+
💡 지역별: "서울 실업률", "부산 인구" (17개 시도)
|
|
173
|
+
💡 월별: "2024년 10월 출생아수" (일부 키워드)`.trim();
|
|
174
|
+
return {
|
|
175
|
+
success: false,
|
|
176
|
+
answer: `"${input.query}"에 대한 빠른 조회가 지원되지 않습니다.`,
|
|
177
|
+
note: `${keywordGuide}\n\n🔍 다른 통계는 search_statistics("${input.query}")로 검색해보세요.`,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
// 2. 지역 결정
|
|
181
|
+
let regionName = '전국';
|
|
182
|
+
let objL1 = param.objL1;
|
|
183
|
+
let requestedRegion = null;
|
|
184
|
+
let districtNote = null;
|
|
185
|
+
// 자치구·시군 추출: input.region 우선, 없으면 query에서.
|
|
186
|
+
// (quickStats는 광역시도 단위까지 지원. 자치구는 fetch_kosis_excel 권장)
|
|
187
|
+
const trimmedRegion = input.region?.trim() ?? '';
|
|
188
|
+
const districtFromRegion = trimmedRegion ? extractDistrictName(trimmedRegion) : null;
|
|
189
|
+
const districtFromQuery = !districtFromRegion ? extractDistrictName(trimmedQuery) : null;
|
|
190
|
+
const districtName = districtFromRegion ?? districtFromQuery;
|
|
191
|
+
const provFromQuery = extractProvinceName(trimmedQuery, /* districtDetected: */ false);
|
|
192
|
+
if (districtName) {
|
|
193
|
+
let prov = findProvinceByDistrict(districtName);
|
|
194
|
+
// 모호한 자치구(예: '동구', '북구') + 광역시도 컨텍스트가 함께 있으면 그쪽 우선
|
|
195
|
+
if (provFromQuery && AMBIGUOUS_DISTRICTS[districtName]?.includes(provFromQuery)) {
|
|
196
|
+
const candidate = PROVINCES.find((p) => p.shortName === provFromQuery);
|
|
197
|
+
if (candidate)
|
|
198
|
+
prov = candidate;
|
|
199
|
+
}
|
|
200
|
+
if (prov) {
|
|
201
|
+
requestedRegion = prov.shortName;
|
|
202
|
+
districtNote = `💡 "${districtName}" 자치구 데이터는 quick_stats가 지원하지 않아 ${prov.shortName} 광역시도 데이터로 표시했습니다. 자치구 단위는 fetch_kosis_excel("${districtName}", "${keyword}")로 조회하세요.`;
|
|
203
|
+
}
|
|
204
|
+
else if (provFromQuery) {
|
|
205
|
+
// 자치구 매핑 실패했지만 광역시도는 명시 → 그걸로 fallback
|
|
206
|
+
requestedRegion = provFromQuery;
|
|
207
|
+
districtNote = `💡 "${districtName}"은(는) 자치구 매핑이 모호합니다. ${provFromQuery} 광역시도 데이터로 표시합니다.`;
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
// 자치구도 광역시도도 매칭 실패 → 전국 데이터
|
|
211
|
+
districtNote = `💡 "${districtName}"은(는) 자치구 매핑이 모호합니다 (여러 광역시도에 동명 자치구 존재 가능). 전국 데이터로 표시합니다. 정확한 자치구 조회는 search_statistics("${districtName} ${keyword}") 사용.`;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
else if (trimmedRegion) {
|
|
215
|
+
// 명시적 region 파라미터 (광역시도)
|
|
216
|
+
requestedRegion = trimmedRegion;
|
|
217
|
+
}
|
|
218
|
+
else if (provFromQuery) {
|
|
219
|
+
// query에서 광역시도만 추출
|
|
220
|
+
requestedRegion = provFromQuery;
|
|
221
|
+
}
|
|
222
|
+
// 지역 요청이 있는 경우 처리
|
|
223
|
+
if (requestedRegion) {
|
|
224
|
+
if (!param.regionCodes) {
|
|
225
|
+
return {
|
|
226
|
+
success: false,
|
|
227
|
+
answer: `"${keyword}" 통계는 지역별 조회를 지원하지 않습니다. 전국 데이터만 제공됩니다.`,
|
|
228
|
+
note: `지역별 조회 가능: 인구, 출산율, 사망률, 혼인율, 이혼율, 실업률, 고용률, GRDP, 물가, 주택가격, 아파트가격, 전세가격, 미세먼지, 교통사고, 범죄율, 의사수, 자동차 등`,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
const regionCode = getRegionCode(param, requestedRegion);
|
|
232
|
+
if (regionCode !== param.objL1) {
|
|
233
|
+
objL1 = regionCode;
|
|
234
|
+
regionName = requestedRegion;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// 3. 주기(period) 결정 및 검증
|
|
238
|
+
const supportedPeriods = param.supportedPeriods || ['Y'];
|
|
239
|
+
// 사용자가 주기를 지정하지 않으면 키워드의 첫 번째 지원 주기 사용
|
|
240
|
+
const defaultPeriod = supportedPeriods[0];
|
|
241
|
+
const requestedPeriod = input.period || defaultPeriod;
|
|
242
|
+
if (!supportedPeriods.includes(requestedPeriod)) {
|
|
243
|
+
const periodNames = { 'Y': '연간', 'Q': '분기', 'M': '월별' };
|
|
244
|
+
const supportedNames = supportedPeriods.map(p => periodNames[p]).join(', ');
|
|
245
|
+
return {
|
|
246
|
+
success: false,
|
|
247
|
+
answer: `"${input.query}"는 ${periodNames[requestedPeriod]} 조회를 지원하지 않습니다.`,
|
|
248
|
+
note: `지원 주기: ${supportedNames}`,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
// 4. 조회 기간 계산
|
|
252
|
+
let startPrd;
|
|
253
|
+
let endPrd;
|
|
254
|
+
if (input.year) {
|
|
255
|
+
if (requestedPeriod === 'Y') {
|
|
256
|
+
startPrd = input.year.toString();
|
|
257
|
+
endPrd = input.year.toString();
|
|
258
|
+
}
|
|
259
|
+
else if (requestedPeriod === 'Q' && input.quarter) {
|
|
260
|
+
const qStr = `${input.year}${input.quarter.toString().padStart(2, '0')}`;
|
|
261
|
+
startPrd = qStr;
|
|
262
|
+
endPrd = qStr;
|
|
263
|
+
}
|
|
264
|
+
else if (requestedPeriod === 'M' && input.month) {
|
|
265
|
+
const mStr = `${input.year}${input.month.toString().padStart(2, '0')}`;
|
|
266
|
+
startPrd = mStr;
|
|
267
|
+
endPrd = mStr;
|
|
268
|
+
}
|
|
269
|
+
else if (requestedPeriod === 'Q') {
|
|
270
|
+
// 해당 연도의 모든 분기
|
|
271
|
+
startPrd = `${input.year}01`;
|
|
272
|
+
endPrd = `${input.year}04`;
|
|
273
|
+
}
|
|
274
|
+
else if (requestedPeriod === 'M') {
|
|
275
|
+
// 해당 연도의 모든 월
|
|
276
|
+
startPrd = `${input.year}01`;
|
|
277
|
+
endPrd = `${input.year}12`;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// 5. 데이터 조회 (검증된 정적 파라미터 사용)
|
|
281
|
+
const results = await cache.getStatisticsData({
|
|
282
|
+
orgId: param.orgId,
|
|
283
|
+
tableId: param.tableId,
|
|
284
|
+
objL1,
|
|
285
|
+
objL2: param.objL2,
|
|
286
|
+
itemId: param.itemId,
|
|
287
|
+
periodType: requestedPeriod,
|
|
288
|
+
recentCount: startPrd ? undefined : 1,
|
|
289
|
+
year: input.year,
|
|
290
|
+
month: input.month,
|
|
291
|
+
quarter: input.quarter,
|
|
292
|
+
}, async () => {
|
|
293
|
+
return client.getStatisticsData({
|
|
294
|
+
orgId: param.orgId,
|
|
295
|
+
tblId: param.tableId,
|
|
296
|
+
objL1,
|
|
297
|
+
objL2: param.objL2,
|
|
298
|
+
itmId: param.itemId,
|
|
299
|
+
prdSe: requestedPeriod,
|
|
300
|
+
newEstPrdCnt: startPrd ? undefined : 1,
|
|
301
|
+
startPrdDe: startPrd,
|
|
302
|
+
endPrdDe: endPrd,
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
if (results.length === 0) {
|
|
306
|
+
return {
|
|
307
|
+
success: false,
|
|
308
|
+
answer: `"${input.query}"에 대한 데이터를 찾을 수 없습니다.`,
|
|
309
|
+
note: `테이블: ${param.tableName} (${param.tableId})\n다른 검색어로 시도하거나 search_statistics를 사용해보세요.`,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
// 6. 결과 파싱
|
|
313
|
+
const latestData = results[0];
|
|
314
|
+
const value = latestData.DT;
|
|
315
|
+
const period = latestData.PRD_DE;
|
|
316
|
+
const periodFormatted = formatPeriodWithType(period, requestedPeriod);
|
|
317
|
+
const unit = param.unit;
|
|
318
|
+
// 5. 자연어 응답 생성
|
|
319
|
+
const baseAnswer = generateNaturalResponse({
|
|
320
|
+
keyword,
|
|
321
|
+
regionName,
|
|
322
|
+
value,
|
|
323
|
+
unit,
|
|
324
|
+
period: periodFormatted,
|
|
325
|
+
description: param.description,
|
|
326
|
+
});
|
|
327
|
+
// 장래추계 데이터 안내 (미래연도 데이터는 실측이 아님)
|
|
328
|
+
const projectionNote = param.isProjection
|
|
329
|
+
? `⚠️ 본 수치는 통계청 장래추계 데이터입니다 (실측 아닌 미래 추계). 정책·보고 인용 시 "추계" 명시 권장.`
|
|
330
|
+
: null;
|
|
331
|
+
// 출처 + 자치구 + 추계 안내 부착
|
|
332
|
+
const noteSuffix = [districtNote, projectionNote].filter(Boolean).join('\n\n');
|
|
333
|
+
const answer = `${baseAnswer}\n\n📊 출처: ${param.tableName} (KOSIS)${noteSuffix ? `\n\n${noteSuffix}` : ''}`;
|
|
334
|
+
const combinedNote = [districtNote, projectionNote].filter(Boolean).join(' / ');
|
|
335
|
+
return {
|
|
336
|
+
success: true,
|
|
337
|
+
answer,
|
|
338
|
+
value,
|
|
339
|
+
unit,
|
|
340
|
+
period: periodFormatted,
|
|
341
|
+
source: {
|
|
342
|
+
orgId: param.orgId,
|
|
343
|
+
tableId: param.tableId,
|
|
344
|
+
tableName: param.tableName,
|
|
345
|
+
},
|
|
346
|
+
...(param.isProjection ? { isProjection: true } : {}),
|
|
347
|
+
...(combinedNote ? { note: combinedNote } : {}),
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
console.error('Quick stats error:', error);
|
|
352
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
353
|
+
// KOSIS "데이터가 존재하지 않습니다" → 친절한 안내
|
|
354
|
+
const isMissing = /데이터가 존재하지 않습니다/.test(errorMessage);
|
|
355
|
+
if (isMissing) {
|
|
356
|
+
const yearHint = input.year != null
|
|
357
|
+
? (input.year > new Date().getFullYear()
|
|
358
|
+
? `${input.year}년은 아직 발표되지 않았을 가능성이 큽니다. 연도 미지정 시 최신 데이터를 자동 조회합니다.`
|
|
359
|
+
: `${input.year}년 데이터가 해당 통계표에 없습니다. 가용 연도 범위를 좁혀 다시 시도해보세요.`)
|
|
360
|
+
: '해당 통계표에 데이터가 없습니다.';
|
|
361
|
+
return {
|
|
362
|
+
success: false,
|
|
363
|
+
answer: `"${input.query}" 데이터를 찾을 수 없습니다.`,
|
|
364
|
+
note: `${yearHint}\n다른 검색은 search_statistics("${input.query}") 사용.`,
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
return {
|
|
368
|
+
success: false,
|
|
369
|
+
answer: `조회 중 오류가 발생했습니다: ${errorMessage}`,
|
|
370
|
+
note: `search_statistics("${input.query}")로 직접 검색해보세요.`,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* 쿼리에서 키워드 추출 (korean-law-mcp의 정규화 alias 패턴 차용)
|
|
376
|
+
*
|
|
377
|
+
* 알고리즘:
|
|
378
|
+
* 1. 정규화 (공백·대소문자·중점/하이픈 제거 + 률/율 오타 매핑)
|
|
379
|
+
* 2. KEYWORD_LOOKUP에서 가장 긴 정규화 키 부분 매칭 (긴 키 우선 → 충돌 방지)
|
|
380
|
+
* → "경기 노인 인구"는 '노인인구'(4자)가 '인구'(2자)보다 먼저 매칭
|
|
381
|
+
* → "G D P"·"출산률"·"PM 2.5"도 모두 정규화 후 매칭
|
|
382
|
+
* 3. 매칭 실패 시 원문 그대로 반환 (getQuickStatsParam에서 추가 처리)
|
|
383
|
+
*
|
|
384
|
+
* KEYWORD_LOOKUP은 정식 키워드 + KEYWORD_ALIASES + BASIC_TYPO_MAP을 통합한 사전 빌드 Map.
|
|
385
|
+
*/
|
|
386
|
+
const SORTED_NORM_KEYS = Array.from(KEYWORD_LOOKUP.keys())
|
|
387
|
+
.filter((k) => k.length >= 2)
|
|
388
|
+
.sort((a, b) => b.length - a.length);
|
|
389
|
+
export function extractKeyword(query) {
|
|
390
|
+
if (!query)
|
|
391
|
+
return query;
|
|
392
|
+
const normQuery = normalizeKeywordKey(query);
|
|
393
|
+
if (!normQuery)
|
|
394
|
+
return query;
|
|
395
|
+
for (const nk of SORTED_NORM_KEYS) {
|
|
396
|
+
if (normQuery.includes(nk)) {
|
|
397
|
+
return KEYWORD_LOOKUP.get(nk);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
return query;
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* 기간 형식 포맷팅 (년/분기/월 지원)
|
|
404
|
+
*/
|
|
405
|
+
function formatPeriod(period) {
|
|
406
|
+
if (period.length === 4) {
|
|
407
|
+
// 연간: "2024" → "2024년"
|
|
408
|
+
return `${period}년`;
|
|
409
|
+
}
|
|
410
|
+
else if (period.length === 6) {
|
|
411
|
+
const year = period.slice(0, 4);
|
|
412
|
+
const suffix = period.slice(4);
|
|
413
|
+
const num = parseInt(suffix, 10);
|
|
414
|
+
// 분기인지 월인지 구분 (01~04는 분기일 수도, 01~12는 월)
|
|
415
|
+
// KOSIS API는 분기를 01, 02, 03, 04로, 월을 01~12로 표현
|
|
416
|
+
// 구분을 위해 값의 범위로 판단 (5 이상이면 월)
|
|
417
|
+
if (num >= 5 && num <= 12) {
|
|
418
|
+
// 월간: "202410" → "2024년 10월"
|
|
419
|
+
return `${year}년 ${num}월`;
|
|
420
|
+
}
|
|
421
|
+
else if (num >= 1 && num <= 4) {
|
|
422
|
+
// 분기: "202401" → "2024년 1분기" (단, 월일 수도 있음)
|
|
423
|
+
// 이 경우 호출 컨텍스트에서 판단해야 함
|
|
424
|
+
// 기본적으로 월로 처리 (1~4월)
|
|
425
|
+
return `${year}년 ${num}월`;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
return period;
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* 기간 형식 포맷팅 (주기 타입 명시)
|
|
432
|
+
*/
|
|
433
|
+
function formatPeriodWithType(period, periodType) {
|
|
434
|
+
if (period.length === 4) {
|
|
435
|
+
return `${period}년`;
|
|
436
|
+
}
|
|
437
|
+
else if (period.length === 6) {
|
|
438
|
+
const year = period.slice(0, 4);
|
|
439
|
+
const num = parseInt(period.slice(4), 10);
|
|
440
|
+
if (periodType === 'Q') {
|
|
441
|
+
return `${year}년 ${num}분기`;
|
|
442
|
+
}
|
|
443
|
+
else if (periodType === 'M') {
|
|
444
|
+
return `${year}년 ${num}월`;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
return period;
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* 한국어 받침 유무에 따라 조사 선택
|
|
451
|
+
* 받침이 있으면 '은', 없으면 '는'
|
|
452
|
+
*/
|
|
453
|
+
function getKoreanParticle(text) {
|
|
454
|
+
if (!text || text.length === 0)
|
|
455
|
+
return '은';
|
|
456
|
+
const lastChar = text.charAt(text.length - 1);
|
|
457
|
+
const code = lastChar.charCodeAt(0);
|
|
458
|
+
// 한글 유니코드 범위: 0xAC00 ~ 0xD7A3
|
|
459
|
+
if (code >= 0xAC00 && code <= 0xD7A3) {
|
|
460
|
+
// 종성(받침) 존재 여부 확인
|
|
461
|
+
// (code - 0xAC00) % 28 === 0 이면 받침 없음
|
|
462
|
+
const hasJongseong = (code - 0xAC00) % 28 !== 0;
|
|
463
|
+
return hasJongseong ? '은' : '는';
|
|
464
|
+
}
|
|
465
|
+
// 숫자나 영문 등은 기본적으로 '는' 사용
|
|
466
|
+
return '는';
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* 자연어 응답 생성
|
|
470
|
+
*/
|
|
471
|
+
function generateNaturalResponse(data) {
|
|
472
|
+
const { regionName, value, unit, period, description } = data;
|
|
473
|
+
// 숫자 포맷팅 (콤마 추가)
|
|
474
|
+
const formattedValue = value.includes(',') ? value : Number(value).toLocaleString();
|
|
475
|
+
// 단위 포맷팅 (지수 기준연도는 괄호로 감싸기)
|
|
476
|
+
let formattedUnit = unit;
|
|
477
|
+
if (unit.includes('=')) {
|
|
478
|
+
// 지수 단위 (예: 2020=100, 2021.6=100)
|
|
479
|
+
formattedUnit = unit.startsWith('(') ? ` ${unit}` : ` (${unit})`;
|
|
480
|
+
}
|
|
481
|
+
// 한국어 문법: 받침 유무에 따라 은/는 선택
|
|
482
|
+
const suffix = getKoreanParticle(description);
|
|
483
|
+
if (regionName === '전국') {
|
|
484
|
+
return `${period} 한국의 ${description}${suffix} ${formattedValue}${formattedUnit}입니다.`;
|
|
485
|
+
}
|
|
486
|
+
else {
|
|
487
|
+
return `${period} ${regionName}의 ${description}${suffix} ${formattedValue}${formattedUnit}입니다.`;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
//# sourceMappingURL=quickStats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickStats.js","sourceRoot":"","sources":["../../src/tools/quickStats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 빠른 추세 분석 도구
|
|
3
|
+
* 자연어 키워드로 시계열 추세를 간편하게 분석
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
/**
|
|
7
|
+
* 자연어 키워드에서 yearCount 추정
|
|
8
|
+
*
|
|
9
|
+
* 인식 패턴:
|
|
10
|
+
* - "지난/최근 N년", "N년 추세/추이" → N
|
|
11
|
+
* - "작년 대비", "전년 대비" → 2
|
|
12
|
+
* - "민선 N기" → N*4 (지방선거 임기 4년)
|
|
13
|
+
* - "임기 N년" → N
|
|
14
|
+
* - "취임 N년", "취임 N년차" → N+1 (취임 시점 포함)
|
|
15
|
+
* - "역대", "장기" → 20
|
|
16
|
+
*/
|
|
17
|
+
export declare function extractYearCount(query: string): number | null;
|
|
18
|
+
export declare const quickTrendSchema: {
|
|
19
|
+
name: string;
|
|
20
|
+
description: string;
|
|
21
|
+
inputSchema: z.ZodObject<{
|
|
22
|
+
keyword: z.ZodString;
|
|
23
|
+
region: z.ZodOptional<z.ZodString>;
|
|
24
|
+
yearCount: z.ZodOptional<z.ZodNumber>;
|
|
25
|
+
}, "strip", z.ZodTypeAny, {
|
|
26
|
+
keyword: string;
|
|
27
|
+
region?: string | undefined;
|
|
28
|
+
yearCount?: number | undefined;
|
|
29
|
+
}, {
|
|
30
|
+
keyword: string;
|
|
31
|
+
region?: string | undefined;
|
|
32
|
+
yearCount?: number | undefined;
|
|
33
|
+
}>;
|
|
34
|
+
};
|
|
35
|
+
export type QuickTrendInput = z.infer<typeof quickTrendSchema.inputSchema>;
|
|
36
|
+
export interface TrendDataPoint {
|
|
37
|
+
year: string;
|
|
38
|
+
value: number;
|
|
39
|
+
formatted: string;
|
|
40
|
+
changeRate?: string;
|
|
41
|
+
}
|
|
42
|
+
interface QuickTrendResult {
|
|
43
|
+
success: boolean;
|
|
44
|
+
keyword: string;
|
|
45
|
+
region: string;
|
|
46
|
+
trend: 'increasing' | 'decreasing' | 'stable' | 'fluctuating';
|
|
47
|
+
trendDescription: string;
|
|
48
|
+
summary: string;
|
|
49
|
+
dataPoints: TrendDataPoint[];
|
|
50
|
+
insights: string[];
|
|
51
|
+
source?: {
|
|
52
|
+
orgId: string;
|
|
53
|
+
tableId: string;
|
|
54
|
+
tableName: string;
|
|
55
|
+
};
|
|
56
|
+
isProjection?: boolean;
|
|
57
|
+
note?: string;
|
|
58
|
+
}
|
|
59
|
+
export declare function quickTrend(input: QuickTrendInput): Promise<QuickTrendResult>;
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=quickTrend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickTrend.d.ts","sourceRoot":"","sources":["../../src/tools/quickTrend.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAkBxB;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA8B7D;AAED,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;CA8B5B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,WAAW,CAAC,CAAC;AAE3E,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,gBAAgB;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,aAAa,CAAC;IAC9D,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAUD,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA8PlF"}
|