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,305 @@
1
+ /**
2
+ * 통계 데이터 조회 도구
3
+ * 특정 통계표의 실제 데이터를 조회
4
+ */
5
+ import { z } from 'zod';
6
+ import { getKosisClient } from '../api/client.js';
7
+ import { getCacheManager } from '../cache/index.js';
8
+ import { simplifyStatisticsData, recommendVisualization } from '../utils/dataFormatter.js';
9
+ import { resolveDimensions, summarizeTableMeta } from '../utils/metaLookup.js';
10
+ export const getStatisticsDataSchema = {
11
+ name: 'get_statistics_data',
12
+ description: `[직접조회] 특정 통계표의 실제 데이터를 조회. orgId+tableId 필수.
13
+
14
+ 🔄 도구 라우팅:
15
+ • 자연어/키워드(예: "서울 인구") → quick_stats가 우선
16
+ • 시계열(추세/추이) → quick_trend
17
+ • 통계표 ID를 모르면 → search_statistics
18
+ • 차원·항목 코드 확인 → get_table_info
19
+
20
+ 자동 메타 lookup 지원:
21
+ • regionName="광진구" 처럼 자치구·시·군 이름을 주면 objL1·objL2가 자동으로 채워집니다 (시군구별/자치구별/구군별/행정구역별 OBJ에서 매칭).
22
+ • itemName으로 항목명 매칭도 가능 (예: "여자", "65세이상").
23
+ • objL1·itemId를 직접 넣으면 lookup 없이 그 값 사용.
24
+
25
+ 자치구·시·군 통계 조회 경로 (광역시도별로 패턴이 다름):
26
+
27
+ 【Path A — 광역시도 기본통계 시리즈】 가장 일반적
28
+ • 서울: orgId=201, tblId=DT_201004_* (예: DT_201004_O110054 보육시설)
29
+ • 부산: orgId=202, tblId=DT_xxx (예: DT_202 구·군별 세대 및 등록인구)
30
+ • 대구: orgId=203, tblId=DT_Bxxxxx (예: DT_B40001 구군별 세대 및 등록인구)
31
+ • 인천 이하: 자치구별 [구군별]/[행정구역별] 분류에 ITM_NM으로 자치구가 들어있음
32
+ • 광역시도별 LIST_ID 패턴이 다르므로, search_statistics 로 표 ID 먼저 확인
33
+
34
+ 【Path B — 자치구 단독 OpenAPI 시리즈】 챕터별 세분화 통계
35
+ • orgId=5xx (자치구 코드), tblId=DT_<자치구코드>0?_<챕터><번호>
36
+ • 예: 해운대구 orgId=539, tblId=DT_53902_B001003 (인구추이)
37
+ • 예: 수성구 orgId=556, tblId=DT_55601_B001003 (인구추이)
38
+ • regionName 없이 그대로 조회 (이미 자치구 한정 표)
39
+
40
+ 【Path C — 통계청 e-지방지표 (orgId=101)】 256개 행정구역 통합
41
+ • DT_1YLxxxxx 시리즈 (예: DT_1YL15001 학급당 학생수)
42
+ • regionName="수성구" / "해운대구" 등 모든 시군구가 [행정구역별] 분류에 들어있음
43
+ • 광역시도 기본통계가 미비할 때 가장 광범위한 폴백
44
+
45
+ ITM_ID는 통계표마다 다른 코드 체계를 쓰므로(예: "001005", "1520213102303231A.09", "22060"), 직접 입력 대신 regionName/itemName 사용을 권장합니다.
46
+
47
+ 「OO광역시도 OO구 기본통계」 컨테이너 LIST_ID(예: 201_201A_505_50501)는 직접 조회하지 말 것 — TBL_ID가 아님.`,
48
+ inputSchema: z.object({
49
+ orgId: z.string().describe('기관 ID (예: 201 = 서울특별시)'),
50
+ tableId: z.string().describe('통계표 ID (예: DT_201004_O110054)'),
51
+ regionName: z
52
+ .string()
53
+ .optional()
54
+ .describe('자치구·시·군 이름 (예: "광진구", "수성구"). 주어지면 objL1/objL2 자동 lookup. 전국·합계는 비워둠.'),
55
+ itemName: z
56
+ .string()
57
+ .optional()
58
+ .describe('항목 이름 (예: "여자", "총인구"). 주어지면 itemId 자동 lookup. 보통 통계표 항목이 하나면 생략.'),
59
+ objL1: z
60
+ .string()
61
+ .optional()
62
+ .describe('분류1 코드 직접 지정 (선택). regionName이 있으면 무시.'),
63
+ objL2: z.string().optional().describe('분류2 코드 (선택)'),
64
+ objL3: z.string().optional().describe('분류3 코드 (선택)'),
65
+ objL4: z.string().optional().describe('분류4 코드 (선택)'),
66
+ itemId: z
67
+ .string()
68
+ .optional()
69
+ .describe('항목 ID 직접 지정 (선택). itemName이 있으면 무시.'),
70
+ periodType: z
71
+ .enum(['Y', 'M', 'Q', 'S', 'D', 'F', 'IR'])
72
+ .describe('주기: Y(년), M(월), Q(분기), S(반기), D(일), F(다년), IR(부정기)'),
73
+ startPeriod: z
74
+ .string()
75
+ .optional()
76
+ .describe('시작 시점 (예: 2020, 202001)'),
77
+ endPeriod: z
78
+ .string()
79
+ .optional()
80
+ .describe('종료 시점 (예: 2024, 202412)'),
81
+ recentCount: z
82
+ .number()
83
+ .min(1)
84
+ .max(100)
85
+ .optional()
86
+ .describe('최근 N개 시점 (startPeriod/endPeriod 대신 사용)'),
87
+ }),
88
+ };
89
+ export async function getStatisticsData(input) {
90
+ const client = getKosisClient();
91
+ const cache = getCacheManager();
92
+ try {
93
+ // 자동 메타 lookup — regionName/itemName이 있거나 objL1/itemId가 비어있으면 실행
94
+ let resolvedObjL1 = input.objL1;
95
+ let resolvedObjL2 = input.objL2;
96
+ let resolvedObjL3 = input.objL3;
97
+ let resolvedObjL4 = input.objL4;
98
+ let resolvedItmId = input.itemId;
99
+ let resolveLog = [];
100
+ const needsLookup = input.regionName ||
101
+ input.itemName ||
102
+ (!input.objL1 && !input.itemId);
103
+ if (needsLookup) {
104
+ const r = await resolveDimensions(input.orgId, input.tableId, {
105
+ regionName: input.regionName,
106
+ itemName: input.itemName,
107
+ });
108
+ // 명시적 regionName/itemName 매칭 실패 → 잘못된 폴백 데이터 방지 위해 즉시 에러
109
+ if (r.unmatched) {
110
+ const candidateLines = r.candidates
111
+ ? Object.entries(r.candidates)
112
+ .map(([objNm, names]) => ` - ${objNm}: ${names.slice(0, 8).join(', ')}${names.length > 8 ? ' ...' : ''}`)
113
+ .join('\n')
114
+ : '';
115
+ const missMsg = [
116
+ r.unmatched.regionName ? `regionName="${r.unmatched.regionName}"` : '',
117
+ r.unmatched.itemName ? `itemName="${r.unmatched.itemName}"` : '',
118
+ ].filter(Boolean).join(', ');
119
+ return {
120
+ success: false,
121
+ data: [],
122
+ totalCount: 0,
123
+ metadata: {
124
+ orgId: input.orgId,
125
+ tableId: input.tableId,
126
+ periodType: input.periodType,
127
+ },
128
+ resolved: r.resolved,
129
+ usageHint: `
130
+ ## 메타 lookup 실패
131
+
132
+ 요청한 ${missMsg} 이(가) 이 통계표의 어느 분류에서도 매칭되지 않았습니다.
133
+
134
+ ### 사용 가능한 후보
135
+ ${candidateLines || '(메타 정보 없음)'}
136
+
137
+ ### 해결
138
+ 1. 광역시도가 다른 자치구일 수 있습니다. 광역시도별 표 ID 패턴은 다음과 같습니다:
139
+ - 서울(201): DT_201004_* — 자치구 분류 포함
140
+ - 부산(202): DT_202, DT_BA102 등 — [구군별] 분류
141
+ - 대구(203): DT_B40001, DT_B70001 등 — [행정구역(구군)별] 분류
142
+ - 통계청(101): DT_1IN1503 시군구 주민등록인구, DT_1YL* e-지방지표 — 모든 시군구
143
+ 2. \`search_statistics\` 로 "${input.regionName ?? ''} <원하는 통계>" 검색해서 표 ID 확인.
144
+ 3. \`get_table_info\` 로 메타에서 정확한 분류명을 확인.`,
145
+ };
146
+ }
147
+ // 사용자가 직접 지정한 값은 덮어쓰지 않음
148
+ resolvedObjL1 = input.objL1 ?? r.objL1;
149
+ resolvedObjL2 = input.objL2 ?? r.objL2;
150
+ resolvedObjL3 = input.objL3 ?? r.objL3;
151
+ resolvedObjL4 = input.objL4 ?? r.objL4;
152
+ resolvedItmId = input.itemId ?? r.itmId;
153
+ resolveLog = r.resolved;
154
+ }
155
+ // 캐시된 데이터 조회
156
+ const results = await cache.getStatisticsData({
157
+ orgId: input.orgId,
158
+ tableId: input.tableId,
159
+ objL1: resolvedObjL1,
160
+ objL2: resolvedObjL2,
161
+ objL3: resolvedObjL3,
162
+ objL4: resolvedObjL4,
163
+ itemId: resolvedItmId,
164
+ periodType: input.periodType,
165
+ startPeriod: input.startPeriod,
166
+ endPeriod: input.endPeriod,
167
+ recentCount: input.recentCount,
168
+ }, async () => {
169
+ return client.getStatisticsData({
170
+ orgId: input.orgId,
171
+ tblId: input.tableId,
172
+ objL1: resolvedObjL1,
173
+ objL2: resolvedObjL2,
174
+ objL3: resolvedObjL3,
175
+ objL4: resolvedObjL4,
176
+ itmId: resolvedItmId,
177
+ prdSe: input.periodType,
178
+ startPrdDe: input.startPeriod,
179
+ endPrdDe: input.endPeriod,
180
+ newEstPrdCnt: input.recentCount,
181
+ });
182
+ });
183
+ if (results.length === 0) {
184
+ // 매칭 실패 디버깅용: 메타 요약 반환
185
+ let candidates;
186
+ try {
187
+ const summary = await summarizeTableMeta(input.orgId, input.tableId, {
188
+ sampleSize: 8,
189
+ filter: input.regionName,
190
+ });
191
+ candidates = summary.groups
192
+ .map((g) => `### [${g.objIdSn === '0' ? '항목' : 'objL' + g.objIdSn}] ${g.objNm} (총 ${g.totalItems}개)\n` +
193
+ g.sample.map((it) => ` - \`${it.ITM_ID}\` ${it.ITM_NM}`).join('\n'))
194
+ .join('\n\n');
195
+ }
196
+ catch { }
197
+ return {
198
+ success: true,
199
+ data: [],
200
+ totalCount: 0,
201
+ metadata: {
202
+ orgId: input.orgId,
203
+ tableId: input.tableId,
204
+ periodType: input.periodType,
205
+ },
206
+ resolved: resolveLog,
207
+ usageHint: `
208
+ ## 데이터를 찾을 수 없습니다
209
+
210
+ ### 사용된 파라미터
211
+ - orgId: "${input.orgId}"
212
+ - tableId: "${input.tableId}"
213
+ - objL1: "${resolvedObjL1}"
214
+ - objL2: "${resolvedObjL2 ?? ''}"
215
+ - itemId: "${resolvedItmId}"
216
+ - periodType: "${input.periodType}"
217
+
218
+ ### 사용 가능한 분류값
219
+ ${candidates ?? '(메타 조회 실패)'}
220
+
221
+ ### 해결 방법
222
+ 1. **get_table_info 호출**하여 유효한 코드를 확인하세요:
223
+ \`\`\`json
224
+ { "orgId": "${input.orgId}", "tableId": "${input.tableId}" }
225
+ \`\`\`
226
+
227
+ 2. **파라미터 확인**:
228
+ - objL1: 분류값 코드 (예: "00"=전국, "11"=서울)
229
+ - itemId: 항목 코드 (예: "T10", "T1")
230
+ - ⚠️ OBJ_ID(예: "ITEM", "B")가 아닌 실제 분류값 코드를 사용하세요
231
+
232
+ ### 예시 호출
233
+ {
234
+ "orgId": "${input.orgId}",
235
+ "tableId": "${input.tableId}",
236
+ "objL1": "00",
237
+ "itemId": "T1",
238
+ "periodType": "${input.periodType}",
239
+ "recentCount": 5
240
+ }
241
+ `,
242
+ };
243
+ }
244
+ // 데이터 간소화
245
+ const simplifiedData = simplifyStatisticsData(results);
246
+ // 메타데이터 추출
247
+ const firstItem = results[0];
248
+ const periods = results.map((r) => r.PRD_DE);
249
+ const periodRange = periods.length > 1
250
+ ? `${periods[periods.length - 1]} ~ ${periods[0]}`
251
+ : periods[0];
252
+ // 시각화 추천
253
+ const hasMultipleCategories = new Set(simplifiedData.map((d) => d.classification)).size > 1;
254
+ const visualization = recommendVisualization(simplifiedData.length, hasMultipleCategories, ['Y', 'M', 'Q'].includes(input.periodType));
255
+ return {
256
+ success: true,
257
+ tableName: firstItem.TBL_NM,
258
+ unit: firstItem.UNIT_NM,
259
+ data: simplifiedData,
260
+ totalCount: simplifiedData.length,
261
+ visualization: {
262
+ recommendedType: visualization.type,
263
+ reason: visualization.reason,
264
+ },
265
+ metadata: {
266
+ orgId: input.orgId,
267
+ tableId: input.tableId,
268
+ periodType: input.periodType,
269
+ periodRange,
270
+ },
271
+ };
272
+ }
273
+ catch (error) {
274
+ console.error('Data error:', error);
275
+ const errorMessage = error instanceof Error ? error.message : String(error);
276
+ return {
277
+ success: false,
278
+ data: [],
279
+ totalCount: 0,
280
+ metadata: {
281
+ orgId: input.orgId,
282
+ tableId: input.tableId,
283
+ periodType: input.periodType,
284
+ },
285
+ usageHint: `
286
+ ## 데이터 조회 중 오류 발생
287
+
288
+ ### 오류 내용
289
+ ${errorMessage}
290
+
291
+ ### 확인 사항
292
+ 1. orgId, tableId가 올바른지 확인하세요
293
+ 2. get_table_info로 유효한 objL1, itemId 코드를 확인하세요
294
+ 3. periodType이 해당 통계표에서 지원되는지 확인하세요
295
+
296
+ ### get_table_info 호출 예시
297
+ {
298
+ "orgId": "${input.orgId}",
299
+ "tableId": "${input.tableId}"
300
+ }
301
+ `,
302
+ };
303
+ }
304
+ }
305
+ //# sourceMappingURL=getStatisticsData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getStatisticsData.js","sourceRoot":"","sources":["../../src/tools/getStatisticsData.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * 통계 목록 조회 도구
3
+ * 주제별/기관별 트리 탐색 + 9개 분야 추천 카드 통합 (recommendedTopic 옵션)
4
+ */
5
+ import { z } from 'zod';
6
+ import type { ListItem, SimplifiedStatisticsItem } from '../api/types.js';
7
+ export declare const getStatisticsListSchema: {
8
+ name: string;
9
+ description: string;
10
+ inputSchema: z.ZodObject<{
11
+ viewCode: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodEnum<["MT_ZTITLE", "MT_OTITLE", "MT_GTITLE01", "MT_GTITLE02", "MT_RTITLE", "MT_BUKHAN", "MT_TM1_TITLE", "MT_TM2_TITLE"]>>;
12
+ parentId: z.ZodDefault<z.ZodOptional<z.ZodString>>;
13
+ recommendedTopic: z.ZodOptional<z.ZodEnum<["population", "economy", "employment", "housing", "education", "health", "environment", "transport", "social"]>>;
14
+ limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
15
+ }, "strip", z.ZodTypeAny, {
16
+ limit: number;
17
+ viewCode: "MT_OTITLE" | "MT_ZTITLE" | "MT_GTITLE01" | "MT_GTITLE02" | "MT_RTITLE" | "MT_BUKHAN" | "MT_TM1_TITLE" | "MT_TM2_TITLE";
18
+ parentId: string;
19
+ recommendedTopic?: "population" | "economy" | "employment" | "housing" | "education" | "health" | "environment" | "transport" | "social" | undefined;
20
+ }, {
21
+ viewCode: string;
22
+ limit?: number | undefined;
23
+ parentId?: string | undefined;
24
+ recommendedTopic?: "population" | "economy" | "employment" | "housing" | "education" | "health" | "environment" | "transport" | "social" | undefined;
25
+ }>;
26
+ };
27
+ export type GetStatisticsListInput = z.infer<typeof getStatisticsListSchema.inputSchema>;
28
+ type ListResult = {
29
+ success: boolean;
30
+ viewName: string;
31
+ parentId: string;
32
+ items: ListItem[];
33
+ hasMore: boolean;
34
+ navigation?: {
35
+ canGoUp: boolean;
36
+ instruction: string;
37
+ };
38
+ };
39
+ type RecommendedResult = {
40
+ success: boolean;
41
+ mode: 'recommended';
42
+ topic: {
43
+ code: string;
44
+ name: string;
45
+ description: string;
46
+ };
47
+ recommendations: SimplifiedStatisticsItem[];
48
+ relatedTopics: string[];
49
+ searchSuggestions: string[];
50
+ };
51
+ export declare function getStatisticsList(input: GetStatisticsListInput): Promise<ListResult | RecommendedResult>;
52
+ /**
53
+ * 사용 가능한 서비스뷰 목록 반환
54
+ */
55
+ export declare function getAvailableViewCodes(): Array<{
56
+ code: string;
57
+ name: string;
58
+ description: string;
59
+ }>;
60
+ /**
61
+ * 추천 토픽 목록 (이전 getAvailableTopics와 동일)
62
+ */
63
+ export declare function getAvailableRecommendedTopics(): Array<{
64
+ code: string;
65
+ name: string;
66
+ description: string;
67
+ }>;
68
+ export {};
69
+ //# sourceMappingURL=getStatisticsList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getStatisticsList.d.ts","sourceRoot":"","sources":["../../src/tools/getStatisticsList.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,QAAQ,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAkH1E,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;CAuDnC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,WAAW,CAAC,CAAC;AAEzF,KAAK,UAAU,GAAG;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,eAAe,EAAE,wBAAwB,EAAE,CAAC;IAC5C,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B,CAAC;AAEF,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,UAAU,GAAG,iBAAiB,CAAC,CAkKzC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,KAAK,CAAC;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAWD;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,KAAK,CAAC;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAMD"}