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.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +301 -0
  3. package/dist/api/client.d.ts +65 -0
  4. package/dist/api/client.d.ts.map +1 -0
  5. package/dist/api/client.js +143 -0
  6. package/dist/api/client.js.map +1 -0
  7. package/dist/api/types.d.ts +157 -0
  8. package/dist/api/types.d.ts.map +1 -0
  9. package/dist/api/types.js +5 -0
  10. package/dist/api/types.js.map +1 -0
  11. package/dist/cache/index.d.ts +55 -0
  12. package/dist/cache/index.d.ts.map +1 -0
  13. package/dist/cache/index.js +102 -0
  14. package/dist/cache/index.js.map +1 -0
  15. package/dist/config/index.d.ts +46 -0
  16. package/dist/config/index.d.ts.map +1 -0
  17. package/dist/config/index.js +54 -0
  18. package/dist/config/index.js.map +1 -0
  19. package/dist/data/quickStatsParams.d.ts +76 -0
  20. package/dist/data/quickStatsParams.d.ts.map +1 -0
  21. package/dist/data/quickStatsParams.js +1344 -0
  22. package/dist/data/quickStatsParams.js.map +1 -0
  23. package/dist/index.d.ts +13 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +56 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/prompts/index.d.ts +5 -0
  28. package/dist/prompts/index.d.ts.map +1 -0
  29. package/dist/prompts/index.js +5 -0
  30. package/dist/prompts/index.js.map +1 -0
  31. package/dist/prompts/statisticsAssistant.d.ts +25 -0
  32. package/dist/prompts/statisticsAssistant.d.ts.map +1 -0
  33. package/dist/prompts/statisticsAssistant.js +43 -0
  34. package/dist/prompts/statisticsAssistant.js.map +1 -0
  35. package/dist/resources/categoryTree.d.ts +18 -0
  36. package/dist/resources/categoryTree.d.ts.map +1 -0
  37. package/dist/resources/categoryTree.js +80 -0
  38. package/dist/resources/categoryTree.js.map +1 -0
  39. package/dist/resources/index.d.ts +6 -0
  40. package/dist/resources/index.d.ts.map +1 -0
  41. package/dist/resources/index.js +6 -0
  42. package/dist/resources/index.js.map +1 -0
  43. package/dist/resources/keyIndicators.d.ts +20 -0
  44. package/dist/resources/keyIndicators.d.ts.map +1 -0
  45. package/dist/resources/keyIndicators.js +108 -0
  46. package/dist/resources/keyIndicators.js.map +1 -0
  47. package/dist/server-http.d.ts +10 -0
  48. package/dist/server-http.d.ts.map +1 -0
  49. package/dist/server-http.js +134 -0
  50. package/dist/server-http.js.map +1 -0
  51. package/dist/server.d.ts +10 -0
  52. package/dist/server.d.ts.map +1 -0
  53. package/dist/server.js +194 -0
  54. package/dist/server.js.map +1 -0
  55. package/dist/tools/analyzeTimeSeries.d.ts +70 -0
  56. package/dist/tools/analyzeTimeSeries.d.ts.map +1 -0
  57. package/dist/tools/analyzeTimeSeries.js +204 -0
  58. package/dist/tools/analyzeTimeSeries.js.map +1 -0
  59. package/dist/tools/chains.d.ts +197 -0
  60. package/dist/tools/chains.d.ts.map +1 -0
  61. package/dist/tools/chains.js +369 -0
  62. package/dist/tools/chains.js.map +1 -0
  63. package/dist/tools/compareStatistics.d.ts +62 -0
  64. package/dist/tools/compareStatistics.d.ts.map +1 -0
  65. package/dist/tools/compareStatistics.js +190 -0
  66. package/dist/tools/compareStatistics.js.map +1 -0
  67. package/dist/tools/fetchKosisExcel.d.ts +62 -0
  68. package/dist/tools/fetchKosisExcel.d.ts.map +1 -0
  69. package/dist/tools/fetchKosisExcel.js +366 -0
  70. package/dist/tools/fetchKosisExcel.js.map +1 -0
  71. package/dist/tools/getRecommendedStats.d.ts +41 -0
  72. package/dist/tools/getRecommendedStats.d.ts.map +1 -0
  73. package/dist/tools/getRecommendedStats.js +251 -0
  74. package/dist/tools/getRecommendedStats.js.map +1 -0
  75. package/dist/tools/getStatisticsData.d.ts +75 -0
  76. package/dist/tools/getStatisticsData.d.ts.map +1 -0
  77. package/dist/tools/getStatisticsData.js +305 -0
  78. package/dist/tools/getStatisticsData.js.map +1 -0
  79. package/dist/tools/getStatisticsList.d.ts +69 -0
  80. package/dist/tools/getStatisticsList.d.ts.map +1 -0
  81. package/dist/tools/getStatisticsList.js +336 -0
  82. package/dist/tools/getStatisticsList.js.map +1 -0
  83. package/dist/tools/getTableInfo.d.ts +66 -0
  84. package/dist/tools/getTableInfo.d.ts.map +1 -0
  85. package/dist/tools/getTableInfo.js +85 -0
  86. package/dist/tools/getTableInfo.js.map +1 -0
  87. package/dist/tools/index.d.ts +14 -0
  88. package/dist/tools/index.d.ts.map +1 -0
  89. package/dist/tools/index.js +19 -0
  90. package/dist/tools/index.js.map +1 -0
  91. package/dist/tools/quickStats.d.ts +71 -0
  92. package/dist/tools/quickStats.d.ts.map +1 -0
  93. package/dist/tools/quickStats.js +490 -0
  94. package/dist/tools/quickStats.js.map +1 -0
  95. package/dist/tools/quickTrend.d.ts +61 -0
  96. package/dist/tools/quickTrend.d.ts.map +1 -0
  97. package/dist/tools/quickTrend.js +328 -0
  98. package/dist/tools/quickTrend.js.map +1 -0
  99. package/dist/tools/searchStatistics.d.ts +41 -0
  100. package/dist/tools/searchStatistics.d.ts.map +1 -0
  101. package/dist/tools/searchStatistics.js +318 -0
  102. package/dist/tools/searchStatistics.js.map +1 -0
  103. package/dist/utils/dataFormatter.d.ts +40 -0
  104. package/dist/utils/dataFormatter.d.ts.map +1 -0
  105. package/dist/utils/dataFormatter.js +142 -0
  106. package/dist/utils/dataFormatter.js.map +1 -0
  107. package/dist/utils/errorHandler.d.ts +33 -0
  108. package/dist/utils/errorHandler.d.ts.map +1 -0
  109. package/dist/utils/errorHandler.js +94 -0
  110. package/dist/utils/errorHandler.js.map +1 -0
  111. package/dist/utils/metaLookup.d.ts +93 -0
  112. package/dist/utils/metaLookup.d.ts.map +1 -0
  113. package/dist/utils/metaLookup.js +170 -0
  114. package/dist/utils/metaLookup.js.map +1 -0
  115. package/dist/utils/queryParser.d.ts +45 -0
  116. package/dist/utils/queryParser.d.ts.map +1 -0
  117. package/dist/utils/queryParser.js +244 -0
  118. package/dist/utils/queryParser.js.map +1 -0
  119. package/dist/utils/regions.d.ts +70 -0
  120. package/dist/utils/regions.d.ts.map +1 -0
  121. package/dist/utils/regions.js +261 -0
  122. package/dist/utils/regions.js.map +1 -0
  123. package/package.json +60 -0
@@ -0,0 +1,318 @@
1
+ /**
2
+ * 통계 검색 도구
3
+ * 키워드로 KOSIS 통계표를 검색
4
+ */
5
+ import { z } from 'zod';
6
+ import { getKosisClient } from '../api/client.js';
7
+ import { getCacheManager } from '../cache/index.js';
8
+ import { parseQuery, generateSearchTerms, REGION_NAMES } from '../utils/queryParser.js';
9
+ import { detectRegion, isProvinceBaseStat } from '../utils/regions.js';
10
+ /**
11
+ * 키워드별 우선 표시 테이블 ID
12
+ * - 검색 결과에서 이 테이블들이 있으면 상위로 배치
13
+ * - 일반 사용자가 가장 기대하는 결과를 먼저 보여주기 위함
14
+ */
15
+ const PRIORITY_TABLES = {
16
+ // 인구 관련
17
+ '인구': ['DT_1B04005', 'DT_1IN1503', 'DT_1YL20001', 'DT_1B8000F'],
18
+ '인구수': ['DT_1B04005', 'DT_1IN1503'],
19
+ '총인구': ['DT_1B04005', 'DT_1IN1503', 'DT_1YL20001'],
20
+ '주민등록인구': ['DT_1B04005', 'DT_1IN1503'],
21
+ '인구현황': ['DT_1B04005', 'DT_1IN1503'],
22
+ // 주거/부동산 관련
23
+ '집값': ['DT_1YL21101', 'DT_1YL20111E'],
24
+ '주택가격': ['DT_1YL21101', 'DT_1YL20111E'],
25
+ '아파트': ['DT_1YL21101', 'DT_1YL20111E'],
26
+ '아파트가격': ['DT_1YL21101'],
27
+ '전세': ['DT_1YL21101', 'DT_1YL20111E'],
28
+ '매매': ['DT_1YL21101', 'DT_1YL20111E'],
29
+ '부동산': ['DT_1YL21101', 'DT_1YL20111E'],
30
+ // 고용 관련
31
+ '실업률': ['DT_1DA7102S', 'DT_1DA7001'],
32
+ '실업': ['DT_1DA7102S', 'DT_1DA7001'],
33
+ '취업': ['DT_1DA7001', 'DT_1DA7012'],
34
+ '고용률': ['DT_1DA7001', 'DT_1DA7012'],
35
+ // 경제 관련
36
+ 'GDP': ['DT_2AS004', 'DT_2AS003'],
37
+ '국내총생산': ['DT_2AS004', 'DT_2AS003'],
38
+ '경제성장': ['DT_2AS004', 'DT_2AS003'],
39
+ '물가': ['DT_1J22001', 'DT_1J20001'],
40
+ '소비자물가': ['DT_1J22001', 'DT_1J20001'],
41
+ // 출산/사망 관련
42
+ '출산율': ['DT_1B81A17', 'DT_1B8000H'],
43
+ '합계출산율': ['DT_1B81A17'],
44
+ '출생': ['DT_1B8000H', 'DT_1B8000F'],
45
+ '사망': ['DT_1B8000H', 'DT_1B8000F'],
46
+ };
47
+ /**
48
+ * 검색어 동의어 사전
49
+ * - 다양한 표현을 표준 검색어로 통일
50
+ */
51
+ const SYNONYMS = {
52
+ '인구': ['인구수', '총인구', '주민등록인구', '인구현황', '인구통계'],
53
+ '집값': ['주택가격', '아파트값', '부동산가격', '집가격', '아파트가격'],
54
+ '월급': ['임금', '급여', '소득', '평균임금', '월소득'],
55
+ '실업률': ['실업', '실업자', '실업자수'],
56
+ '물가': ['소비자물가', '물가지수', 'CPI'],
57
+ };
58
+ /**
59
+ * 검색 결과에 우선 테이블이 없을 때 직접 삽입할 폴백 테이블
60
+ * - KOSIS API 검색이 핵심 통계를 반환하지 않을 때 사용
61
+ */
62
+ const FALLBACK_TABLES = {
63
+ '인구': [
64
+ { ORG_ID: '101', ORG_NM: '통계청', TBL_ID: 'DT_1B04005', TBL_NM: '시도/성/연령별 주민등록인구', STAT_ID: 'DT_1B04005', STAT_NM: '주민등록인구현황', VW_CD: 'MT_ZTITLE' },
65
+ { ORG_ID: '101', ORG_NM: '통계청', TBL_ID: 'DT_1IN1503', TBL_NM: '주민등록인구현황(시군구)', STAT_ID: 'DT_1IN1503', STAT_NM: '주민등록인구현황', VW_CD: 'MT_ZTITLE' },
66
+ ],
67
+ '집값': [
68
+ { ORG_ID: '116', ORG_NM: '한국부동산원', TBL_ID: 'DT_1YL21101', TBL_NM: '아파트 매매/전세 가격지수', STAT_ID: 'DT_1YL21101', STAT_NM: '부동산통계', VW_CD: 'MT_ZTITLE' },
69
+ { ORG_ID: '116', ORG_NM: '한국부동산원', TBL_ID: 'DT_1YL20111E', TBL_NM: '주택매매가격지수', STAT_ID: 'DT_1YL20111E', STAT_NM: '부동산통계', VW_CD: 'MT_ZTITLE' },
70
+ ],
71
+ '실업률': [
72
+ { ORG_ID: '101', ORG_NM: '통계청', TBL_ID: 'DT_1DA7102S', TBL_NM: '성/연령별 실업률', STAT_ID: 'DT_1DA7102S', STAT_NM: '경제활동인구조사', VW_CD: 'MT_ZTITLE' },
73
+ { ORG_ID: '101', ORG_NM: '통계청', TBL_ID: 'DT_1DA7001', TBL_NM: '경제활동인구총괄', STAT_ID: 'DT_1DA7001', STAT_NM: '경제활동인구조사', VW_CD: 'MT_ZTITLE' },
74
+ ],
75
+ 'GDP': [
76
+ { ORG_ID: '301', ORG_NM: '한국은행', TBL_ID: 'DT_200Y001', TBL_NM: '국내총생산(GDP)', STAT_ID: 'DT_200Y001', STAT_NM: '국민계정', VW_CD: 'MT_OTITLE' },
77
+ { ORG_ID: '301', ORG_NM: '한국은행', TBL_ID: 'DT_2AS004', TBL_NM: '경제성장률', STAT_ID: 'DT_2AS004', STAT_NM: '국민계정', VW_CD: 'MT_OTITLE' },
78
+ ],
79
+ '물가': [
80
+ { ORG_ID: '101', ORG_NM: '통계청', TBL_ID: 'DT_1J22001', TBL_NM: '소비자물가 등락률', STAT_ID: 'DT_1J22001', STAT_NM: '소비자물가조사', VW_CD: 'MT_ZTITLE' },
81
+ { ORG_ID: '101', ORG_NM: '통계청', TBL_ID: 'DT_1J20001', TBL_NM: '소비자물가지수', STAT_ID: 'DT_1J20001', STAT_NM: '소비자물가조사', VW_CD: 'MT_ZTITLE' },
82
+ ],
83
+ '출산율': [
84
+ { ORG_ID: '101', ORG_NM: '통계청', TBL_ID: 'DT_1B81A17', TBL_NM: '합계출산율', STAT_ID: 'DT_1B81A17', STAT_NM: '인구동향조사', VW_CD: 'MT_ZTITLE' },
85
+ { ORG_ID: '101', ORG_NM: '통계청', TBL_ID: 'DT_1B8000H', TBL_NM: '인구동태건수(출생/사망)', STAT_ID: 'DT_1B8000H', STAT_NM: '인구동향조사', VW_CD: 'MT_ZTITLE' },
86
+ ],
87
+ };
88
+ export const searchStatisticsSchema = {
89
+ name: 'search_statistics',
90
+ description: '[검색] 키워드로 KOSIS 통계표 검색 → orgId/tableId 메타 획득 (직접 데이터 조회 전 단계). 자치구·시군은 광역시도 기본통계 시리즈로 자동 라우팅(Path A/B/C). 단일 수치/추세는 quick_stats / quick_trend가 더 빠름. 분야는 알지만 통계표를 모르면 get_statistics_list(recommendedTopic).',
91
+ inputSchema: z.object({
92
+ query: z
93
+ .string()
94
+ .describe('검색어 (예: 인구, 경제성장률, 출생률, 서울 실업률)'),
95
+ orgId: z
96
+ .string()
97
+ .optional()
98
+ .describe('기관코드 (선택, 예: 101=통계청)'),
99
+ sort: z
100
+ .enum(['RANK', 'DATE'])
101
+ .optional()
102
+ .default('RANK')
103
+ .describe('정렬: RANK(정확도순), DATE(최신순)'),
104
+ limit: z
105
+ .number()
106
+ .min(1)
107
+ .max(50)
108
+ .optional()
109
+ .default(10)
110
+ .describe('결과 개수 (기본: 10, 최대: 50)'),
111
+ }),
112
+ };
113
+ export async function searchStatistics(input) {
114
+ const client = getKosisClient();
115
+ const cache = getCacheManager();
116
+ // 쿼리 분석
117
+ const parsed = parseQuery(input.query);
118
+ const searchTerms = generateSearchTerms(parsed, input.query);
119
+ // 지역명 추출 (결과 필터링용)
120
+ const regionNames = parsed.regions.map(code => REGION_NAMES[code]).filter(Boolean);
121
+ const hasRegion = regionNames.length > 0;
122
+ // 자치구·시·군 감지 → 「OO광역시도 기본통계」시리즈 라우팅
123
+ const detected = detectRegion(input.query);
124
+ const districtName = detected.district;
125
+ const provinceOrgId = detected.province?.orgId;
126
+ // 명시적 orgId 우선, 없으면 자치구 감지 결과 활용
127
+ const effectiveOrgId = input.orgId ?? provinceOrgId;
128
+ // 검색어 결정 - 지역이 있으면 조합 검색어 우선, 없으면 원본 쿼리
129
+ const searchWord = searchTerms.length > 0 ? searchTerms[0] : input.query;
130
+ try {
131
+ // 캐시된 검색 결과 조회
132
+ let results = await cache.getSearchResults({ query: searchWord, orgId: effectiveOrgId, sort: input.sort }, async () => {
133
+ return client.searchStatistics(searchWord, {
134
+ orgId: effectiveOrgId,
135
+ sort: input.sort,
136
+ startCount: 1,
137
+ resultCount: input.limit ? input.limit * 2 : 20, // 지역 필터링을 위해 더 많이 조회
138
+ });
139
+ });
140
+ // 검색 결과 후처리 - 우선 테이블 상위 배치
141
+ // 1. 검색어에서 우선 테이블 ID 추출
142
+ const priorityTableIds = getPriorityTableIds(input.query);
143
+ // 2. 검색 결과에 우선 테이블이 없으면 폴백 테이블 삽입
144
+ const existingTableIds = new Set(results.map(r => r.TBL_ID));
145
+ const hasPriorityTable = priorityTableIds.some(id => existingTableIds.has(id));
146
+ if (!hasPriorityTable) {
147
+ // 폴백 테이블 가져오기
148
+ const fallbackTables = getFallbackTables(input.query);
149
+ if (fallbackTables.length > 0) {
150
+ // 폴백 테이블을 맨 앞에 추가 (중복 제거)
151
+ const newTables = fallbackTables.filter(t => !existingTableIds.has(t.TBL_ID));
152
+ results = [...newTables, ...results];
153
+ }
154
+ }
155
+ if (results.length > 0) {
156
+ // 3. 결과 정렬 - 우선 테이블과 지역명 고려
157
+ results = results.sort((a, b) => {
158
+ // 자치구 감지 시: 해당 광역시도 「기본통계」 시리즈 (DT_2xx004_*) 최우선
159
+ if (districtName && provinceOrgId) {
160
+ const aIsBase = isProvinceBaseStat(a.ORG_ID, a.TBL_ID) != null;
161
+ const bIsBase = isProvinceBaseStat(b.ORG_ID, b.TBL_ID) != null;
162
+ if (aIsBase && !bIsBase)
163
+ return -1;
164
+ if (!aIsBase && bIsBase)
165
+ return 1;
166
+ }
167
+ // 우선 테이블 점수 계산 (낮을수록 우선)
168
+ const aPriority = getPriorityScore(a.TBL_ID, priorityTableIds);
169
+ const bPriority = getPriorityScore(b.TBL_ID, priorityTableIds);
170
+ // 우선 테이블 점수가 다르면 그걸로 정렬
171
+ if (aPriority !== bPriority) {
172
+ return aPriority - bPriority;
173
+ }
174
+ // 지역이 있는 경우 지역명 포함 여부로 2차 정렬
175
+ if (hasRegion) {
176
+ const aHasRegion = regionNames.some(region => (a.TBL_NM || '').includes(region) ||
177
+ (a.STAT_NM || '').includes(region));
178
+ const bHasRegion = regionNames.some(region => (b.TBL_NM || '').includes(region) ||
179
+ (b.STAT_NM || '').includes(region));
180
+ if (aHasRegion && !bHasRegion)
181
+ return -1;
182
+ if (!aHasRegion && bHasRegion)
183
+ return 1;
184
+ }
185
+ // 테이블명에 검색 키워드가 직접 포함된 경우 우선
186
+ const queryKeywords = input.query.split(/\s+/).filter(k => k.length > 1);
187
+ const aHasKeyword = queryKeywords.some(k => (a.TBL_NM || '').includes(k));
188
+ const bHasKeyword = queryKeywords.some(k => (b.TBL_NM || '').includes(k));
189
+ if (aHasKeyword && !bHasKeyword)
190
+ return -1;
191
+ if (!aHasKeyword && bHasKeyword)
192
+ return 1;
193
+ return 0;
194
+ });
195
+ }
196
+ // 결과 개수 제한 (정렬 후 상위 N개만)
197
+ const limitedResults = results.slice(0, input.limit || 10);
198
+ // 결과 간소화
199
+ // API 응답 필드: ORG_ID, ORG_NM, TBL_ID, TBL_NM, STAT_NM, STRT_PRD_DE, END_PRD_DE, VW_CD 등
200
+ const simplifiedResults = limitedResults.map((item) => ({
201
+ orgId: item.ORG_ID,
202
+ orgName: item.ORG_NM,
203
+ tableId: item.TBL_ID,
204
+ tableName: item.TBL_NM,
205
+ statisticsName: item.STAT_NM,
206
+ period: item.STRT_PRD_DE && item.END_PRD_DE
207
+ ? `${item.STRT_PRD_DE}~${item.END_PRD_DE}`
208
+ : item.STRT_PRD_DE || item.END_PRD_DE || '',
209
+ periodType: item.VW_CD || '',
210
+ lastUpdated: item.END_PRD_DE,
211
+ }));
212
+ // 후속 질문 제안
213
+ const suggestions = [];
214
+ if (simplifiedResults.length > 0) {
215
+ const firstResult = simplifiedResults[0];
216
+ if (districtName) {
217
+ suggestions.push(`"${firstResult.tableName}"에서 ${districtName} 데이터 조회 (regionName="${districtName}")`);
218
+ }
219
+ else {
220
+ suggestions.push(`"${firstResult.tableName}"의 최근 데이터 조회`, `${firstResult.orgName}의 다른 통계 검색`);
221
+ }
222
+ if (parsed.regions.length === 0 && !districtName) {
223
+ suggestions.push('서울, 부산 등 지역별 데이터 비교');
224
+ }
225
+ if (!parsed.timeRange) {
226
+ suggestions.push('최근 5년 추세 분석');
227
+ }
228
+ }
229
+ return {
230
+ success: true,
231
+ totalCount: simplifiedResults.length,
232
+ results: simplifiedResults,
233
+ queryAnalysis: {
234
+ topics: parsed.topics,
235
+ regions: parsed.regions,
236
+ intent: parsed.intent,
237
+ district: districtName,
238
+ province: detected.province?.fullName,
239
+ },
240
+ suggestions,
241
+ };
242
+ }
243
+ catch (error) {
244
+ console.error('Search error:', error);
245
+ return {
246
+ success: false,
247
+ totalCount: 0,
248
+ results: [],
249
+ queryAnalysis: {
250
+ topics: parsed.topics,
251
+ regions: parsed.regions,
252
+ intent: parsed.intent,
253
+ },
254
+ };
255
+ }
256
+ }
257
+ /**
258
+ * 검색어에서 우선 배치해야 할 테이블 ID 목록 추출
259
+ */
260
+ function getPriorityTableIds(query) {
261
+ const tableIds = [];
262
+ // 1. 직접 매칭되는 키워드 확인
263
+ for (const [keyword, ids] of Object.entries(PRIORITY_TABLES)) {
264
+ if (query.includes(keyword)) {
265
+ tableIds.push(...ids);
266
+ }
267
+ }
268
+ // 2. 동의어 확인
269
+ for (const [standard, synonyms] of Object.entries(SYNONYMS)) {
270
+ if (synonyms.some(syn => query.includes(syn))) {
271
+ // 동의어가 매칭되면 표준 키워드의 우선 테이블 추가
272
+ if (PRIORITY_TABLES[standard]) {
273
+ tableIds.push(...PRIORITY_TABLES[standard]);
274
+ }
275
+ }
276
+ }
277
+ // 중복 제거
278
+ return [...new Set(tableIds)];
279
+ }
280
+ /**
281
+ * 테이블 ID의 우선순위 점수 계산
282
+ * - 우선 목록에 있으면 순서대로 낮은 점수 (0, 1, 2...)
283
+ * - 없으면 높은 점수 (1000)
284
+ */
285
+ function getPriorityScore(tableId, priorityTableIds) {
286
+ const index = priorityTableIds.indexOf(tableId);
287
+ return index >= 0 ? index : 1000;
288
+ }
289
+ /**
290
+ * 검색어에 해당하는 폴백 테이블 가져오기
291
+ * - 직접 매칭 및 동의어 매칭 지원
292
+ */
293
+ function getFallbackTables(query) {
294
+ const tables = [];
295
+ // 1. 직접 매칭
296
+ for (const [keyword, fallbacks] of Object.entries(FALLBACK_TABLES)) {
297
+ if (query.includes(keyword)) {
298
+ tables.push(...fallbacks);
299
+ }
300
+ }
301
+ // 2. 동의어 매칭
302
+ for (const [standard, synonyms] of Object.entries(SYNONYMS)) {
303
+ if (synonyms.some(syn => query.includes(syn))) {
304
+ if (FALLBACK_TABLES[standard]) {
305
+ tables.push(...FALLBACK_TABLES[standard]);
306
+ }
307
+ }
308
+ }
309
+ // 중복 제거
310
+ const seen = new Set();
311
+ return tables.filter(t => {
312
+ if (seen.has(t.TBL_ID))
313
+ return false;
314
+ seen.add(t.TBL_ID);
315
+ return true;
316
+ });
317
+ }
318
+ //# sourceMappingURL=searchStatistics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchStatistics.js","sourceRoot":"","sources":["../../src/tools/searchStatistics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * 데이터 포매팅 유틸리티
3
+ */
4
+ import type { StatisticsDataItem, SimplifiedDataItem } from '../api/types.js';
5
+ /**
6
+ * 통계 데이터 간소화
7
+ */
8
+ export declare function simplifyStatisticsData(items: StatisticsDataItem[]): SimplifiedDataItem[];
9
+ /**
10
+ * 시점 포매팅
11
+ */
12
+ export declare function formatPeriod(period: string, periodType: string): string;
13
+ /**
14
+ * 숫자 포매팅
15
+ */
16
+ export declare function formatNumber(value: string): string;
17
+ /**
18
+ * 변화율 계산
19
+ */
20
+ export declare function calculateChangeRate(current: number, previous: number): {
21
+ rate: number;
22
+ direction: 'up' | 'down' | 'stable';
23
+ formatted: string;
24
+ };
25
+ /**
26
+ * 추세 분석
27
+ */
28
+ export declare function analyzeTrend(values: number[]): {
29
+ trend: 'increasing' | 'decreasing' | 'stable' | 'fluctuating';
30
+ avgGrowthRate: number;
31
+ volatility: number;
32
+ };
33
+ /**
34
+ * 시각화 타입 추천
35
+ */
36
+ export declare function recommendVisualization(dataLength: number, hasMultipleCategories: boolean, isTimeSeries: boolean): {
37
+ type: 'bar' | 'line' | 'pie' | 'table';
38
+ reason: string;
39
+ };
40
+ //# sourceMappingURL=dataFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataFormatter.d.ts","sourceRoot":"","sources":["../../src/utils/dataFormatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE9E;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,kBAAkB,EAAE,GAC1B,kBAAkB,EAAE,CAQtB;AAkBD;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAevE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWlD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf;IACD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB,CAWA;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EAAE,GACf;IACD,KAAK,EAAE,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,aAAa,CAAC;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,CAuCA;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,qBAAqB,EAAE,OAAO,EAC9B,YAAY,EAAE,OAAO,GACpB;IACD,IAAI,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC;CAChB,CA0BA"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * 데이터 포매팅 유틸리티
3
+ */
4
+ /**
5
+ * 통계 데이터 간소화
6
+ */
7
+ export function simplifyStatisticsData(items) {
8
+ return items.map((item) => ({
9
+ period: formatPeriod(item.PRD_DE, item.PRD_SE),
10
+ value: formatNumber(item.DT),
11
+ classification: getClassificationName(item),
12
+ item: item.ITM_NM,
13
+ unit: item.UNIT_NM,
14
+ }));
15
+ }
16
+ /**
17
+ * 분류명 추출
18
+ */
19
+ function getClassificationName(item) {
20
+ const names = [];
21
+ for (let i = 1; i <= 8; i++) {
22
+ const name = item[`C${i}_NM`];
23
+ if (name) {
24
+ names.push(name);
25
+ }
26
+ }
27
+ return names.join(' > ') || '-';
28
+ }
29
+ /**
30
+ * 시점 포매팅
31
+ */
32
+ export function formatPeriod(period, periodType) {
33
+ if (!period)
34
+ return '-';
35
+ switch (periodType) {
36
+ case 'Y':
37
+ return `${period}년`;
38
+ case 'Q':
39
+ return `${period.slice(0, 4)}년 ${period.slice(4)}분기`;
40
+ case 'M':
41
+ return `${period.slice(0, 4)}년 ${parseInt(period.slice(4), 10)}월`;
42
+ case 'D':
43
+ return `${period.slice(0, 4)}.${period.slice(4, 6)}.${period.slice(6)}`;
44
+ default:
45
+ return period;
46
+ }
47
+ }
48
+ /**
49
+ * 숫자 포매팅
50
+ */
51
+ export function formatNumber(value) {
52
+ if (!value || value === '-' || value === '...')
53
+ return value;
54
+ // 숫자가 아닌 경우 그대로 반환
55
+ const num = parseFloat(value.replace(/,/g, ''));
56
+ if (isNaN(num))
57
+ return value;
58
+ // 천 단위 구분자 추가
59
+ return num.toLocaleString('ko-KR', {
60
+ maximumFractionDigits: 2,
61
+ });
62
+ }
63
+ /**
64
+ * 변화율 계산
65
+ */
66
+ export function calculateChangeRate(current, previous) {
67
+ if (previous === 0) {
68
+ return { rate: 0, direction: 'stable', formatted: '-' };
69
+ }
70
+ const rate = ((current - previous) / Math.abs(previous)) * 100;
71
+ const direction = rate > 0.1 ? 'up' : rate < -0.1 ? 'down' : 'stable';
72
+ const sign = rate > 0 ? '+' : '';
73
+ const formatted = `${sign}${rate.toFixed(1)}%`;
74
+ return { rate, direction, formatted };
75
+ }
76
+ /**
77
+ * 추세 분석
78
+ */
79
+ export function analyzeTrend(values) {
80
+ if (values.length < 2) {
81
+ return { trend: 'stable', avgGrowthRate: 0, volatility: 0 };
82
+ }
83
+ // 변화율 계산
84
+ const changes = [];
85
+ for (let i = 1; i < values.length; i++) {
86
+ if (values[i - 1] !== 0) {
87
+ changes.push((values[i] - values[i - 1]) / Math.abs(values[i - 1]) * 100);
88
+ }
89
+ }
90
+ if (changes.length === 0) {
91
+ return { trend: 'stable', avgGrowthRate: 0, volatility: 0 };
92
+ }
93
+ // 평균 변화율
94
+ const avgGrowthRate = changes.reduce((a, b) => a + b, 0) / changes.length;
95
+ // 변동성 (표준편차)
96
+ const variance = changes.reduce((sum, val) => sum + Math.pow(val - avgGrowthRate, 2), 0) /
97
+ changes.length;
98
+ const volatility = Math.sqrt(variance);
99
+ // 추세 판단
100
+ let trend;
101
+ if (volatility > 20) {
102
+ trend = 'fluctuating';
103
+ }
104
+ else if (avgGrowthRate > 2) {
105
+ trend = 'increasing';
106
+ }
107
+ else if (avgGrowthRate < -2) {
108
+ trend = 'decreasing';
109
+ }
110
+ else {
111
+ trend = 'stable';
112
+ }
113
+ return { trend, avgGrowthRate, volatility };
114
+ }
115
+ /**
116
+ * 시각화 타입 추천
117
+ */
118
+ export function recommendVisualization(dataLength, hasMultipleCategories, isTimeSeries) {
119
+ if (isTimeSeries && dataLength > 2) {
120
+ return {
121
+ type: 'line',
122
+ reason: '시계열 데이터는 선 그래프로 추세를 파악하기 좋습니다.',
123
+ };
124
+ }
125
+ if (hasMultipleCategories && dataLength <= 6) {
126
+ return {
127
+ type: 'pie',
128
+ reason: '비율 비교는 파이 차트가 적합합니다.',
129
+ };
130
+ }
131
+ if (dataLength <= 10) {
132
+ return {
133
+ type: 'bar',
134
+ reason: '항목 비교는 막대 그래프가 효과적입니다.',
135
+ };
136
+ }
137
+ return {
138
+ type: 'table',
139
+ reason: '데이터가 많아 표 형식이 가장 적합합니다.',
140
+ };
141
+ }
142
+ //# sourceMappingURL=dataFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataFormatter.js","sourceRoot":"","sources":["../../src/utils/dataFormatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * 에러 처리 유틸리티
3
+ */
4
+ export declare enum ErrorCode {
5
+ INVALID_API_KEY = "INVALID_API_KEY",
6
+ RATE_LIMIT_EXCEEDED = "RATE_LIMIT_EXCEEDED",
7
+ INVALID_PARAMETER = "INVALID_PARAMETER",
8
+ NO_DATA_FOUND = "NO_DATA_FOUND",
9
+ API_UNAVAILABLE = "API_UNAVAILABLE",
10
+ NETWORK_ERROR = "NETWORK_ERROR",
11
+ UNKNOWN_ERROR = "UNKNOWN_ERROR"
12
+ }
13
+ /**
14
+ * 사용자 친화적 에러 메시지 반환
15
+ */
16
+ export declare function getErrorMessage(code: ErrorCode | string): string;
17
+ /**
18
+ * 에러를 안전하게 처리하고 결과 반환
19
+ */
20
+ export declare function handleToolError(error: unknown): {
21
+ success: false;
22
+ error: string;
23
+ code: string;
24
+ };
25
+ /**
26
+ * 재시도 래퍼 함수
27
+ */
28
+ export declare function withRetry<T>(fn: () => Promise<T>, options?: {
29
+ maxRetries?: number;
30
+ baseDelay?: number;
31
+ maxDelay?: number;
32
+ }): Promise<T>;
33
+ //# sourceMappingURL=errorHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../src/utils/errorHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,oBAAY,SAAS;IACnB,eAAe,oBAAoB;IACnC,mBAAmB,wBAAwB;IAC3C,iBAAiB,sBAAsB;IACvC,aAAa,kBAAkB;IAC/B,eAAe,oBAAoB;IACnC,aAAa,kBAAkB;IAC/B,aAAa,kBAAkB;CAChC;AAmBD;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAEhE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG;IAC/C,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CA0BA;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACd,GACL,OAAO,CAAC,CAAC,CAAC,CAyBZ"}