korean-stats-mcp 1.4.1 → 1.5.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.
@@ -15,7 +15,12 @@ export declare class KosisClient {
15
15
  private apiKey;
16
16
  constructor(apiKey?: string);
17
17
  /**
18
- * API 요청 실행
18
+ * API 요청 실행 (timeout 15s + 3회 재시도 + 지수 백오프)
19
+ *
20
+ * - Fly Singapore → KOSIS Korea cold path 일시 abort 대응
21
+ * - KOSIS 응답 에러(err/errMsg 필드)는 영구 실패 → 즉시 throw, retry 안 함
22
+ * - HTTP 4xx도 영구 실패 → 즉시 throw
23
+ * - 네트워크 오류·타임아웃·5xx만 retry (800ms / 1600ms 백오프)
19
24
  */
20
25
  private request;
21
26
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAIjB,MAAM,YAAY,CAAC;AAEpB,cAAM,aAAc,SAAQ,KAAK;IAEtB,IAAI,EAAE,MAAM;IAEZ,aAAa,CAAC,EAAE,KAAK;gBAFrB,IAAI,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACR,aAAa,CAAC,EAAE,KAAK,YAAA;CAK/B;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,CAAC,EAAE,MAAM;IAK3B;;OAEG;YACW,OAAO;IAyErB;;OAEG;IACG,iBAAiB,CACrB,IAAI,EAAE,MAAM,EACZ,YAAY,GAAE,MAAW,GACxB,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAWhC;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE;QAC9B,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAUjC;;;OAGG;IACG,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GACA,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAW9B;;OAEG;IACG,oBAAoB,CACxB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IASpC;;;;;OAKG;IACG,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,QAAQ,GAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,QAAgB,GAClE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;CAQrC;AAKD,wBAAgB,cAAc,IAAI,WAAW,CAK5C;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAIjB,MAAM,YAAY,CAAC;AAEpB,cAAM,aAAc,SAAQ,KAAK;IAEtB,IAAI,EAAE,MAAM;IAEZ,aAAa,CAAC,EAAE,KAAK;gBAFrB,IAAI,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACR,aAAa,CAAC,EAAE,KAAK,YAAA;CAK/B;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,CAAC,EAAE,MAAM;IAK3B;;;;;;;OAOG;YACW,OAAO;IAsFrB;;OAEG;IACG,iBAAiB,CACrB,IAAI,EAAE,MAAM,EACZ,YAAY,GAAE,MAAW,GACxB,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAWhC;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE;QAC9B,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAUjC;;;OAGG;IACG,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GACA,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAW9B;;OAEG;IACG,oBAAoB,CACxB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IASpC;;;;;OAKG;IACG,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,QAAQ,GAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,QAAgB,GAClE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;CAQrC;AAKD,wBAAgB,cAAc,IAAI,WAAW,CAK5C;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -23,10 +23,14 @@ export class KosisClient {
23
23
  this.apiKey = apiKey || config.kosis.apiKey;
24
24
  }
25
25
  /**
26
- * API 요청 실행
26
+ * API 요청 실행 (timeout 15s + 3회 재시도 + 지수 백오프)
27
+ *
28
+ * - Fly Singapore → KOSIS Korea cold path 일시 abort 대응
29
+ * - KOSIS 응답 에러(err/errMsg 필드)는 영구 실패 → 즉시 throw, retry 안 함
30
+ * - HTTP 4xx도 영구 실패 → 즉시 throw
31
+ * - 네트워크 오류·타임아웃·5xx만 retry (800ms / 1600ms 백오프)
27
32
  */
28
33
  async request(endpoint, params) {
29
- // undefined 값 제거 및 문자열 변환
30
34
  const cleanParams = {};
31
35
  for (const [key, value] of Object.entries(params)) {
32
36
  if (value !== undefined) {
@@ -38,42 +42,57 @@ export class KosisClient {
38
42
  cleanParams.jsonVD = 'Y';
39
43
  const url = new URL(this.baseUrl + endpoint);
40
44
  url.search = new URLSearchParams(cleanParams).toString();
41
- // 8초 타임아웃 (Vercel maxDuration 15초 내에 여유 확보)
42
- const controller = new AbortController();
43
- const timeoutId = setTimeout(() => controller.abort(), 8000);
44
- try {
45
- const response = await fetch(url.toString(), {
46
- signal: controller.signal,
47
- });
48
- if (!response.ok) {
49
- throw new KosisApiError('HTTP_ERROR', `HTTP ${response.status}: ${response.statusText}`);
50
- }
51
- const data = await response.json();
52
- // 에러 응답 처리
53
- if (data.err || data.errMsg) {
54
- throw new KosisApiError(data.err || 'API_ERROR', data.errMsg || '알 수 없는 API 오류');
55
- }
56
- // 결과가 배열이 아닌 경우 빈 배열 반환
57
- if (!Array.isArray(data)) {
58
- if (data.result && Array.isArray(data.result)) {
59
- return data.result;
45
+ const requestUrl = url.toString();
46
+ const TIMEOUT_MS = 15000;
47
+ const MAX_ATTEMPTS = 3;
48
+ for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
49
+ const controller = new AbortController();
50
+ const timeoutId = setTimeout(() => controller.abort(), TIMEOUT_MS);
51
+ let isRetryable = false;
52
+ try {
53
+ const response = await fetch(requestUrl, {
54
+ signal: controller.signal,
55
+ });
56
+ if (!response.ok) {
57
+ // 5xx는 일시적 retry, 4xx는 영구 실패
58
+ isRetryable = response.status >= 500;
59
+ throw new KosisApiError('HTTP_ERROR', `HTTP ${response.status}: ${response.statusText}`);
60
+ }
61
+ const data = (await response.json());
62
+ // KOSIS 응답 에러 — 영구 실패
63
+ if (data.err || data.errMsg) {
64
+ throw new KosisApiError(data.err || 'API_ERROR', data.errMsg || '알 수 없는 API 오류');
65
+ }
66
+ if (!Array.isArray(data)) {
67
+ if (data.result && Array.isArray(data.result)) {
68
+ return data.result;
69
+ }
70
+ return [];
60
71
  }
61
- return [];
72
+ return data;
62
73
  }
63
- return data;
64
- }
65
- catch (error) {
66
- if (error instanceof KosisApiError) {
67
- throw error;
74
+ catch (error) {
75
+ // KOSIS 응답 에러는 즉시 throw (retry 무의미)
76
+ if (error instanceof KosisApiError && !isRetryable) {
77
+ throw error;
78
+ }
79
+ // 네트워크/timeout/5xx — retry 가능
80
+ if (attempt === MAX_ATTEMPTS - 1) {
81
+ if (error instanceof DOMException && error.name === 'AbortError') {
82
+ throw new KosisApiError('TIMEOUT', `KOSIS API 응답 시간 초과 (${TIMEOUT_MS / 1000}초, ${MAX_ATTEMPTS}회 시도). 잠시 후 다시 시도해주세요.`);
83
+ }
84
+ if (error instanceof KosisApiError)
85
+ throw error;
86
+ throw new KosisApiError('NETWORK_ERROR', '네트워크 오류가 발생했습니다.', error);
87
+ }
88
+ await new Promise((r) => setTimeout(r, 800 * (attempt + 1)));
68
89
  }
69
- if (error instanceof DOMException && error.name === 'AbortError') {
70
- throw new KosisApiError('TIMEOUT', 'KOSIS API 응답 시간 초과 (8초). 잠시 후 다시 시도해주세요.');
90
+ finally {
91
+ clearTimeout(timeoutId);
71
92
  }
72
- throw new KosisApiError('NETWORK_ERROR', '네트워크 오류가 발생했습니다.', error);
73
- }
74
- finally {
75
- clearTimeout(timeoutId);
76
93
  }
94
+ // 도달 불가 (위 loop에서 모두 return 또는 throw)
95
+ throw new KosisApiError('UNEXPECTED', '요청 처리 중 예기치 못한 종료');
77
96
  }
78
97
  /**
79
98
  * 통계목록 조회
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * 자치구 통계연보 파일 매핑 (KOSIS file 통계표)
3
+ *
4
+ * 자치구청 발행 통계연보(DT_<orgId>001_FILE<year>)는 14개 분야 .xlsx 파일로 구성.
5
+ * 정식 키워드(QUICK_STATS_PARAMS의 키 또는 KEYWORD_ALIASES 정규화 결과) →
6
+ * 해당 분야 file_sn(1~14) 매핑.
7
+ *
8
+ * 광진구 기준 14개 파일 구조:
9
+ * 1: Ⅱ.토지/기후 · 2: Ⅲ.인구 · 3: Ⅳ.노동/사업체 · 4: Ⅴ.농림/제조
10
+ * 5: Ⅵ.가스/상하수도 · 6: Ⅶ.유통/금융/무역수지 · 7: Ⅷ.주택/건설
11
+ * 8: Ⅸ.교통/관광 · 9: Ⅹ.보건 · 10: XI.사회보장 · 11: XII.환경
12
+ * 12: XIII.교육/문화 · 13: XIV.재정 · 14: XV.공공행정/사법
13
+ *
14
+ * P0 범위: 인구·노동·주거·보건 4분야만 매핑. 나머지는 P2에서 자치구별 검증 후 확장.
15
+ */
16
+ /**
17
+ * 자치구 단위 KOSIS OpenAPI 라우팅 매핑 (키워드 → 테이블·항목 코드)
18
+ *
19
+ * fetchKosisExcel(.xlsx 자치구 통계연보)이 미제공/PDF인 자치구에서도 자치구 정밀값을 보장.
20
+ * objL1은 런타임에 `getDistrictKscdCodeFor(orgId, tblId, districtName)` 으로 동적 lookup.
21
+ *
22
+ * 정확도 — KOSIS getMeta로 자치구 OBJ_ID=A 자치구별 ITM_ID 추출 후 호출. 라이브 검증 완료:
23
+ * - DT_1B040A3 광진구(11215) → 331,029명 ✓
24
+ * - DT_1B81A23 합계출산율 — 자치구별 코드 보유
25
+ */
26
+ export interface DistrictOpenApiRoute {
27
+ orgId: string;
28
+ tblId: string;
29
+ itmId: string;
30
+ prdSe: 'Y' | 'Q' | 'M';
31
+ /** 자연어 응답 description (예: '주민등록 총인구', '합계출산율') */
32
+ description: string;
33
+ /** 단위 (예: '명', '%') — 응답에서 자동 부착 */
34
+ unit: string;
35
+ /** 자치구 객체 OBJ_ID (KOSIS 테이블마다 다름: 'A'/'SGG'/'region'/'C1' 등). 'auto'면 후보 순회 */
36
+ objId?: string;
37
+ /** 통계청 장래추계 데이터 — 미래연도 실측 아닌 추계 안내 */
38
+ isProjection?: boolean;
39
+ }
40
+ export declare const DISTRICT_OPENAPI_ROUTES: Record<string, DistrictOpenApiRoute>;
41
+ export declare const DISTRICT_KEYWORD_TO_FILESN: Record<string, number>;
42
+ /**
43
+ * markdown에서 키워드 관련 핵심 행과 추정 value/unit 추출
44
+ *
45
+ * - highlightLines: 키워드 매칭 행 + 인접 행 (최대 50줄, 표 헤더·단위 정보 포함)
46
+ * - value/unit: 첫 매칭 행에서 "숫자+단위" 1차 시도, 실패 시 콤마 큰 수 2차 시도
47
+ *
48
+ * 매칭 패턴 없거나 value 추출 실패 시 value=null. answer는 markdown만 노출로 degrade.
49
+ */
50
+ export declare function extractDistrictHighlight(markdown: string, keyword: string): {
51
+ value: string | null;
52
+ unit: string | null;
53
+ highlightLines: string[];
54
+ };
55
+ //# sourceMappingURL=districtFileMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"districtFileMap.d.ts","sourceRoot":"","sources":["../../src/data/districtFileMap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;GASG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACvB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAoCxE,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgE7D,CAAC;AA0VF;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd;IACD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B,CA8DA"}