daiso 1.0.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 (69) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +741 -0
  3. package/dist/api/cgvHandlers.js +97 -0
  4. package/dist/api/handlers.js +208 -0
  5. package/dist/api/megaboxHandlers.js +145 -0
  6. package/dist/api/response.js +22 -0
  7. package/dist/api/routes/cgvRoutes.js +22 -0
  8. package/dist/api/routes/daisoRoutes.js +27 -0
  9. package/dist/api/routes/megaboxRoutes.js +22 -0
  10. package/dist/api/routes/oliveyoungRoutes.js +17 -0
  11. package/dist/cli.js +140 -0
  12. package/dist/core/interfaces.js +6 -0
  13. package/dist/core/registry.js +121 -0
  14. package/dist/core/types.js +6 -0
  15. package/dist/index.js +123 -0
  16. package/dist/pages/openapi.js +6 -0
  17. package/dist/pages/openapiResponse.js +32 -0
  18. package/dist/pages/openapiSpec.js +43 -0
  19. package/dist/pages/openapiSpecComponents.js +419 -0
  20. package/dist/pages/openapiSpecComponentsCgv.js +123 -0
  21. package/dist/pages/openapiSpecPathsCgv.js +149 -0
  22. package/dist/pages/openapiSpecPathsDaisoOliveyoung.js +381 -0
  23. package/dist/pages/openapiSpecPathsMegabox.js +184 -0
  24. package/dist/pages/openapiYaml.js +58 -0
  25. package/dist/pages/privacy.js +262 -0
  26. package/dist/pages/prompt.js +425 -0
  27. package/dist/services/cgv/api.js +15 -0
  28. package/dist/services/cgv/client.js +146 -0
  29. package/dist/services/cgv/index.js +30 -0
  30. package/dist/services/cgv/timetable.js +16 -0
  31. package/dist/services/cgv/tools/findTheaters.js +43 -0
  32. package/dist/services/cgv/tools/getTimetable.js +47 -0
  33. package/dist/services/cgv/tools/searchMovies.js +40 -0
  34. package/dist/services/cgv/transport.js +91 -0
  35. package/dist/services/cgv/types.js +4 -0
  36. package/dist/services/daiso/api.js +53 -0
  37. package/dist/services/daiso/client.js +35 -0
  38. package/dist/services/daiso/index.js +42 -0
  39. package/dist/services/daiso/tools/checkInventory.js +122 -0
  40. package/dist/services/daiso/tools/findStores.js +145 -0
  41. package/dist/services/daiso/tools/getPriceInfo.js +90 -0
  42. package/dist/services/daiso/tools/searchProducts.js +74 -0
  43. package/dist/services/daiso/types.js +4 -0
  44. package/dist/services/megabox/api.js +8 -0
  45. package/dist/services/megabox/client.js +140 -0
  46. package/dist/services/megabox/index.js +26 -0
  47. package/dist/services/megabox/tools/findNearbyTheaters.js +74 -0
  48. package/dist/services/megabox/tools/getRemainingSeats.js +57 -0
  49. package/dist/services/megabox/tools/listNowShowing.js +51 -0
  50. package/dist/services/megabox/types.js +4 -0
  51. package/dist/services/oliveyoung/api.js +8 -0
  52. package/dist/services/oliveyoung/client.js +90 -0
  53. package/dist/services/oliveyoung/index.js +28 -0
  54. package/dist/services/oliveyoung/tools/checkInventory.js +87 -0
  55. package/dist/services/oliveyoung/tools/findNearbyStores.js +53 -0
  56. package/dist/services/oliveyoung/types.js +4 -0
  57. package/dist/tools/checkInventory.js +98 -0
  58. package/dist/tools/findStores.js +125 -0
  59. package/dist/tools/getPriceInfo.js +77 -0
  60. package/dist/tools/searchProducts.js +61 -0
  61. package/dist/types/index.js +4 -0
  62. package/dist/utils/cache.js +54 -0
  63. package/dist/utils/fetch.js +14 -0
  64. package/dist/utils/format.js +31 -0
  65. package/dist/utils/http.js +35 -0
  66. package/dist/utils/zyte.js +76 -0
  67. package/openapi.json +1938 -0
  68. package/openapi.yaml +1338 -0
  69. package/package.json +79 -0
@@ -0,0 +1,262 @@
1
+ /**
2
+ * 개인정보 처리방침 페이지
3
+ *
4
+ * 서비스의 개인정보 처리방침을 제공합니다.
5
+ * 이 서비스는 사용자 데이터를 수집하지 않습니다.
6
+ */
7
+ /**
8
+ * 개인정보 처리방침 텍스트 생성
9
+ */
10
+ export function generatePrivacyText(baseUrl) {
11
+ const currentDate = new Date().toISOString().split('T')[0];
12
+ return `# 개인정보 처리방침
13
+
14
+ **시행일자**: ${currentDate}
15
+
16
+ ---
17
+
18
+ ## 1. 개요
19
+
20
+ 본 개인정보 처리방침은 다이소 MCP API 서비스(이하 "서비스")의 개인정보 처리에 관한 사항을 안내합니다.
21
+
22
+ **서비스 URL**: ${baseUrl}
23
+
24
+ ---
25
+
26
+ ## 2. 수집하는 개인정보
27
+
28
+ **본 서비스는 어떠한 개인정보도 수집하지 않습니다.**
29
+
30
+ 구체적으로 다음 정보를 수집, 저장, 처리하지 않습니다:
31
+
32
+ - 이름, 이메일, 전화번호 등 개인 식별 정보
33
+ - IP 주소, 브라우저 정보 등 기기 식별 정보
34
+ - 쿠키, 세션 정보
35
+ - 위치 정보 (API 요청에 포함된 좌표는 처리 후 즉시 폐기)
36
+ - 검색 기록 및 사용 패턴
37
+ - 기타 모든 형태의 개인정보
38
+
39
+ ---
40
+
41
+ ## 3. 서비스 작동 방식
42
+
43
+ 본 서비스는 다음과 같이 작동합니다:
44
+
45
+ 1. **무상태(Stateless) 처리**: 모든 API 요청은 독립적으로 처리되며, 요청 간 사용자 정보를 저장하지 않습니다.
46
+ 2. **데이터 미보관**: 요청 처리에 사용된 정보는 응답 후 즉시 폐기됩니다.
47
+ 3. **로그 미수집**: 사용자 활동에 대한 로그를 기록하지 않습니다.
48
+ 4. **제3자 공유 없음**: 어떠한 정보도 제3자에게 제공하지 않습니다.
49
+
50
+ ---
51
+
52
+ ## 4. 쿠키 및 추적 기술
53
+
54
+ **본 서비스는 쿠키나 추적 기술을 사용하지 않습니다.**
55
+
56
+ - 쿠키 설정 없음
57
+ - 웹 비콘 없음
58
+ - 분석 도구 없음
59
+ - 광고 추적 없음
60
+
61
+ ---
62
+
63
+ ## 5. 제3자 서비스
64
+
65
+ 본 서비스는 다이소 공식 API를 통해 제품 및 매장 정보를 조회합니다. 다이소 서비스 이용 시 다이소의 개인정보 처리방침이 적용될 수 있습니다.
66
+
67
+ ---
68
+
69
+ ## 6. 아동의 개인정보
70
+
71
+ 본 서비스는 개인정보를 수집하지 않으므로, 아동의 개인정보 보호와 관련된 별도의 조치가 필요하지 않습니다.
72
+
73
+ ---
74
+
75
+ ## 7. 보안
76
+
77
+ 개인정보를 수집하지 않으므로 보호할 개인정보가 없습니다. 다만, 서비스의 안정적인 운영을 위해 Cloudflare의 보안 인프라를 활용합니다.
78
+
79
+ ---
80
+
81
+ ## 8. 개인정보 처리방침의 변경
82
+
83
+ 본 방침이 변경될 경우, 변경 사항을 이 페이지에 게시합니다.
84
+
85
+ ---
86
+
87
+ ## 9. 문의
88
+
89
+ 본 개인정보 처리방침에 대한 문의사항은 GitHub 저장소의 이슈를 통해 연락해 주시기 바랍니다.
90
+
91
+ ---
92
+
93
+ ## 10. 동의
94
+
95
+ 본 서비스를 이용함으로써 귀하는 이 개인정보 처리방침에 동의하는 것으로 간주됩니다.
96
+
97
+ ---
98
+
99
+ **요약: 본 서비스는 사용자의 개인정보를 일체 수집, 저장, 처리하지 않습니다.**
100
+ `;
101
+ }
102
+ /**
103
+ * 개인정보 처리방침 HTML 생성
104
+ */
105
+ export function generatePrivacyHtml(baseUrl) {
106
+ const currentDate = new Date().toISOString().split('T')[0];
107
+ return `<!DOCTYPE html>
108
+ <html lang="ko">
109
+ <head>
110
+ <meta charset="UTF-8">
111
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
112
+ <title>개인정보 처리방침 - 다이소 MCP API</title>
113
+ <style>
114
+ * { box-sizing: border-box; margin: 0; padding: 0; }
115
+ body {
116
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
117
+ line-height: 1.6;
118
+ color: #333;
119
+ max-width: 800px;
120
+ margin: 0 auto;
121
+ padding: 40px 20px;
122
+ background: #f9fafb;
123
+ }
124
+ h1 {
125
+ font-size: 2rem;
126
+ margin-bottom: 0.5rem;
127
+ color: #111;
128
+ }
129
+ h2 {
130
+ font-size: 1.25rem;
131
+ margin-top: 2rem;
132
+ margin-bottom: 1rem;
133
+ color: #111;
134
+ border-bottom: 2px solid #e5e7eb;
135
+ padding-bottom: 0.5rem;
136
+ }
137
+ p { margin-bottom: 1rem; }
138
+ ul {
139
+ margin-bottom: 1rem;
140
+ padding-left: 1.5rem;
141
+ }
142
+ li { margin-bottom: 0.5rem; }
143
+ .date { color: #666; margin-bottom: 2rem; }
144
+ .highlight {
145
+ background: #fef3c7;
146
+ padding: 1rem;
147
+ border-radius: 8px;
148
+ border-left: 4px solid #f59e0b;
149
+ margin: 1.5rem 0;
150
+ }
151
+ .summary {
152
+ background: #d1fae5;
153
+ padding: 1.5rem;
154
+ border-radius: 8px;
155
+ margin-top: 2rem;
156
+ text-align: center;
157
+ font-weight: 600;
158
+ color: #065f46;
159
+ }
160
+ hr {
161
+ border: none;
162
+ border-top: 1px solid #e5e7eb;
163
+ margin: 2rem 0;
164
+ }
165
+ code {
166
+ background: #f3f4f6;
167
+ padding: 0.2rem 0.4rem;
168
+ border-radius: 4px;
169
+ font-size: 0.9rem;
170
+ }
171
+ </style>
172
+ </head>
173
+ <body>
174
+ <h1>개인정보 처리방침</h1>
175
+ <p class="date"><strong>시행일자</strong>: ${currentDate}</p>
176
+
177
+ <h2>1. 개요</h2>
178
+ <p>본 개인정보 처리방침은 다이소 MCP API 서비스(이하 "서비스")의 개인정보 처리에 관한 사항을 안내합니다.</p>
179
+ <p><strong>서비스 URL</strong>: <code>${baseUrl}</code></p>
180
+
181
+ <h2>2. 수집하는 개인정보</h2>
182
+ <div class="highlight">
183
+ <strong>본 서비스는 어떠한 개인정보도 수집하지 않습니다.</strong>
184
+ </div>
185
+ <p>구체적으로 다음 정보를 수집, 저장, 처리하지 않습니다:</p>
186
+ <ul>
187
+ <li>이름, 이메일, 전화번호 등 개인 식별 정보</li>
188
+ <li>IP 주소, 브라우저 정보 등 기기 식별 정보</li>
189
+ <li>쿠키, 세션 정보</li>
190
+ <li>위치 정보 (API 요청에 포함된 좌표는 처리 후 즉시 폐기)</li>
191
+ <li>검색 기록 및 사용 패턴</li>
192
+ <li>기타 모든 형태의 개인정보</li>
193
+ </ul>
194
+
195
+ <h2>3. 서비스 작동 방식</h2>
196
+ <p>본 서비스는 다음과 같이 작동합니다:</p>
197
+ <ul>
198
+ <li><strong>무상태(Stateless) 처리</strong>: 모든 API 요청은 독립적으로 처리되며, 요청 간 사용자 정보를 저장하지 않습니다.</li>
199
+ <li><strong>데이터 미보관</strong>: 요청 처리에 사용된 정보는 응답 후 즉시 폐기됩니다.</li>
200
+ <li><strong>로그 미수집</strong>: 사용자 활동에 대한 로그를 기록하지 않습니다.</li>
201
+ <li><strong>제3자 공유 없음</strong>: 어떠한 정보도 제3자에게 제공하지 않습니다.</li>
202
+ </ul>
203
+
204
+ <h2>4. 쿠키 및 추적 기술</h2>
205
+ <div class="highlight">
206
+ <strong>본 서비스는 쿠키나 추적 기술을 사용하지 않습니다.</strong>
207
+ </div>
208
+ <ul>
209
+ <li>쿠키 설정 없음</li>
210
+ <li>웹 비콘 없음</li>
211
+ <li>분석 도구 없음</li>
212
+ <li>광고 추적 없음</li>
213
+ </ul>
214
+
215
+ <h2>5. 제3자 서비스</h2>
216
+ <p>본 서비스는 다이소 공식 API를 통해 제품 및 매장 정보를 조회합니다. 다이소 서비스 이용 시 다이소의 개인정보 처리방침이 적용될 수 있습니다.</p>
217
+
218
+ <h2>6. 아동의 개인정보</h2>
219
+ <p>본 서비스는 개인정보를 수집하지 않으므로, 아동의 개인정보 보호와 관련된 별도의 조치가 필요하지 않습니다.</p>
220
+
221
+ <h2>7. 보안</h2>
222
+ <p>개인정보를 수집하지 않으므로 보호할 개인정보가 없습니다. 다만, 서비스의 안정적인 운영을 위해 Cloudflare의 보안 인프라를 활용합니다.</p>
223
+
224
+ <h2>8. 개인정보 처리방침의 변경</h2>
225
+ <p>본 방침이 변경될 경우, 변경 사항을 이 페이지에 게시합니다.</p>
226
+
227
+ <h2>9. 문의</h2>
228
+ <p>본 개인정보 처리방침에 대한 문의사항은 GitHub 저장소의 이슈를 통해 연락해 주시기 바랍니다.</p>
229
+
230
+ <h2>10. 동의</h2>
231
+ <p>본 서비스를 이용함으로써 귀하는 이 개인정보 처리방침에 동의하는 것으로 간주됩니다.</p>
232
+
233
+ <div class="summary">
234
+ 요약: 본 서비스는 사용자의 개인정보를 일체 수집, 저장, 처리하지 않습니다.
235
+ </div>
236
+ </body>
237
+ </html>`;
238
+ }
239
+ /**
240
+ * 개인정보 처리방침 HTML 응답 생성
241
+ */
242
+ export function createPrivacyResponse(baseUrl) {
243
+ const html = generatePrivacyHtml(baseUrl);
244
+ return new Response(html, {
245
+ headers: {
246
+ 'Content-Type': 'text/html; charset=utf-8',
247
+ 'Cache-Control': 'public, max-age=86400',
248
+ },
249
+ });
250
+ }
251
+ /**
252
+ * 개인정보 처리방침 텍스트 응답 생성
253
+ */
254
+ export function createPrivacyTextResponse(baseUrl) {
255
+ const text = generatePrivacyText(baseUrl);
256
+ return new Response(text, {
257
+ headers: {
258
+ 'Content-Type': 'text/plain; charset=utf-8',
259
+ 'Cache-Control': 'public, max-age=86400',
260
+ },
261
+ });
262
+ }
@@ -0,0 +1,425 @@
1
+ /**
2
+ * 프롬프트 페이지
3
+ *
4
+ * MCP 미지원 AI 에이전트를 위한 API 설명 페이지입니다.
5
+ * 에이전트가 이 페이지를 읽고 GET API를 사용할 수 있습니다.
6
+ */
7
+ /**
8
+ * 프롬프트 텍스트 생성
9
+ */
10
+ export function generatePromptText(baseUrl) {
11
+ return `# 다이소 MCP API
12
+
13
+ 다이소 제품 검색, 매장 찾기, 재고 확인을 위한 API입니다.
14
+ 모든 요청은 GET 방식이며, 결과는 JSON으로 반환됩니다.
15
+
16
+ Base URL: ${baseUrl}
17
+
18
+ ---
19
+
20
+ ## 사용 가능한 기능
21
+
22
+ ### 1. 제품 검색
23
+
24
+ **설명**: 키워드로 다이소 제품을 검색합니다.
25
+
26
+ **URL**: ${baseUrl}/api/daiso/products?q={검색어}
27
+
28
+ **필수 파라미터**:
29
+ - q: 검색 키워드 (예: 수납박스, 펜, 정리함)
30
+
31
+ **선택 파라미터**:
32
+ - page: 페이지 번호 (기본값: 1)
33
+ - pageSize: 페이지당 결과 수 (기본값: 30, 최대: 100)
34
+
35
+ **예시**:
36
+ - ${baseUrl}/api/daiso/products?q=수납박스
37
+ - ${baseUrl}/api/daiso/products?q=펜&page=2&pageSize=10
38
+
39
+ **응답 예시**:
40
+ \`\`\`json
41
+ {
42
+ "success": true,
43
+ "data": {
44
+ "products": [
45
+ {
46
+ "id": "1234567890",
47
+ "name": "PP 수납박스 대형",
48
+ "price": 5000,
49
+ "imageUrl": "https://img.daisomall.co.kr/...",
50
+ "soldOut": false,
51
+ "isNew": false,
52
+ "pickupAvailable": true
53
+ }
54
+ ]
55
+ },
56
+ "meta": { "total": 150, "page": 1, "pageSize": 30 }
57
+ }
58
+ \`\`\`
59
+
60
+ ---
61
+
62
+ ### 2. 제품 상세 정보
63
+
64
+ **설명**: 제품 ID로 상세 정보를 조회합니다.
65
+
66
+ **URL**: ${baseUrl}/api/daiso/products/{제품ID}
67
+
68
+ **예시**:
69
+ - ${baseUrl}/api/daiso/products/1234567890
70
+
71
+ **응답 예시**:
72
+ \`\`\`json
73
+ {
74
+ "success": true,
75
+ "data": {
76
+ "id": "1234567890",
77
+ "name": "PP 수납박스 대형",
78
+ "price": 5000,
79
+ "currency": "KRW",
80
+ "imageUrl": "https://img.daisomall.co.kr/...",
81
+ "brand": "다이소",
82
+ "soldOut": false,
83
+ "isNew": false
84
+ }
85
+ }
86
+ \`\`\`
87
+
88
+ ---
89
+
90
+ ### 3. 매장 찾기
91
+
92
+ **설명**: 키워드 또는 지역으로 다이소 매장을 검색합니다.
93
+
94
+ **URL**: ${baseUrl}/api/daiso/stores?keyword={키워드}
95
+
96
+ **필수 파라미터** (둘 중 하나 필수):
97
+ - keyword: 매장명 또는 주소 키워드 (예: 강남, 홍대, 안산)
98
+ - sido: 시/도 (예: 서울, 경기, 부산)
99
+
100
+ **선택 파라미터**:
101
+ - gugun: 구/군 (예: 강남구, 마포구)
102
+ - dong: 동 (예: 역삼동, 합정동)
103
+ - limit: 최대 결과 수 (기본값: 50)
104
+
105
+ **예시**:
106
+ - ${baseUrl}/api/daiso/stores?keyword=강남
107
+ - ${baseUrl}/api/daiso/stores?sido=서울&gugun=마포구
108
+ - ${baseUrl}/api/daiso/stores?keyword=홍대&limit=10
109
+
110
+ **응답 예시**:
111
+ \`\`\`json
112
+ {
113
+ "success": true,
114
+ "data": {
115
+ "stores": [
116
+ {
117
+ "name": "다이소 강남역점",
118
+ "phone": "02-1234-5678",
119
+ "address": "서울특별시 강남구 강남대로 123",
120
+ "lat": 37.4979,
121
+ "lng": 127.0276,
122
+ "openTime": "10:00",
123
+ "closeTime": "22:00",
124
+ "options": {
125
+ "parking": true,
126
+ "pickup": true,
127
+ "taxFree": false
128
+ }
129
+ }
130
+ ]
131
+ },
132
+ "meta": { "total": 5 }
133
+ }
134
+ \`\`\`
135
+
136
+ ---
137
+
138
+ ### 4. 재고 확인
139
+
140
+ **설명**: 특정 제품의 매장별 재고와 온라인 재고를 확인합니다.
141
+
142
+ **URL**: ${baseUrl}/api/daiso/inventory?productId={제품ID}
143
+
144
+ **필수 파라미터**:
145
+ - productId: 제품 ID (제품 검색 API에서 조회한 id 값)
146
+
147
+ **선택 파라미터**:
148
+ - lat: 위도 (기본값: 37.5665, 서울 시청)
149
+ - lng: 경도 (기본값: 126.978, 서울 시청)
150
+ - keyword: 매장 검색어 (예: 안산, 강남)
151
+ - page: 페이지 번호 (기본값: 1)
152
+ - pageSize: 페이지당 결과 수 (기본값: 30)
153
+
154
+ **예시**:
155
+ - ${baseUrl}/api/daiso/inventory?productId=1234567890
156
+ - ${baseUrl}/api/daiso/inventory?productId=1234567890&lat=37.3219&lng=126.8309
157
+ - ${baseUrl}/api/daiso/inventory?productId=1234567890&keyword=안산
158
+
159
+ **응답 예시**:
160
+ \`\`\`json
161
+ {
162
+ "success": true,
163
+ "data": {
164
+ "productId": "1234567890",
165
+ "location": { "latitude": 37.5665, "longitude": 126.978 },
166
+ "onlineStock": 150,
167
+ "storeInventory": {
168
+ "totalStores": 25,
169
+ "inStockCount": 18,
170
+ "stores": [
171
+ {
172
+ "storeCode": "ST001",
173
+ "storeName": "다이소 강남역점",
174
+ "address": "서울특별시 강남구...",
175
+ "distance": "0.5km",
176
+ "quantity": 12,
177
+ "options": { "parking": true, "pickup": true }
178
+ }
179
+ ]
180
+ }
181
+ },
182
+ "meta": { "total": 25, "page": 1, "pageSize": 30 }
183
+ }
184
+ \`\`\`
185
+
186
+ ---
187
+
188
+ ### 5. 올리브영 매장 찾기
189
+
190
+ **설명**: 위치 기반으로 주변 올리브영 매장을 검색합니다.
191
+
192
+ **URL**: ${baseUrl}/api/oliveyoung/stores?keyword={키워드}
193
+
194
+ **선택 파라미터**:
195
+ - keyword: 매장명/지역 키워드 (예: 명동, 강남)
196
+ - lat: 위도 (기본값: 37.5665)
197
+ - lng: 경도 (기본값: 126.978)
198
+ - pageIdx: 페이지 번호 (기본값: 1)
199
+ - limit: 최대 결과 수 (기본값: 20)
200
+
201
+ **예시**:
202
+ - ${baseUrl}/api/oliveyoung/stores?keyword=명동
203
+ - ${baseUrl}/api/oliveyoung/stores?lat=37.498&lng=127.027&limit=5
204
+
205
+ ---
206
+
207
+ ### 6. 올리브영 재고 확인
208
+
209
+ **설명**: 상품 키워드 기준 올리브영 재고를 조회하고 주변 매장 목록을 함께 반환합니다.
210
+
211
+ **URL**: ${baseUrl}/api/oliveyoung/inventory?keyword={검색어}
212
+
213
+ **필수 파라미터**:
214
+ - keyword: 상품 검색어 (예: 선크림, 립밤)
215
+
216
+ **선택 파라미터**:
217
+ - lat: 위도 (기본값: 37.5665)
218
+ - lng: 경도 (기본값: 126.978)
219
+ - storeKeyword: 매장 필터 키워드
220
+ - page: 상품 검색 페이지 (기본값: 1)
221
+ - size: 페이지당 결과 수 (기본값: 20)
222
+ - includeSoldOut: 품절 포함 여부 (기본값: false)
223
+
224
+ **예시**:
225
+ - ${baseUrl}/api/oliveyoung/inventory?keyword=선크림
226
+ - ${baseUrl}/api/oliveyoung/inventory?keyword=립밤&storeKeyword=명동
227
+
228
+ ---
229
+
230
+ ### 7. 메가박스 주변 지점 찾기
231
+
232
+ **설명**: 사용자 좌표 기준으로 메가박스 지점을 거리순으로 조회합니다.
233
+
234
+ **URL**: ${baseUrl}/api/megabox/theaters?lat={위도}&lng={경도}
235
+
236
+ **선택 파라미터**:
237
+ - lat: 위도 (기본값: 37.5665)
238
+ - lng: 경도 (기본값: 126.978)
239
+ - playDate: 조회 날짜 (YYYYMMDD, 기본값: 오늘)
240
+ - areaCode: 지역 코드 (기본값: 11, 서울)
241
+ - limit: 최대 결과 수 (기본값: 10)
242
+
243
+ **예시**:
244
+ - ${baseUrl}/api/megabox/theaters?lat=37.4982&lng=127.0264
245
+ - ${baseUrl}/api/megabox/theaters?areaCode=11&limit=5
246
+
247
+ ---
248
+
249
+ ### 8. 메가박스 영화/회차 목록
250
+
251
+ **설명**: 날짜/지점 조건으로 메가박스 영화와 상영 회차를 조회합니다.
252
+
253
+ **URL**: ${baseUrl}/api/megabox/movies?playDate={YYYYMMDD}
254
+
255
+ **선택 파라미터**:
256
+ - playDate: 조회 날짜 (YYYYMMDD, 기본값: 오늘)
257
+ - theaterId: 지점 ID (예: 1372)
258
+ - movieId: 영화 ID (예: 25104500)
259
+ - areaCode: 지역 코드 (기본값: 11)
260
+
261
+ **예시**:
262
+ - ${baseUrl}/api/megabox/movies?playDate=20260304&theaterId=1372
263
+ - ${baseUrl}/api/megabox/movies?playDate=20260304&movieId=25104500
264
+
265
+ ---
266
+
267
+ ### 9. 메가박스 잔여 좌석 조회
268
+
269
+ **설명**: 영화/지점/날짜 기준으로 회차별 잔여 좌석 수를 조회합니다.
270
+
271
+ **URL**: ${baseUrl}/api/megabox/seats?playDate={YYYYMMDD}
272
+
273
+ **선택 파라미터**:
274
+ - playDate: 조회 날짜 (YYYYMMDD, 기본값: 오늘)
275
+ - theaterId: 지점 ID
276
+ - movieId: 영화 ID
277
+ - areaCode: 지역 코드 (기본값: 11)
278
+ - limit: 최대 결과 수 (기본값: 50)
279
+
280
+ **예시**:
281
+ - ${baseUrl}/api/megabox/seats?playDate=20260304&theaterId=1372
282
+ - ${baseUrl}/api/megabox/seats?playDate=20260304&movieId=25104500&limit=20
283
+
284
+ ---
285
+
286
+ ### 10. CGV 극장 검색
287
+
288
+ **설명**: 지역 코드 기준으로 CGV 극장 목록을 조회합니다.
289
+
290
+ **URL**: ${baseUrl}/api/cgv/theaters?playDate={YYYYMMDD}
291
+
292
+ **선택 파라미터**:
293
+ - playDate: 조회 날짜 (YYYYMMDD, 기본값: 오늘)
294
+ - regionCode: 지역 코드 (예: 01)
295
+ - limit: 최대 결과 수 (기본값: 30)
296
+
297
+ **예시**:
298
+ - ${baseUrl}/api/cgv/theaters?playDate=20260304&regionCode=01
299
+ - ${baseUrl}/api/cgv/theaters?playDate=20260304&limit=10
300
+
301
+ ---
302
+
303
+ ### 11. CGV 영화 검색
304
+
305
+ **설명**: 날짜/극장 조건으로 CGV 영화 목록을 조회합니다.
306
+
307
+ **URL**: ${baseUrl}/api/cgv/movies?playDate={YYYYMMDD}
308
+
309
+ **선택 파라미터**:
310
+ - playDate: 조회 날짜 (YYYYMMDD, 기본값: 오늘)
311
+ - theaterCode: 극장 코드 (예: 0056)
312
+
313
+ **예시**:
314
+ - ${baseUrl}/api/cgv/movies?playDate=20260304&theaterCode=0056
315
+
316
+ ---
317
+
318
+ ### 12. CGV 시간표 조회
319
+
320
+ **설명**: 날짜/극장/영화 조건으로 CGV 상영 시간표를 조회합니다.
321
+
322
+ **URL**: ${baseUrl}/api/cgv/timetable?playDate={YYYYMMDD}
323
+
324
+ **선택 파라미터**:
325
+ - playDate: 조회 날짜 (YYYYMMDD, 기본값: 오늘)
326
+ - theaterCode: 극장 코드 (예: 0056)
327
+ - movieCode: 영화 코드
328
+ - limit: 최대 결과 수 (기본값: 50)
329
+
330
+ **예시**:
331
+ - ${baseUrl}/api/cgv/timetable?playDate=20260304&theaterCode=0056
332
+ - ${baseUrl}/api/cgv/timetable?playDate=20260304&movieCode=200001
333
+
334
+ ---
335
+
336
+ ## 응답 형식
337
+
338
+ ### 성공 응답
339
+ \`\`\`json
340
+ {
341
+ "success": true,
342
+ "data": { ... },
343
+ "meta": {
344
+ "total": 100,
345
+ "page": 1,
346
+ "pageSize": 30
347
+ }
348
+ }
349
+ \`\`\`
350
+
351
+ ### 에러 응답
352
+ \`\`\`json
353
+ {
354
+ "success": false,
355
+ "error": {
356
+ "code": "ERROR_CODE",
357
+ "message": "에러 메시지"
358
+ }
359
+ }
360
+ \`\`\`
361
+
362
+ ### 에러 코드
363
+ | 코드 | 설명 |
364
+ |------|------|
365
+ | MISSING_QUERY | 검색어가 누락됨 |
366
+ | MISSING_PARAMS | 필수 파라미터 누락 |
367
+ | MISSING_PRODUCT_ID | 제품 ID 누락 |
368
+ | NOT_FOUND | 결과를 찾을 수 없음 |
369
+ | SEARCH_FAILED | 검색 실패 |
370
+ | FETCH_FAILED | 데이터 조회 실패 |
371
+ | OLIVEYOUNG_STORE_SEARCH_FAILED | 올리브영 매장 조회 실패 |
372
+ | OLIVEYOUNG_INVENTORY_CHECK_FAILED | 올리브영 재고 조회 실패 |
373
+ | MEGABOX_THEATER_SEARCH_FAILED | 메가박스 지점 조회 실패 |
374
+ | MEGABOX_MOVIE_LIST_FAILED | 메가박스 영화 목록 조회 실패 |
375
+ | MEGABOX_SEAT_LIST_FAILED | 메가박스 좌석 조회 실패 |
376
+ | CGV_THEATER_SEARCH_FAILED | CGV 극장 조회 실패 |
377
+ | CGV_MOVIE_SEARCH_FAILED | CGV 영화 목록 조회 실패 |
378
+ | CGV_TIMETABLE_FETCH_FAILED | CGV 시간표 조회 실패 |
379
+
380
+ ---
381
+
382
+ ## 사용 팁
383
+
384
+ 1. **한글 검색어**: URL 인코딩이 자동으로 처리됩니다
385
+ 2. **페이지네이션**: 결과가 많을 경우 page 파라미터 사용
386
+ 3. **재고 확인 워크플로우**:
387
+ - 먼저 /api/daiso/products로 제품 검색
388
+ - 결과에서 원하는 제품의 id 확인
389
+ - /api/daiso/inventory에 해당 id로 재고 조회
390
+ 4. **위치 기반 재고**: lat, lng 파라미터로 가까운 매장 우선 조회
391
+
392
+ ---
393
+
394
+ ## MCP 지원 서비스
395
+
396
+ MCP를 지원하는 AI 에이전트(Claude 등)는 더 풍부한 기능을 사용할 수 있습니다.
397
+ MCP 연결 정보: ${baseUrl}/mcp
398
+
399
+ 지원 도구:
400
+ - daiso_search_products: 제품 검색
401
+ - daiso_find_stores: 매장 검색
402
+ - daiso_check_inventory: 재고 확인
403
+ - daiso_get_price_info: 가격 정보 조회
404
+ - oliveyoung_find_nearby_stores: 올리브영 주변 매장 탐색
405
+ - oliveyoung_check_inventory: 올리브영 재고 파악
406
+ - megabox_find_nearby_theaters: 메가박스 주변 지점 탐색
407
+ - megabox_list_now_showing: 메가박스 영화 목록 조회
408
+ - megabox_get_remaining_seats: 메가박스 잔여 좌석 조회
409
+ - cgv_find_theaters: CGV 극장 검색
410
+ - cgv_search_movies: CGV 영화 검색
411
+ - cgv_get_timetable: CGV 시간표 조회
412
+ `;
413
+ }
414
+ /**
415
+ * 프롬프트 페이지 응답 생성
416
+ */
417
+ export function createPromptResponse(baseUrl) {
418
+ const text = generatePromptText(baseUrl);
419
+ return new Response(text, {
420
+ headers: {
421
+ 'Content-Type': 'text/plain; charset=utf-8',
422
+ 'Cache-Control': 'public, max-age=3600',
423
+ },
424
+ });
425
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * CGV API 엔드포인트 중앙 관리
3
+ */
4
+ export const CGV_API = {
5
+ BASE_URL: 'https://api.cgv.co.kr',
6
+ OIDC_BASE_URL: 'https://oidc.cgv.co.kr',
7
+ COMPANY_CODE: 'A420',
8
+ SIGNING_SECRET: 'ydqXY0ocnFLmJGHr_zNzFcpjwAsXq_8JcBNURAkRscg',
9
+ THEATER_LIST_PATH: '/cnm/atkt/searchRegnList',
10
+ MOVIE_LIST_PATH: '/cnm/atkt/searchOnlyCgvMovList',
11
+ TIMETABLE_BY_SITE_PATH: '/cnm/atkt/searchMovScnInfo',
12
+ TIMETABLE_PATH: '/cnm/atkt/searchSchByMov',
13
+ TIMETABLE_SITE_SCOPE_CODE: '08',
14
+ TIMETABLE_SCOPE_CODE: '01',
15
+ };