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,336 @@
1
+ /**
2
+ * 통계 목록 조회 도구
3
+ * 주제별/기관별 트리 탐색 + 9개 분야 추천 카드 통합 (recommendedTopic 옵션)
4
+ */
5
+ import { z } from 'zod';
6
+ import { getKosisClient } from '../api/client.js';
7
+ import { getCacheManager } from '../cache/index.js';
8
+ import { config } from '../config/index.js';
9
+ // ═══════════════════════════════════════════════════════════
10
+ // 추천 통계 (이전 get_recommended_statistics 흡수)
11
+ // ═══════════════════════════════════════════════════════════
12
+ const PRIORITY_TABLES = {
13
+ population: [
14
+ { orgId: '101', tableId: 'DT_1B04005', name: '시도/성/연령별 주민등록인구' },
15
+ { orgId: '101', tableId: 'DT_1IN1503', name: '주민등록인구현황' },
16
+ { orgId: '101', tableId: 'DT_1B8000H', name: '인구동태건수 (출생/사망)' },
17
+ { orgId: '101', tableId: 'DT_1B81A17', name: '합계출산율' },
18
+ { orgId: '101', tableId: 'DT_1BPA002', name: '주요인구지표' },
19
+ ],
20
+ economy: [
21
+ { orgId: '301', tableId: 'DT_200Y001', name: '국내총생산(GDP)' },
22
+ { orgId: '101', tableId: 'DT_1J20001', name: '소비자물가지수' },
23
+ { orgId: '101', tableId: 'DT_1J22001', name: '소비자물가 등락률' },
24
+ { orgId: '301', tableId: 'DT_2AS004', name: '경제성장률' },
25
+ ],
26
+ employment: [
27
+ { orgId: '101', tableId: 'DT_1DA7102S', name: '성/연령별 실업률' },
28
+ { orgId: '101', tableId: 'DT_1DA7001', name: '경제활동인구총괄' },
29
+ { orgId: '101', tableId: 'DT_1DA7012', name: '취업자수' },
30
+ { orgId: '118', tableId: 'DT_118N_PAYM02', name: '평균임금' },
31
+ ],
32
+ housing: [
33
+ { orgId: '116', tableId: 'DT_1YL21101', name: '아파트 매매/전세 가격지수' },
34
+ { orgId: '116', tableId: 'DT_1YL20111E', name: '주택매매가격지수' },
35
+ { orgId: '101', tableId: 'DT_1YL20001', name: '주택수' },
36
+ ],
37
+ education: [
38
+ { orgId: '101', tableId: 'DT_1YL21121', name: '학생수' },
39
+ { orgId: '101', tableId: 'DT_1YL21131', name: '학교수' },
40
+ ],
41
+ health: [
42
+ { orgId: '101', tableId: 'DT_1B41', name: '기대수명' },
43
+ { orgId: '101', tableId: 'DT_1B34E01', name: '사망원인' },
44
+ ],
45
+ environment: [
46
+ { orgId: '106', tableId: 'DT_106N_99_2400001', name: '미세먼지 농도' },
47
+ ],
48
+ transport: [
49
+ { orgId: '101', tableId: 'DT_1YL12001', name: '자동차등록현황' },
50
+ ],
51
+ social: [
52
+ { orgId: '101', tableId: 'DT_1YL13001', name: '범죄발생 현황' },
53
+ ],
54
+ };
55
+ const TOPIC_RECOMMENDATIONS = {
56
+ population: {
57
+ name: '인구',
58
+ description: '인구수, 출생, 사망, 혼인, 이혼 등',
59
+ searchTerms: ['주민등록인구', '출생', '사망', '혼인', '합계출산율'],
60
+ },
61
+ economy: {
62
+ name: '경제',
63
+ description: 'GDP, 물가, 수출입, 경제성장률 등',
64
+ searchTerms: ['GDP', '경제성장률', '소비자물가', '수출', '무역수지'],
65
+ },
66
+ employment: {
67
+ name: '고용/노동',
68
+ description: '취업자, 실업률, 임금, 근로시간 등',
69
+ searchTerms: ['취업자', '실업률', '고용률', '임금', '근로시간'],
70
+ },
71
+ housing: {
72
+ name: '주거/부동산',
73
+ description: '주택가격, 전월세, 주거환경 등',
74
+ searchTerms: ['아파트가격', '전세', '주택매매', '월세', '주거'],
75
+ },
76
+ education: {
77
+ name: '교육',
78
+ description: '학생수, 학교, 진학률, 사교육비 등',
79
+ searchTerms: ['학생수', '학교', '진학률', '사교육비', '대학'],
80
+ },
81
+ health: {
82
+ name: '보건/의료',
83
+ description: '기대수명, 의료비, 건강보험 등',
84
+ searchTerms: ['기대수명', '의료비', '건강보험', '병원', '사망원인'],
85
+ },
86
+ environment: {
87
+ name: '환경',
88
+ description: '대기질, 미세먼지, 폐기물, 에너지 등',
89
+ searchTerms: ['미세먼지', '대기오염', '폐기물', '재활용', '탄소배출'],
90
+ },
91
+ transport: {
92
+ name: '교통',
93
+ description: '자동차, 대중교통, 도로, 사고 등',
94
+ searchTerms: ['자동차등록', '대중교통', '교통사고', '도로'],
95
+ },
96
+ social: {
97
+ name: '사회/복지',
98
+ description: '사회보장, 범죄, 안전, 문화 등',
99
+ searchTerms: ['사회보장', '범죄', '안전', '문화', '여가'],
100
+ },
101
+ };
102
+ const RELATED_TOPICS = {
103
+ population: ['economy', 'housing', 'social'],
104
+ economy: ['employment', 'housing', 'transport'],
105
+ employment: ['economy', 'education', 'social'],
106
+ housing: ['economy', 'population', 'transport'],
107
+ education: ['employment', 'social', 'population'],
108
+ health: ['social', 'environment', 'population'],
109
+ environment: ['health', 'transport', 'economy'],
110
+ transport: ['environment', 'housing', 'economy'],
111
+ social: ['health', 'education', 'population'],
112
+ };
113
+ export const getStatisticsListSchema = {
114
+ name: 'get_statistics_list',
115
+ description: '[목록탐색] 주제별/기관별/지방지표/국제/북한 통계 트리 탐색 + 9개 분야 추천 카드 통합. recommendedTopic 옵션 사용 시 추천 카드(분야별 핵심 통계표 5개) 반환. parentId로 트리 단계별 진입. "무엇을 봐야 할지 모를 때" recommendedTopic 사용.',
116
+ inputSchema: z.object({
117
+ viewCode: z
118
+ .string()
119
+ .transform((val) => {
120
+ if (!val || val.trim() === '')
121
+ return 'MT_ZTITLE';
122
+ return val;
123
+ })
124
+ .pipe(z.enum([
125
+ 'MT_ZTITLE',
126
+ 'MT_OTITLE',
127
+ 'MT_GTITLE01',
128
+ 'MT_GTITLE02',
129
+ 'MT_RTITLE',
130
+ 'MT_BUKHAN',
131
+ 'MT_TM1_TITLE',
132
+ 'MT_TM2_TITLE',
133
+ ]))
134
+ .describe('서비스뷰 코드: MT_ZTITLE(주제별, 기본값), MT_OTITLE(기관별), MT_GTITLE01(e-지방지표 주제별), MT_GTITLE02(e-지방지표 지역별), MT_RTITLE(국제통계), MT_BUKHAN(북한통계)'),
135
+ parentId: z
136
+ .string()
137
+ .optional()
138
+ .default('')
139
+ .describe('상위 목록 ID (비어있으면 최상위 목록 조회). recommendedTopic 사용 시 무시됨.'),
140
+ recommendedTopic: z
141
+ .enum([
142
+ 'population',
143
+ 'economy',
144
+ 'employment',
145
+ 'housing',
146
+ 'education',
147
+ 'health',
148
+ 'environment',
149
+ 'transport',
150
+ 'social',
151
+ ])
152
+ .optional()
153
+ .describe('[추천 모드] 9개 분야 추천 카드. 지정 시 트리 탐색 대신 분야별 핵심 통계표 반환. population(인구), economy(경제), employment(고용), housing(주거), education(교육), health(보건), environment(환경), transport(교통), social(사회)'),
154
+ limit: z
155
+ .number()
156
+ .min(1)
157
+ .max(20)
158
+ .optional()
159
+ .default(5)
160
+ .describe('recommendedTopic 사용 시 추천 개수 (기본 5)'),
161
+ }),
162
+ };
163
+ export async function getStatisticsList(input) {
164
+ const client = getKosisClient();
165
+ const cache = getCacheManager();
166
+ // 추천 모드 — 9개 분야 카드
167
+ if (input.recommendedTopic) {
168
+ const topicInfo = TOPIC_RECOMMENDATIONS[input.recommendedTopic];
169
+ if (!topicInfo) {
170
+ return {
171
+ success: false,
172
+ mode: 'recommended',
173
+ topic: { code: input.recommendedTopic, name: '알 수 없음', description: '' },
174
+ recommendations: [],
175
+ relatedTopics: [],
176
+ searchSuggestions: [],
177
+ };
178
+ }
179
+ try {
180
+ const limit = input.limit ?? 5;
181
+ const recommendations = [];
182
+ const priorityTables = PRIORITY_TABLES[input.recommendedTopic] || [];
183
+ for (const table of priorityTables) {
184
+ if (recommendations.length >= limit)
185
+ break;
186
+ recommendations.push({
187
+ orgId: table.orgId,
188
+ orgName: table.orgId === '101'
189
+ ? '통계청'
190
+ : table.orgId === '301'
191
+ ? '한국은행'
192
+ : table.orgId === '116'
193
+ ? '한국부동산원'
194
+ : '기타기관',
195
+ tableId: table.tableId,
196
+ tableName: table.name,
197
+ statisticsName: topicInfo.name + ' 통계',
198
+ period: '',
199
+ periodType: '',
200
+ lastUpdated: '',
201
+ isPriority: true,
202
+ });
203
+ }
204
+ if (recommendations.length < limit) {
205
+ const searchResults = await cache.getSearchResults({ topic: input.recommendedTopic, limit }, async () => {
206
+ const allResults = [];
207
+ for (const term of topicInfo.searchTerms.slice(0, 2)) {
208
+ const results = await client.searchStatistics(term, {
209
+ sort: 'RANK',
210
+ startCount: 1,
211
+ resultCount: Math.ceil(limit / 2),
212
+ });
213
+ allResults.push(...results);
214
+ }
215
+ return allResults;
216
+ });
217
+ const addedTableIds = new Set(recommendations.map((r) => r.tableId));
218
+ for (const item of searchResults) {
219
+ if (recommendations.length >= limit)
220
+ break;
221
+ if (addedTableIds.has(item.TBL_ID))
222
+ continue;
223
+ recommendations.push({
224
+ orgId: item.ORG_ID,
225
+ orgName: item.ORG_NM,
226
+ tableId: item.TBL_ID,
227
+ tableName: item.TBL_NM,
228
+ statisticsName: item.STAT_NM,
229
+ period: item.STRT_PRD_DE && item.END_PRD_DE
230
+ ? `${item.STRT_PRD_DE}~${item.END_PRD_DE}`
231
+ : item.STRT_PRD_DE || item.END_PRD_DE || '',
232
+ periodType: item.VW_CD || '',
233
+ lastUpdated: item.END_PRD_DE,
234
+ });
235
+ addedTableIds.add(item.TBL_ID);
236
+ }
237
+ }
238
+ return {
239
+ success: true,
240
+ mode: 'recommended',
241
+ topic: {
242
+ code: input.recommendedTopic,
243
+ name: topicInfo.name,
244
+ description: topicInfo.description,
245
+ },
246
+ recommendations,
247
+ relatedTopics: RELATED_TOPICS[input.recommendedTopic] || [],
248
+ searchSuggestions: topicInfo.searchTerms,
249
+ };
250
+ }
251
+ catch (error) {
252
+ console.error('Recommendation error:', error);
253
+ return {
254
+ success: false,
255
+ mode: 'recommended',
256
+ topic: {
257
+ code: input.recommendedTopic,
258
+ name: topicInfo.name,
259
+ description: topicInfo.description,
260
+ },
261
+ recommendations: [],
262
+ relatedTopics: [],
263
+ searchSuggestions: topicInfo.searchTerms,
264
+ };
265
+ }
266
+ }
267
+ // 일반 트리 탐색 모드
268
+ const viewName = config.viewCodes[input.viewCode] || input.viewCode;
269
+ try {
270
+ const results = await cache.getStatisticsList({ viewCode: input.viewCode, parentId: input.parentId }, async () => {
271
+ return client.getStatisticsList(input.viewCode, input.parentId);
272
+ });
273
+ const items = results.map((item) => {
274
+ const isTable = !!item.TBL_ID;
275
+ return {
276
+ id: isTable ? item.TBL_ID : item.LIST_ID,
277
+ name: isTable ? item.TBL_NM : item.LIST_NM,
278
+ isTable,
279
+ orgId: item.ORG_ID,
280
+ tableId: item.TBL_ID,
281
+ tableName: item.TBL_NM,
282
+ };
283
+ });
284
+ const hasMore = items.some((item) => !item.isTable);
285
+ const canGoUp = input.parentId !== '';
286
+ return {
287
+ success: true,
288
+ viewName,
289
+ parentId: input.parentId,
290
+ items,
291
+ hasMore,
292
+ navigation: {
293
+ canGoUp,
294
+ instruction: hasMore
295
+ ? '폴더 ID를 parentId로 전달하면 하위 목록을 조회할 수 있습니다. 또는 recommendedTopic 옵션으로 분야별 추천 카드 사용.'
296
+ : '통계표 ID와 기관 ID를 사용하여 get_statistics_data로 데이터를 조회하세요.',
297
+ },
298
+ };
299
+ }
300
+ catch (error) {
301
+ console.error('List error:', error);
302
+ return {
303
+ success: false,
304
+ viewName,
305
+ parentId: input.parentId,
306
+ items: [],
307
+ hasMore: false,
308
+ };
309
+ }
310
+ }
311
+ /**
312
+ * 사용 가능한 서비스뷰 목록 반환
313
+ */
314
+ export function getAvailableViewCodes() {
315
+ return [
316
+ { code: 'MT_ZTITLE', name: '국내통계 주제별', description: '주제(인구, 경제 등)로 분류된 국내 통계' },
317
+ { code: 'MT_OTITLE', name: '국내통계 기관별', description: '작성기관별로 분류된 국내 통계' },
318
+ { code: 'MT_GTITLE01', name: 'e-지방지표(주제별)', description: '지방자치단체 통계 (주제별)' },
319
+ { code: 'MT_GTITLE02', name: 'e-지방지표(지역별)', description: '지방자치단체 통계 (지역별)' },
320
+ { code: 'MT_RTITLE', name: '국제통계', description: 'OECD, UN 등 국제기구 통계' },
321
+ { code: 'MT_BUKHAN', name: '북한통계', description: '북한 관련 통계' },
322
+ { code: 'MT_TM1_TITLE', name: '대상별통계', description: '여성, 청소년, 고령자 등 대상별 통계' },
323
+ { code: 'MT_TM2_TITLE', name: '이슈별통계', description: '사회적 이슈별 통계' },
324
+ ];
325
+ }
326
+ /**
327
+ * 추천 토픽 목록 (이전 getAvailableTopics와 동일)
328
+ */
329
+ export function getAvailableRecommendedTopics() {
330
+ return Object.entries(TOPIC_RECOMMENDATIONS).map(([code, info]) => ({
331
+ code,
332
+ name: info.name,
333
+ description: info.description,
334
+ }));
335
+ }
336
+ //# sourceMappingURL=getStatisticsList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getStatisticsList.js","sourceRoot":"","sources":["../../src/tools/getStatisticsList.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * 통계표 분류·항목 메타 조회 (경량)
3
+ *
4
+ * 응답 크기가 컸던 이전 구현은 raw 메타를 통째로 반환하여 클라이언트(Cursor 등)를
5
+ * 초기화시키는 문제가 있었다. 이번에는 OBJ_NM 그룹별로 샘플 N개(기본 10)만 노출하고
6
+ * `filter`로 ITM_NM 부분일치 검색을 지원한다.
7
+ *
8
+ * 사용 예: "광진구" 코드를 찾을 때
9
+ * get_table_info({ orgId: "201", tblId: "DT_201004_O110054", filter: "광진구" })
10
+ */
11
+ import { z } from 'zod';
12
+ export declare const getTableInfoSchema: {
13
+ name: string;
14
+ description: string;
15
+ inputSchema: z.ZodObject<{
16
+ orgId: z.ZodString;
17
+ tableId: z.ZodString;
18
+ filter: z.ZodOptional<z.ZodString>;
19
+ sampleSize: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
20
+ }, "strip", z.ZodTypeAny, {
21
+ orgId: string;
22
+ tableId: string;
23
+ sampleSize: number;
24
+ filter?: string | undefined;
25
+ }, {
26
+ orgId: string;
27
+ tableId: string;
28
+ filter?: string | undefined;
29
+ sampleSize?: number | undefined;
30
+ }>;
31
+ };
32
+ export type GetTableInfoInput = z.infer<typeof getTableInfoSchema.inputSchema>;
33
+ export declare function getTableInfo(input: GetTableInfoInput): Promise<{
34
+ success: boolean;
35
+ orgId: string;
36
+ tableId: string;
37
+ usageHint: string;
38
+ groups?: undefined;
39
+ hint?: undefined;
40
+ error?: undefined;
41
+ } | {
42
+ success: boolean;
43
+ orgId: string;
44
+ tableId: string;
45
+ groups: {
46
+ objNm: string;
47
+ objIdSn: string;
48
+ totalItems: number;
49
+ sample: Array<{
50
+ ITM_ID: string;
51
+ ITM_NM: string;
52
+ }>;
53
+ }[];
54
+ hint: string;
55
+ usageHint?: undefined;
56
+ error?: undefined;
57
+ } | {
58
+ success: boolean;
59
+ orgId: string;
60
+ tableId: string;
61
+ error: string;
62
+ usageHint: string;
63
+ groups?: undefined;
64
+ hint?: undefined;
65
+ }>;
66
+ //# sourceMappingURL=getTableInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTableInfo.d.ts","sourceRoot":"","sources":["../../src/tools/getTableInfo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;CAwB9B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,WAAW,CAAC,CAAC;AAE/E,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+C1D"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * 통계표 분류·항목 메타 조회 (경량)
3
+ *
4
+ * 응답 크기가 컸던 이전 구현은 raw 메타를 통째로 반환하여 클라이언트(Cursor 등)를
5
+ * 초기화시키는 문제가 있었다. 이번에는 OBJ_NM 그룹별로 샘플 N개(기본 10)만 노출하고
6
+ * `filter`로 ITM_NM 부분일치 검색을 지원한다.
7
+ *
8
+ * 사용 예: "광진구" 코드를 찾을 때
9
+ * get_table_info({ orgId: "201", tblId: "DT_201004_O110054", filter: "광진구" })
10
+ */
11
+ import { z } from 'zod';
12
+ import { summarizeTableMeta } from '../utils/metaLookup.js';
13
+ export const getTableInfoSchema = {
14
+ name: 'get_table_info',
15
+ description: `[메타조회] 통계표의 분류(OBJ_NM)와 항목(ITM_ID, ITM_NM) 목록 조회. get_statistics_data / analyze_time_series 호출 전 차원·항목 코드 확인용. 통계표 ID 모르면 search_statistics 먼저.
16
+
17
+ 응답이 무거울 수 있으니 filter로 좁히세요.
18
+ • filter="광진구" → 자치구별 분류에서 "광진구" 항목만 노출
19
+ • sampleSize 조절 (기본 10, 최대 50)
20
+
21
+ 자치구·시군구 통계는 통계표마다 ITM_ID 패턴이 다릅니다 (예: 광진구가 "001005"이거나 "13102127569D1.HCD_11050"). 항상 이 도구로 실제 코드를 확인하세요.`,
22
+ inputSchema: z.object({
23
+ orgId: z.string().describe('기관 ID (예: 201 = 서울특별시)'),
24
+ tableId: z.string().describe('통계표 ID (예: DT_201004_O110054)'),
25
+ filter: z
26
+ .string()
27
+ .optional()
28
+ .describe('ITM_NM 부분일치 필터 (예: "광진구", "여자"). 비우면 OBJ 그룹별 첫 N개만 노출'),
29
+ sampleSize: z
30
+ .number()
31
+ .min(1)
32
+ .max(50)
33
+ .optional()
34
+ .default(10)
35
+ .describe('OBJ 그룹별 표시 개수 (기본 10, 최대 50)'),
36
+ }),
37
+ };
38
+ export async function getTableInfo(input) {
39
+ try {
40
+ const summary = await summarizeTableMeta(input.orgId, input.tableId, {
41
+ sampleSize: input.sampleSize ?? 10,
42
+ filter: input.filter,
43
+ });
44
+ if (summary.groups.length === 0) {
45
+ return {
46
+ success: false,
47
+ orgId: input.orgId,
48
+ tableId: input.tableId,
49
+ usageHint: '메타데이터를 찾을 수 없습니다. orgId와 tableId를 확인하세요.',
50
+ };
51
+ }
52
+ const lines = [];
53
+ lines.push(`## ${input.orgId} / ${input.tableId} 메타`);
54
+ if (input.filter)
55
+ lines.push(`(filter="${input.filter}")\n`);
56
+ for (const g of summary.groups) {
57
+ const label = g.objIdSn === '0' ? '[항목]' : `[objL${g.objIdSn}]`;
58
+ lines.push(`### ${label} ${g.objNm} — 총 ${g.totalItems}개`);
59
+ for (const it of g.sample) {
60
+ lines.push(` - \`${it.ITM_ID}\` ${it.ITM_NM}`);
61
+ }
62
+ if (g.totalItems > g.sample.length) {
63
+ lines.push(` ... +${g.totalItems - g.sample.length}개 (filter로 좁히세요)`);
64
+ }
65
+ }
66
+ return {
67
+ success: true,
68
+ orgId: input.orgId,
69
+ tableId: input.tableId,
70
+ groups: summary.groups,
71
+ hint: lines.join('\n'),
72
+ };
73
+ }
74
+ catch (error) {
75
+ const msg = error instanceof Error ? error.message : String(error);
76
+ return {
77
+ success: false,
78
+ orgId: input.orgId,
79
+ tableId: input.tableId,
80
+ error: msg,
81
+ usageHint: `메타 조회 실패: ${msg}`,
82
+ };
83
+ }
84
+ }
85
+ //# sourceMappingURL=getTableInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTableInfo.js","sourceRoot":"","sources":["../../src/tools/getTableInfo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * MCP 도구 등록 통합
3
+ */
4
+ export { searchStatistics, searchStatisticsSchema, type SearchStatisticsInput, } from './searchStatistics.js';
5
+ export { getStatisticsList, getStatisticsListSchema, getAvailableViewCodes, getAvailableRecommendedTopics, type GetStatisticsListInput, } from './getStatisticsList.js';
6
+ export { getStatisticsData, getStatisticsDataSchema, type GetStatisticsDataInput, } from './getStatisticsData.js';
7
+ export { compareStatistics, compareStatisticsSchema, type CompareStatisticsInput, } from './compareStatistics.js';
8
+ export { analyzeTimeSeries, analyzeTimeSeriesSchema, type AnalyzeTimeSeriesInput, } from './analyzeTimeSeries.js';
9
+ export { getTableInfo, getTableInfoSchema, type GetTableInfoInput, } from './getTableInfo.js';
10
+ export { quickStats, quickStatsSchema, type QuickStatsInput, } from './quickStats.js';
11
+ export { quickTrend, quickTrendSchema, type QuickTrendInput, } from './quickTrend.js';
12
+ export { fetchKosisExcel, fetchKosisExcelSchema, type FetchKosisExcelInput, } from './fetchKosisExcel.js';
13
+ export { chainRegionBrief, chainRegionBriefSchema, type ChainRegionBriefInput, chainCompareRegions, chainCompareRegionsSchema, type ChainCompareRegionsInput, chainPolicyIndicator, chainPolicyIndicatorSchema, type ChainPolicyIndicatorInput, } from './chains.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,6BAA6B,EAC7B,KAAK,sBAAsB,GAC5B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,sBAAsB,GAC5B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,sBAAsB,GAC5B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,KAAK,sBAAsB,GAC5B,MAAM,wBAAwB,CAAC;AAKhC,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,KAAK,oBAAoB,GAC1B,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,qBAAqB,EAC1B,mBAAmB,EACnB,yBAAyB,EACzB,KAAK,wBAAwB,EAC7B,oBAAoB,EACpB,0BAA0B,EAC1B,KAAK,yBAAyB,GAC/B,MAAM,aAAa,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * MCP 도구 등록 통합
3
+ */
4
+ export { searchStatistics, searchStatisticsSchema, } from './searchStatistics.js';
5
+ export { getStatisticsList, getStatisticsListSchema, getAvailableViewCodes, getAvailableRecommendedTopics, } from './getStatisticsList.js';
6
+ export { getStatisticsData, getStatisticsDataSchema, } from './getStatisticsData.js';
7
+ export { compareStatistics, compareStatisticsSchema, } from './compareStatistics.js';
8
+ export { analyzeTimeSeries, analyzeTimeSeriesSchema, } from './analyzeTimeSeries.js';
9
+ // v1.4.0: get_recommended_statistics → get_statistics_list(recommendedTopic) 통폐합
10
+ // 경량화 후 재활성화: filter + sampleSize로 응답량 제한
11
+ export { getTableInfo, getTableInfoSchema, } from './getTableInfo.js';
12
+ export { quickStats, quickStatsSchema, } from './quickStats.js';
13
+ export { quickTrend, quickTrendSchema, } from './quickTrend.js';
14
+ export { fetchKosisExcel, fetchKosisExcelSchema, } from './fetchKosisExcel.js';
15
+ // 체인 도구 (공무원 업무 킬링 기능)
16
+ export { chainRegionBrief, chainRegionBriefSchema, chainCompareRegions, chainCompareRegionsSchema, chainPolicyIndicator, chainPolicyIndicatorSchema, } from './chains.js';
17
+ // 도구 스키마들은 개별적으로 export되어 있습니다.
18
+ // server.ts에서 직접 import하여 사용하세요.
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GAEvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,6BAA6B,GAE9B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GAExB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GAExB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GAExB,MAAM,wBAAwB,CAAC;AAEhC,iFAAiF;AAEjF,0CAA0C;AAC1C,OAAO,EACL,YAAY,EACZ,kBAAkB,GAEnB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,UAAU,EACV,gBAAgB,GAEjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,UAAU,EACV,gBAAgB,GAEjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,eAAe,EACf,qBAAqB,GAEtB,MAAM,sBAAsB,CAAC;AAE9B,uBAAuB;AACvB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EAEtB,mBAAmB,EACnB,yBAAyB,EAEzB,oBAAoB,EACpB,0BAA0B,GAE3B,MAAM,aAAa,CAAC;AAErB,gCAAgC;AAChC,iCAAiC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * 빠른 통계 조회 도구
3
+ * 자연어 질문으로 한 번에 통계 데이터를 조회하고 자연어 응답을 생성
4
+ *
5
+ * 개선: 정적으로 검증된 파라미터 사용 (동적 조회 대신)
6
+ */
7
+ import { z } from 'zod';
8
+ export declare const quickStatsSchema: {
9
+ name: string;
10
+ description: string;
11
+ inputSchema: z.ZodObject<{
12
+ query: z.ZodString;
13
+ region: z.ZodOptional<z.ZodString>;
14
+ year: z.ZodOptional<z.ZodNumber>;
15
+ period: z.ZodOptional<z.ZodEnum<["Y", "Q", "M"]>>;
16
+ month: z.ZodOptional<z.ZodNumber>;
17
+ quarter: z.ZodOptional<z.ZodNumber>;
18
+ }, "strip", z.ZodTypeAny, {
19
+ query: string;
20
+ region?: string | undefined;
21
+ period?: "Y" | "Q" | "M" | undefined;
22
+ year?: number | undefined;
23
+ month?: number | undefined;
24
+ quarter?: number | undefined;
25
+ }, {
26
+ query: string;
27
+ region?: string | undefined;
28
+ period?: "Y" | "Q" | "M" | undefined;
29
+ year?: number | undefined;
30
+ month?: number | undefined;
31
+ quarter?: number | undefined;
32
+ }>;
33
+ };
34
+ export type QuickStatsInput = z.infer<typeof quickStatsSchema.inputSchema>;
35
+ interface QuickStatsResult {
36
+ success: boolean;
37
+ answer: string;
38
+ value?: number | string;
39
+ unit?: string;
40
+ period?: string;
41
+ source?: {
42
+ orgId: string;
43
+ tableId: string;
44
+ tableName: string;
45
+ };
46
+ isProjection?: boolean;
47
+ note?: string;
48
+ }
49
+ /**
50
+ * 쿼리에서 광역시도 추출
51
+ *
52
+ * 부분매칭 버그 방지:
53
+ * 1. 자치구가 먼저 감지되면 광역시도 매칭은 스킵 (예: "해운대구"에 "대구" 부분매칭 방지)
54
+ * 2. 풀네임 우선 매칭 (예: "서울특별시" > "서울")
55
+ * 3. shortName은 단어 단위로 매칭 (앞뒤가 한글이 아니거나 끝)
56
+ */
57
+ export declare function extractProvinceName(query: string, districtDetected: boolean): string | null;
58
+ /**
59
+ * 쿼리에서 자치구 감지
60
+ * 반환: 자치구명 또는 null
61
+ *
62
+ * 보장:
63
+ * - "인구"/"수입"/"수출" 등 "구/군/시"로 끝나는 키워드는 자치구 아님
64
+ * - 광역시도 풀네임("서울특별시" 등) 자치구 아님
65
+ * - 정식 KOSIS 키워드/별칭은 자치구 아님
66
+ */
67
+ export declare function extractDistrictName(query: string): string | null;
68
+ export declare function quickStats(input: QuickStatsInput): Promise<QuickStatsResult>;
69
+ export declare function extractKeyword(query: string): string;
70
+ export {};
71
+ //# sourceMappingURL=quickStats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quickStats.d.ts","sourceRoot":"","sources":["../../src/tools/quickStats.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAsBxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;CA8C5B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,WAAW,CAAC,CAAC;AAE3E,UAAU,gBAAgB;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,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;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CA2B3F;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAehE;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAyPlF;AAkBD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYpD"}