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/dist/index.js CHANGED
@@ -13,16 +13,33 @@ import { createDaisoService } from './services/daiso/index.js';
13
13
  import { createOliveyoungService } from './services/oliveyoung/index.js';
14
14
  import { createMegaboxService } from './services/megabox/index.js';
15
15
  import { createCgvService } from './services/cgv/index.js';
16
+ import { createLotteCinemaService } from './services/lottecinema/index.js';
17
+ import { createLotteMartService } from './services/lottemart/index.js';
18
+ import { createCuService } from './services/cu/index.js';
19
+ import { createEmart24Service } from './services/emart24/index.js';
20
+ import { createGs25Service } from './services/gs25/index.js';
21
+ import { createSevenElevenService } from './services/seveneleven/index.js';
16
22
  import { createPromptResponse } from './pages/prompt.js';
17
- import { createOpenApiJsonResponse, createOpenApiYamlResponse } from './pages/openapi.js';
23
+ import { createFullOpenApiJsonResponse, createFullOpenApiYamlResponse, createOpenApiJsonResponse, createOpenApiYamlResponse, } from './pages/openapi.js';
18
24
  import { createPrivacyResponse } from './pages/privacy.js';
25
+ import { buildActionQueryTargetUrl } from './api/actionsProxy.js';
19
26
  import { registerDaisoRoutes } from './api/routes/daisoRoutes.js';
20
27
  import { registerOliveyoungRoutes } from './api/routes/oliveyoungRoutes.js';
21
28
  import { registerMegaboxRoutes } from './api/routes/megaboxRoutes.js';
22
29
  import { registerCgvRoutes } from './api/routes/cgvRoutes.js';
30
+ import { registerLotteCinemaRoutes } from './api/routes/lottecinemaRoutes.js';
31
+ import { registerLotteMartRoutes } from './api/routes/lottemartRoutes.js';
32
+ import { registerCuRoutes } from './api/routes/cuRoutes.js';
33
+ import { registerEmart24Routes } from './api/routes/emart24Routes.js';
34
+ import { registerGs25Routes } from './api/routes/gs25Routes.js';
35
+ import { registerSevenElevenRoutes } from './api/routes/sevenelevenRoutes.js';
36
+ import { registerHealthRoutes } from './api/routes/healthRoutes.js';
23
37
  // ์„œ๋ฒ„ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
24
38
  const SERVER_NAME = 'multi-service-mcp';
25
39
  const SERVER_VERSION = '1.0.0';
40
+ const SESSION_HEADER = 'mcp-session-id';
41
+ // ์„ธ์…˜๋ณ„ MCP ์ „์†ก ๊ณ„์ธต/์„œ๋ฒ„๋ฅผ ์œ ์ง€ํ•ด GET/POST/DELETE๋ฅผ ์ผ๊ด€ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
42
+ const mcpSessions = new Map();
26
43
  /**
27
44
  * ์š”์ฒญ ์ปจํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ƒ์„ฑ
28
45
  */
@@ -30,9 +47,21 @@ const createRegistry = (bindings) => {
30
47
  const registry = new ServiceRegistry();
31
48
  registry.registerAll([
32
49
  createDaisoService,
50
+ createGs25Service,
51
+ createSevenElevenService,
52
+ createCuService,
53
+ createEmart24Service,
54
+ () => createLotteMartService({
55
+ googleMapsApiKey: bindings?.GOOGLE_MAPS_API_KEY,
56
+ zyteApiKey: bindings?.ZYTE_API_KEY,
57
+ }),
33
58
  createMegaboxService,
59
+ () => createLotteCinemaService({
60
+ googleMapsApiKey: bindings?.GOOGLE_MAPS_API_KEY,
61
+ }),
34
62
  () => createCgvService({
35
63
  zyteApiKey: bindings?.ZYTE_API_KEY,
64
+ googleMapsApiKey: bindings?.GOOGLE_MAPS_API_KEY,
36
65
  }),
37
66
  () => createOliveyoungService({
38
67
  zyteApiKey: bindings?.ZYTE_API_KEY,
@@ -52,13 +81,88 @@ const createMcpServer = (bindings) => {
52
81
  registry.applyToServer(server);
53
82
  return server;
54
83
  };
84
+ /**
85
+ * initialize ์š”์ฒญ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
86
+ */
87
+ const isInitializeRequest = (body) => {
88
+ if (Array.isArray(body)) {
89
+ return body.some((item) => typeof item === 'object' && item !== null && item.method === 'initialize');
90
+ }
91
+ return typeof body === 'object' && body !== null && body.method === 'initialize';
92
+ };
93
+ /**
94
+ * ์ƒˆ ์„ธ์…˜ transport/server๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
95
+ */
96
+ const createSessionTransport = (bindings) => {
97
+ const server = createMcpServer(bindings);
98
+ const transport = new WebStandardStreamableHTTPServerTransport({
99
+ sessionIdGenerator: () => crypto.randomUUID(),
100
+ onsessioninitialized: (sessionId) => {
101
+ mcpSessions.set(sessionId, { server, transport });
102
+ },
103
+ onsessionclosed: (sessionId) => {
104
+ mcpSessions.delete(sessionId);
105
+ },
106
+ });
107
+ return { server, transport };
108
+ };
109
+ /**
110
+ * /mcp ์š”์ฒญ์„ ์„ธ์…˜ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
111
+ */
112
+ const handleMcpRequest = async (c) => {
113
+ const sessionId = c.req.header(SESSION_HEADER);
114
+ if (sessionId) {
115
+ const existing = mcpSessions.get(sessionId);
116
+ if (!existing) {
117
+ if (c.req.method === 'POST') {
118
+ const transport = new WebStandardStreamableHTTPServerTransport();
119
+ const server = createMcpServer(c.env);
120
+ await server.connect(transport);
121
+ const response = await transport.handleRequest(c.req.raw);
122
+ response.headers.set('x-mcp-session-fallback', 'stateless');
123
+ return response;
124
+ }
125
+ return c.json({
126
+ error: 'Session not found',
127
+ message: '์œ ํšจํ•˜์ง€ ์•Š์€ mcp-session-id ์ž…๋‹ˆ๋‹ค. initialize ์š”์ฒญ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์ฃผ์„ธ์š”.',
128
+ }, 404);
129
+ }
130
+ return existing.transport.handleRequest(c.req.raw);
131
+ }
132
+ if (c.req.method === 'POST') {
133
+ const parsedBody = await c.req.raw
134
+ .clone()
135
+ .json()
136
+ .catch(() => undefined);
137
+ if (!isInitializeRequest(parsedBody)) {
138
+ return c.json({
139
+ error: 'Bad Request',
140
+ message: '์„ธ์…˜์ด ์—†์Šต๋‹ˆ๋‹ค. ๋จผ์ € initialize ์š”์ฒญ์œผ๋กœ ์„ธ์…˜์„ ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”.',
141
+ }, 400);
142
+ }
143
+ const { server, transport } = createSessionTransport(c.env);
144
+ await server.connect(transport);
145
+ return transport.handleRequest(c.req.raw, { parsedBody });
146
+ }
147
+ return c.json({
148
+ error: 'Bad Request',
149
+ message: `์„ธ์…˜์ด ์—†์Šต๋‹ˆ๋‹ค. ๋จผ์ € POST /mcp initialize ์š”์ฒญ ํ›„ ${SESSION_HEADER} ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ์„ธ์š”.`,
150
+ }, 400);
151
+ };
55
152
  // Hono ์•ฑ ์ƒ์„ฑ
56
153
  const app = new Hono();
57
154
  // CORS ์„ค์ •
58
155
  app.use('*', cors({
59
156
  origin: '*',
60
157
  allowMethods: ['GET', 'POST', 'DELETE', 'OPTIONS'],
61
- allowHeaders: ['Content-Type', 'mcp-session-id', 'Last-Event-ID', 'mcp-protocol-version'],
158
+ allowHeaders: [
159
+ 'Content-Type',
160
+ 'Authorization',
161
+ 'x-health-check-key',
162
+ 'mcp-session-id',
163
+ 'Last-Event-ID',
164
+ 'mcp-protocol-version',
165
+ ],
62
166
  exposeHeaders: ['mcp-session-id', 'mcp-protocol-version'],
63
167
  }));
64
168
  // ๊ธฐ๋ณธ ์ •๋ณด ์—”๋“œํฌ์ธํŠธ (GET ์š”์ฒญ๋งŒ)
@@ -73,6 +177,10 @@ app.get('/', (c) => {
73
177
  endpoints: {
74
178
  mcp: '/ ๋˜๋Š” /mcp (POST) - MCP ํ”„๋กœํ† ์ฝœ ์—”๋“œํฌ์ธํŠธ',
75
179
  health: '/health (GET) - ํ—ฌ์Šค ์ฒดํฌ',
180
+ healthChecks: '/api/health/checks (GET) - ์„œ๋น„์Šค๋ณ„ ์ƒ์„ธ ํ—ฌ์Šค ์ฒดํฌ',
181
+ openapi: '/openapi.json (GET) - OpenAI Actions์šฉ ์ถ•์•ฝ OpenAPI',
182
+ openapiFull: '/openapi-full.json (GET) - ์ „์ฒด OpenAPI',
183
+ actionsQuery: '/api/actions/query (GET) - ๊ธฐ์กด GET API ํ†ตํ•ฉ facade',
76
184
  },
77
185
  services,
78
186
  tools: allTools,
@@ -89,6 +197,7 @@ app.on(['POST', 'DELETE', 'OPTIONS'], '/', async (c) => {
89
197
  });
90
198
  // ํ—ฌ์Šค ์ฒดํฌ ์—”๋“œํฌ์ธํŠธ
91
199
  app.get('/health', (c) => c.json({ status: 'ok' }));
200
+ registerHealthRoutes(app);
92
201
  // ํ”„๋กฌํ”„ํŠธ ํŽ˜์ด์ง€ (MCP ๋ฏธ์ง€์› ์—์ด์ „ํŠธ์šฉ)
93
202
  app.get('/prompt', (c) => {
94
203
  const baseUrl = new URL(c.req.url).origin;
@@ -103,6 +212,14 @@ app.get('/openapi.yaml', (c) => {
103
212
  const baseUrl = new URL(c.req.url).origin;
104
213
  return createOpenApiYamlResponse(baseUrl);
105
214
  });
215
+ app.get('/openapi-full.json', (c) => {
216
+ const baseUrl = new URL(c.req.url).origin;
217
+ return createFullOpenApiJsonResponse(baseUrl);
218
+ });
219
+ app.get('/openapi-full.yaml', (c) => {
220
+ const baseUrl = new URL(c.req.url).origin;
221
+ return createFullOpenApiYamlResponse(baseUrl);
222
+ });
106
223
  // ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ ํŽ˜์ด์ง€
107
224
  app.get('/privacy', (c) => {
108
225
  const baseUrl = new URL(c.req.url).origin;
@@ -110,14 +227,36 @@ app.get('/privacy', (c) => {
110
227
  });
111
228
  // GET API ์—”๋“œํฌ์ธํŠธ (MCP ๋ฏธ์ง€์› ์—์ด์ „ํŠธ์šฉ)
112
229
  registerDaisoRoutes(app);
230
+ registerGs25Routes(app);
231
+ registerSevenElevenRoutes(app);
232
+ registerCuRoutes(app);
233
+ registerEmart24Routes(app);
234
+ registerLotteMartRoutes(app);
113
235
  registerOliveyoungRoutes(app);
114
236
  registerMegaboxRoutes(app);
237
+ registerLotteCinemaRoutes(app);
115
238
  registerCgvRoutes(app);
116
- // MCP ์—”๋“œํฌ์ธํŠธ
117
- app.all('/mcp', async (c) => {
118
- const transport = new WebStandardStreamableHTTPServerTransport();
119
- const server = createMcpServer(c.env);
120
- await server.connect(transport);
121
- return transport.handleRequest(c.req.raw);
239
+ app.get('/api/actions/query', async (c) => {
240
+ try {
241
+ const targetUrl = buildActionQueryTargetUrl(c.req.url);
242
+ const headers = new Headers(c.req.raw.headers);
243
+ headers.delete('host');
244
+ return app.fetch(new Request(targetUrl.toString(), {
245
+ method: 'GET',
246
+ headers,
247
+ }), c.env);
248
+ }
249
+ catch (error) {
250
+ const message = error instanceof Error ? error.message : '์•Œ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.';
251
+ return c.json({
252
+ success: false,
253
+ error: {
254
+ code: 'INVALID_ACTION_QUERY',
255
+ message,
256
+ },
257
+ }, 400);
258
+ }
122
259
  });
260
+ // MCP ์—”๋“œํฌ์ธํŠธ
261
+ app.all('/mcp', handleMcpRequest);
123
262
  export default app;
@@ -2,5 +2,6 @@
2
2
  * OpenAPI ํŽ˜์ด์ง€ ์—”ํŠธ๋ฆฌ
3
3
  */
4
4
  export { generateOpenApiSpec } from './openapiSpec.js';
5
- export { createOpenApiJsonResponse, createOpenApiYamlResponse } from './openapiResponse.js';
5
+ export { generateFullOpenApiSpec } from './openapiFullSpec.js';
6
+ export { createOpenApiJsonResponse, createOpenApiYamlResponse, createFullOpenApiJsonResponse, createFullOpenApiYamlResponse, } from './openapiResponse.js';
6
7
  export { __testOnlyJsonToYaml } from './openapiYaml.js';
@@ -0,0 +1,58 @@
1
+ /**
2
+ * ์ „์ฒด OpenAPI ์ŠคํŽ™ ์กฐํ•ฉ ๋ชจ๋“ˆ
3
+ */
4
+ import { OPENAPI_PATHS_DAISO_OLIVEYOUNG } from './openapiSpecPathsDaisoOliveyoung.js';
5
+ import { OPENAPI_PATHS_CU } from './openapiSpecPathsCu.js';
6
+ import { OPENAPI_PATHS_EMART24 } from './openapiSpecPathsEmart24.js';
7
+ import { OPENAPI_PATHS_LOTTEMART } from './openapiSpecPathsLotteMart.js';
8
+ import { OPENAPI_PATHS_MEGABOX } from './openapiSpecPathsMegabox.js';
9
+ import { OPENAPI_PATHS_CGV } from './openapiSpecPathsCgv.js';
10
+ import { OPENAPI_PATHS_LOTTECINEMA } from './openapiSpecPathsLottecinema.js';
11
+ import { OPENAPI_PATHS_GS25 } from './openapiSpecPathsGs25.js';
12
+ import { OPENAPI_PATHS_SEVENELEVEN } from './openapiSpecPathsSeveneleven.js';
13
+ import { OPENAPI_COMPONENTS } from './openapiSpecComponents.js';
14
+ export function generateFullOpenApiSpec(baseUrl) {
15
+ return {
16
+ openapi: '3.1.0',
17
+ info: {
18
+ title: '๋‹ค์ด์†Œ MCP API (์ „์ฒด ์ŠคํŽ™)',
19
+ description: `๋‹ค์ด์†Œ ์ œํ’ˆ ๊ฒ€์ƒ‰, ๋งค์žฅ ์ฐพ๊ธฐ, ์žฌ๊ณ  ํ™•์ธ์„ ์œ„ํ•œ API์ž…๋‹ˆ๋‹ค.
20
+
21
+ ## ์ฃผ์š” ๊ธฐ๋Šฅ
22
+ - ๐Ÿ” **์ œํ’ˆ ๊ฒ€์ƒ‰**: ํ‚ค์›Œ๋“œ๋กœ ๋‹ค์ด์†Œ ์ œํ’ˆ ๊ฒ€์ƒ‰
23
+ - ๐Ÿช **๋งค์žฅ ์ฐพ๊ธฐ**: ์ง€์—ญ/ํ‚ค์›Œ๋“œ๋กœ ๋งค์žฅ ๊ฒ€์ƒ‰
24
+ - ๐Ÿ“ฆ **์žฌ๊ณ  ํ™•์ธ**: ์˜จ๋ผ์ธ ๋ฐ ์˜คํ”„๋ผ์ธ ๋งค์žฅ ์žฌ๊ณ  ์กฐํšŒ
25
+ - ๐Ÿงญ **์ง„์—ด ์œ„์น˜ ์กฐํšŒ**: ๋งค์žฅ ๋‚ด ์ƒํ’ˆ ๊ตฌ์—ญ/์ธต ์ •๋ณด ์กฐํšŒ
26
+ - ๐Ÿช **GS25 ๋งค์žฅ/์ƒํ’ˆ/์žฌ๊ณ  ์กฐํšŒ**: GS25 ๋งค์žฅ ํƒ์ƒ‰, ์ƒํ’ˆ ๊ฒ€์ƒ‰, ์žฌ๊ณ  ์กฐํšŒ
27
+ - 7๏ธโƒฃ **์„ธ๋ธ์ผ๋ ˆ๋ธ ์ƒํ’ˆ/๋งค์žฅ/์žฌ๊ณ  ์กฐํšŒ**: ์ƒํ’ˆ ๊ฒ€์ƒ‰, ๋งค์žฅ ๊ฒ€์ƒ‰, ์‹ค์žฌ๊ณ  ์กฐํšŒ
28
+ - ๐Ÿช **CU ๋งค์žฅ/์žฌ๊ณ  ์กฐํšŒ**: CU ๋งค์žฅ ํƒ์ƒ‰ ๋ฐ ์ƒํ’ˆ ์žฌ๊ณ  ๊ฒ€์ƒ‰
29
+ - ๐ŸŽฌ **๋ฉ”๊ฐ€๋ฐ•์Šค ์ง€์ /์˜ํ™” ์กฐํšŒ**: ์ฃผ๋ณ€ ์ง€์ , ์ƒ์˜ ๋ชฉ๋ก, ์ž”์—ฌ ์ขŒ์„ ์กฐํšŒ
30
+ - ๐ŸŽž๏ธ **๋กฏ๋ฐ์‹œ๋„ค๋งˆ ์ง€์ /์˜ํ™” ์กฐํšŒ**: ์ฃผ๋ณ€ ์ง€์ , ์ƒ์˜ ๋ชฉ๋ก, ์ž”์—ฌ ์ขŒ์„ ์กฐํšŒ
31
+ - ๐ŸŽฅ **CGV ์ง€์ /์˜ํ™” ์กฐํšŒ**: ๊ทน์žฅ ๋ชฉ๋ก, ์˜ํ™” ๋ชฉ๋ก, ์‹œ๊ฐ„ํ‘œ ์กฐํšŒ
32
+
33
+ ## ์‚ฌ์šฉ ํŒ
34
+ 1. ํ•œ๊ธ€ ๊ฒ€์ƒ‰์–ด๋Š” URL ์ธ์ฝ”๋”ฉ์ด ์ž๋™ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค
35
+ 2. ์žฌ๊ณ  ํ™•์ธ ์‹œ ๋จผ์ € ์ œํ’ˆ ๊ฒ€์ƒ‰์œผ๋กœ ์ œํ’ˆ ID๋ฅผ ํ™•์ธํ•˜์„ธ์š”
36
+ 3. ์œ„์น˜ ๊ธฐ๋ฐ˜ ์žฌ๊ณ  ์กฐํšŒ ์‹œ lat, lng ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์„ธ์š”
37
+ 4. ์„ธ๋ธ์ผ๋ ˆ๋ธ ์žฌ๊ณ  ์กฐํšŒ๋Š” keyword์™€ storeKeyword๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ •ํ™•๋„๊ฐ€ ๋†’์•„์ง‘๋‹ˆ๋‹ค`,
38
+ version: '1.0.0',
39
+ contact: {
40
+ name: 'GitHub Repository',
41
+ url: 'https://github.com/hmmhmmhm/daiso-mcp',
42
+ },
43
+ },
44
+ servers: [{ url: baseUrl, description: 'Production Server' }],
45
+ paths: {
46
+ ...OPENAPI_PATHS_DAISO_OLIVEYOUNG,
47
+ ...OPENAPI_PATHS_CU,
48
+ ...OPENAPI_PATHS_EMART24,
49
+ ...OPENAPI_PATHS_LOTTEMART,
50
+ ...OPENAPI_PATHS_GS25,
51
+ ...OPENAPI_PATHS_SEVENELEVEN,
52
+ ...OPENAPI_PATHS_MEGABOX,
53
+ ...OPENAPI_PATHS_LOTTECINEMA,
54
+ ...OPENAPI_PATHS_CGV,
55
+ },
56
+ components: OPENAPI_COMPONENTS,
57
+ };
58
+ }
@@ -2,6 +2,7 @@
2
2
  * OpenAPI ์‘๋‹ต ์ƒ์„ฑ ๋ชจ๋“ˆ
3
3
  */
4
4
  import { generateOpenApiSpec } from './openapiSpec.js';
5
+ import { generateFullOpenApiSpec } from './openapiFullSpec.js';
5
6
  import { jsonToYaml } from './openapiYaml.js';
6
7
  /**
7
8
  * OpenAPI ์ŠคํŽ™ ์‘๋‹ต ์ƒ์„ฑ (JSON)
@@ -30,3 +31,30 @@ export function createOpenApiYamlResponse(baseUrl) {
30
31
  },
31
32
  });
32
33
  }
34
+ /**
35
+ * ์ „์ฒด OpenAPI ์ŠคํŽ™ ์‘๋‹ต ์ƒ์„ฑ (JSON)
36
+ */
37
+ export function createFullOpenApiJsonResponse(baseUrl) {
38
+ const spec = generateFullOpenApiSpec(baseUrl);
39
+ return new Response(JSON.stringify(spec, null, 2), {
40
+ headers: {
41
+ 'Content-Type': 'application/json; charset=utf-8',
42
+ 'Cache-Control': 'public, max-age=3600',
43
+ 'Access-Control-Allow-Origin': '*',
44
+ },
45
+ });
46
+ }
47
+ /**
48
+ * ์ „์ฒด OpenAPI ์ŠคํŽ™ ์‘๋‹ต ์ƒ์„ฑ (YAML)
49
+ */
50
+ export function createFullOpenApiYamlResponse(baseUrl) {
51
+ const spec = generateFullOpenApiSpec(baseUrl);
52
+ const yaml = jsonToYaml(spec);
53
+ return new Response(yaml, {
54
+ headers: {
55
+ 'Content-Type': 'text/yaml; charset=utf-8',
56
+ 'Cache-Control': 'public, max-age=3600',
57
+ 'Access-Control-Allow-Origin': '*',
58
+ },
59
+ });
60
+ }
@@ -1,43 +1,4 @@
1
1
  /**
2
- * OpenAPI ์ŠคํŽ™ ์กฐํ•ฉ ๋ชจ๋“ˆ
2
+ * OpenAI Actions์šฉ ๊ธฐ๋ณธ OpenAPI ์ŠคํŽ™ ์—”ํŠธ๋ฆฌ
3
3
  */
4
- import { OPENAPI_PATHS_DAISO_OLIVEYOUNG } from './openapiSpecPathsDaisoOliveyoung.js';
5
- import { OPENAPI_PATHS_MEGABOX } from './openapiSpecPathsMegabox.js';
6
- import { OPENAPI_PATHS_CGV } from './openapiSpecPathsCgv.js';
7
- import { OPENAPI_COMPONENTS } from './openapiSpecComponents.js';
8
- /**
9
- * OpenAPI ์ŠคํŽ™ ์ƒ์„ฑ
10
- */
11
- export function generateOpenApiSpec(baseUrl) {
12
- return {
13
- openapi: '3.1.0',
14
- info: {
15
- title: '๋‹ค์ด์†Œ MCP API',
16
- description: `๋‹ค์ด์†Œ ์ œํ’ˆ ๊ฒ€์ƒ‰, ๋งค์žฅ ์ฐพ๊ธฐ, ์žฌ๊ณ  ํ™•์ธ์„ ์œ„ํ•œ API์ž…๋‹ˆ๋‹ค.
17
-
18
- ## ์ฃผ์š” ๊ธฐ๋Šฅ
19
- - ๐Ÿ” **์ œํ’ˆ ๊ฒ€์ƒ‰**: ํ‚ค์›Œ๋“œ๋กœ ๋‹ค์ด์†Œ ์ œํ’ˆ ๊ฒ€์ƒ‰
20
- - ๐Ÿช **๋งค์žฅ ์ฐพ๊ธฐ**: ์ง€์—ญ/ํ‚ค์›Œ๋“œ๋กœ ๋งค์žฅ ๊ฒ€์ƒ‰
21
- - ๐Ÿ“ฆ **์žฌ๊ณ  ํ™•์ธ**: ์˜จ๋ผ์ธ ๋ฐ ์˜คํ”„๋ผ์ธ ๋งค์žฅ ์žฌ๊ณ  ์กฐํšŒ
22
- - ๐ŸŽฌ **๋ฉ”๊ฐ€๋ฐ•์Šค ์ง€์ /์˜ํ™” ์กฐํšŒ**: ์ฃผ๋ณ€ ์ง€์ , ์ƒ์˜ ๋ชฉ๋ก, ์ž”์—ฌ ์ขŒ์„ ์กฐํšŒ
23
- - ๐ŸŽฅ **CGV ์ง€์ /์˜ํ™” ์กฐํšŒ**: ๊ทน์žฅ ๋ชฉ๋ก, ์˜ํ™” ๋ชฉ๋ก, ์‹œ๊ฐ„ํ‘œ ์กฐํšŒ
24
-
25
- ## ์‚ฌ์šฉ ํŒ
26
- 1. ํ•œ๊ธ€ ๊ฒ€์ƒ‰์–ด๋Š” URL ์ธ์ฝ”๋”ฉ์ด ์ž๋™ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค
27
- 2. ์žฌ๊ณ  ํ™•์ธ ์‹œ ๋จผ์ € ์ œํ’ˆ ๊ฒ€์ƒ‰์œผ๋กœ ์ œํ’ˆ ID๋ฅผ ํ™•์ธํ•˜์„ธ์š”
28
- 3. ์œ„์น˜ ๊ธฐ๋ฐ˜ ์žฌ๊ณ  ์กฐํšŒ ์‹œ lat, lng ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์„ธ์š”`,
29
- version: '1.0.0',
30
- contact: {
31
- name: 'GitHub Repository',
32
- url: 'https://github.com/hmmhmmhm/daiso-mcp',
33
- },
34
- },
35
- servers: [{ url: baseUrl, description: 'Production Server' }],
36
- paths: {
37
- ...OPENAPI_PATHS_DAISO_OLIVEYOUNG,
38
- ...OPENAPI_PATHS_MEGABOX,
39
- ...OPENAPI_PATHS_CGV,
40
- },
41
- components: OPENAPI_COMPONENTS,
42
- };
43
- }
4
+ export { generateOpenApiSpec } from './openapiSpecActions.js';
@@ -0,0 +1,109 @@
1
+ /**
2
+ * OpenAI Actions์šฉ ์ถ•์•ฝ OpenAPI ์ŠคํŽ™
3
+ */
4
+ import { ACTION_QUERY_ACTIONS } from '../api/actionsProxy.js';
5
+ import { OPENAPI_COMPONENTS } from './openapiSpecComponents.js';
6
+ const ACTION_QUERY_PARAMETERS = [
7
+ {
8
+ name: 'action',
9
+ in: 'query',
10
+ required: true,
11
+ description: '์‹คํ–‰ํ•  ์•ก์…˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ enum ๋ชฉ๋ก์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.',
12
+ schema: {
13
+ type: 'string',
14
+ enum: ACTION_QUERY_ACTIONS,
15
+ },
16
+ },
17
+ { name: 'q', in: 'query', required: false, description: '๋‹ค์ด์†Œ ์ œํ’ˆ ๊ฒ€์ƒ‰์–ด', schema: { type: 'string' } },
18
+ { name: 'query', in: 'query', required: false, description: '์„ธ๋ธ์ผ๋ ˆ๋ธ ์ƒํ’ˆ ๊ฒ€์ƒ‰์–ด', schema: { type: 'string' } },
19
+ { name: 'itemCode', in: 'query', required: false, description: 'GS25 ์ƒํ’ˆ ์ฝ”๋“œ', schema: { type: 'string' } },
20
+ { name: 'productId', in: 'query', required: false, description: '์ œํ’ˆ ID ๋˜๋Š” ์ƒ์„ธ ์กฐํšŒ์šฉ path ํŒŒ๋ผ๋ฏธํ„ฐ', schema: { type: 'string' } },
21
+ { name: 'keyword', in: 'query', required: false, description: '๊ณตํ†ต ํ‚ค์›Œ๋“œ ํŒŒ๋ผ๋ฏธํ„ฐ', schema: { type: 'string' } },
22
+ { name: 'sido', in: 'query', required: false, description: '๋‹ค์ด์†Œ ์‹œ/๋„', schema: { type: 'string' } },
23
+ { name: 'gugun', in: 'query', required: false, description: '๋‹ค์ด์†Œ ๊ตฌ/๊ตฐ', schema: { type: 'string' } },
24
+ { name: 'dong', in: 'query', required: false, description: '๋‹ค์ด์†Œ ๋™', schema: { type: 'string' } },
25
+ { name: 'area', in: 'query', required: false, description: '๋กฏ๋ฐ๋งˆํŠธ ์ง€์—ญ', schema: { type: 'string' } },
26
+ { name: 'area1', in: 'query', required: false, description: '์ด๋งˆํŠธ24 1์ฐจ ์ง€์—ญ', schema: { type: 'string' } },
27
+ { name: 'area2', in: 'query', required: false, description: '์ด๋งˆํŠธ24 2์ฐจ ์ง€์—ญ', schema: { type: 'string' } },
28
+ { name: 'areaCode', in: 'query', required: false, description: '๋ฉ”๊ฐ€๋ฐ•์Šค ์ง€์—ญ ์ฝ”๋“œ', schema: { type: 'string' } },
29
+ { name: 'brandVariant', in: 'query', required: false, description: '๋กฏ๋ฐ๋งˆํŠธ ๋ธŒ๋žœ๋“œ ๋ณ€ํ˜•', schema: { type: 'string' } },
30
+ { name: 'lat', in: 'query', required: false, description: '์œ„๋„', schema: { type: 'number', format: 'float' } },
31
+ { name: 'lng', in: 'query', required: false, description: '๊ฒฝ๋„', schema: { type: 'number', format: 'float' } },
32
+ { name: 'page', in: 'query', required: false, description: 'ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ', schema: { type: 'integer' } },
33
+ { name: 'pageIdx', in: 'query', required: false, description: '์˜ฌ๋ฆฌ๋ธŒ์˜ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ', schema: { type: 'integer' } },
34
+ { name: 'pageLimit', in: 'query', required: false, description: '๋กฏ๋ฐ๋งˆํŠธ ์ถ”๊ฐ€ ํŽ˜์ด์ง€ ์ˆ˜', schema: { type: 'integer' } },
35
+ { name: 'pageSize', in: 'query', required: false, description: 'ํŽ˜์ด์ง€ ํฌ๊ธฐ', schema: { type: 'integer' } },
36
+ { name: 'size', in: 'query', required: false, description: 'ํŽ˜์ด์ง€ ํฌ๊ธฐ ๋˜๋Š” ๊ฒ€์ƒ‰ ํฌ๊ธฐ', schema: { type: 'integer' } },
37
+ { name: 'offset', in: 'query', required: false, description: 'CU ๊ฒ€์ƒ‰ ์˜คํ”„์…‹', schema: { type: 'integer' } },
38
+ { name: 'limit', in: 'query', required: false, description: '์ตœ๋Œ€ ๊ฒฐ๊ณผ ์ˆ˜', schema: { type: 'integer' } },
39
+ { name: 'storeLimit', in: 'query', required: false, description: '๋งค์žฅ ๊ฒฐ๊ณผ ์ œํ•œ ์ˆ˜', schema: { type: 'integer' } },
40
+ { name: 'storeCode', in: 'query', required: false, description: '๋งค์žฅ ์ฝ”๋“œ', schema: { type: 'string' } },
41
+ { name: 'storeName', in: 'query', required: false, description: '๋งค์žฅ๋ช…', schema: { type: 'string' } },
42
+ { name: 'storeKeyword', in: 'query', required: false, description: '๋งค์žฅ ํ‚ค์›Œ๋“œ', schema: { type: 'string' } },
43
+ { name: 'playDate', in: 'query', required: false, description: '์ƒ์˜์ผ(YYYYMMDD)', schema: { type: 'string' } },
44
+ { name: 'regionCode', in: 'query', required: false, description: 'CGV ์ง€์—ญ ์ฝ”๋“œ', schema: { type: 'string' } },
45
+ { name: 'theaterCode', in: 'query', required: false, description: 'CGV ๊ทน์žฅ ์ฝ”๋“œ', schema: { type: 'string' } },
46
+ { name: 'theaterId', in: 'query', required: false, description: '๋ฉ”๊ฐ€๋ฐ•์Šค/๋กฏ๋ฐ์‹œ๋„ค๋งˆ ์ง€์  ID', schema: { type: 'string' } },
47
+ { name: 'movieCode', in: 'query', required: false, description: 'CGV ์˜ํ™” ์ฝ”๋“œ', schema: { type: 'string' } },
48
+ { name: 'movieId', in: 'query', required: false, description: '๋ฉ”๊ฐ€๋ฐ•์Šค/๋กฏ๋ฐ์‹œ๋„ค๋งˆ ์˜ํ™” ID', schema: { type: 'string' } },
49
+ { name: 'pluCd', in: 'query', required: false, description: '์ด๋งˆํŠธ24 ์ƒํ’ˆ PLU ์ฝ”๋“œ', schema: { type: 'string' } },
50
+ { name: 'bizNoArr', in: 'query', required: false, description: '์ด๋งˆํŠธ24 ์‚ฌ์—…์ž๋ฒˆํ˜ธ ๋ชฉ๋ก', schema: { type: 'string' } },
51
+ { name: 'label', in: 'query', required: false, description: '์„ธ๋ธ์ผ๋ ˆ๋ธ ์ธ๊ธฐ ๊ฒ€์ƒ‰์–ด ๋ผ๋ฒจ', schema: { type: 'string' } },
52
+ { name: 'sort', in: 'query', required: false, description: '์ •๋ ฌ ๊ธฐ์ค€', schema: { type: 'string' } },
53
+ { name: 'searchSort', in: 'query', required: false, description: 'CU ๊ฒ€์ƒ‰ ์ •๋ ฌ ๊ธฐ์ค€', schema: { type: 'string' } },
54
+ { name: 'service24h', in: 'query', required: false, description: '์ด๋งˆํŠธ24 24์‹œ๊ฐ„ ํ•„ํ„ฐ', schema: { type: 'boolean' } },
55
+ { name: 'includeSoldOut', in: 'query', required: false, description: '์˜ฌ๋ฆฌ๋ธŒ์˜ ํ’ˆ์ ˆ ํฌํ•จ ์—ฌ๋ถ€', schema: { type: 'boolean' } },
56
+ { name: 'includeIssues', in: 'query', required: false, description: '์„ธ๋ธ์ผ๋ ˆ๋ธ ์ด๋‹ฌ์˜ ํ–‰์‚ฌ์ง€ ํฌํ•จ ์—ฌ๋ถ€', schema: { type: 'boolean' } },
57
+ { name: 'includeExhibition', in: 'query', required: false, description: '์„ธ๋ธ์ผ๋ ˆ๋ธ ์ „์‹œ์ƒํ’ˆ ํฌํ•จ ์—ฌ๋ถ€', schema: { type: 'boolean' } },
58
+ { name: 'timeoutMs', in: 'query', required: false, description: '์„ธ๋ธ์ผ๋ ˆ๋ธ inventory ํƒ€์ž„์•„์›ƒ', schema: { type: 'integer' } },
59
+ ];
60
+ export function generateOpenApiSpec(baseUrl) {
61
+ return {
62
+ openapi: '3.1.0',
63
+ info: {
64
+ title: '๋‹ค์ด์†Œ MCP API (OpenAI Actions์šฉ)',
65
+ description: `OpenAI ์ฑ—๋ด‡์˜ OpenAPI import ๊ฐœ์ˆ˜ ์ œํ•œ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  GET API๋ฅผ ๋‹จ์ผ facade ์—”๋“œํฌ์ธํŠธ๋กœ ์ง‘์•ฝํ•œ ์ŠคํŽ™์ž…๋‹ˆ๋‹ค.
66
+
67
+ ์‹ค์ œ ๋Ÿฐํƒ€์ž„์€ ๊ธฐ์กด /api/{service}/... ์—”๋“œํฌ์ธํŠธ๋กœ ์œ„์ž„ํ•˜๋ฉฐ, ์ด ์ŠคํŽ™์€ OpenAI Actions ๋“ฑ๋ก ์ „์šฉ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
68
+
69
+ ๋ธŒ๋žœ๋“œ๋ช…์ด ์š”์ฒญ ์•ž๋ถ€๋ถ„์— ๋‚˜์˜ค๋ฉด ๋’ค์˜ ์ƒํ’ˆ/์žฌ๊ณ  ์š”์ฒญ๊นŒ์ง€ ๊ฐ™์€ ๋ธŒ๋žœ๋“œ๋กœ ํ•ด์„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: "์•ˆ์‚ฐ ์ค‘์•™์—ญ ์ฃผ๋ณ€ ๋‹ค์ด์†Œ ์ฐพ์•„์ฃผ์‹œ๊ณ  ํ•ซ์‹์Šค ์žฌ๊ณ  ์ฐพ์•„์ฃผ์„ธ์š”"๋Š” ๋‹ค์ด์†Œ ๊ธฐ์ค€ ์กฐํšŒ๋ฅผ ๋จผ์ € ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ฒฐ๊ณผ๊ฐ€ ์—†์„ ๋•Œ๋งŒ ๋‹ค๋ฅธ ๋ธŒ๋žœ๋“œ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.
70
+
71
+ ์ „์ฒด ๊ฐœ๋ณ„ ์—”๋“œํฌ์ธํŠธ ์ŠคํŽ™์ด ํ•„์š”ํ•˜๋ฉด /openapi-full.json ๋˜๋Š” /openapi-full.yaml ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.`,
72
+ version: '1.0.0',
73
+ contact: {
74
+ name: 'GitHub Repository',
75
+ url: 'https://github.com/hmmhmmhm/daiso-mcp',
76
+ },
77
+ },
78
+ servers: [{ url: baseUrl, description: 'Production Server' }],
79
+ paths: {
80
+ '/api/actions/query': {
81
+ get: {
82
+ operationId: 'queryAction',
83
+ summary: '๊ณตํ†ต GET ์•ก์…˜ ์‹คํ–‰',
84
+ description: 'action ๊ฐ’์— ๋”ฐ๋ผ ๊ธฐ์กด GET API ์—”๋“œํฌ์ธํŠธ๋กœ ํ”„๋ก์‹œํ•ฉ๋‹ˆ๋‹ค. OpenAI Actions ๋“ฑ๋ก ์‹œ ์ด ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.',
85
+ parameters: ACTION_QUERY_PARAMETERS,
86
+ responses: {
87
+ '200': {
88
+ description: 'ํ”„๋ก์‹œ ํ˜ธ์ถœ ์„ฑ๊ณต',
89
+ content: {
90
+ 'application/json': {
91
+ schema: { $ref: '#/components/schemas/ActionQueryResponse' },
92
+ },
93
+ },
94
+ },
95
+ '400': {
96
+ description: '์ž˜๋ชป๋œ ์š”์ฒญ',
97
+ content: {
98
+ 'application/json': {
99
+ schema: { $ref: '#/components/schemas/ErrorResponse' },
100
+ },
101
+ },
102
+ },
103
+ },
104
+ },
105
+ },
106
+ },
107
+ components: OPENAPI_COMPONENTS,
108
+ };
109
+ }