daiso 1.0.4 → 1.0.5

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 (158) hide show
  1. package/README.md +218 -540
  2. package/dist/api/actionsProxy.js +82 -0
  3. package/dist/api/cgvHandlers.js +103 -16
  4. package/dist/api/daisoHandlers.js +127 -0
  5. package/dist/api/emart24Handlers.js +176 -0
  6. package/dist/api/gs25Handlers.js +256 -0
  7. package/dist/api/handlers.js +184 -108
  8. package/dist/api/healthChecks.js +332 -0
  9. package/dist/api/lottecinemaHandlers.js +155 -0
  10. package/dist/api/lottemartHandlers.js +128 -0
  11. package/dist/api/megaboxHandlers.js +81 -50
  12. package/dist/api/routes/cuRoutes.js +17 -0
  13. package/dist/api/routes/daisoRoutes.js +6 -1
  14. package/dist/api/routes/emart24Routes.js +22 -0
  15. package/dist/api/routes/gs25Routes.js +22 -0
  16. package/dist/api/routes/healthRoutes.js +44 -0
  17. package/dist/api/routes/lottecinemaRoutes.js +22 -0
  18. package/dist/api/routes/lottemartRoutes.js +18 -0
  19. package/dist/api/routes/oliveyoungRoutes.js +6 -1
  20. package/dist/api/routes/sevenelevenRoutes.js +32 -0
  21. package/dist/api/sevenelevenHandlers.js +200 -0
  22. package/dist/cli/args.js +54 -0
  23. package/dist/cli/commands/convenience.js +241 -0
  24. package/dist/cli/commands/daiso.js +96 -0
  25. package/dist/cli/constants.js +5 -0
  26. package/dist/cli/deps.js +48 -0
  27. package/dist/cli/http.js +98 -0
  28. package/dist/cli/interactiveFetch.js +31 -0
  29. package/dist/cli/interactiveItemSearch.js +259 -0
  30. package/dist/cli/interactivePrompt.js +49 -0
  31. package/dist/cli/interactiveTypes.js +4 -0
  32. package/dist/cli/types.js +4 -0
  33. package/dist/cli.js +66 -197
  34. package/dist/cliHelp.js +206 -1
  35. package/dist/cliInteractive.js +174 -0
  36. package/dist/cliPicker.js +56 -0
  37. package/dist/cliRenderer.js +4 -0
  38. package/dist/index.js +147 -8
  39. package/dist/pages/openapi.js +2 -1
  40. package/dist/pages/openapiFullSpec.js +58 -0
  41. package/dist/pages/openapiResponse.js +28 -0
  42. package/dist/pages/openapiSpec.js +2 -41
  43. package/dist/pages/openapiSpecActions.js +109 -0
  44. package/dist/pages/openapiSpecComponents.js +30 -391
  45. package/dist/pages/openapiSpecComponentsCgv.js +24 -0
  46. package/dist/pages/openapiSpecComponentsCu.js +112 -0
  47. package/dist/pages/openapiSpecComponentsDaisoOliveyoung.js +342 -0
  48. package/dist/pages/openapiSpecComponentsEmart24.js +141 -0
  49. package/dist/pages/openapiSpecComponentsGs25.js +109 -0
  50. package/dist/pages/openapiSpecComponentsLotteMart.js +85 -0
  51. package/dist/pages/openapiSpecComponentsLottecinema.js +163 -0
  52. package/dist/pages/openapiSpecComponentsMegabox.js +144 -0
  53. package/dist/pages/openapiSpecComponentsSeveneleven.js +82 -0
  54. package/dist/pages/openapiSpecPathsCgv.js +66 -3
  55. package/dist/pages/openapiSpecPathsCu.js +138 -0
  56. package/dist/pages/openapiSpecPathsDaiso.js +302 -0
  57. package/dist/pages/openapiSpecPathsDaisoOliveyoung.js +4 -376
  58. package/dist/pages/openapiSpecPathsEmart24.js +223 -0
  59. package/dist/pages/openapiSpecPathsGs25.js +166 -0
  60. package/dist/pages/openapiSpecPathsLotteMart.js +135 -0
  61. package/dist/pages/openapiSpecPathsLottecinema.js +212 -0
  62. package/dist/pages/openapiSpecPathsMegabox.js +52 -3
  63. package/dist/pages/openapiSpecPathsOliveyoung.js +231 -0
  64. package/dist/pages/openapiSpecPathsSeveneleven.js +234 -0
  65. package/dist/pages/prompt.js +8 -402
  66. package/dist/pages/promptCoreText.js +278 -0
  67. package/dist/pages/promptReferenceText.js +131 -0
  68. package/dist/pages/promptRetailCinemaText.js +273 -0
  69. package/dist/services/cgv/client.js +6 -1
  70. package/dist/services/cgv/index.js +3 -3
  71. package/dist/services/cgv/location.js +235 -0
  72. package/dist/services/cgv/tools/findTheaters.js +30 -5
  73. package/dist/services/cgv/tools/getTimetable.js +42 -14
  74. package/dist/services/cgv/tools/searchMovies.js +40 -12
  75. package/dist/services/cgv/transport.js +0 -3
  76. package/dist/services/cu/api.js +11 -0
  77. package/dist/services/cu/client.js +297 -0
  78. package/dist/services/cu/index.js +21 -0
  79. package/dist/services/cu/tools/checkInventory.js +123 -0
  80. package/dist/services/cu/tools/findNearbyStores.js +49 -0
  81. package/dist/services/cu/types.js +4 -0
  82. package/dist/services/daiso/api.js +22 -2
  83. package/dist/services/daiso/client.js +59 -0
  84. package/dist/services/daiso/index.js +2 -0
  85. package/dist/services/daiso/product.js +17 -0
  86. package/dist/services/daiso/tools/checkInventory.js +76 -41
  87. package/dist/services/daiso/tools/findStores.js +17 -7
  88. package/dist/services/daiso/tools/getDisplayLocation.js +75 -0
  89. package/dist/services/emart24/api.js +11 -0
  90. package/dist/services/emart24/client.js +173 -0
  91. package/dist/services/emart24/index.js +22 -0
  92. package/dist/services/emart24/inventoryLookup.js +134 -0
  93. package/dist/services/emart24/tools/checkInventory.js +54 -0
  94. package/dist/services/emart24/tools/findNearbyStores.js +72 -0
  95. package/dist/services/emart24/tools/searchProducts.js +63 -0
  96. package/dist/services/emart24/types.js +4 -0
  97. package/dist/services/gs25/api.js +9 -0
  98. package/dist/services/gs25/client.js +198 -0
  99. package/dist/services/gs25/index.js +22 -0
  100. package/dist/services/gs25/storeUtils.js +168 -0
  101. package/dist/services/gs25/tools/checkInventory.js +163 -0
  102. package/dist/services/gs25/tools/findNearbyStores.js +103 -0
  103. package/dist/services/gs25/tools/searchProducts.js +50 -0
  104. package/dist/services/gs25/types.js +4 -0
  105. package/dist/services/lottecinema/api.js +12 -0
  106. package/dist/services/lottecinema/client.js +161 -0
  107. package/dist/services/lottecinema/index.js +30 -0
  108. package/dist/services/lottecinema/location.js +191 -0
  109. package/dist/services/lottecinema/tools/findNearbyTheaters.js +47 -0
  110. package/dist/services/lottecinema/tools/getRemainingSeats.js +85 -0
  111. package/dist/services/lottecinema/tools/listNowShowing.js +79 -0
  112. package/dist/services/lottecinema/types.js +4 -0
  113. package/dist/services/lottemart/api.js +31 -0
  114. package/dist/services/lottemart/client.js +245 -0
  115. package/dist/services/lottemart/clientTypes.js +4 -0
  116. package/dist/services/lottemart/config.js +4 -0
  117. package/dist/services/lottemart/debug.js +92 -0
  118. package/dist/services/lottemart/geocode.js +49 -0
  119. package/dist/services/lottemart/index.js +30 -0
  120. package/dist/services/lottemart/keyword.js +29 -0
  121. package/dist/services/lottemart/parser.js +185 -0
  122. package/dist/services/lottemart/session.js +331 -0
  123. package/dist/services/lottemart/storeSearch.js +52 -0
  124. package/dist/services/lottemart/tools/findNearbyStores.js +67 -0
  125. package/dist/services/lottemart/tools/searchProducts.js +62 -0
  126. package/dist/services/lottemart/types.js +4 -0
  127. package/dist/services/lottemart/zetta.js +105 -0
  128. package/dist/services/megabox/location.js +219 -0
  129. package/dist/services/megabox/tools/findNearbyTheaters.js +13 -44
  130. package/dist/services/megabox/tools/getRemainingSeats.js +31 -3
  131. package/dist/services/megabox/tools/listNowShowing.js +31 -3
  132. package/dist/services/oliveyoung/api.js +2 -0
  133. package/dist/services/oliveyoung/client.js +150 -9
  134. package/dist/services/oliveyoung/index.js +3 -1
  135. package/dist/services/oliveyoung/tools/checkInventory.js +15 -4
  136. package/dist/services/oliveyoung/tools/searchProducts.js +57 -0
  137. package/dist/services/seveneleven/api.js +15 -0
  138. package/dist/services/seveneleven/client.js +279 -0
  139. package/dist/services/seveneleven/index.js +30 -0
  140. package/dist/services/seveneleven/inventory.js +302 -0
  141. package/dist/services/seveneleven/productKeyword.js +141 -0
  142. package/dist/services/seveneleven/tools/checkInventory.js +82 -0
  143. package/dist/services/seveneleven/tools/getCatalogSnapshot.js +55 -0
  144. package/dist/services/seveneleven/tools/getSearchPopwords.js +41 -0
  145. package/dist/services/seveneleven/tools/searchProducts.js +56 -0
  146. package/dist/services/seveneleven/tools/searchStores.js +45 -0
  147. package/dist/services/seveneleven/types.js +4 -0
  148. package/dist/utils/cliInteractiveHelpers.js +63 -0
  149. package/dist/utils/daisoKeyword.js +30 -0
  150. package/dist/utils/http.js +16 -2
  151. package/openapi.json +1977 -734
  152. package/openapi.yaml +1430 -543
  153. package/package.json +28 -15
  154. package/dist/tools/checkInventory.js +0 -98
  155. package/dist/tools/findStores.js +0 -125
  156. package/dist/tools/getPriceInfo.js +0 -77
  157. package/dist/tools/searchProducts.js +0 -61
  158. package/dist/types/index.js +0 -4
package/README.md CHANGED
@@ -7,16 +7,30 @@
7
7
 
8
8
  # Daiso MCP Server
9
9
 
10
- 다이소(제품/매장/재고), 올리브영(매장/재고), 메가박스(지점/영화/시간표/좌석), CGV(극장/영화/시간표) 조회 기능을 AI에 연결합니다.
10
+ 다이소(제품/매장/재고), 롯데마트(매장/상품), GS25(매장/상품/재고), 세븐일레븐(상품/매장/재고/인기검색어/카탈로그), CU(매장/재고), 이마트24(매장/상품/재고), 올리브영(매장/재고), 메가박스(지점/영화/시간표/좌석), 롯데시네마(지점/영화/좌석), CGV(극장/영화/시간표) 조회 기능을 AI에 연결합니다.
11
11
 
12
12
  <br>
13
13
 
14
14
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
15
15
  [![Cloudflare Workers](https://img.shields.io/badge/Cloudflare-Workers-F38020.svg)](https://workers.cloudflare.com/)
16
16
  [![MCP](https://img.shields.io/badge/MCP-Protocol-8B5CF6.svg)](https://modelcontextprotocol.io/)
17
+ [![Code Coverage](https://img.shields.io/badge/Code%20Coverage-100%25-brightgreen.svg)](https://github.com/hmmhmmhm/daiso-mcp/actions/workflows/coverage.yml)
17
18
  [![Coverage](https://github.com/hmmhmmhm/daiso-mcp/actions/workflows/coverage.yml/badge.svg?branch=main)](https://github.com/hmmhmmhm/daiso-mcp/actions/workflows/coverage.yml)
19
+ [![Better Stack Badge](https://uptime.betterstack.com/status-badges/v2/monitor/2mmhx.svg)](https://aka-page.betteruptime.com/)
20
+
21
+ **[실시간 서비스 상태 보기](https://aka-page.betteruptime.com/)**
22
+
23
+ <!-- WORKERS_INVOCATIONS_CHART:START -->
24
+ <h3>Cloudflare Workers 호출량 (2026-03-01 ~ 2026-05-16, 77일)</h3>
25
+
26
+ <img src="./assets/analytics/workers-invocations.png?v=2026-05-16T15:44:19.119Z" alt="Cloudflare Workers 호출량 그래프 (2026-03-01 ~ 2026-05-16)" width="100%">
27
+
28
+ <sub>기준 워커: <code>daiso-mcp</code> · 마지막 갱신: 2026-05-17 00:44 KST</sub>
29
+
30
+ <!-- WORKERS_INVOCATIONS_CHART:END -->
18
31
 
19
32
  <br>
33
+
20
34
  <br>
21
35
 
22
36
  <img src="https://i.imgur.com/mPwS4Kv.png" width="400">&nbsp;&nbsp;<img src="https://i.imgur.com/MrndJ3g.png" width="400">
@@ -31,31 +45,8 @@
31
45
 
32
46
  ## AI 앱에서 MCP 연결하기
33
47
 
34
- MCP 서버 URL:
35
-
36
- ```
37
- https://mcp.aka.page
38
- ```
39
-
40
- CLI (npx):
41
-
42
- ```bash
43
- npx daiso help
44
- npx daiso help products
45
- npx daiso url
46
- npx daiso health
47
- npx daiso claude
48
-
49
- # AI 없이 직접 조회
50
- npx daiso products 수납박스
51
- npx daiso product 1034604
52
- npx daiso stores 강남역
53
- npx daiso inventory 1034604 --keyword 강남역
54
- npx daiso get /api/cgv/movies --playDate 20260307 --theaterCode 0056
55
-
56
- # 원본 JSON 필요 시
57
- npx daiso products 수납박스 --json
58
- ```
48
+ ChatGPT, Claude, Grok 같은 AI 앱에서 바로 연결해 사용할 수 있습니다.
49
+ 아래 앱별 가이드에서 먼저 연동한 뒤 검색/재고/영화 조회를 요청하세요.
59
50
 
60
51
  <br>
61
52
 
@@ -71,7 +62,17 @@ npx daiso products 수납박스 --json
71
62
  ```
72
63
  다이소 mcp로 수납박스 검색해줘
73
64
  올리브영 mcp로 명동 근처 매장 찾아줘
65
+ 이마트24 mcp로 강남 근처 매장과 두바이 재고 알려줘
66
+ 롯데마트 mcp로 잠실 근처 매장 찾아줘
67
+ 롯데마트 mcp로 강변점에서 콜라 재고 알려줘
68
+ GS25 mcp로 강남 근처 매장과 오감자 재고 알려줘
69
+ 세븐일레븐 mcp로 삼각김밥 검색해줘
70
+ 세븐일레븐 mcp로 안산 중앙역 근처 매장 찾아줘
71
+ 세븐일레븐 mcp로 안산 중앙역 근처 세븐일레븐에서 핫식스 재고 알려줘
72
+ 세븐일레븐 mcp로 인기 검색어와 카탈로그 요약 알려줘
74
73
  메가박스 mcp로 강남점 영화와 잔여 좌석 알려줘
74
+ 롯데시네마 mcp로 월드타워 근처 지점과 상영 영화 알려줘
75
+ 롯데시네마 mcp로 월드타워 잔여 좌석 알려줘
75
76
  CGV mcp로 강남 상영 영화와 시간표 알려줘
76
77
  ```
77
78
 
@@ -94,8 +95,15 @@ CGV mcp로 강남 상영 영화와 시간표 알려줘
94
95
  다이소 mcp를 사용해서 강남역 근처 매장 찾아줘
95
96
  올리브영 mcp를 사용해서 명동 근처 매장 찾아줘
96
97
  올리브영 mcp를 사용해서 선크림 재고 확인해줘
98
+ 이마트24 mcp를 사용해서 강남 매장 찾고 두바이 재고 확인해줘
99
+ 롯데마트 mcp를 사용해서 잠실 근처 매장 찾아줘
100
+ 롯데마트 mcp를 사용해서 강변점에서 콜라 검색해줘
101
+ GS25 mcp를 사용해서 강남 매장 찾고 오감자 재고 확인해줘
102
+ 세븐일레븐 mcp를 사용해서 안산 중앙역 근처 매장 찾고 핫식스 재고 확인해줘
97
103
  메가박스 mcp를 사용해서 강남역 근처 지점 찾아줘
98
104
  메가박스 mcp를 사용해서 강남점 영화 목록이랑 잔여 좌석 확인해줘
105
+ 롯데시네마 mcp를 사용해서 잠실 근처 지점 찾아줘
106
+ 롯데시네마 mcp를 사용해서 월드타워 영화 목록이랑 잔여 좌석 확인해줘
99
107
  CGV mcp를 사용해서 서울 지역 극장 목록 찾아줘
100
108
  CGV mcp를 사용해서 강남 CGV 영화랑 시간표 확인해줘
101
109
  ```
@@ -109,7 +117,7 @@ CGV mcp를 사용해서 강남 CGV 영화랑 시간표 확인해줘
109
117
  > Claude Code CLI에서 MCP 서버 추가
110
118
 
111
119
  ```bash
112
- claude mcp add daiso-mcp https://mcp.aka.page --transport sse
120
+ claude mcp add daiso-mcp https://mcp.aka.page --transport http
113
121
  ```
114
122
 
115
123
  <br>
@@ -138,460 +146,176 @@ AI: (페이지를 읽고 API 사용법 이해)
138
146
  사용자: 수납박스 검색해줘
139
147
  AI: (https://mcp.aka.page/api/daiso/products?q=수납박스 호출 후 결과 제공)
140
148
 
141
- 사용자: 강남역 근처 메가박스 지점 찾아줘
142
- AI: (https://mcp.aka.page/api/megabox/theaters?lat=37.4982&lng=127.0264 호출 후 결과 제공)
149
+ 사용자: 안산 중앙역 근처 메가박스 지점 찾아줘
150
+ AI: (https://mcp.aka.page/api/megabox/theaters?keyword=안산%20중앙역 호출 후 결과 제공)
151
+
152
+ 사용자: 잠실 근처 롯데시네마 지점 찾아줘
153
+ AI: (https://mcp.aka.page/api/lottecinema/theaters?keyword=%EC%9E%A0%EC%8B%A4 호출 후 결과 제공)
143
154
 
144
155
  사용자: 강남 CGV 시간표 알려줘
145
156
  AI: (https://mcp.aka.page/api/cgv/timetable?playDate=20260304&theaterCode=0056 호출 후 결과 제공)
146
- ```
147
-
148
- <br>
149
-
150
- ### 미지원 서비스
151
-
152
- | 서비스 | 상태 |
153
- | :---------------------------------------------------------------------------------------------------- | :-------- |
154
- | ![Gemini](https://img.shields.io/badge/Gemini-8E75B2?logo=googlegemini&logoColor=white) Google Gemini | ❌ 미지원 |
155
- | ![Copilot](https://img.shields.io/badge/Copilot-000000?logo=github&logoColor=white) GitHub Copilot | ❌ 미지원 |
156
-
157
- <br>
158
-
159
- ---
160
-
161
- <br>
162
-
163
- ## 기능
164
-
165
- ### daiso_search_products
166
-
167
- 다이소 제품을 검색합니다.
168
-
169
- | 파라미터 | 필수 | 설명 |
170
- | :--------- | :--: | :---------------------------- |
171
- | `query` | O | 검색할 제품명 또는 키워드 |
172
- | `page` | | 페이지 번호 (기본값: 1) |
173
- | `pageSize` | | 페이지당 결과 수 (기본값: 30) |
174
-
175
- <br>
176
-
177
- ### daiso_find_stores
178
-
179
- 다이소 매장을 검색합니다.
180
-
181
- | 파라미터 | 필수 | 설명 |
182
- | :-------- | :--: | :------------------------ |
183
- | `keyword` | | 매장명 또는 주소 키워드 |
184
- | `sido` | | 시/도 (예: 서울, 경기) |
185
- | `gugun` | | 구/군 (예: 강남구) |
186
- | `dong` | | 동 (예: 역삼동) |
187
- | `limit` | | 최대 매장 수 (기본값: 50) |
188
-
189
- <br>
190
-
191
- ### daiso_check_inventory
192
-
193
- 특정 제품의 매장별 재고를 확인합니다.
194
-
195
- | 파라미터 | 필수 | 설명 |
196
- | :----------- | :--: | :---------------------------- |
197
- | `productId` | O | 제품 ID |
198
- | `storeQuery` | | 매장 검색어 (예: 안산 중앙역) |
199
- | `latitude` | | 위도 (기본값: 서울 시청) |
200
- | `longitude` | | 경도 (기본값: 서울 시청) |
201
- | `page` | | 페이지 번호 (기본값: 1) |
202
- | `pageSize` | | 페이지당 결과 수 (기본값: 30) |
203
-
204
- <br>
205
-
206
- ### daiso_get_price_info
207
-
208
- 제품의 가격 정보를 조회합니다.
209
-
210
- | 파라미터 | 필수 | 설명 |
211
- | :------------ | :--: | :---------------------------------- |
212
- | `productId` | | 제품 ID |
213
- | `productName` | | 제품명 (productId가 없을 경우 사용) |
214
-
215
- <br>
216
-
217
- ### oliveyoung_find_nearby_stores
218
-
219
- Zyte API 기반으로 내 주변 올리브영 매장을 조회합니다.
220
-
221
- | 파라미터 | 필수 | 설명 |
222
- | :---------- | :--: | :---------------------------------- |
223
- | `latitude` | | 위도 (기본값: 서울 시청) |
224
- | `longitude` | | 경도 (기본값: 서울 시청) |
225
- | `keyword` | | 매장명/지역 키워드 (예: 명동, 강남) |
226
- | `pageIdx` | | 페이지 번호 (기본값: 1) |
227
- | `limit` | | 최대 결과 수 (기본값: 20) |
228
-
229
- <br>
230
-
231
- ### oliveyoung_check_inventory
232
-
233
- Zyte API 기반으로 올리브영 상품 재고를 조회하고 주변 매장 정보를 함께 반환합니다.
234
-
235
- | 파라미터 | 필수 | 설명 |
236
- | :--------------- | :--: | :----------------------------- |
237
- | `keyword` | O | 재고를 확인할 상품 키워드 |
238
- | `latitude` | | 위도 (기본값: 서울 시청) |
239
- | `longitude` | | 경도 (기본값: 서울 시청) |
240
- | `storeKeyword` | | 주변 매장 검색 키워드 |
241
- | `page` | | 페이지 번호 (기본값: 1) |
242
- | `size` | | 페이지당 상품 수 (기본값: 20) |
243
- | `includeSoldOut` | | 품절 포함 여부 (기본값: false) |
244
-
245
- <br>
246
-
247
- ### megabox_find_nearby_theaters
248
-
249
- 사용자 좌표 기준으로 메가박스 주변 지점을 거리순으로 조회합니다.
250
-
251
- | 파라미터 | 필수 | 설명 |
252
- | :---------- | :--: | :--------------------------------- |
253
- | `latitude` | | 위도 (기본값: 서울 시청) |
254
- | `longitude` | | 경도 (기본값: 서울 시청) |
255
- | `playDate` | | 조회 날짜 (YYYYMMDD, 기본값: 오늘) |
256
- | `areaCode` | | 지역 코드 (기본값: 11, 서울) |
257
- | `limit` | | 최대 결과 수 (기본값: 10) |
258
-
259
- <br>
260
-
261
- ### megabox_list_now_showing
262
-
263
- 날짜/지점 조건으로 메가박스 영화 및 상영 회차 목록을 조회합니다.
264
-
265
- | 파라미터 | 필수 | 설명 |
266
- | :---------- | :--: | :--------------------------------- |
267
- | `playDate` | | 조회 날짜 (YYYYMMDD, 기본값: 오늘) |
268
- | `theaterId` | | 지점 ID (예: 1372) |
269
- | `movieId` | | 영화 ID (예: 25104500) |
270
- | `areaCode` | | 지역 코드 (기본값: 11, 서울) |
271
-
272
- <br>
273
-
274
- ### megabox_get_remaining_seats
275
-
276
- 영화/지점/날짜 조건으로 회차별 남은 좌석 수를 조회합니다.
277
-
278
- | 파라미터 | 필수 | 설명 |
279
- | :---------- | :--: | :--------------------------------- |
280
- | `playDate` | | 조회 날짜 (YYYYMMDD, 기본값: 오늘) |
281
- | `theaterId` | | 지점 ID |
282
- | `movieId` | | 영화 ID |
283
- | `areaCode` | | 지역 코드 (기본값: 11, 서울) |
284
- | `limit` | | 최대 결과 수 (기본값: 50) |
285
-
286
- <br>
287
-
288
- ### cgv_find_theaters
289
-
290
- 지역 코드 기준으로 CGV 극장 목록을 조회합니다.
291
-
292
- | 파라미터 | 필수 | 설명 |
293
- | :----------- | :--: | :--------------------------------- |
294
- | `playDate` | | 조회 날짜 (YYYYMMDD, 기본값: 오늘) |
295
- | `regionCode` | | 지역 코드 (예: 01 서울) |
296
- | `limit` | | 최대 결과 수 (기본값: 30) |
297
- | `timeoutMs` | | 요청 제한 시간(ms, 기본값: 15000) |
298
-
299
- <br>
300
-
301
- ### cgv_search_movies
302
-
303
- 날짜/극장 조건으로 CGV 영화 목록을 조회합니다.
304
-
305
- | 파라미터 | 필수 | 설명 |
306
- | :------------ | :--: | :--------------------------------- |
307
- | `playDate` | | 조회 날짜 (YYYYMMDD, 기본값: 오늘) |
308
- | `theaterCode` | | CGV 극장 코드 (예: 0056) |
309
- | `timeoutMs` | | 요청 제한 시간(ms, 기본값: 15000) |
310
-
311
- <br>
312
-
313
- ### cgv_get_timetable
314
-
315
- 날짜/극장/영화 조건으로 CGV 상영 시간표를 조회합니다.
316
-
317
- | 파라미터 | 필수 | 설명 |
318
- | :------------ | :--: | :--------------------------------- |
319
- | `playDate` | | 조회 날짜 (YYYYMMDD, 기본값: 오늘) |
320
- | `theaterCode` | | CGV 극장 코드 (예: 0056) |
321
- | `movieCode` | | CGV 영화 코드 |
322
- | `limit` | | 최대 결과 수 (기본값: 50) |
323
- | `timeoutMs` | | 요청 제한 시간(ms, 기본값: 15000) |
324
-
325
- <br>
326
-
327
- ### 올리브영 REST 캐싱 정책
328
-
329
- Cloudflare Edge Cache API(`caches.default`)를 사용해 올리브영 REST 응답을 캐싱합니다.
330
-
331
- - `GET /api/oliveyoung/stores`: 24시간 TTL
332
- - `GET /api/oliveyoung/inventory`: 10분 TTL
333
- - 공통: `stale-while-revalidate` 적용, 오류 응답(4xx/5xx)은 캐시하지 않음
334
157
 
335
- <br>
336
-
337
- ### 메가박스 REST 캐싱 정책
338
-
339
- Cloudflare Edge Cache API(`caches.default`)를 사용해 메가박스 REST 응답을 캐싱합니다.
340
-
341
- - `GET /api/megabox/theaters`: 24시간 TTL
342
- - `GET /api/megabox/movies`: 10분 TTL
343
- - `GET /api/megabox/seats`: 3분 TTL
344
- - 공통: `stale-while-revalidate` 적용, 오류 응답(4xx/5xx)은 캐시하지 않음
345
-
346
- <br>
347
-
348
- ### CGV REST 캐싱 정책
349
-
350
- Cloudflare Edge Cache API(`caches.default`)를 사용해 CGV REST 응답을 캐싱합니다.
351
-
352
- - `GET /api/cgv/theaters`: 24시간 TTL
353
- - `GET /api/cgv/movies`: 10분 TTL
354
- - `GET /api/cgv/timetable`: 3분 TTL
355
- - 공통: `stale-while-revalidate` 적용, 오류 응답(4xx/5xx)은 캐시하지 않음
356
-
357
- <br>
358
-
359
- ### 다이소 REST 캐싱 정책
360
-
361
- Cloudflare Edge Cache API(`caches.default`)를 사용해 다이소 REST 응답을 캐싱합니다.
362
-
363
- - `GET /api/daiso/products`: 30분 TTL
364
- - `GET /api/daiso/products/:id`: 1시간 TTL
365
- - `GET /api/daiso/stores`: 24시간 TTL
366
- - `GET /api/daiso/inventory`: 10분 TTL
367
- - 공통: `stale-while-revalidate` 적용, 오류 응답(4xx/5xx)은 캐시하지 않음
368
-
369
- <br>
370
-
371
- ---
158
+ 사용자: 안산 중앙역 근처 CGV 찾아서 오늘 영화랑 시간표 알려줘
159
+ AI: (https://mcp.aka.page/api/cgv/theaters?playDate=20260315&keyword=안산%20중앙역 호출 후 결과 제공)
160
+ AI: (https://mcp.aka.page/api/cgv/movies?playDate=20260315&keyword=안산%20중앙역 호출 후 결과 제공)
161
+ AI: (https://mcp.aka.page/api/cgv/timetable?playDate=20260315&keyword=안산%20중앙역 호출 후 결과 제공)
162
+ ```
372
163
 
373
164
  <br>
374
165
 
375
- ## REST API
376
-
377
- MCP를 지원하지 않는 서비스를 위한 GET 기반 REST API입니다.
378
-
379
- ### 엔드포인트
166
+ ### MCP 서버 URL / CLI (고급)
380
167
 
381
- | 엔드포인트 | 설명 |
382
- | :------------------------------ | :---------------------------------- |
383
- | `GET /prompt` | API 사용법 설명 페이지 (에이전트용) |
384
- | `GET /api/daiso/products` | 제품 검색 |
385
- | `GET /api/daiso/products/:id` | 제품 상세 정보 |
386
- | `GET /api/daiso/stores` | 매장 검색 |
387
- | `GET /api/daiso/inventory` | 재고 확인 |
388
- | `GET /api/oliveyoung/stores` | 올리브영 매장 검색 |
389
- | `GET /api/oliveyoung/inventory` | 올리브영 재고 확인 |
390
- | `GET /api/megabox/theaters` | 메가박스 주변 지점 조회 |
391
- | `GET /api/megabox/movies` | 메가박스 영화/회차 목록 조회 |
392
- | `GET /api/megabox/seats` | 메가박스 잔여 좌석 조회 |
393
- | `GET /api/cgv/theaters` | CGV 극장 목록 조회 |
394
- | `GET /api/cgv/movies` | CGV 영화 목록 조회 |
395
- | `GET /api/cgv/timetable` | CGV 상영 시간표 조회 |
168
+ AI 앱 대신 직접 연결하거나 스크립트에서 사용할 때만 참고하세요.
396
169
 
397
- ### 제품 검색
170
+ MCP 서버 URL:
398
171
 
399
172
  ```
400
- GET /api/daiso/products?q={검색어}&page={페이지}&pageSize={개수}
173
+ https://mcp.aka.page
401
174
  ```
402
175
 
403
- | 파라미터 | 필수 | 설명 |
404
- | :--------- | :--: | :---------------------------- |
405
- | `q` | O | 검색 키워드 |
406
- | `page` | | 페이지 번호 (기본값: 1) |
407
- | `pageSize` | | 페이지당 결과 수 (기본값: 30) |
176
+ CLI (npx):
408
177
 
409
- ### 매장 검색
178
+ ```bash
179
+ # 인터랙티브 모드 (추천)
180
+ npx daiso
410
181
 
411
- ```
412
- GET /api/daiso/stores?keyword={키워드}&sido={시도}&limit={개수}
413
- ```
182
+ # 인터랙티브 비활성화 (CI/스크립트)
183
+ npx daiso --non-interactive
414
184
 
415
- | 파라미터 | 필수 | 설명 |
416
- | :-------- | :--: | :-------------------------------------------------- |
417
- | `keyword` | △ | 매장명/주소 키워드 (keyword 또는 sido 중 하나 필수) |
418
- | `sido` | △ | 시/도 |
419
- | `gugun` | | 구/군 |
420
- | `dong` | | 동 |
421
- | `limit` | | 최대 결과 수 (기본값: 50) |
185
+ # 명령형 모드
186
+ npx daiso help
187
+ npx daiso help products
188
+ npx daiso url
189
+ npx daiso health
190
+ npx daiso claude
422
191
 
423
- ### 재고 확인
192
+ # AI 없이 직접 조회
193
+ npx daiso products 수납박스
194
+ npx daiso product 1034604
195
+ npx daiso stores 강남역
196
+ npx daiso inventory 1034604 --keyword 강남역
197
+ npx daiso display-location 1034604 04515
198
+ npx daiso cu-stores 강남
199
+ npx daiso cu-inventory 과자 --storeKeyword 강남
200
+ npx daiso lottemart-stores 잠실 --area 서울 --limit 10
201
+ npx daiso lottemart-products 콜라 --storeName 강변점 --area 서울
202
+ npx daiso emart24-stores 강남 --service24h true
203
+ npx daiso emart24-products 두바이 --pageSize 20
204
+ npx daiso emart24-inventory 8800244010504 --bizNoArr 28339,05015
205
+ npx daiso gs25-stores 강남 --limit 10
206
+ npx daiso gs25-products 오감자 --limit 20
207
+ npx daiso gs25-inventory 오감자 --storeKeyword 강남 --storeLimit 10
208
+ npx daiso seveneleven-products 삼각김밥 --size 20
209
+ npx daiso seveneleven-stores 안산 중앙역 --limit 10
210
+ npx daiso get /api/seveneleven/inventory --keyword 핫식스 --storeKeyword 안산%20중앙역 --storeLimit 10
211
+ npx daiso seveneleven-popwords --label home
212
+ npx daiso seveneleven-catalog --includeIssues true --includeExhibition true --limit 10
213
+ npx daiso get /api/cgv/movies --playDate 20260307 --theaterCode 0056
424
214
 
425
- ```
426
- GET /api/daiso/inventory?productId={제품ID}&lat={위도}&lng={경도}
215
+ # 원본 JSON 필요 시
216
+ npx daiso products 수납박스 --json
427
217
  ```
428
218
 
429
- | 파라미터 | 필수 | 설명 |
430
- | :---------- | :--: | :---------------------------- |
431
- | `productId` | O | 제품 ID |
432
- | `lat` | | 위도 (기본값: 37.5665) |
433
- | `lng` | | 경도 (기본값: 126.978) |
434
- | `keyword` | | 매장 검색어 |
435
- | `page` | | 페이지 번호 (기본값: 1) |
436
- | `pageSize` | | 페이지당 결과 수 (기본값: 30) |
219
+ ### OpenAPI 스펙
437
220
 
438
- ### 올리브영 매장 검색
221
+ - OpenAI 챗봇 등록용 축약 스펙: `https://mcp.aka.page/openapi.json`
222
+ - OpenAI 챗봇 등록용 YAML: `https://mcp.aka.page/openapi.yaml`
223
+ - 전체 개별 엔드포인트 스펙(JSON): `https://mcp.aka.page/openapi-full.json`
224
+ - 전체 개별 엔드포인트 스펙(YAML): `https://mcp.aka.page/openapi-full.yaml`
439
225
 
440
- ```
441
- GET /api/oliveyoung/stores?keyword={키워드}&lat={위도}&lng={경도}
442
- ```
226
+ ### 운영 헬스 체크
443
227
 
444
- | 파라미터 | 필수 | 설명 |
445
- | :-------- | :--: | :---------------------------------- |
446
- | `keyword` | | 매장명/지역 키워드 (예: 명동, 강남) |
447
- | `lat` | | 위도 (기본값: 37.5665) |
448
- | `lng` | | 경도 (기본값: 126.978) |
449
- | `pageIdx` | | 페이지 번호 (기본값: 1) |
450
- | `limit` | | 최대 결과 수 (기본값: 20) |
228
+ 공개 상태 페이지: **[Daiso MCP Status](https://aka-page.betteruptime.com/)**
451
229
 
452
- ### 올리브영 재고 확인
230
+ 서비스별 API 상태를 즉시 확인할 때는 `GET /api/health/checks`를 사용합니다. 이 엔드포인트는 `HEALTH_CHECK_SECRET` 환경 변수가 설정되어 있어야 하며, 요청에는 `Authorization: Bearer <secret>` 또는 `x-health-check-key: <secret>` 헤더가 필요합니다. 내부 체크 요청의 기준 URL은 `HEALTH_CHECK_BASE_URL`로 지정할 수 있습니다.
453
231
 
232
+ ```bash
233
+ curl -H "Authorization: Bearer $HEALTH_CHECK_SECRET" \
234
+ "https://mcp.aka.page/api/health/checks?check=lottemart.products&fresh=true&includeSamples=true"
454
235
  ```
455
- GET /api/oliveyoung/inventory?keyword={검색어}&lat={위도}&lng={경도}
456
- ```
457
-
458
- | 파라미터 | 필수 | 설명 |
459
- | :--------------- | :--: | :----------------------------- |
460
- | `keyword` | O | 검색 키워드 (예: 선크림, 립밤) |
461
- | `lat` | | 위도 (기본값: 37.5665) |
462
- | `lng` | | 경도 (기본값: 126.978) |
463
- | `storeKeyword` | | 주변 매장 필터 키워드 |
464
- | `page` | | 페이지 번호 (기본값: 1) |
465
- | `size` | | 페이지당 결과 수 (기본값: 20) |
466
- | `sort` | | 정렬 코드 (기본값: 01) |
467
- | `includeSoldOut` | | 품절 포함 여부 (기본값: false) |
468
236
 
469
- ### 메가박스 주변 지점 조회
470
-
471
- ```
472
- GET /api/megabox/theaters?lat={위도}&lng={경도}&playDate={YYYYMMDD}&areaCode={지역코드}
473
- ```
237
+ 주요 쿼리:
474
238
 
475
- | 파라미터 | 필수 | 설명 |
476
- | :--------- | :--: | :--------------------------------- |
477
- | `lat` | | 위도 (기본값: 37.5665) |
478
- | `lng` | | 경도 (기본값: 126.978) |
479
- | `playDate` | | 조회 날짜 (YYYYMMDD, 기본값: 오늘) |
480
- | `areaCode` | | 지역 코드 (기본값: 11, 서울) |
481
- | `limit` | | 최대 결과 수 (기본값: 10) |
239
+ - `service=gs25`: 특정 서비스만 확인
240
+ - `check=lottemart.products`: 특정 체크만 확인
241
+ - `mode=quick|deep`: 체크 모드 선택
242
+ - `fresh=true`: 60초 캐시 우회
243
+ - `includeSamples=true`: 첫 결과 이름 샘플 포함
482
244
 
483
- ### 메가박스 영화/회차 목록 조회
245
+ 배포 전 로컬에서 CLI 모드까지 확인할 때는 아래 명령을 사용합니다.
484
246
 
485
- ```
486
- GET /api/megabox/movies?playDate={YYYYMMDD}&theaterId={지점ID}&movieId={영화ID}
247
+ ```bash
248
+ npm run cli:smoke
487
249
  ```
488
250
 
489
- | 파라미터 | 필수 | 설명 |
490
- | :---------- | :--: | :--------------------------------- |
491
- | `playDate` | | 조회 날짜 (YYYYMMDD, 기본값: 오늘) |
492
- | `theaterId` | | 지점 ID (예: 1372) |
493
- | `movieId` | | 영화 ID (예: 25104500) |
494
- | `areaCode` | | 지역 코드 (기본값: 11, 서울) |
251
+ 기본 `openapi.json`은 OpenAI Actions import 제한에 맞추기 위해 `GET /api/actions/query` 단일 facade만 노출합니다.
252
+ 기존 서비스별 GET API는 유지되며, 자세한 배경은 [OpenAPI Actions Facade 문서](./docs/openapi-actions-facade.md)에 정리했습니다.
495
253
 
496
- ### 메가박스 잔여 좌석 조회
254
+ 인터랙티브 예시:
497
255
 
498
- ```
499
- GET /api/megabox/seats?playDate={YYYYMMDD}&theaterId={지점ID}&movieId={영화ID}
500
- ```
256
+ ```text
257
+ $ npx daiso
258
+ daiso 인터랙티브 모드
501
259
 
502
- | 파라미터 | 필수 | 설명 |
503
- | :---------- | :--: | :--------------------------------- |
504
- | `playDate` | | 조회 날짜 (YYYYMMDD, 기본값: 오늘) |
505
- | `theaterId` | | 지점 ID |
506
- | `movieId` | | 영화 ID |
507
- | `areaCode` | | 지역 코드 (기본값: 11, 서울) |
508
- | `limit` | | 최대 결과 수 (기본값: 50) |
260
+ [서비스 선택]
261
+ 1. 다이소
262
+ 2. 올리브영
263
+ 3. CU
264
+ 서비스 번호를 선택하세요 (0: 종료): 1
509
265
 
510
- ### CGV 극장 목록 조회
266
+ 매장 검색 키워드를 입력하세요: 강남
511
267
 
512
- ```
513
- GET /api/cgv/theaters?playDate={YYYYMMDD}&regionCode={지역코드}
514
- ```
268
+ [매장 선택]
269
+ 1. 다이소 강남점 | 서울 강남구 ...
270
+ 2. 다이소 강남역점 | 서울 강남구 ...
271
+ 입력: 번호 선택 | /키워드 필터 | all 전체보기 | 0 다시 검색
272
+ 선택: /역점
273
+ 선택: 1
515
274
 
516
- | 파라미터 | 필수 | 설명 |
517
- | :----------- | :--: | :--------------------------------- |
518
- | `playDate` | | 조회 날짜 (YYYYMMDD, 기본값: 오늘) |
519
- | `regionCode` | | 지역 코드 (예: 01 서울) |
520
- | `limit` | | 최대 결과 수 (기본값: 30) |
521
- | `timeoutMs` | | 요청 제한 시간(ms, 기본값: 15000) |
275
+ [선택한 매장 정보]
276
+ - 매장명: 다이소 강남역점
277
+ - 주소: 서울 강남구 ...
278
+ - 전화: 02-...
522
279
 
523
- ### CGV 영화 목록 조회
280
+ 찾을 상품 키워드를 입력하세요: 수납박스
524
281
 
525
- ```
526
- GET /api/cgv/movies?playDate={YYYYMMDD}&theaterCode={극장코드}
527
- ```
528
-
529
- | 파라미터 | 필수 | 설명 |
530
- | :------------ | :--: | :--------------------------------- |
531
- | `playDate` | | 조회 날짜 (YYYYMMDD, 기본값: 오늘) |
532
- | `theaterCode` | | CGV 극장 코드 (예: 0056) |
533
- | `timeoutMs` | | 요청 제한 시간(ms, 기본값: 15000) |
282
+ [상품 선택]
283
+ 1. 손잡이 수납박스 (2000원, ID: 1034604)
284
+ 2. 접이식 수납박스 (3000원, ID: 1034605)
285
+ 입력: 번호 선택 | /키워드 필터 | all 전체보기 | 0 취소
286
+ 선택: 1
534
287
 
535
- ### CGV 시간표 조회
288
+ [재고 결과]
289
+ - 상품: 손잡이 수납박스
290
+ - 매장: 다이소 강남역점
291
+ - 재고 수량: 7
536
292
 
293
+ [다음 동작]
294
+ 1. 같은 매장에서 다른 상품 찾기
295
+ 2. 다른 매장/서비스 다시 선택하기
296
+ 3. 종료하기
297
+ 번호를 선택하세요: 3
298
+ 인터랙티브 모드를 종료합니다.
537
299
  ```
538
- GET /api/cgv/timetable?playDate={YYYYMMDD}&theaterCode={극장코드}&movieCode={영화코드}
539
- ```
540
-
541
- | 파라미터 | 필수 | 설명 |
542
- | :------------ | :--: | :--------------------------------- |
543
- | `playDate` | | 조회 날짜 (YYYYMMDD, 기본값: 오늘) |
544
- | `theaterCode` | | CGV 극장 코드 (예: 0056) |
545
- | `movieCode` | | CGV 영화 코드 |
546
- | `limit` | | 최대 결과 수 (기본값: 50) |
547
- | `timeoutMs` | | 요청 제한 시간(ms, 기본값: 15000) |
548
-
549
- ### 응답 형식
550
-
551
- ```json
552
- {
553
- "success": true,
554
- "data": { ... },
555
- "meta": { "total": 100, "page": 1, "pageSize": 30 }
556
- }
557
- ```
558
-
559
- <br>
560
-
561
- ---
562
300
 
563
301
  <br>
564
302
 
565
- ## 사용 예시
566
-
567
- ```
568
- 사용자: 수납박스 검색해줘
569
- AI: daiso_search_products 도구로 제품 목록 조회
570
-
571
- 사용자: 이 제품 안산 중앙역 근처 매장에 재고 있어?
572
- AI: daiso_check_inventory 도구로 특정 매장 재고 확인
573
-
574
- 사용자: 강남역 근처 다이소 매장 찾아줘
575
- AI: daiso_find_stores 도구로 매장 검색
576
-
577
- 사용자: 명동 근처 올리브영 매장 찾아줘
578
- AI: oliveyoung_find_nearby_stores 도구로 주변 매장 검색
303
+ ### 미지원 서비스
579
304
 
580
- 사용자: 올리브영 선크림 재고 확인해줘
581
- AI: oliveyoung_check_inventory 도구로 재고/매장 정보 조회
305
+ | 서비스 | 상태 |
306
+ | :---------------------------------------------------------------------------------------------------- | :-------- |
307
+ | ![Gemini](https://img.shields.io/badge/Gemini-8E75B2?logo=googlegemini&logoColor=white) Google Gemini | ❌ 미지원 |
308
+ | ![Copilot](https://img.shields.io/badge/Copilot-000000?logo=github&logoColor=white) GitHub Copilot | ❌ 미지원 |
582
309
 
583
- 사용자: 강남역 근처 메가박스 지점 찾아줘
584
- AI: megabox_find_nearby_theaters 도구로 주변 지점 조회
310
+ <br>
585
311
 
586
- 사용자: 메가박스 강남점 영화 목록과 잔여 좌석 알려줘
587
- AI: megabox_list_now_showing / megabox_get_remaining_seats 도구로 회차/좌석 조회
312
+ ## Special Thanks
588
313
 
589
- 사용자: 서울 지역 CGV 극장 목록 알려줘
590
- AI: cgv_find_theaters 도구로 CGV 극장 목록 조회
314
+ 이 프로젝트에 도움 주신 분들께 감사드립니다.
591
315
 
592
- 사용자: CGV 강남 상영 영화랑 시간표 알려줘
593
- AI: cgv_search_movies / cgv_get_timetable 도구로 영화/시간표 조회
594
- ```
316
+ - [@thecats1105](https://github.com/thecats1105): 다이소 진열 위치 조회 도구(`daiso_get_display_location`) 구현 및 API/테스트 연동
317
+ - [@betterthanhajin](https://github.com/betterthanhajin): CGV 서비스 프로바이더 구현(극장/영화/시간표 도구, 라우트·스펙·테스트 추가)
318
+ - [제로초님](https://youtube.com/shorts/ZgIqA1NCEp0?si=UW0pKsSpqmEi7lXG): 프로젝트 홍보 도움
595
319
 
596
320
  <br>
597
321
 
@@ -599,43 +323,12 @@ AI: cgv_search_movies / cgv_get_timetable 도구로 영화/시간표 조회
599
323
 
600
324
  <br>
601
325
 
602
- ## 개발
603
-
604
- ```bash
605
- # Node 버전 맞추기
606
- nvm use
607
-
608
- # 설치
609
- npm ci
326
+ ## 상세 문서
610
327
 
611
- # 환경 변수 설정
612
- cp .env.example .env
613
- # .env 파일에 ZYTE_API_KEY 값 입력
328
+ `Special Thanks` 이후에 있던 상세 설명은 별도 문서로 분리했습니다.
614
329
 
615
- # 품질 검사 (포맷/린트/타입/테스트)
616
- npm run check
617
-
618
- # 로컬 개발 서버
619
- npm run dev
620
-
621
- # 배포
622
- npm run deploy
623
- ```
624
-
625
- ## npm 퍼블리싱
626
-
627
- ```bash
628
- # npm 로그인
629
- npm login
630
-
631
- # 배포 산출물/메타 검증
632
- npm run release:dry-run
633
-
634
- # 퍼블리시 (공개 패키지)
635
- npm run publish:public
636
- ```
637
-
638
- 기여 가이드는 [CONTRIBUTING.md](./CONTRIBUTING.md)에서 확인할 수 있습니다.
330
+ - [서비스 레퍼런스](./docs/service-reference.md)
331
+ - [CONTRIBUTING 가이드](./CONTRIBUTING.md)
639
332
 
640
333
  <br>
641
334
 
@@ -643,99 +336,66 @@ npm run publish:public
643
336
 
644
337
  <br>
645
338
 
646
- ## 아키텍처
339
+ ## docs 문서
647
340
 
648
- | 항목 | 기술 |
649
- | :--------- | :--------------------------- |
650
- | 런타임 | Cloudflare Workers |
651
- | 프레임워크 | Hono + TypeScript |
652
- | 프로토콜 | MCP (Model Context Protocol) |
653
- | 전송 | SSE (Server-Sent Events) |
341
+ ### 공통 가이드
654
342
 
655
- <br>
343
+ - [서비스 레퍼런스](./docs/service-reference.md)
344
+ - [스크래핑 플레이북](./docs/scraping-playbook.md)
345
+ - [mitmproxy 가이드](./docs/mitmproxy-guide.md)
346
+ - [AI 지시문](./docs/ai-instruction.md)
656
347
 
657
- ---
348
+ ### 다이소
658
349
 
659
- <br>
350
+ - [다이소 네트워크 분석 결과](./docs/daiso-network-analysis-result.md)
351
+ - [다이소 Playwright 네트워크 분석](./docs/daiso-playwright-network-analysis.md)
352
+ - [다이소 리플레이 세션 테스트 HTML](./docs/daiso-replay-session-test.html)
353
+ - [다이소 테스트 리플레이 스크립트](./docs/daiso-test-replay.ts)
660
354
 
661
- ## 프로젝트 구조
355
+ ### CU
662
356
 
663
- ```
664
- daiso-mcp/
665
- ├── src/
666
- │ ├── index.ts # MCP 서버 진입점
667
- │ ├── core/ # 핵심 모듈
668
- │ │ ├── types.ts # 공통 타입
669
- │ │ ├── interfaces.ts # ServiceProvider 인터페이스
670
- │ │ └── registry.ts # ServiceRegistry
671
- │ ├── services/ # 서비스 프로바이더
672
- │ │ ├── daiso/ # 다이소 서비스
673
- │ │ ├── oliveyoung/ # 올리브영 서비스 (Zyte API)
674
- │ │ ├── megabox/ # 메가박스 서비스
675
- │ │ └── cgv/ # CGV 서비스
676
- │ ├── api/ # REST API (MCP 미지원 서비스용)
677
- │ │ ├── handlers.ts # 다이소/올리브영 API 핸들러
678
- │ │ ├── megaboxHandlers.ts # 메가박스 API 핸들러
679
- │ │ ├── cgvHandlers.ts # CGV API 핸들러
680
- │ │ └── routes/ # 서비스별 API 라우트
681
- │ ├── pages/ # 정적 페이지
682
- │ │ └── prompt.ts # 에이전트용 프롬프트 페이지
683
- │ └── utils/ # 유틸리티
684
- ├── wrangler.toml # Cloudflare Workers 설정
685
- └── package.json
686
- ```
357
+ - [CU 네트워크 분석 결과](./docs/cu-network-analysis-result.md)
358
+ - [CU 앱 요청 캡처 가이드](./docs/cu-app-request-capture-guide.md)
359
+ - [CU 앱 스크래핑 리플레이 가이드](./docs/cu-app-scraping-replay-guide.md)
687
360
 
688
- <br>
361
+ ### 이마트24
689
362
 
690
- ---
363
+ - [이마트24 네트워크 분석 결과](./docs/emart24-network-analysis-result.md)
364
+ - [이마트24 앱 스크래핑 준비 가이드](./docs/emart24-app-scraping-preparation-guide.md)
365
+ - [이마트24 앱 스크래핑 리플레이 가이드](./docs/emart24-app-scraping-replay-guide.md)
691
366
 
692
- <br>
693
-
694
- ## 확장 가능한 아키텍처
367
+ ### 롯데마트
695
368
 
696
- 이 프로젝트는 **플러그인 기반 아키텍처**로 설계되어 새로운 서비스를 쉽게 추가할 수 있습니다.
369
+ - [롯데마트 모바일 도와센터 스크래핑 리플레이 계획](./docs/lottemart-mobile-scraping-replay-plan.md)
697
370
 
698
- ### 핵심 컴포넌트
371
+ ### 공통
699
372
 
700
- | 컴포넌트 | 역할 |
701
- | :----------------- | :------------------------------------- |
702
- | `ServiceProvider` | 모든 서비스가 구현해야 하는 인터페이스 |
703
- | `ServiceRegistry` | 서비스 등록 및 MCP 서버 연결 관리 |
704
- | `ToolRegistration` | 도구 메타데이터와 핸들러 정의 |
373
+ - [OpenAPI Actions facade 리팩토링 배경](./docs/openapi-actions-facade.md)
705
374
 
706
- ### 새 서비스 추가 방법
375
+ ### 올리브영
707
376
 
708
- 예: CU 편의점 서비스 추가
377
+ - [올리브영 네트워크 분석 결과](./docs/oliveyoung-network-analysis-result.md)
378
+ - [올리브영 Playwright MCP 온보딩](./docs/oliveyoung-playwright-mcp-onboarding.md)
379
+ - [올리브영 Playwright 네트워크 분석](./docs/oliveyoung-playwright-network-analysis.md)
380
+ - [올리브영 Lightpanda 검증](./docs/oliveyoung-lightpanda-validation.md)
381
+ - [올리브영 리플레이 세션 테스트 스크립트](./docs/oliveyoung-replay-session-test.ts)
382
+ - [올리브영 Zyte 대역폭 테스트](./docs/oliveyoung-zyte-bandwidth-test.ts)
383
+ - [올리브영 Zyte 리플레이 테스트](./docs/oliveyoung-zyte-replay-test.ts)
709
384
 
710
- ```typescript
711
- // 1. src/services/cu/index.ts 생성
712
- import type { ServiceProvider } from '../../core/interfaces.js';
385
+ ### 영화관
713
386
 
714
- class CuService implements ServiceProvider {
715
- readonly metadata = {
716
- id: 'cu',
717
- name: 'CU 편의점',
718
- version: '1.0.0',
719
- };
387
+ - [CGV 네트워크 분석 결과](./docs/cgv-network-analysis-result.md)
388
+ - [메가박스 네트워크 분석 결과](./docs/megabox-network-analysis-result.md)
389
+ - [롯데시네마 네트워크 분석 결과](./docs/lottecinema-network-analysis-result.md)
720
390
 
721
- getTools() {
722
- return [
723
- /* cu_search_products, cu_find_stores 등 */
724
- ];
725
- }
726
- }
727
-
728
- export function createCuService(): ServiceProvider {
729
- return new CuService();
730
- }
731
- ```
391
+ ### GS25
732
392
 
733
- ```typescript
734
- // 2. src/index.ts에 한 줄 추가
735
- import { createCuService } from './services/cu/index.js';
736
-
737
- registry.registerAll([createDaisoService, createCuService]);
738
- ```
393
+ - [GS25 API 리플레이 방법론 (최종)](./docs/gs25-final-replay-methodology.md)
394
+ - [GS25 네트워크 분석 결과 (아카이브)](./docs/archive/gs25-network-analysis-result.md)
395
+ - [GS25 안드로이드 우회 캡처 가이드 (아카이브)](./docs/archive/gs25-android-bypass-capture-guide.md)
396
+ - [GS25 앱 캡처 시도 로그 (2026-03-08, 아카이브)](./docs/archive/gs25-app-capture-attempt-log-20260308.md)
397
+ - [GS25 앱 스크래핑 준비 가이드 (아카이브)](./docs/archive/gs25-app-scraping-preparation-guide.md)
398
+ - [GS25 세션 인계 문서 (2026-03-09, 아카이브)](./docs/archive/gs25-session-handoff-20260309.md)
739
399
 
740
400
  <br>
741
401
 
@@ -750,3 +410,21 @@ MIT License
750
410
  <br>
751
411
 
752
412
  </div>
413
+
414
+ ---
415
+
416
+ ## 신규 MCP 기능 추가 시 유의사항
417
+
418
+ 새로운 서비스나 도구를 추가할 때는 구현만 끝내지 말고 아래 반영 범위를 함께 확인해야 합니다.
419
+
420
+ - `MCP`: `src/index.ts` 서비스 등록, 루트 서비스/도구 목록, 관련 테스트 반영
421
+ - `HTTPS`: GET API 핸들러/라우트, 프롬프트 페이지(`src/pages/prompt.ts`), 앱 통합 테스트 반영
422
+ - `CLI`: `src/cli.ts`, `src/cliHelp.ts`, CLI 테스트 반영
423
+ - `AI instruction`: [ai-instruction.md](./docs/ai-instruction.md) 사용 규칙/워크플로우 반영
424
+ - `README`: 지원 서비스 설명, 예시, 문서 링크 반영
425
+ - `OpenAPI`: 기본 `/openapi.json` facade 스펙, `/openapi-full.json` 전체 스펙, 관련 테스트 반영
426
+
427
+ 기능 추가 후 최소 검증 기준:
428
+
429
+ - `npm run typecheck`
430
+ - `npm test`