@portone/mcp-server 0.13.0 → 0.14.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.
package/server/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  var __defProp = Object.defineProperty;
3
3
  var __export = (target, all) => {
4
- for (var name13 in all)
5
- __defProp(target, name13, { get: all[name13], enumerable: true });
4
+ for (var name14 in all)
5
+ __defProp(target, name14, { get: all[name14], enumerable: true });
6
6
  };
7
7
 
8
8
  // src/index.ts
@@ -10,11 +10,12 @@ import { dirname, join as join4 } from "path";
10
10
  import { fileURLToPath } from "url";
11
11
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
12
12
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
13
+ import { GraphQLClient } from "graphql-request";
13
14
 
14
15
  // package.json
15
16
  var package_default = {
16
17
  name: "@portone/mcp-server",
17
- version: "0.13.0",
18
+ version: "0.14.0",
18
19
  description: "\uD3EC\uD2B8\uC6D0 \uC0AC\uC6A9\uC790\uB97C \uC704\uD55C MCP (Model Context Protocol) \uC11C\uBC84\uC785\uB2C8\uB2E4. \uD3EC\uD2B8\uC6D0 \uAC1C\uBC1C\uC790\uC13C\uD130, \uD5EC\uD504\uC13C\uD130 \uB4F1 \uACF5\uC2DD \uBB38\uC11C \uB0B4\uC6A9\uC744 LLM(Large Language Model)\uC5D0 \uC81C\uACF5\uD574 \uC815\uD655\uD55C \uC815\uBCF4\uB97C \uBC14\uD0D5\uC73C\uB85C \uC0AC\uC6A9\uC790\uC758 \uC5F0\uB3D9 \uBC0F \uC9C8\uC758\uB97C \uB3D5\uB3C4\uB85D \uD569\uB2C8\uB2E4.",
19
20
  main: "server/index.js",
20
21
  type: "module",
@@ -47,8 +48,12 @@ var package_default = {
47
48
  "@modelcontextprotocol/sdk": "^1.15.0",
48
49
  "@portone/server-sdk": "^0.15.0",
49
50
  axios: "^1.7.2",
51
+ graphql: "^16.11.0",
52
+ "graphql-request": "^7.2.0",
50
53
  "gray-matter": "^4.0.3",
54
+ h3: "2.0.0-beta.1",
51
55
  "js-yaml": "^4.1.0",
56
+ open: "^10.2.0",
52
57
  "ts-pattern": "^5.7.1",
53
58
  zod: "^3.25.75"
54
59
  },
@@ -198,471 +203,1137 @@ async function loadInstructions(path) {
198
203
  }
199
204
  }
200
205
 
201
- // src/tools/getIdentityVerification.ts
202
- var getIdentityVerification_exports = {};
203
- __export(getIdentityVerification_exports, {
206
+ // src/tools/addTestChannel.ts
207
+ var addTestChannel_exports = {};
208
+ __export(addTestChannel_exports, {
204
209
  config: () => config,
205
210
  init: () => init,
206
211
  name: () => name
207
212
  });
208
- import z2 from "zod";
213
+ import z5 from "zod";
209
214
 
210
- // src/tools/utils/portoneRest.ts
215
+ // src/tools/request/addChannel.ts
216
+ import { match, P } from "ts-pattern";
211
217
  import z from "zod";
212
- var PgProviderSchema = z.enum([
213
- "HTML5_INICIS",
214
- "PAYPAL",
215
- "PAYPAL_V2",
216
- "INICIS",
217
- "DANAL",
218
- "NICE",
219
- "DANAL_TPAY",
220
- "JTNET",
221
- "UPLUS",
222
- "NAVERPAY",
223
- "KAKAO",
224
- "SETTLE",
225
- "KCP",
226
- "MOBILIANS",
227
- "KAKAOPAY",
228
- "NAVERCO",
229
- "SYRUP",
230
- "KICC",
231
- "EXIMBAY",
232
- "SMILEPAY",
233
- "PAYCO",
234
- "KCP_BILLING",
235
- "ALIPAY",
236
- "PAYPLE",
237
- "CHAI",
238
- "BLUEWALNUT",
239
- "SMARTRO",
240
- "SMARTRO_V2",
241
- "PAYMENTWALL",
242
- "TOSSPAYMENTS",
243
- "KCP_QUICK",
244
- "DAOU",
245
- "GALAXIA",
246
- "TOSSPAY",
247
- "KCP_DIRECT",
248
- "SETTLE_ACC",
249
- "SETTLE_FIRM",
250
- "INICIS_UNIFIED",
251
- "KSNET",
252
- "PINPAY",
253
- "NICE_V2",
254
- "TOSS_BRANDPAY",
255
- "WELCOME",
256
- "TOSSPAY_V2",
257
- "INICIS_V2",
258
- "KPN",
259
- "KCP_V2",
260
- "HYPHEN",
261
- "EXIMBAY_V2",
262
- "INICIS_JP",
263
- "PAYLETTER_GLOBAL"
264
- ]);
265
- var PortOneVersion = z.enum(["V1", "V2"]);
266
- var PAYMENT_FIELDS = [
267
- "status",
268
- "id",
269
- "transactionId",
270
- "storeId",
271
- "version",
272
- "scheduleId",
273
- "requestedAt",
274
- "updatedAt",
275
- "statusChangedAt",
276
- "orderName",
277
- "amount",
278
- "currency",
279
- "promotionId",
280
- "isCulturalExpense",
281
- "products",
282
- "productCount",
283
- "country",
284
- "paidAt",
285
- "cancelledAt",
286
- "failedAt",
287
- "failure",
288
- "method.type",
289
- // 간편결제
290
- "method.method.type",
291
- "channel.type",
292
- "channel.name",
293
- "channel.pgProvider",
294
- "escrow.status",
295
- "escrow.company",
296
- "escrow.sentAt",
297
- "escrow.appliedAt",
298
- "escrow.isAutomaticallyConfirmed",
299
- "cashReceipt.status",
300
- "cashReceipt.type",
301
- "cashReceipt.totalAmount",
302
- "cashReceipt.taxFreeAmount",
303
- "cashReceipt.currency",
304
- "cashReceipt.issuedAt",
305
- "cashReceipt.cancelledAt",
306
- "cancellations.status",
307
- "cancellations.id",
308
- "cancellations.totalAmount",
309
- "cancellations.taxFreeAmount",
310
- "cancellations.vatAmount",
311
- "cancellations.easyPayDiscountAmount",
312
- "cancellations.reason",
313
- "cancellations.cancelledAt",
314
- "cancellations.requestedAt",
315
- "cancellations.trigger",
316
- "disputes.status",
317
- "disputes.reason",
318
- "disputes.createdAt",
319
- "disputes.resolvedAt",
320
- "channelGroup.name",
321
- "channelGroup.isForTest"
322
- ];
323
- var PaymentField = z.enum(PAYMENT_FIELDS);
324
- var IDENTITY_VERIFICATION_FIELDS = [
325
- "status",
326
- "id",
327
- "requestedAt",
328
- "updatedAt",
329
- "statusChangedAt",
330
- "failure",
331
- "version",
332
- "channel.type",
333
- "channel.name",
334
- "channel.pgProvider"
335
- ];
336
- var IdentityVerificationField = z.enum(IDENTITY_VERIFICATION_FIELDS);
337
- var JsonLiteral = z.string().or(z.number()).or(z.boolean());
338
- var JsonValue = z.lazy(
339
- () => JsonLiteral.or(z.array(JsonValue)).or(z.record(JsonValue))
340
- );
341
- function filterFields(fields, data) {
342
- const withPrefixes = new Set(fields);
343
- for (const field of fields) {
344
- let searchPos = 0;
345
- while (true) {
346
- const dot = field.indexOf(".", searchPos);
347
- if (dot === -1) break;
348
- withPrefixes.add(field.slice(0, dot));
349
- searchPos = dot + 1;
218
+
219
+ // src/url.ts
220
+ var DEVELOPERS_URL = "https://developers.portone.io";
221
+ var CONSOLE_URL = "https://admin.portone.io";
222
+ var MERCHANT_SERVICE_URL = "https://merchant-service.prod.iamport.co";
223
+ var CHANNEL_SERVICE_URL = "https://channel-service.prod.iamport.co";
224
+ var GRAPHQL_URL = "https://api.portone.io/graphql";
225
+ var HELP_CENTER_URL = "https://help.portone.io";
226
+
227
+ // src/tools/utils/userAgent.ts
228
+ var USER_AGENT = `${package_default.name} ${package_default.version}`;
229
+
230
+ // src/tools/request/addChannel.ts
231
+ var StatusResponse = z.object({
232
+ code: z.unknown(),
233
+ message: z.string(),
234
+ details: z.unknown()
235
+ }).partial();
236
+ var AddChannelResponse = z.object({
237
+ channel: z.object({
238
+ channelKey: z.string()
239
+ })
240
+ });
241
+ var channelTypeMapper = {
242
+ LIVE: "CHANNEL_TYPE_REQUEST_LIVE",
243
+ TEST: "CHANNEL_TYPE_REQUEST_MERCHANT_TEST"
244
+ };
245
+ async function addChannel({
246
+ channelType,
247
+ pgpCredential,
248
+ channelName,
249
+ pgMerchantId,
250
+ storeId,
251
+ taxType,
252
+ manualConfirm,
253
+ isForPayment,
254
+ isForIdentityCertification,
255
+ authorization
256
+ }) {
257
+ const request = {
258
+ channelType: channelTypeMapper[channelType],
259
+ pgpCredential,
260
+ channelName,
261
+ pgMerchantId,
262
+ isForPayment,
263
+ isForIdentityCertification,
264
+ storeId,
265
+ taxType,
266
+ manualConfirm
267
+ };
268
+ try {
269
+ const response = await fetch(new URL("/v2/channels", CHANNEL_SERVICE_URL), {
270
+ method: "POST",
271
+ headers: {
272
+ Authorization: authorization,
273
+ "Content-Type": "application/json",
274
+ "User-Agent": USER_AGENT
275
+ },
276
+ body: JSON.stringify(request)
277
+ });
278
+ const text = await response.text();
279
+ try {
280
+ const parsed = await AddChannelResponse.or(StatusResponse).parseAsync(
281
+ JSON.parse(text)
282
+ );
283
+ return match(parsed).returnType().with({ channel: P.nonNullable }, (success) => ({
284
+ type: "success",
285
+ data: success
286
+ })).otherwise(({ code, message, details }) => ({
287
+ type: "error",
288
+ data: {
289
+ message: message ?? "\uCC44\uB110\uC744 \uC62C\uBC14\uB974\uAC8C \uCD94\uAC00\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.",
290
+ code,
291
+ details,
292
+ status: response.status
293
+ }
294
+ }));
295
+ } catch (parseError) {
296
+ return {
297
+ type: "error",
298
+ data: {
299
+ message: "\uC62C\uBC14\uB974\uC9C0 \uC54A\uC740 \uD615\uC2DD\uC758 \uC11C\uBC84 \uC751\uB2F5",
300
+ cause: parseError
301
+ }
302
+ };
303
+ }
304
+ } catch (error) {
305
+ if (error instanceof Error) {
306
+ return {
307
+ type: "error",
308
+ data: error
309
+ };
310
+ } else {
311
+ return {
312
+ type: "error",
313
+ data: {
314
+ message: `\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.`,
315
+ cause: error
316
+ }
317
+ };
350
318
  }
351
319
  }
352
- const parsed = JsonValue.safeParse(data);
353
- if (parsed.success) {
354
- return filterFieldsPath(parsed.data, "");
355
- } else {
356
- throw parsed.error;
357
- }
358
- function filterFieldsPath(data2, currentPath) {
359
- if (typeof data2 === "object") {
360
- if (Array.isArray(data2)) {
361
- return data2.map((item) => filterFieldsPath(item, currentPath));
362
- } else {
363
- return Object.fromEntries(
364
- Object.entries(data2).flatMap(([key, value]) => {
365
- const childPath = currentPath === "" ? key : `${currentPath}.${key}`;
366
- if (withPrefixes.has(childPath)) {
367
- return [[key, filterFieldsPath(value, childPath)]];
368
- } else {
369
- return [];
320
+ }
321
+
322
+ // src/tools/request/listStores.ts
323
+ import { parse } from "graphql";
324
+ import { gql } from "graphql-request";
325
+ import { match as match2, P as P2 } from "ts-pattern";
326
+ import z2 from "zod";
327
+ var ErrorResponse = z2.object({
328
+ __typename: z2.string(),
329
+ message: z2.string().nullable()
330
+ });
331
+ var StoreResponse = z2.object({
332
+ id: z2.string(),
333
+ plainId: z2.string(),
334
+ name: z2.string(),
335
+ isRepresentative: z2.boolean(),
336
+ v1Info: z2.object({
337
+ v1UserId: z2.number(),
338
+ userCode: z2.string(),
339
+ tierCode: z2.string().nullable()
340
+ }).or(ErrorResponse)
341
+ }).transform(({ v1Info, ...store }) => ({
342
+ ...match2(v1Info).with({ __typename: P2.nonNullable }, () => ({})).otherwise(({ v1UserId, tierCode, ...rest }) => ({
343
+ userId: v1UserId,
344
+ tierCode: tierCode ?? void 0,
345
+ ...rest
346
+ })),
347
+ ...store
348
+ }));
349
+ var MerchantResponse = z2.object({
350
+ stores: z2.object({
351
+ items: z2.array(StoreResponse)
352
+ }).or(ErrorResponse)
353
+ });
354
+ var ListStoresResponse = z2.object({
355
+ merchant: MerchantResponse.transform(({ stores }) => stores).or(
356
+ ErrorResponse
357
+ )
358
+ }).transform(
359
+ ({ merchant }) => match2(merchant).with({ __typename: P2.nonNullable }, (error) => error).otherwise(({ items }) => {
360
+ const main = items.find(({ isRepresentative }) => isRepresentative);
361
+ return {
362
+ main,
363
+ items: items.filter(({ isRepresentative }) => !isRepresentative)
364
+ };
365
+ })
366
+ );
367
+ var listStoresQuery = parse(gql`
368
+ query ListStores {
369
+ merchant {
370
+ ...ErrorFragment
371
+ ... on Merchant {
372
+ stores {
373
+ ...ErrorFragment
374
+ ... on StoresPayload {
375
+ items {
376
+ ... on Store {
377
+ id
378
+ plainId
379
+ name
380
+ isRepresentative
381
+ v1Info {
382
+ ...ErrorFragment
383
+ ... on StoreV1Info {
384
+ v1UserId
385
+ userCode
386
+ tierCode
387
+ }
388
+ }
370
389
  }
371
- })
372
- );
390
+ }
391
+ }
373
392
  }
374
- } else {
375
- return data2;
376
393
  }
377
394
  }
378
395
  }
379
396
 
380
- // src/tools/getIdentityVerification.ts
381
- var name = "getIdentityVerification";
382
- var config = {
383
- title: "\uD3EC\uD2B8\uC6D0 \uBCF8\uC778\uC778\uC99D \uC815\uBCF4 \uC870\uD68C",
384
- description: `\uACE0\uAC1D\uC0AC \uBCF8\uC778\uC778\uC99D \uAC70\uB798\uBC88\uD638\uB85C \uD3EC\uD2B8\uC6D0 \uC11C\uBC84\uC5D0\uC11C \uBCF8\uC778\uC778\uC99D \uC815\uBCF4\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4.
385
- \uACE0\uAC1D\uC0AC \uBCF8\uC778\uC778\uC99D \uAC70\uB798\uBC88\uD638\uB294 \uD3EC\uD2B8\uC6D0 V1\uC5D0\uC11C\uB294 merchant_uid\uC774\uBA70, V2\uC5D0\uC11C\uB294 identityVerificationId\uC5D0 \uD574\uB2F9\uD569\uB2C8\uB2E4.
397
+ fragment ErrorFragment on Error {
398
+ __typename
399
+ message
400
+ }
401
+ `);
402
+ async function listStores({
403
+ client,
404
+ authorization
405
+ }) {
406
+ try {
407
+ const response = await client.request({
408
+ document: listStoresQuery,
409
+ requestHeaders: {
410
+ authorization
411
+ }
412
+ });
413
+ const parsed = await ListStoresResponse.parseAsync(response);
414
+ return match2(parsed).returnType().with({ __typename: P2.nonNullable }, ({ __typename, message }) => ({
415
+ type: "error",
416
+ data: {
417
+ message,
418
+ type: __typename
419
+ }
420
+ })).otherwise((stores) => ({
421
+ type: "success",
422
+ data: stores
423
+ }));
424
+ } catch (error) {
425
+ if (error instanceof Error) {
426
+ return {
427
+ type: "error",
428
+ data: {
429
+ ...error
430
+ }
431
+ };
432
+ } else {
433
+ return {
434
+ type: "error",
435
+ data: {
436
+ message: "\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.",
437
+ cause: error
438
+ }
439
+ };
440
+ }
441
+ }
442
+ }
386
443
 
387
- Note:
388
- UNAUTHORIZED \uC5D0\uB7EC\uC758 \uACBD\uC6B0 MCP \uC11C\uBC84\uC758 API_SECRET \uD658\uACBD\uBCC0\uC218 \uC124\uC815\uC774 \uC798\uBABB\uB418\uC5C8\uC744 \uAC00\uB2A5\uC131\uC774 \uC788\uC2B5\uB2C8\uB2E4.
389
- \uC18C\uBB38\uC790 imp_ \uD639\uC740 imps_ \uB85C \uC2DC\uC791\uD558\uB294 \uAC70\uB798\uBC88\uD638\uB294 \uACE0\uAC1D\uC0AC \uAC70\uB798\uBC88\uD638\uAC00 \uC544\uB2CC V1 \uD3EC\uD2B8\uC6D0 \uAC70\uB798\uBC88\uD638(imp_uid)\uC77C \uAC00\uB2A5\uC131\uC774 \uC788\uC2B5\uB2C8\uB2E4.
390
- \uB0A0\uC9DC \uBC0F \uC2DC\uAC04 \uC815\uBCF4 \uD574\uC11D\uC5D0\uB294 \uD0C0\uC784\uC874\uC5D0 \uC720\uC758\uD558\uC138\uC694. \uD3EC\uD2B8\uC6D0\uC5D0\uC11C\uB294 RFC 3339\uB97C \uC0AC\uC6A9\uD558\uBA70, Z\uB294 Zulu Time\uC744 \uC758\uBBF8\uD569\uB2C8\uB2E4.`,
391
- inputSchema: {
392
- identityVerificationId: z2.string().describe("\uACE0\uAC1D\uC0AC\uC5D0\uC11C \uBC1C\uAE09\uD55C \uBCF8\uC778\uC778\uC99D \uAC70\uB798\uBC88\uD638\uC785\uB2C8\uB2E4."),
393
- storeId: z2.string().optional().describe(
394
- "\uD558\uC704 \uC0C1\uC810\uC744 \uD3EC\uD568\uD55C \uD2B9\uC815 \uC0C1\uC810\uC758 \uC778\uC99D \uAC74\uB9CC\uC744 \uC870\uD68C\uD560 \uACBD\uC6B0\uC5D0\uB9CC \uC785\uB825\uD569\uB2C8\uB2E4. `store-id-{uuid}` \uD615\uC2DD\uC785\uB2C8\uB2E4."
395
- )
396
- },
397
- outputSchema: {
398
- result: z2.object({}).passthrough().describe("\uBCF8\uC778\uC778\uC99D \uC815\uBCF4")
444
+ // src/tools/request/listV2SharedTestChannel.ts
445
+ import { match as match3, P as P3 } from "ts-pattern";
446
+ import z3 from "zod";
447
+ var StatusResponse2 = z3.object({
448
+ code: z3.unknown(),
449
+ message: z3.string(),
450
+ details: z3.unknown()
451
+ }).partial();
452
+ var SharedTestChannelResponse = z3.object({
453
+ pgProvider: z3.string(),
454
+ pgMerchantId: z3.string(),
455
+ pgpCredential: z3.object({}).passthrough(),
456
+ channelName: z3.string(),
457
+ isForPayment: z3.boolean(),
458
+ isForIdentityCertification: z3.boolean()
459
+ });
460
+ var ListV2SharedTestChannelResponse = z3.object({
461
+ channels: z3.array(SharedTestChannelResponse)
462
+ });
463
+ async function listV2SharedTestChannel({
464
+ authorization
465
+ }) {
466
+ try {
467
+ const response = await fetch(
468
+ new URL("/v2/shared-test-channels", CHANNEL_SERVICE_URL),
469
+ {
470
+ method: "GET",
471
+ headers: {
472
+ Authorization: authorization,
473
+ "User-Agent": USER_AGENT
474
+ }
475
+ }
476
+ );
477
+ const text = await response.text();
478
+ try {
479
+ const parsed = await ListV2SharedTestChannelResponse.or(
480
+ StatusResponse2
481
+ ).parseAsync(JSON.parse(text));
482
+ return match3(parsed).returnType().with({ channels: P3.nonNullable }, (success) => ({
483
+ type: "success",
484
+ data: success
485
+ })).otherwise(({ code, message, details }) => ({
486
+ type: "error",
487
+ data: {
488
+ message: message ?? "\uD14C\uC2A4\uD2B8 \uCC44\uB110 \uC815\uBCF4\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.",
489
+ code,
490
+ details,
491
+ status: response.status
492
+ }
493
+ }));
494
+ } catch (parseError) {
495
+ return {
496
+ type: "error",
497
+ data: {
498
+ message: "\uC62C\uBC14\uB974\uC9C0 \uC54A\uC740 \uD615\uC2DD\uC758 \uC11C\uBC84 \uC751\uB2F5",
499
+ cause: parseError
500
+ }
501
+ };
502
+ }
503
+ } catch (error) {
504
+ if (error instanceof Error) {
505
+ return {
506
+ type: "error",
507
+ data: error
508
+ };
509
+ } else {
510
+ return {
511
+ type: "error",
512
+ data: {
513
+ message: `\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.`,
514
+ cause: error
515
+ }
516
+ };
517
+ }
399
518
  }
519
+ }
520
+
521
+ // src/tools/utils/key.ts
522
+ import { getQuery, H3, serve } from "h3";
523
+ import open from "open";
524
+ import { match as match4 } from "ts-pattern";
525
+ import { z as z4 } from "zod";
526
+ var OAUTH_CLIENT_ID = "MCP";
527
+ var OAUTH_TIMEOUT_MILLIS = 5 * 60 * 1e3;
528
+ var OAuthTokenResponse = z4.object({
529
+ access_token: z4.string(),
530
+ token_type: z4.string(),
531
+ expires_in: z4.number(),
532
+ scope: z4.array(z4.string()),
533
+ refresh_token: z4.string()
534
+ });
535
+ var OAuthError = class extends Error {
400
536
  };
401
- function init(httpClient) {
402
- return async ({ identityVerificationId, storeId }) => {
403
- const params = new URLSearchParams();
404
- if (storeId) {
405
- params.set("storeId", storeId);
537
+ var TokenProvider = class {
538
+ app = new H3().get("/oauth/mcp", async (event) => {
539
+ const query = getQuery(event);
540
+ const { code, error, error_description: errorDescription } = query;
541
+ if (code == null) {
542
+ const message = errorDescription == null ? error : errorDescription;
543
+ return `OAuth Error: ${message}`;
406
544
  }
407
- const url = `/identity-verifications/${identityVerificationId}${params.toString() ? `?${params.toString()}` : ""}`;
408
545
  try {
409
- const response = await httpClient.get(url);
410
- if (!response.ok) {
411
- const errorText = await response.text();
412
- return {
413
- content: [
414
- {
415
- type: "text",
416
- text: errorText
417
- }
418
- ],
419
- isError: true
420
- };
546
+ this.token = await this.exchangeAuthorizationCode(code);
547
+ } catch (error2) {
548
+ const message = error2 instanceof Error ? error2.message : "Internal Server Error";
549
+ return new Response(message, {
550
+ status: 500
551
+ });
552
+ }
553
+ return `<!DOCTYPE html>
554
+ <html lang="en">
555
+ <head><meta charset='utf-8'><script>window.close()</script></head>
556
+ <body>Authorization complete. You may close this window.</body>
557
+ </html>
558
+ `;
559
+ });
560
+ serverController = null;
561
+ token = null;
562
+ codeVerifier = null;
563
+ launchRefresher() {
564
+ setInterval(async () => {
565
+ if (this.token !== null && Date.now() >= this.token.refreshAt) {
566
+ try {
567
+ this.token = await this.refresh(this.token.refresh);
568
+ } catch (e) {
569
+ console.error(e);
570
+ this.token = null;
571
+ }
421
572
  }
422
- const data = await response.json();
423
- const maskedData = filterFields(IDENTITY_VERIFICATION_FIELDS, data);
424
- const structuredContent = {
425
- result: maskedData
573
+ }, 10 * 1e3);
574
+ }
575
+ async exchangeAuthorizationCode(code) {
576
+ const res = await fetch(new URL("/oauth/token", MERCHANT_SERVICE_URL), {
577
+ method: "POST",
578
+ headers: {
579
+ "Content-Type": "application/json"
580
+ },
581
+ body: JSON.stringify({
582
+ client_id: OAUTH_CLIENT_ID,
583
+ grant_type: "authorization_code",
584
+ code,
585
+ code_verifier: this.codeVerifier
586
+ })
587
+ });
588
+ if (!res.ok) {
589
+ throw new OAuthError(
590
+ `server returned status: ${res.status} ${await res.text()}`
591
+ );
592
+ }
593
+ try {
594
+ const text = await res.text();
595
+ const response = await OAuthTokenResponse.parseAsync(JSON.parse(text));
596
+ const now = Date.now();
597
+ this.serverController?.abort();
598
+ this.serverController = null;
599
+ return {
600
+ access: response.access_token,
601
+ refresh: response.refresh_token,
602
+ refreshAt: now + 6e4,
603
+ expiresAt: now + response.expires_in * 1e3,
604
+ tokenType: response.token_type
605
+ };
606
+ } catch (error) {
607
+ throw new OAuthError("Invalid server response", { cause: error });
608
+ }
609
+ }
610
+ async refresh(refreshToken) {
611
+ const res = await fetch(new URL("/oauth/token", MERCHANT_SERVICE_URL), {
612
+ method: "POST",
613
+ headers: {
614
+ "Content-Type": "application/json"
615
+ },
616
+ body: JSON.stringify({
617
+ client_id: OAUTH_CLIENT_ID,
618
+ grant_type: "refresh_token",
619
+ refresh_token: refreshToken
620
+ })
621
+ });
622
+ if (!res.ok) {
623
+ throw new OAuthError(`server returned status: ${res.status}`);
624
+ }
625
+ try {
626
+ const text = await res.text();
627
+ const response = await OAuthTokenResponse.parseAsync(JSON.parse(text));
628
+ const now = Date.now();
629
+ return {
630
+ access: response.access_token,
631
+ refresh: response.refresh_token,
632
+ refreshAt: now + 6e4,
633
+ expiresAt: now + response.expires_in * 1e3,
634
+ tokenType: response.token_type
635
+ };
636
+ } catch (error) {
637
+ throw new OAuthError("Invalid server response", { cause: error });
638
+ }
639
+ }
640
+ async getToken() {
641
+ if (this.token === null || Date.now() >= this.token.expiresAt) {
642
+ this.serverController?.abort();
643
+ this.serverController = new AbortController();
644
+ const serverTimeout = setTimeout(() => {
645
+ this.serverController?.abort();
646
+ this.serverController = null;
647
+ }, OAUTH_TIMEOUT_MILLIS);
648
+ this.serverController.signal.addEventListener("abort", () => {
649
+ clearTimeout(serverTimeout);
650
+ });
651
+ serve(this.app, {
652
+ port: 1270,
653
+ silent: true,
654
+ node: {
655
+ signal: this.serverController.signal
656
+ }
657
+ });
658
+ this.codeVerifier = crypto.getRandomValues(Buffer.alloc(32)).toString("base64url");
659
+ const codeChallenge = Buffer.from(
660
+ await crypto.subtle.digest(
661
+ "SHA-256",
662
+ Buffer.from(this.codeVerifier, "ascii")
663
+ )
664
+ ).toString("base64url");
665
+ const url = new URL("/oauth/authorize", CONSOLE_URL);
666
+ url.searchParams.set("client_id", OAUTH_CLIENT_ID);
667
+ url.searchParams.set("redirect_uri", "http://127.0.0.1:1270/oauth/mcp");
668
+ url.searchParams.set("response_type", "code");
669
+ url.searchParams.set(
670
+ "scope",
671
+ [
672
+ "HOME_AND_REPORT",
673
+ "CHANNEL_READ",
674
+ "CHANNEL_UPDATE",
675
+ "STORE_READ",
676
+ "MERCHANT_READ"
677
+ ].join(" ")
678
+ );
679
+ url.searchParams.set("code_challenge", codeChallenge);
680
+ url.searchParams.set("code_challenge_method", "S256");
681
+ await open(url.toString());
682
+ return {
683
+ state: "loginRequired",
684
+ url
426
685
  };
686
+ } else {
687
+ return {
688
+ state: "authorized",
689
+ authorization: `${this.token.tokenType} ${this.token.access}`
690
+ };
691
+ }
692
+ }
693
+ };
694
+ async function getToken(tokenProvider) {
695
+ const state = await tokenProvider.getToken();
696
+ return match4(state).returnType().with(
697
+ {
698
+ state: "loginRequired"
699
+ },
700
+ ({ url }) => ({
701
+ type: "error",
702
+ data: {
703
+ message: `\uB85C\uADF8\uC778\uC774 \uD544\uC694\uD569\uB2C8\uB2E4. \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uB85C\uADF8\uC778\uC744 \uC9C4\uD589\uD574\uC8FC\uC138\uC694. \uBE0C\uB77C\uC6B0\uC800\uAC00 \uC5F4\uB9AC\uC9C0 \uC54A\uC73C\uBA74 ${url} \uC5D0 \uC9C1\uC811 \uC811\uC18D\uD574\uC11C \uB85C\uADF8\uC778\uC744 \uC9C4\uD589\uD574\uC8FC\uC138\uC694.`
704
+ }
705
+ })
706
+ ).with(
707
+ {
708
+ state: "authorized"
709
+ },
710
+ ({ authorization }) => ({
711
+ type: "success",
712
+ data: authorization
713
+ })
714
+ ).exhaustive();
715
+ }
716
+
717
+ // src/tools/utils/result.ts
718
+ function toolErrorResult(error) {
719
+ return {
720
+ content: [
721
+ {
722
+ type: "text",
723
+ text: JSON.stringify(error.data, null, 2)
724
+ }
725
+ ],
726
+ isError: true
727
+ };
728
+ }
729
+
730
+ // src/tools/addTestChannel.ts
731
+ var name = "addTestChannel";
732
+ var InputSchema = z5.object({
733
+ mid: z5.string().describe("\uD14C\uC2A4\uD2B8 \uCC44\uB110\uC758 PG\uC0AC MID"),
734
+ manualConfirm: z5.boolean().optional().default(false).describe("\uC218\uB3D9 \uC2B9\uC778 \uC0AC\uC6A9 \uC5EC\uBD80")
735
+ });
736
+ var OutputSchema = z5.object({
737
+ channelKey: z5.string().describe("\uCD94\uAC00\uB41C \uCC44\uB110\uC758 \uCC44\uB110\uD0A4")
738
+ });
739
+ var config = {
740
+ title: "\uD3EC\uD2B8\uC6D0 \uD14C\uC2A4\uD2B8 \uCC44\uB110 \uCD94\uAC00",
741
+ description: `\uACE0\uAC1D\uC0AC\uC758 \uB300\uD45C\uC0C1\uC810\uC5D0 \uACF5\uC6A9 \uD14C\uC2A4\uD2B8 \uCC44\uB110\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4.
742
+
743
+ NOTE:
744
+ \uBC18\uB4DC\uC2DC listSharedTestChannels\uB97C \uD1B5\uD574 \uC5BB\uC740 MID\uB97C \uC0AC\uC6A9\uD558\uC138\uC694.`,
745
+ inputSchema: InputSchema.shape,
746
+ outputSchema: OutputSchema.shape
747
+ };
748
+ function init(tokenProvider, client) {
749
+ return async ({ mid, manualConfirm }) => {
750
+ const token = await getToken(tokenProvider);
751
+ if (token.type === "error") {
752
+ return toolErrorResult(token);
753
+ }
754
+ const authorization = token.data;
755
+ const stores = await listStores({
756
+ client,
757
+ authorization
758
+ });
759
+ if (stores.type === "error") {
760
+ return toolErrorResult(stores);
761
+ }
762
+ const storeId = stores.data.main?.plainId;
763
+ if (storeId == null) {
427
764
  return {
428
765
  content: [
429
766
  {
430
767
  type: "text",
431
- text: JSON.stringify(structuredContent, null, 2)
768
+ text: "\uB300\uD45C\uC0C1\uC810 \uC815\uBCF4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."
432
769
  }
433
770
  ],
434
- structuredContent
771
+ isError: true
435
772
  };
436
- } catch {
773
+ }
774
+ const list = await listV2SharedTestChannel({
775
+ authorization
776
+ });
777
+ if (list.type === "error") {
778
+ return toolErrorResult(list);
779
+ }
780
+ const channelToAdd = list.data.channels.find(
781
+ ({ pgMerchantId }) => pgMerchantId === mid
782
+ );
783
+ if (channelToAdd == null) {
437
784
  return {
438
785
  content: [
439
786
  {
440
787
  type: "text",
441
- text: `\uC11C\uBC84\uB85C\uBD80\uD130 \uC798\uBABB\uB41C \uC751\uB2F5 \uC218\uC2E0`
788
+ text: `${mid}\uC5D0 \uD574\uB2F9\uD558\uB294 \uD14C\uC2A4\uD2B8 \uCC44\uB110 \uC815\uBCF4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.`
442
789
  }
443
790
  ],
444
791
  isError: true
445
792
  };
446
793
  }
794
+ const add = await addChannel({
795
+ authorization,
796
+ channelType: "TEST",
797
+ manualConfirm,
798
+ ...channelToAdd,
799
+ storeId
800
+ });
801
+ if (add.type === "error") {
802
+ return toolErrorResult(add);
803
+ }
804
+ const structuredContent = add.data.channel;
805
+ return {
806
+ content: [
807
+ {
808
+ type: "text",
809
+ text: JSON.stringify(structuredContent, null, 2)
810
+ }
811
+ ],
812
+ structuredContent
813
+ };
447
814
  };
448
815
  }
449
816
 
450
- // src/tools/getIdentityVerificationsByFilter.ts
451
- var getIdentityVerificationsByFilter_exports = {};
452
- __export(getIdentityVerificationsByFilter_exports, {
817
+ // src/tools/getChannelsOfStore.ts
818
+ var getChannelsOfStore_exports = {};
819
+ __export(getChannelsOfStore_exports, {
453
820
  config: () => config2,
454
821
  init: () => init2,
455
822
  name: () => name2
456
823
  });
457
- import z3 from "zod";
458
-
459
- // src/tools/utils/mapping.ts
460
- function filterOutNone(obj) {
461
- return Object.fromEntries(
462
- Object.entries(obj).filter(([_, value]) => value !== void 0)
463
- );
464
- }
465
-
466
- // src/tools/getIdentityVerificationsByFilter.ts
467
- var IdentityVerificationTimeStamp = z3.enum([
468
- "REQUESTED_AT",
469
- "VERIFIED_AT",
470
- "FAILED_AT",
471
- "STATUS_UPDATED_AT"
472
- ]);
473
- var IdentityVerificationStatus = z3.enum(["READY", "VERIFIED", "FAILED"]);
474
- var Carrier = z3.enum(["SKT", "KT", "LGU", "SKT_MVNO", "KT_MVNO", "LGU_MVNO"]);
475
- var name2 = "getIdentityVerificationsByFilter";
476
- var config2 = {
477
- title: "\uD3EC\uD2B8\uC6D0 \uBCF8\uC778\uC778\uC99D \uB0B4\uC5ED \uAC80\uC0C9",
478
- description: `\uD3EC\uD2B8\uC6D0 \uC11C\uBC84\uC5D0\uC11C \uC8FC\uC5B4\uC9C4 \uC870\uAC74\uC744 \uBAA8\uB450 \uB9CC\uC871\uD558\uB294 \uBCF8\uC778\uC778\uC99D \uC815\uBCF4\uB97C \uAC80\uC0C9\uD569\uB2C8\uB2E4.
824
+ import z7 from "zod";
479
825
 
480
- Note:
481
- \uCD5C\uB300 10\uAC1C\uC758 \uACB0\uACFC\uB9CC \uBC18\uD658\uB429\uB2C8\uB2E4.
482
- UNAUTHORIZED \uC5D0\uB7EC\uC758 \uACBD\uC6B0 MCP \uC11C\uBC84\uC758 API_SECRET \uD658\uACBD\uBCC0\uC218 \uC124\uC815\uC774 \uC798\uBABB\uB418\uC5C8\uC744 \uAC00\uB2A5\uC131\uC774 \uC788\uC2B5\uB2C8\uB2E4.
483
- \uB0A0\uC9DC \uBC0F \uC2DC\uAC04 \uC815\uBCF4 \uC785\uCD9C\uB825 \uC2DC\uC5D0\uB294 \uBC18\uB4DC\uC2DC \uD0C0\uC784\uC874\uC744 \uBA85\uC2DC\uD569\uB2C8\uB2E4.`,
484
- inputSchema: {
485
- fromTime: z3.string().datetime({ offset: true }).describe("\uC870\uD68C \uC2DC\uC791 \uC2DC\uAC04 (ISO 8601 \uD615\uC2DD)"),
486
- untilTime: z3.string().datetime({ offset: true }).describe("\uC870\uD68C \uC885\uB8CC \uC2DC\uAC04 (ISO 8601 \uD615\uC2DD)"),
487
- pageIndex: z3.number().min(0).describe("\uAC80\uC0C9\uD560 \uD398\uC774\uC9C0 \uC704\uCE58\uC785\uB2C8\uB2E4. 0\uBD80\uD130 \uC2DC\uC791\uD569\uB2C8\uB2E4."),
488
- pageSize: z3.number().min(1).default(10).describe("\uD55C \uD398\uC774\uC9C0\uC5D0 \uBC18\uD658\uD560 \uACB0\uACFC\uC758 \uC218\uC785\uB2C8\uB2E4."),
489
- fields: z3.array(IdentityVerificationField).describe("\uAC80\uC0C9 \uACB0\uACFC\uB85C \uBC1B\uC744 \uD544\uB4DC \uBAA9\uB85D\uC785\uB2C8\uB2E4."),
490
- timestampType: IdentityVerificationTimeStamp.default(
491
- "STATUS_UPDATED_AT"
492
- ).describe(`\uC870\uD68C \uBC94\uC704\uC758 \uAE30\uC900\uC774 \uBCF8\uC778\uC778\uC99D\uC744 \uCC98\uC74C \uC2DC\uB3C4\uD55C \uC2DC\uAC01\uC774\uBA74 "REQUESTED_AT",
493
- \uBCF8\uC778\uC778\uC99D\uC774 \uC644\uB8CC\uB41C \uC2DC\uAC01\uC774\uBA74 "VERIFIED_AT", \uC2E4\uD328\uD55C \uC2DC\uAC01\uC774\uBA74 "FAILED_AT",
494
- \uB9C8\uC9C0\uB9C9\uC73C\uB85C \uC0C1\uD0DC\uAC00 \uBCC0\uACBD\uB41C \uC2DC\uAC01\uC774\uBA74 "STATUS_UPDATED_AT"\uC785\uB2C8\uB2E4.`),
495
- storeId: z3.string().optional().describe(
496
- "\uD558\uC704 \uC0C1\uC810\uC744 \uD3EC\uD568\uD55C \uD2B9\uC815 \uC0C1\uC810\uC758 \uC778\uC99D \uAC74\uB9CC\uC744 \uC870\uD68C\uD560 \uACBD\uC6B0\uC5D0\uB9CC \uC785\uB825\uD569\uB2C8\uB2E4. `store-id-{uuid}` \uD615\uC2DD\uC785\uB2C8\uB2E4."
497
- ),
498
- status: z3.array(IdentityVerificationStatus).optional().describe("\uD3EC\uD568\uD560 \uBCF8\uC778\uC778\uC99D \uC0C1\uD0DC \uBAA9\uB85D\uC785\uB2C8\uB2E4."),
499
- pgProvider: z3.array(PgProviderSchema).optional().describe("\uBCF8\uC778\uC778\uC99D\uC774 \uC77C\uC5B4\uB09C \uACB0\uC81C\uB300\uD589\uC0AC \uBAA9\uB85D\uC785\uB2C8\uB2E4."),
500
- version: z3.enum(["V1", "V2"]).optional().describe("\uD3EC\uD568\uD560 \uD3EC\uD2B8\uC6D0 \uBC84\uC804\uC785\uB2C8\uB2E4. \uBBF8\uC785\uB825 \uC2DC \uBAA8\uB450 \uAC80\uC0C9\uB429\uB2C8\uB2E4."),
501
- carrier: z3.array(Carrier).optional().describe("\uD3EC\uD568\uD560 \uD1B5\uC2E0\uC0AC \uBAA9\uB85D\uC785\uB2C8\uB2E4. MVNO\uB294 \uC54C\uB730\uD3F0\uC744 \uB73B\uD569\uB2C8\uB2E4."),
502
- customerName: z3.string().optional().describe("\uBC1C\uAE09\uC790\uC758 \uC131\uBA85 \uC77C\uBD80\uBD84\uC785\uB2C8\uB2E4."),
503
- pgMerchantId: z3.string().optional().describe("\uACB0\uC81C\uB300\uD589\uC0AC\uC5D0\uC11C \uC81C\uACF5\uD55C \uC0C1\uC810\uC544\uC774\uB514 (MID) \uC77C\uBD80\uBD84\uC785\uB2C8\uB2E4."),
504
- isTest: z3.boolean().default(true).describe(
505
- "\uD14C\uC2A4\uD2B8 \uC778\uC99D \uAC74\uC744 \uD3EC\uD568\uD560\uC9C0 \uC5EC\uBD80\uC785\uB2C8\uB2E4. \uBBF8\uC785\uB825 \uC2DC `true`\uC785\uB2C8\uB2E4."
506
- )
507
- },
508
- outputSchema: {
509
- items: z3.array(z3.object({}).passthrough()).describe("\uC870\uD68C\uB41C \uBCF8\uC778\uC778\uC99D \uAC74\uC758 \uBAA9\uB85D"),
510
- totalCount: z3.number().describe("\uC870\uAC74\uC5D0 \uB9DE\uB294 \uBCF8\uC778\uC778\uC99D \uAC74\uC758 \uCD1D \uAC1C\uC218")
511
- }
512
- };
513
- function init2(httpClient) {
514
- return async ({
515
- fromTime,
516
- untilTime,
517
- pageIndex,
518
- pageSize,
519
- fields,
520
- timestampType,
521
- storeId,
522
- status,
523
- pgProvider,
524
- carrier,
525
- customerName,
526
- version,
527
- pgMerchantId,
528
- isTest
529
- }) => {
530
- const searchFilter = filterOutNone({
531
- from: fromTime,
532
- until: untilTime,
533
- timeRangeField: timestampType,
534
- storeId,
535
- statuses: status,
536
- pgProviders: pgProvider,
537
- version,
538
- carriers: carrier,
539
- pgMerchantId,
540
- isTest,
541
- customer: filterOutNone({
542
- name: customerName
543
- })
826
+ // src/tools/request/listChannels.ts
827
+ import { match as match5, P as P4 } from "ts-pattern";
828
+ import z6 from "zod";
829
+ var StatusResponse3 = z6.object({
830
+ code: z6.unknown(),
831
+ message: z6.string(),
832
+ details: z6.unknown()
833
+ }).partial();
834
+ var ChannelResponse = z6.object({
835
+ channelId: z6.string(),
836
+ pgProvider: z6.string(),
837
+ channelType: z6.string(),
838
+ liveChannel: z6.object({
839
+ merchantId: z6.string(),
840
+ storeIds: z6.array(z6.string())
841
+ }).optional(),
842
+ merchantTestChannel: z6.object({
843
+ merchantId: z6.string()
844
+ }).optional(),
845
+ channelName: z6.string(),
846
+ pgMerchantId: z6.string(),
847
+ isForPayment: z6.boolean(),
848
+ isForIdentityCertification: z6.boolean(),
849
+ isFromV1UserPgs: z6.boolean(),
850
+ isFromV1SbcrUsers: z6.boolean(),
851
+ deleted: z6.boolean(),
852
+ boundAt: z6.string(),
853
+ modifiedAt: z6.string(),
854
+ taxType: z6.string().optional(),
855
+ channelKey: z6.string(),
856
+ pgCompany: z6.string(),
857
+ isSupportingV2: z6.boolean(),
858
+ manualConfirm: z6.boolean()
859
+ });
860
+ var ListChannelsResponse = z6.object({
861
+ channels: z6.array(ChannelResponse)
862
+ });
863
+ async function listChannels({
864
+ storeId,
865
+ authorization
866
+ }) {
867
+ try {
868
+ const url = new URL("/v2/channels", CHANNEL_SERVICE_URL);
869
+ url.searchParams.set("storeId", storeId);
870
+ const response = await fetch(url, {
871
+ method: "GET",
872
+ headers: {
873
+ Authorization: authorization,
874
+ "User-Agent": USER_AGENT
875
+ }
544
876
  });
545
- const response = await httpClient.get(
546
- `/identity-verifications?requestBody=${encodeURIComponent(
547
- JSON.stringify({
548
- filter: searchFilter,
549
- page: {
550
- number: pageIndex,
551
- size: pageSize
552
- }
553
- })
554
- )}`
555
- );
556
- if (!response.ok) {
557
- const text = await response.text();
558
- return { content: [{ type: "text", text }], isError: true };
559
- }
877
+ const text = await response.text();
560
878
  try {
561
- const data = await response.json();
562
- const maskedItems = filterFields(fields, data.items);
563
- const structuredContent = {
564
- items: maskedItems,
565
- totalCount: data.page.totalCount
879
+ const parsed = await ListChannelsResponse.or(StatusResponse3).parseAsync(
880
+ JSON.parse(text)
881
+ );
882
+ return match5(parsed).returnType().with({ channels: P4.nonNullable }, (success) => ({
883
+ type: "success",
884
+ data: success
885
+ })).otherwise(({ code, message, details }) => ({
886
+ type: "error",
887
+ data: {
888
+ message: message ?? "\uC0C1\uC810\uC758 \uCC44\uB110 \uC815\uBCF4\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.",
889
+ code,
890
+ details,
891
+ status: response.status
892
+ }
893
+ }));
894
+ } catch (parseError) {
895
+ return {
896
+ type: "error",
897
+ data: {
898
+ message: "\uC62C\uBC14\uB974\uC9C0 \uC54A\uC740 \uD615\uC2DD\uC758 \uC11C\uBC84 \uC751\uB2F5",
899
+ cause: parseError
900
+ }
566
901
  };
902
+ }
903
+ } catch (error) {
904
+ if (error instanceof Error) {
567
905
  return {
568
- content: [
569
- {
570
- type: "text",
571
- text: JSON.stringify(structuredContent, null, 2)
572
- }
573
- ],
574
- structuredContent
906
+ type: "error",
907
+ data: error
575
908
  };
576
- } catch {
909
+ } else {
577
910
  return {
578
- content: [{ type: "text", text: "\uC11C\uBC84\uB85C\uBD80\uD130 \uC798\uBABB\uB41C \uC751\uB2F5 \uC218\uC2E0" }],
579
- isError: true
911
+ type: "error",
912
+ data: {
913
+ message: "\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.",
914
+ cause: error
915
+ }
580
916
  };
581
917
  }
918
+ }
919
+ }
920
+
921
+ // src/tools/utils/filterFields.ts
922
+ function filterFields(fields, data) {
923
+ const withPrefixes = new Set(fields);
924
+ for (const field of fields) {
925
+ let searchPos = 0;
926
+ while (true) {
927
+ const dot = field.indexOf(".", searchPos);
928
+ if (dot === -1) break;
929
+ withPrefixes.add(field.slice(0, dot));
930
+ searchPos = dot + 1;
931
+ }
932
+ }
933
+ return filterFieldsPath(data, "");
934
+ function filterFieldsPath(data2, currentPath) {
935
+ return Object.fromEntries(
936
+ Object.entries(data2).flatMap(([key, value]) => {
937
+ const childPath = currentPath === "" ? key : `${currentPath}.${key}`;
938
+ if (withPrefixes.has(childPath)) {
939
+ if (Array.isArray(value)) {
940
+ return [
941
+ [
942
+ key,
943
+ value.map(
944
+ (item) => typeof item === "object" ? filterFieldsPath(item, childPath) : item
945
+ )
946
+ ]
947
+ ];
948
+ } else if (typeof value === "object") {
949
+ return [[key, filterFieldsPath(value, childPath)]];
950
+ } else {
951
+ return [[key, value]];
952
+ }
953
+ } else {
954
+ return [];
955
+ }
956
+ })
957
+ );
958
+ }
959
+ }
960
+
961
+ // src/tools/getChannelsOfStore.ts
962
+ var name2 = "getChannelsOfStore";
963
+ var Channel = z7.object({
964
+ id: z7.string().describe(
965
+ "\uCC44\uB110 ID\uB85C \uCC44\uB110 \uC218\uC815 \uC2DC\uB9C8\uB2E4 \uBCC0\uACBD\uB429\uB2C8\uB2E4. \uBAA8\uB4E0 \uACB0\uC81C\uAC74\uC740 \uCC44\uB110 ID\uC640 \uD5A0\uAED8 \uC800\uC7A5\uB418\uC5B4 \uCC44\uB110 \uC218\uC815 \uD6C4\uC5D0\uB3C4 \uC774\uC804 ID\uB97C \uC720\uC9C0\uD569\uB2C8\uB2E4."
966
+ ),
967
+ pg: z7.string().describe(
968
+ "PG\uC0AC \uACB0\uC81C \uBAA8\uB4C8\uC758 \uC2DD\uBCC4\uC790\uB85C, PG\uC0AC\uBCC4\uB85C \uC5EC\uB7EC \uBAA8\uB4C8\uC774 \uC788\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4."
969
+ ),
970
+ mid: z7.string().describe("PG\uC0AC\uC5D0\uC11C \uACE0\uAC1D\uC0AC\uB97C \uAD6C\uBD84\uD558\uAE30 \uC704\uD55C ID"),
971
+ name: z7.string().describe("\uCC44\uB110\uBA85"),
972
+ usage: z7.array(z7.enum(["PAYMENT", "IDENTITY"])).describe("\uCC44\uB110\uC744 \uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uC6A9\uB3C4"),
973
+ createdAt: z7.string().describe("\uC0DD\uC131 \uC2DC\uAC01"),
974
+ modifiedAt: z7.string().describe("\uB9C8\uC9C0\uB9C9 \uC218\uC815 \uC2DC\uAC01"),
975
+ taxType: z7.string().describe("\uC815\uC0B0 \uC2DC\uC5D0\uB9CC \uCC38\uACE0\uD558\uB294, MID\uC758 \uACFC\uC138 \uC815\uBCF4"),
976
+ key: z7.string().describe("\uCC44\uB110 \uD0A4"),
977
+ canV2: z7.boolean().describe("V2 \uC0AC\uC6A9 \uAC00\uB2A5 \uC5EC\uBD80"),
978
+ manualConfirm: z7.boolean().describe("\uC218\uB3D9 \uC2B9\uC778 (2-transaction) \uC0AC\uC6A9 \uC5EC\uBD80")
979
+ }).partial();
980
+ var InputSchema2 = z7.object({
981
+ store: z7.string().describe("\uCC44\uB110\uC744 \uAC80\uC0C9\uD560 \uC0C1\uC810\uC544\uC774\uB514"),
982
+ fields: Channel.keyof().array().describe("\uACB0\uACFC\uB85C \uBC1B\uC744 \uCC44\uB110 \uC815\uBCF4 \uBAA9\uB85D")
983
+ });
984
+ var OutputSchema2 = z7.object({
985
+ items: Channel.array().describe("\uC870\uD68C\uB41C \uCC44\uB110 \uBAA9\uB85D")
986
+ });
987
+ var config2 = {
988
+ title: "\uD3EC\uD2B8\uC6D0 \uC0C1\uC810 \uB0B4 \uCC44\uB110 \uBAA9\uB85D \uC870\uD68C",
989
+ description: "\uACE0\uAC1D\uC0AC\uC758 \uC0C1\uC810\uC5D0 \uC874\uC7AC\uD558\uB294 \uBAA8\uB4E0 \uCC44\uB110 \uC815\uBCF4\uB97C \uAC00\uC838\uC635\uB2C8\uB2E4.",
990
+ inputSchema: InputSchema2.shape,
991
+ outputSchema: OutputSchema2.shape
992
+ };
993
+ function init2(tokenProvider) {
994
+ return async ({ store, fields }) => {
995
+ const token = await getToken(tokenProvider);
996
+ if (token.type === "error") {
997
+ return toolErrorResult(token);
998
+ }
999
+ const list = await listChannels({
1000
+ storeId: store,
1001
+ authorization: token.data
1002
+ });
1003
+ if (list.type === "error") {
1004
+ return toolErrorResult(list);
1005
+ }
1006
+ const channels = list.data.channels.filter(({ deleted }) => !deleted).map(
1007
+ ({
1008
+ channelId,
1009
+ pgProvider,
1010
+ pgMerchantId,
1011
+ channelName,
1012
+ isForPayment,
1013
+ isForIdentityCertification,
1014
+ boundAt,
1015
+ modifiedAt,
1016
+ taxType,
1017
+ channelKey,
1018
+ isSupportingV2,
1019
+ manualConfirm
1020
+ }) => {
1021
+ const usage = [];
1022
+ if (isForPayment) usage.push("PAYMENT");
1023
+ if (isForIdentityCertification) usage.push("IDENTITY");
1024
+ return {
1025
+ id: channelId,
1026
+ pg: pgProvider,
1027
+ mid: pgMerchantId,
1028
+ name: channelName,
1029
+ usage,
1030
+ createdAt: boundAt,
1031
+ modifiedAt,
1032
+ taxType,
1033
+ key: channelKey,
1034
+ canV2: isSupportingV2,
1035
+ manualConfirm
1036
+ };
1037
+ }
1038
+ );
1039
+ const structuredContent = {
1040
+ items: channels.map((item) => filterFields(fields, item))
1041
+ };
1042
+ return {
1043
+ content: [
1044
+ {
1045
+ type: "text",
1046
+ text: JSON.stringify(structuredContent, null, 2)
1047
+ }
1048
+ ],
1049
+ structuredContent
1050
+ };
582
1051
  };
583
1052
  }
584
1053
 
585
- // src/tools/getPayment.ts
586
- var getPayment_exports = {};
587
- __export(getPayment_exports, {
1054
+ // src/tools/getDocsUrl.ts
1055
+ var getDocsUrl_exports = {};
1056
+ __export(getDocsUrl_exports, {
588
1057
  config: () => config3,
589
1058
  init: () => init3,
590
1059
  name: () => name3
591
1060
  });
592
- import z4 from "zod";
593
- var name3 = "getPayment";
1061
+ import z8 from "zod";
1062
+
1063
+ // src/tools/utils/docPathToUrl.ts
1064
+ function docPathToUrl(path) {
1065
+ if (path.startsWith("help/")) {
1066
+ return `${HELP_CENTER_URL}/category/${path.slice(5)}`;
1067
+ }
1068
+ return `${DEVELOPERS_URL}/${path}`;
1069
+ }
1070
+
1071
+ // src/tools/getDocsUrl.ts
1072
+ var name3 = "getPortoneDocsUrl";
1073
+ var OutputSchema3 = z8.object({
1074
+ url: z8.string().array().describe(
1075
+ "\uBB38\uC11C\uB97C \uC6F9\uC73C\uB85C \uC811\uADFC \uAC00\uB2A5\uD55C \uB9C1\uD06C\uAC00 \uC785\uB825\uD55C \uBB38\uC11C \uC21C\uC11C\uB300\uB85C \uC8FC\uC5B4\uC9D1\uB2C8\uB2E4."
1076
+ )
1077
+ });
594
1078
  var config3 = {
595
- title: "\uD3EC\uD2B8\uC6D0 \uACB0\uC81C \uC815\uBCF4 \uC870\uD68C",
596
- description: `\uACE0\uAC1D\uC0AC \uAC70\uB798\uBC88\uD638\uB85C \uD3EC\uD2B8\uC6D0 \uC11C\uBC84\uC5D0\uC11C \uACB0\uC81C \uB0B4\uC5ED\uC744 \uAC80\uC0C9\uD569\uB2C8\uB2E4. \uACE0\uAC1D\uC0AC \uAC70\uB798\uBC88\uD638\uB294 \uD3EC\uD2B8\uC6D0 V1\uC5D0\uC11C\uB294 merchant_uid\uC774\uBA70, V2\uC5D0\uC11C\uB294 paymentId\uC5D0 \uD574\uB2F9\uD569\uB2C8\uB2E4.`,
1079
+ title: "\uD3EC\uD2B8\uC6D0 \uBB38\uC11C \uC6F9 \uB9C1\uD06C \uC870\uD68C",
1080
+ description: `\uD3EC\uD2B8\uC6D0 \uAC1C\uBCC4 \uBB38\uC11C\uB4E4\uC758 \uACBD\uB85C\uB97C \uD1B5\uD574 \uD574\uB2F9 \uD3EC\uD2B8\uC6D0 \uBB38\uC11C\uC758 \uC6F9\uC73C\uB85C \uC811\uADFC \uAC00\uB2A5\uD55C \uB9C1\uD06C\uB97C \uAC00\uC838\uC635\uB2C8\uB2E4.
1081
+
1082
+ Note:
1083
+ \uBB38\uC11C\uAC00 1\uAC1C\uBFD0\uC778 \uACBD\uC6B0\uC5D0\uB294 readPortoneDoc\uC744 \uC0AC\uC6A9\uD558\uBA74 \uBB38\uC11C \uB0B4\uC6A9\uACFC \uBA54\uD0C0 \uC815\uBCF4\uB3C4 \uD68D\uB4DD\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.
1084
+ getPortoneDocsUrl\uC740 \uC5EC\uB7EC \uBB38\uC11C\uC758 \uB9C1\uD06C\uB97C \uAC00\uC838\uC62C \uC218 \uC788\uC2B5\uB2C8\uB2E4.`,
597
1085
  inputSchema: {
598
- paymentId: z4.string().describe("\uACE0\uAC1D\uC0AC\uC5D0\uC11C \uBC1C\uAE09\uD55C \uAC70\uB798\uBC88\uD638\uC785\uB2C8\uB2E4."),
599
- storeId: z4.string().optional().describe(
600
- "\uD558\uC704 \uC0C1\uC810\uC744 \uD3EC\uD568\uD55C \uD2B9\uC815 \uC0C1\uC810\uC758 \uACB0\uC81C \uAC74\uB9CC\uC744 \uC870\uD68C\uD560 \uACBD\uC6B0\uC5D0\uB9CC \uC785\uB825\uD569\uB2C8\uB2E4. `store-id-{uuid}` \uD615\uC2DD\uC785\uB2C8\uB2E4."
601
- )
1086
+ path: z8.string().array().describe("\uC77D\uC744 \uD3EC\uD2B8\uC6D0 \uBB38\uC11C\uB4E4\uC758 \uACBD\uB85C \uBAA9\uB85D")
602
1087
  },
603
- outputSchema: {
604
- result: z4.object({}).passthrough().describe("\uB9C8\uC2A4\uD0B9\uB41C \uACB0\uC81C \uC815\uBCF4")
605
- }
1088
+ outputSchema: OutputSchema3.shape
606
1089
  };
607
- function init3(httpClient) {
608
- return async ({ paymentId, storeId }) => {
609
- const params = new URLSearchParams();
610
- if (storeId) {
611
- params.set("storeId", storeId);
612
- }
613
- const url = `/payments/${paymentId}${params.toString() ? `?${params.toString()}` : ""}`;
614
- try {
615
- const response = await httpClient.get(url);
616
- if (!response.ok) {
617
- const errorText = await response.text();
618
- return {
619
- content: [
620
- {
621
- type: "text",
622
- text: errorText
623
- }
624
- ],
625
- isError: true
626
- };
1090
+ function init3(documents) {
1091
+ return ({ path: paths }) => {
1092
+ const { markdownDocs } = documents;
1093
+ const found = [];
1094
+ const notFound = [];
1095
+ for (const path of paths) {
1096
+ if (path in markdownDocs) {
1097
+ found.push(docPathToUrl(markdownDocs[path].path));
1098
+ } else {
1099
+ notFound.push(path);
627
1100
  }
628
- const data = await response.json();
629
- const maskedData = filterFields(PAYMENT_FIELDS, data);
630
- const structuredContent = {
631
- result: maskedData
632
- };
633
- return {
634
- content: [
635
- {
636
- type: "text",
637
- text: JSON.stringify(structuredContent, null, 2)
638
- }
639
- ],
640
- structuredContent
641
- };
642
- } catch {
1101
+ }
1102
+ if (notFound.length > 0) {
643
1103
  return {
644
1104
  content: [
645
1105
  {
646
1106
  type: "text",
647
- text: `\uC11C\uBC84\uB85C\uBD80\uD130 \uC798\uBABB\uB41C \uC751\uB2F5 \uC218\uC2E0`
1107
+ text: `Document not found at paths: ${notFound}`
648
1108
  }
649
1109
  ],
650
1110
  isError: true
651
1111
  };
652
1112
  }
653
- };
1113
+ const structuredContent = {
1114
+ url: found
1115
+ };
1116
+ return {
1117
+ content: [
1118
+ {
1119
+ type: "text",
1120
+ text: JSON.stringify(structuredContent, null, 2)
1121
+ }
1122
+ ],
1123
+ structuredContent
1124
+ };
1125
+ };
1126
+ }
1127
+
1128
+ // src/tools/getPaymentsByFilter.ts
1129
+ var getPaymentsByFilter_exports = {};
1130
+ __export(getPaymentsByFilter_exports, {
1131
+ config: () => config4,
1132
+ init: () => init4,
1133
+ name: () => name4
1134
+ });
1135
+ import z10 from "zod";
1136
+
1137
+ // src/tools/request/getPaymentsByFilter.ts
1138
+ import { parse as parse2 } from "graphql";
1139
+ import { gql as gql2 } from "graphql-request";
1140
+ import { match as match6, P as P5 } from "ts-pattern";
1141
+ import z9 from "zod";
1142
+
1143
+ // src/tools/utils/nullableObject.ts
1144
+ function nullableObject(shape) {
1145
+ return Object.fromEntries(
1146
+ Object.entries(shape).map(([key, value]) => [key, value.nullable()])
1147
+ );
1148
+ }
1149
+
1150
+ // src/tools/request/getPaymentsByFilter.ts
1151
+ var ErrorResponse2 = z9.object({
1152
+ __typename: z9.string(),
1153
+ message: z9.string().nullable()
1154
+ });
1155
+ var PageResponse = z9.object({
1156
+ totalCount: z9.number()
1157
+ });
1158
+ var PaymentResponse = z9.object(
1159
+ nullableObject({
1160
+ amount: z9.object(
1161
+ nullableObject({
1162
+ total: z9.number(),
1163
+ taxFree: z9.number(),
1164
+ vat: z9.number(),
1165
+ supply: z9.number(),
1166
+ discount: z9.number(),
1167
+ paid: z9.number(),
1168
+ cancelled: z9.number(),
1169
+ cancelledTaxFree: z9.number(),
1170
+ cardDiscount: z9.number(),
1171
+ easyPayDiscount: z9.number(),
1172
+ promotionDiscount: z9.number(),
1173
+ currentDiscount: z9.number(),
1174
+ cancellable: z9.number()
1175
+ })
1176
+ ),
1177
+ billingKey: z9.string(),
1178
+ channel: z9.object(
1179
+ nullableObject({
1180
+ type: z9.string(),
1181
+ id: z9.string(),
1182
+ key: z9.string(),
1183
+ name: z9.string(),
1184
+ pgProvider: z9.string(),
1185
+ pgMerchantId: z9.string()
1186
+ })
1187
+ ),
1188
+ channelGroup: z9.object(
1189
+ nullableObject({
1190
+ plainId: z9.string(),
1191
+ name: z9.string(),
1192
+ isForTest: z9.boolean()
1193
+ })
1194
+ ),
1195
+ currency: z9.string(),
1196
+ customer: z9.object(
1197
+ nullableObject({
1198
+ id: z9.string()
1199
+ })
1200
+ ),
1201
+ histories: z9.array(
1202
+ z9.object(
1203
+ nullableObject({
1204
+ status: z9.string(),
1205
+ statusChangedAt: z9.string(),
1206
+ paid: z9.number(),
1207
+ cancelled: z9.number(),
1208
+ partialCancelled: z9.number()
1209
+ })
1210
+ )
1211
+ ),
1212
+ lastWebhookStatus: z9.string(),
1213
+ orderName: z9.string(),
1214
+ transactionId: z9.string(),
1215
+ scheduleId: z9.string(),
1216
+ requestedAt: z9.string(),
1217
+ plainId: z9.string(),
1218
+ methodTypes: z9.array(z9.string()),
1219
+ storeId: z9.string()
1220
+ })
1221
+ );
1222
+ var PaymentsResponse = z9.object({
1223
+ items: z9.array(PaymentResponse),
1224
+ page: PageResponse
1225
+ }).or(ErrorResponse2);
1226
+ var GetPaymentsByFilterResponse = z9.object({
1227
+ merchant: z9.object({
1228
+ store: z9.object({
1229
+ payments: PaymentsResponse
1230
+ }).or(ErrorResponse2)
1231
+ }).or(
1232
+ z9.object({
1233
+ payments: PaymentsResponse
1234
+ })
1235
+ ).or(ErrorResponse2)
1236
+ }).transform(({ merchant }) => {
1237
+ if ("__typename" in merchant) return merchant;
1238
+ if ("store" in merchant) {
1239
+ if ("__typename" in merchant.store) return merchant.store;
1240
+ return merchant.store.payments;
1241
+ } else {
1242
+ return merchant.payments;
1243
+ }
1244
+ });
1245
+ var getPaymentsByFilterQuery = parse2(gql2`
1246
+ query GetPaymentsByFilter(
1247
+ $storeId: ID
1248
+ $page: PageInput
1249
+ $sort: PaymentSortInput
1250
+ $filter: PaymentFilterInputV2Input
1251
+ $includeMerchantPayment: Boolean!
1252
+ $includeStorePayment: Boolean!
1253
+ ) {
1254
+ merchant {
1255
+ ...ErrorFragment
1256
+ ... on Merchant {
1257
+ payments(page: $page, sort: $sort, filter: $filter) @include(if: $includeMerchantPayment) {
1258
+ ...ErrorFragment
1259
+ ...PaymentFragment
1260
+ }
1261
+ store(id: $storeId) {
1262
+ ...ErrorFragment
1263
+ ... on Store {
1264
+ payments(page: $page, sort: $sort, filter: $filter) @include(if: $includeStorePayment) {
1265
+ ...ErrorFragment
1266
+ ...PaymentFragment
1267
+ }
1268
+ }
1269
+ }
1270
+ }
1271
+ }
1272
+ }
1273
+
1274
+ fragment ErrorFragment on Error {
1275
+ __typename
1276
+ message
1277
+ }
1278
+
1279
+ fragment PaymentFragment on PaymentsPayload {
1280
+ items {
1281
+ amount {
1282
+ total
1283
+ taxFree
1284
+ vat
1285
+ supply
1286
+ discount
1287
+ paid
1288
+ cancelled
1289
+ cancelledTaxFree
1290
+ cardDiscount
1291
+ easyPayDiscount
1292
+ promotionDiscount
1293
+ currentDiscount
1294
+ cancellable
1295
+ }
1296
+ billingKey
1297
+ channel {
1298
+ type
1299
+ id
1300
+ key
1301
+ name
1302
+ pgProvider
1303
+ pgMerchantId
1304
+ }
1305
+ channelGroup {
1306
+ plainId
1307
+ name
1308
+ isForTest
1309
+ }
1310
+ currency
1311
+ customer {
1312
+ id
1313
+ }
1314
+ histories {
1315
+ status
1316
+ statusChangedAt
1317
+ paid
1318
+ cancelled
1319
+ partialCancelled
1320
+ }
1321
+ lastWebhookStatus
1322
+ orderName
1323
+ transactionId
1324
+ storeId
1325
+ scheduleId
1326
+ requestedAt
1327
+ plainId
1328
+ methodTypes
1329
+ }
1330
+ page {
1331
+ totalCount
1332
+ }
654
1333
  }
655
-
656
- // src/tools/getPaymentsByFilter.ts
657
- var getPaymentsByFilter_exports = {};
658
- __export(getPaymentsByFilter_exports, {
659
- config: () => config4,
660
- init: () => init4,
661
- name: () => name4
662
- });
663
- import z5 from "zod";
664
- var PaymentTimeRangeField = z5.enum(["CREATED_AT", "STATUS_CHANGED_AT"]);
665
- var PaymentStatus = z5.enum([
1334
+ `);
1335
+ var PaymentSortBy = z9.enum(["REQUESTED_AT", "STATUS_CHANGED_AT"]);
1336
+ var PaymentStatus = z9.enum([
666
1337
  "READY",
667
1338
  "PENDING",
668
1339
  "VIRTUAL_ACCOUNT_ISSUED",
@@ -671,117 +1342,365 @@ var PaymentStatus = z5.enum([
671
1342
  "PARTIAL_CANCELLED",
672
1343
  "CANCELLED"
673
1344
  ]);
674
- var PaymentMethodType = z5.enum([
1345
+ var PaymentType = z9.enum(["NORMAL", "SCHEDULE"]);
1346
+ var PaymentMethodDetailType = z9.enum([
675
1347
  "CARD",
676
1348
  "TRANSFER",
677
1349
  "VIRTUAL_ACCOUNT",
678
1350
  "GIFT_CERTIFICATE",
679
1351
  "MOBILE",
680
1352
  "EASY_PAY",
681
- "CONVENIENCE_STORE"
1353
+ "CONVENIENCE_STORE",
1354
+ "POINT"
1355
+ ]);
1356
+ var PgProvider = z9.enum([
1357
+ "HTML5_INICIS",
1358
+ "PAYPAL",
1359
+ "PAYPAL_V2",
1360
+ "INICIS",
1361
+ "DANAL",
1362
+ "NICE",
1363
+ "DANAL_TPAY",
1364
+ "JTNET",
1365
+ "UPLUS",
1366
+ "NAVERPAY",
1367
+ "KAKAO",
1368
+ "SETTLE",
1369
+ "KCP",
1370
+ "MOBILIANS",
1371
+ "KAKAOPAY",
1372
+ "NAVERCO",
1373
+ "SYRUP",
1374
+ "KICC",
1375
+ "EXIMBAY",
1376
+ "SMILEPAY",
1377
+ "PAYCO",
1378
+ "KCP_BILLING",
1379
+ "ALIPAY",
1380
+ "PAYPLE",
1381
+ "CHAI",
1382
+ "BLUEWALNUT",
1383
+ "SMARTRO",
1384
+ "SMARTRO_V2",
1385
+ "PAYMENTWALL",
1386
+ "TOSSPAYMENTS",
1387
+ "KCP_QUICK",
1388
+ "DAOU",
1389
+ "GALAXIA",
1390
+ "TOSSPAY",
1391
+ "KCP_DIRECT",
1392
+ "SETTLE_ACC",
1393
+ "SETTLE_FIRM",
1394
+ "INICIS_UNIFIED",
1395
+ "KSNET",
1396
+ "PINPAY",
1397
+ "NICE_V2",
1398
+ "TOSS_BRANDPAY",
1399
+ "WELCOME",
1400
+ "TOSSPAY_V2",
1401
+ "INICIS_V2",
1402
+ "KPN",
1403
+ "KCP_V2",
1404
+ "HYPHEN",
1405
+ "EXIMBAY_V2",
1406
+ "INICIS_JP",
1407
+ "PAYLETTER_GLOBAL"
682
1408
  ]);
1409
+ var SelectedChannelType = z9.enum(["LIVE", "TEST"]);
1410
+ var PaymentWebhookStatus = z9.enum([
1411
+ "SUCCEEDED",
1412
+ "FAILED_NOT_OK_RESPONSE",
1413
+ "FAILED_UNEXPECTED_ERROR"
1414
+ ]);
1415
+ var TimestampType = z9.enum(["CREATED_AT", "STATUS_CHANGED_AT"]);
1416
+ var PaymentFilter = z9.object({
1417
+ timestampType: TimestampType.optional(),
1418
+ from: z9.string(),
1419
+ until: z9.string(),
1420
+ statuses: z9.array(PaymentStatus).optional(),
1421
+ types: z9.array(PaymentType).optional(),
1422
+ methods: z9.array(PaymentMethodDetailType).optional(),
1423
+ pgProviders: z9.array(PgProvider).optional(),
1424
+ channelTypes: z9.array(SelectedChannelType).optional(),
1425
+ currencies: z9.array(z9.string()).optional(),
1426
+ lastWebhookStatuses: z9.array(PaymentWebhookStatus).optional(),
1427
+ textSearch: z9.object({
1428
+ id: z9.string(),
1429
+ orderName: z9.string()
1430
+ }).partial()
1431
+ });
1432
+ async function getPaymentsByFilter({
1433
+ client,
1434
+ authorization,
1435
+ id,
1436
+ page,
1437
+ pageSize,
1438
+ sortBy,
1439
+ isDescending,
1440
+ filter
1441
+ }) {
1442
+ try {
1443
+ const response = await client.request({
1444
+ document: getPaymentsByFilterQuery,
1445
+ requestHeaders: {
1446
+ authorization
1447
+ },
1448
+ variables: {
1449
+ storeId: id,
1450
+ page: {
1451
+ number: page,
1452
+ size: pageSize
1453
+ },
1454
+ sort: {
1455
+ by: sortBy,
1456
+ order: isDescending === true ? "DESC" : "ASC"
1457
+ },
1458
+ filter,
1459
+ includeMerchantPayment: id == null,
1460
+ includeStorePayment: id != null
1461
+ }
1462
+ });
1463
+ const parsed = await GetPaymentsByFilterResponse.parseAsync(response);
1464
+ return match6(parsed).returnType().with({ __typename: P5.nonNullable }, ({ __typename, message }) => ({
1465
+ type: "error",
1466
+ data: {
1467
+ message,
1468
+ type: __typename
1469
+ }
1470
+ })).otherwise((stores) => ({
1471
+ type: "success",
1472
+ data: stores
1473
+ }));
1474
+ } catch (error) {
1475
+ if (error instanceof Error) {
1476
+ return {
1477
+ type: "error",
1478
+ data: error
1479
+ };
1480
+ } else {
1481
+ return {
1482
+ type: "error",
1483
+ data: {
1484
+ message: `\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4.`,
1485
+ cause: error
1486
+ }
1487
+ };
1488
+ }
1489
+ }
1490
+ }
1491
+
1492
+ // src/tools/getPaymentsByFilter.ts
683
1493
  var name4 = "getPaymentsByFilter";
1494
+ var Amount = z10.object({
1495
+ total: z10.number().describe("\uCD1D \uAE08\uC561"),
1496
+ taxFree: z10.number().describe("\uBA74\uC138 \uAE08\uC561"),
1497
+ vat: z10.number().describe("\uBD80\uAC00\uC138"),
1498
+ supply: z10.number().describe("\uACF5\uAE09\uAC00\uC561"),
1499
+ dc: z10.number().describe("\uD560\uC778\uC561"),
1500
+ cancel: z10.number().describe("\uCD1D \uCDE8\uC18C\uC561"),
1501
+ taxFreeCancel: z10.number().describe("\uBA74\uC138 \uCDE8\uC18C\uC561"),
1502
+ cardDc: z10.number().describe("\uCE74\uB4DC\uC0AC \uD560\uC778\uC561"),
1503
+ easyDc: z10.number().describe("\uAC04\uD3B8\uACB0\uC81C \uD560\uC778\uC561"),
1504
+ promotionDc: z10.number().describe("\uD504\uB85C\uBAA8\uC158 \uD560\uC778\uC561"),
1505
+ balance: z10.number().describe("\uCDE8\uC18C \uAC00\uB2A5 \uC794\uC561")
1506
+ }).partial();
1507
+ var AmountFields = Object.keys(Amount.shape);
1508
+ var Channel2 = z10.object({
1509
+ type: z10.string().describe("\uCC44\uB110 \uC2E4\uC5F0\uB3D9 \uC885\uB958"),
1510
+ id: z10.string().describe("\uCC44\uB110 ID. \uCC44\uB110\uC744 \uC218\uC815\uD558\uBA74 \uCC44\uB110 ID\uAC00 \uBCC0\uACBD\uB418\uBA70 \uCC44\uB110\uD0A4\uB294 \uC720\uC9C0\uB428."),
1511
+ key: z10.string().describe("\uCC44\uB110\uD0A4"),
1512
+ name: z10.string().describe("\uCC44\uB110\uBA85"),
1513
+ pg: z10.string().describe("PG\uC0AC \uBAA8\uB4C8"),
1514
+ mid: z10.string().describe("PG\uC0AC MID")
1515
+ }).partial();
1516
+ var ChannelFields = Object.keys(Channel2.shape);
1517
+ var ChannelGroup = z10.object({
1518
+ id: z10.string().describe("\uCC44\uB110 \uADF8\uB8F9 ID"),
1519
+ name: z10.string().describe("\uADF8\uB8F9\uBA85"),
1520
+ test: z10.boolean().describe("\uD14C\uC2A4\uD2B8 \uC5EC\uBD80")
1521
+ }).partial();
1522
+ var ChannelGroupFields = Object.keys(ChannelGroup.shape);
1523
+ var History = z10.object({
1524
+ status: z10.string().describe("\uAC70\uB798 \uC0C1\uD0DC"),
1525
+ changedAt: z10.string().describe("\uC0C1\uD0DC \uBCC0\uACBD \uC2DC\uAC01"),
1526
+ paid: z10.number().describe("\uACB0\uC81C\uC561"),
1527
+ cancel: z10.number().describe("\uCDE8\uC18C\uC561")
1528
+ }).partial();
1529
+ var HistoryFields = Object.keys(History.shape);
1530
+ var Payment = z10.object({
1531
+ amount: Amount.describe("\uAE08\uC561 \uC815\uBCF4"),
1532
+ billKey: z10.string().describe("\uC0AC\uC6A9\uB41C \uBE4C\uB9C1\uD0A4"),
1533
+ channel: Channel2.describe("\uACB0\uC81C \uB2F9\uC2DC \uC120\uD0DD\uB41C \uCC44\uB110 \uC815\uBCF4"),
1534
+ group: ChannelGroup.describe("\uCC44\uB110 \uADF8\uB8F9 \uC815\uBCF4"),
1535
+ currency: z10.string().describe("\uACB0\uC81C \uD1B5\uD654"),
1536
+ customer: z10.string().describe("\uACE0\uAC1D ID"),
1537
+ history: History.array().describe("\uACB0\uC81C \uC0C1\uD0DC \uBCC0\uACBD \uAE30\uB85D"),
1538
+ webhook: z10.string().describe("\uB9C8\uC9C0\uB9C9 \uC6F9\uD6C5 \uC218\uC2E0 \uACB0\uACFC"),
1539
+ order: z10.string().describe("\uC8FC\uBB38\uBA85"),
1540
+ txId: z10.string().describe("\uD3EC\uD2B8\uC6D0 \uAC70\uB798\uBC88\uD638 (V1\uC5D0\uC11C\uB294 imp_uid)"),
1541
+ storeId: z10.string().describe("\uAC70\uB798 \uBC1C\uC0DD \uC0C1\uC810\uC544\uC774\uB514"),
1542
+ schedule: z10.string().describe("\uACB0\uC81C \uC608\uC57D ID"),
1543
+ requestAt: z10.string().describe("\uACB0\uC81C \uC694\uCCAD \uC2DC\uAC01"),
1544
+ paymentId: z10.string().describe("\uACE0\uAC1D\uC0AC \uAC70\uB798\uBC88\uD638 (V1\uC5D0\uC11C\uB294 merchant_uid)"),
1545
+ method: z10.string().array().describe("\uC0AC\uC6A9\uB41C \uACB0\uC81C\uC218\uB2E8 \uBAA9\uB85D")
1546
+ }).partial();
1547
+ var PaymentFields = Object.keys(Payment.shape).concat(AmountFields.map((key) => `amount.${key}`)).concat(ChannelFields.map((key) => `channel.${key}`)).concat(ChannelGroupFields.map((key) => `group.${key}`)).concat(HistoryFields.map((key) => `history.${key}`));
1548
+ var OutputSchema4 = z10.object({
1549
+ items: Payment.array().describe("\uC870\uD68C\uB41C \uACB0\uC81C \uBAA9\uB85D"),
1550
+ count: z10.number().describe("\uD398\uC774\uC9C0\uC640 \uAD00\uACC4\uC5C6\uC774 \uC870\uAC74\uC5D0 \uB9DE\uB294 \uACB0\uC81C \uCD1D \uAC1C\uC218")
1551
+ });
1552
+ var InputSchema3 = z10.object({
1553
+ from: z10.string().datetime({ offset: true }).describe("\uC870\uD68C \uC2DC\uC791 \uC2DC\uAC04 (ISO 8601 \uD615\uC2DD)"),
1554
+ to: z10.string().datetime({ offset: true }).describe("\uC870\uD68C \uC885\uB8CC \uC2DC\uAC04 (ISO 8601 \uD615\uC2DD)"),
1555
+ timeType: TimestampType.describe("from, to\uB85C \uC81C\uC57D\uD560 \uACB0\uC81C\uAC74\uC758 \uAE30\uC900 \uC2DC\uAC01 \uC870\uAC74"),
1556
+ page: z10.number().min(0).describe("\uAC80\uC0C9\uD560 \uD398\uC774\uC9C0 \uC704\uCE58\uC785\uB2C8\uB2E4. 0\uBD80\uD130 \uC2DC\uC791\uD569\uB2C8\uB2E4."),
1557
+ pageSize: z10.number().min(1).default(10).describe("\uD55C \uD398\uC774\uC9C0\uC5D0 \uBC18\uD658\uD560 \uACB0\uACFC\uC758 \uC218"),
1558
+ status: z10.array(PaymentStatus).optional().describe("\uD3EC\uD568\uD560 \uACB0\uC81C \uC0C1\uD0DC \uBAA9\uB85D"),
1559
+ types: PaymentType.array().optional().describe("\uC77C\uBC18 / \uC815\uAE30\uACB0\uC81C \uC5EC\uBD80"),
1560
+ method: PaymentMethodDetailType.array().optional().describe("\uD3EC\uD568\uD560 \uACB0\uC81C\uC218\uB2E8 \uBAA9\uB85D"),
1561
+ pg: PgProvider.array().optional().describe("\uD3EC\uD568\uD560 PG\uC0AC \uBAA8\uB4C8 \uBAA9\uB85D"),
1562
+ channel: SelectedChannelType.array().optional().describe("\uC2E4\uC5F0\uB3D9 \uBC0F \uD14C\uC2A4\uD2B8 \uD3EC\uD568 \uBAA9\uB85D"),
1563
+ currency: z10.string().length(3).toUpperCase().array().optional().describe("\uD3EC\uD568\uD560 \uD1B5\uD654 \uBAA9\uB85D, \uC138 \uC790\uB9AC \uD1B5\uD654 \uCF54\uB4DC"),
1564
+ webhook: PaymentWebhookStatus.array().optional().describe("\uD3EC\uD568\uD560 \uACB0\uC81C\uAC74\uC758 \uC6F9\uD6C5 \uC0C1\uD0DC \uBAA9\uB85D"),
1565
+ id: z10.string().optional().describe("paymentId / txId / imp_uid / merchant_uid \uAC80\uC0C9 \uD544\uB4DC"),
1566
+ order: z10.string().optional().describe("\uACB0\uC81C\uAC74\uC758 \uC8FC\uBB38\uBA85"),
1567
+ fields: z10.enum(PaymentFields).array().describe("\uAC80\uC0C9 \uACB0\uACFC\uB85C \uBC1B\uC744 \uD544\uB4DC \uBAA9\uB85D\uC785\uB2C8\uB2E4.")
1568
+ });
684
1569
  var config4 = {
685
1570
  title: "\uD3EC\uD2B8\uC6D0 \uACB0\uC81C \uB0B4\uC5ED \uAC80\uC0C9",
686
- description: `\uD3EC\uD2B8\uC6D0 \uC11C\uBC84\uC5D0\uC11C \uC8FC\uC5B4\uC9C4 \uC870\uAC74\uC744 \uBAA8\uB450 \uB9CC\uC871\uD558\uB294 \uACB0\uC81C \uB0B4\uC5ED\uC744 \uCD5C\uB300 10\uAC1C\uAE4C\uC9C0 \uAC80\uC0C9\uD569\uB2C8\uB2E4.
1571
+ description: `\uD3EC\uD2B8\uC6D0 \uC11C\uBC84\uC5D0\uC11C \uC8FC\uC5B4\uC9C4 \uC870\uAC74\uC744 \uBAA8\uB450 \uB9CC\uC871\uD558\uB294 \uACB0\uC81C \uB0B4\uC5ED\uC744 \uAC80\uC0C9\uD569\uB2C8\uB2E4.
687
1572
 
688
1573
  Note:
689
- UNAUTHORIZED \uC5D0\uB7EC\uC758 \uACBD\uC6B0 MCP \uC11C\uBC84\uC758 API_SECRET \uD658\uACBD\uBCC0\uC218 \uC124\uC815\uC774 \uC798\uBABB\uB418\uC5C8\uC744 \uAC00\uB2A5\uC131\uC774 \uC788\uC2B5\uB2C8\uB2E4.
690
1574
  \uC18C\uBB38\uC790 imp_ \uD639\uC740 imps_ \uB85C \uC2DC\uC791\uD558\uB294 \uAC70\uB798\uBC88\uD638\uB294 \uACE0\uAC1D\uC0AC \uAC70\uB798\uBC88\uD638\uAC00 \uC544\uB2CC V1 \uD3EC\uD2B8\uC6D0 \uAC70\uB798\uBC88\uD638(imp_uid)\uC77C \uAC00\uB2A5\uC131\uC774 \uC788\uC2B5\uB2C8\uB2E4.
691
1575
  \uB0A0\uC9DC \uBC0F \uC2DC\uAC04 \uC815\uBCF4 \uC785\uCD9C\uB825 \uC2DC\uC5D0\uB294 \uBC18\uB4DC\uC2DC \uD0C0\uC784\uC874\uC744 \uBA85\uC2DC\uD569\uB2C8\uB2E4.`,
692
- inputSchema: {
693
- fromTime: z5.string().datetime({ offset: true }).describe("\uC870\uD68C \uC2DC\uC791 \uC2DC\uAC04 (ISO 8601 \uD615\uC2DD)"),
694
- untilTime: z5.string().datetime({ offset: true }).describe("\uC870\uD68C \uC885\uB8CC \uC2DC\uAC04 (ISO 8601 \uD615\uC2DD)"),
695
- pageIndex: z5.number().min(0).describe("\uAC80\uC0C9\uD560 \uD398\uC774\uC9C0 \uC704\uCE58\uC785\uB2C8\uB2E4. 0\uBD80\uD130 \uC2DC\uC791\uD569\uB2C8\uB2E4."),
696
- pageSize: z5.number().min(1).default(10).describe("\uD55C \uD398\uC774\uC9C0\uC5D0 \uBC18\uD658\uD560 \uACB0\uACFC\uC758 \uC218\uC785\uB2C8\uB2E4."),
697
- fields: z5.array(PaymentField).describe("\uAC80\uC0C9 \uACB0\uACFC\uB85C \uBC1B\uC744 \uD544\uB4DC \uBAA9\uB85D\uC785\uB2C8\uB2E4."),
698
- timestampType: PaymentTimeRangeField.optional().default("STATUS_CHANGED_AT").describe(`\uC870\uD68C \uBC94\uC704\uAC00 \uACB0\uC81C\uB97C \uCC98\uC74C \uC2DC\uB3C4\uD55C \uC2DC\uAC01 \uAE30\uC900\uC774\uBA74 "CREATED_AT",
699
- \uB9C8\uC9C0\uB9C9\uC73C\uB85C \uACB0\uC81C \uC0C1\uD0DC\uAC00 \uBCC0\uACBD\uB41C \uC2DC\uAC01 \uAE30\uC900\uC774\uBA74 "STATUS_CHANGED_AT"\uC785\uB2C8\uB2E4.
700
- \uBBF8\uC785\uB825 \uC2DC "STATUS_CHANGED_AT"\uC785\uB2C8\uB2E4.`),
701
- storeId: z5.string().optional().describe(
702
- "\uD558\uC704 \uC0C1\uC810\uC744 \uD3EC\uD568\uD55C \uD2B9\uC815 \uC0C1\uC810\uC758 \uACB0\uC81C \uAC74\uB9CC\uC744 \uC870\uD68C\uD560 \uACBD\uC6B0\uC5D0\uB9CC \uC785\uB825\uD569\uB2C8\uB2E4. `store-id-{uuid}` \uD615\uC2DD\uC785\uB2C8\uB2E4."
703
- ),
704
- status: z5.array(PaymentStatus).optional().describe("\uD3EC\uD568\uD560 \uACB0\uC81C \uC0C1\uD0DC \uBAA9\uB85D\uC785\uB2C8\uB2E4."),
705
- methods: z5.array(PaymentMethodType).optional().describe("\uD3EC\uD568\uD560 \uACB0\uC81C \uC218\uB2E8 \uBAA9\uB85D\uC785\uB2C8\uB2E4."),
706
- pgProvider: z5.array(PgProviderSchema).optional().describe("\uD3EC\uD568\uD560 \uACB0\uC81C\uAC00 \uC77C\uC5B4\uB09C \uACB0\uC81C\uB300\uD589\uC0AC \uBAA9\uB85D\uC785\uB2C8\uB2E4."),
707
- isTest: z5.boolean().optional().default(true).describe("\uD14C\uC2A4\uD2B8 \uACB0\uC81C\uB97C \uD3EC\uD568\uD560\uC9C0 \uC5EC\uBD80\uC785\uB2C8\uB2E4. \uBBF8\uC785\uB825 \uC2DC `true`\uC785\uB2C8\uB2E4."),
708
- version: z5.enum(["V1", "V2"]).optional().describe("\uD3EC\uD568\uD560 \uD3EC\uD2B8\uC6D0 \uBC84\uC804\uC785\uB2C8\uB2E4. \uBBF8\uC785\uB825 \uC2DC \uBAA8\uB450 \uAC80\uC0C9\uB429\uB2C8\uB2E4."),
709
- currency: z5.string().optional().describe("\uD3EC\uD568\uD560 \uACB0\uC81C \uD1B5\uD654\uB97C \uB098\uD0C0\uB0B4\uB294 \uC138 \uC790\uB9AC \uD1B5\uD654 \uCF54\uB4DC\uC785\uB2C8\uB2E4."),
710
- paymentId: z5.string().optional().describe(
711
- "\uACE0\uAC1D\uC0AC\uC5D0\uC11C \uBC1C\uAE09\uD55C \uAC70\uB798\uBC88\uD638 \uC77C\uBD80\uBD84\uC785\uB2C8\uB2E4. V2\uC5D0\uC11C\uB294 paymentId, V1\uC5D0\uC11C\uB294 merchant_uid\uC5D0 \uB300\uC751\uB429\uB2C8\uB2E4."
712
- ),
713
- orderName: z5.string().optional().describe("\uACB0\uC81C \uC8FC\uBB38\uBA85 \uC77C\uBD80\uBD84\uC785\uB2C8\uB2E4."),
714
- customerName: z5.string().optional().describe("\uAD6C\uB9E4\uC790\uC758 \uC131\uBA85 \uC77C\uBD80\uBD84\uC785\uB2C8\uB2E4."),
715
- customerEmail: z5.string().optional().describe("\uAD6C\uB9E4\uC790\uC758 \uC774\uBA54\uC77C \uC77C\uBD80\uBD84\uC785\uB2C8\uB2E4."),
716
- pgMerchantId: z5.string().optional().describe("\uACB0\uC81C\uB300\uD589\uC0AC\uC5D0\uC11C \uC81C\uACF5\uD55C \uC0C1\uC810\uC544\uC774\uB514 (MID) \uC77C\uBD80\uBD84\uC785\uB2C8\uB2E4.")
717
- },
718
- outputSchema: {
719
- items: z5.array(z5.object({}).passthrough()).describe("\uC870\uD68C\uB41C \uACB0\uC81C \uAC74\uC758 \uBAA9\uB85D"),
720
- totalCount: z5.number().describe("\uC870\uAC74\uC5D0 \uB9DE\uB294 \uBCF8\uC778\uC778\uC99D \uAC74\uC758 \uCD1D \uAC1C\uC218")
721
- }
1576
+ inputSchema: InputSchema3.shape,
1577
+ outputSchema: OutputSchema4.shape
722
1578
  };
723
- function init4(httpClient) {
1579
+ function init4(tokenProvider, client) {
724
1580
  return async ({
725
- fromTime,
726
- untilTime,
727
- pageIndex,
1581
+ from,
1582
+ to,
1583
+ timeType,
1584
+ page,
728
1585
  pageSize,
729
1586
  fields,
730
- timestampType,
731
- storeId,
732
1587
  status,
733
- methods,
734
- pgProvider,
735
- isTest,
736
- version,
1588
+ order,
1589
+ id,
1590
+ webhook,
737
1591
  currency,
738
- paymentId,
739
- orderName,
740
- customerName,
741
- customerEmail,
742
- pgMerchantId
1592
+ channel,
1593
+ pg,
1594
+ method,
1595
+ types
743
1596
  }) => {
744
- const textSearch = [
745
- { field: "PAYMENT_ID", value: paymentId },
746
- { field: "ORDER_NAME", value: orderName },
747
- { field: "CUSTOMER_NAME", value: customerName },
748
- { field: "CUSTOMER_EMAIL", value: customerEmail },
749
- { field: "PG_MERCHANT_ID", value: pgMerchantId }
750
- ].filter((item) => item.value !== void 0);
751
- const searchFilter = filterOutNone({
752
- from: fromTime,
753
- until: untilTime,
754
- timestampType,
755
- storeId,
756
- status,
757
- methods,
758
- pgProvider,
759
- isTest,
760
- version,
761
- currency,
762
- textSearch: textSearch.length > 0 ? textSearch : void 0
1597
+ const token = await getToken(tokenProvider);
1598
+ if (token.type === "error") {
1599
+ return toolErrorResult(token);
1600
+ }
1601
+ const payments = await getPaymentsByFilter({
1602
+ client,
1603
+ authorization: token.data,
1604
+ filter: {
1605
+ from,
1606
+ until: to,
1607
+ timestampType: timeType,
1608
+ statuses: status,
1609
+ lastWebhookStatuses: webhook,
1610
+ channelTypes: channel,
1611
+ pgProviders: pg,
1612
+ methods: method,
1613
+ currencies: currency,
1614
+ types,
1615
+ textSearch: {
1616
+ orderName: order,
1617
+ id
1618
+ }
1619
+ },
1620
+ page,
1621
+ pageSize
763
1622
  });
764
- const response = await httpClient.get(
765
- `/payments?requestBody=${encodeURIComponent(
766
- JSON.stringify({
767
- filter: searchFilter,
768
- page: {
769
- number: pageIndex,
770
- size: pageSize
771
- }
772
- })
773
- )}`
774
- );
775
- if (!response.ok) {
776
- const text = await response.text();
777
- return { content: [{ type: "text", text }], isError: true };
1623
+ if (payments.type === "error") {
1624
+ return toolErrorResult(payments);
778
1625
  }
1626
+ const renamed = payments.data.items.map(
1627
+ ({
1628
+ amount,
1629
+ billingKey,
1630
+ channel: channel2,
1631
+ channelGroup,
1632
+ currency: currency2,
1633
+ customer,
1634
+ histories,
1635
+ lastWebhookStatus,
1636
+ orderName,
1637
+ transactionId,
1638
+ storeId,
1639
+ scheduleId,
1640
+ requestedAt,
1641
+ plainId,
1642
+ methodTypes
1643
+ }) => {
1644
+ return {
1645
+ amount: {
1646
+ total: amount?.total ?? void 0,
1647
+ taxFree: amount?.taxFree ?? void 0,
1648
+ vat: amount?.vat ?? void 0,
1649
+ supply: amount?.supply ?? void 0,
1650
+ dc: amount?.discount ?? void 0,
1651
+ cancel: amount?.cancelled ?? void 0,
1652
+ taxFreeCancel: amount?.cancelledTaxFree ?? void 0,
1653
+ cardDc: amount?.cardDiscount ?? void 0,
1654
+ easyDc: amount?.easyPayDiscount ?? void 0,
1655
+ promotionDc: amount?.promotionDiscount ?? void 0,
1656
+ balance: amount?.cancellable ?? void 0
1657
+ },
1658
+ billKey: billingKey ?? void 0,
1659
+ channel: {
1660
+ type: channel2?.type ?? void 0,
1661
+ id: channel2?.id ?? void 0,
1662
+ key: channel2?.key ?? void 0,
1663
+ name: channel2?.name ?? void 0,
1664
+ pg: channel2?.pgProvider ?? void 0,
1665
+ mid: channel2?.pgMerchantId ?? void 0
1666
+ },
1667
+ group: {
1668
+ id: channelGroup?.plainId ?? void 0,
1669
+ name: channelGroup?.name ?? void 0,
1670
+ test: channelGroup?.isForTest ?? void 0
1671
+ },
1672
+ currency: currency2 ?? void 0,
1673
+ customer: customer?.id ?? void 0,
1674
+ history: histories?.map(
1675
+ ({
1676
+ status: status2,
1677
+ paid,
1678
+ cancelled,
1679
+ statusChangedAt,
1680
+ partialCancelled
1681
+ }) => ({
1682
+ status: status2 ?? void 0,
1683
+ changedAt: statusChangedAt ?? void 0,
1684
+ paid: paid ?? void 0,
1685
+ cancel: cancelled ?? partialCancelled ?? void 0
1686
+ })
1687
+ ) ?? void 0,
1688
+ webhook: lastWebhookStatus ?? void 0,
1689
+ order: orderName ?? void 0,
1690
+ txId: transactionId ?? void 0,
1691
+ storeId: storeId ?? void 0,
1692
+ schedule: scheduleId ?? void 0,
1693
+ requestAt: requestedAt ?? void 0,
1694
+ paymentId: plainId ?? void 0,
1695
+ method: methodTypes ?? void 0
1696
+ };
1697
+ }
1698
+ );
779
1699
  try {
780
- const data = await response.json();
781
- const maskedPayments = filterFields(fields, data.items);
1700
+ const maskedPayments = renamed.map((item) => filterFields(fields, item));
782
1701
  const structuredContent = {
783
1702
  items: maskedPayments,
784
- totalCount: data.page.totalCount
1703
+ count: payments.data.page.totalCount
785
1704
  };
786
1705
  return {
787
1706
  content: [
@@ -808,7 +1727,7 @@ __export(listDocs_exports, {
808
1727
  init: () => init5,
809
1728
  name: () => name5
810
1729
  });
811
- import z6 from "zod";
1730
+ import z11 from "zod";
812
1731
 
813
1732
  // src/tools/utils/markdown.ts
814
1733
  function formatDocumentMetadata(doc) {
@@ -829,22 +1748,23 @@ function formatDocumentMetadata(doc) {
829
1748
  }
830
1749
 
831
1750
  // src/tools/listDocs.ts
832
- var name5 = "list_portone_docs";
1751
+ var name5 = "listPortoneDocs";
833
1752
  var config5 = {
834
1753
  title: "\uD3EC\uD2B8\uC6D0 \uBB38\uC11C \uBAA9\uB85D \uC870\uD68C",
835
- description: `\uD3EC\uD2B8\uC6D0 \uBB38\uC11C \uBAA9\uB85D\uC744 \uCE74\uD14C\uACE0\uB9AC\uBCC4\uB85C \uD544\uD130\uB9C1\uD558\uC5EC \uC870\uD68C\uD569\uB2C8\uB2E4. \uBAA9\uB85D\uC5D0\uB294 \uBB38\uC11C \uACBD\uB85C, \uC81C\uBAA9, \uC124\uBA85, \uB300\uC0C1 \uBC84\uC804 \uB4F1 \uCD95\uC57D\uB41C \uBB38\uC11C \uC815\uBCF4\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.`,
1754
+ description: `\uD3EC\uD2B8\uC6D0 \uBB38\uC11C \uBAA9\uB85D\uC744 \uCE74\uD14C\uACE0\uB9AC\uBCC4\uB85C \uD544\uD130\uB9C1\uD558\uC5EC \uC870\uD68C\uD569\uB2C8\uB2E4.
1755
+ \uBAA9\uB85D\uC5D0\uB294 \uBB38\uC11C \uACBD\uB85C, \uC81C\uBAA9, \uC124\uBA85, \uB300\uC0C1 \uBC84\uC804 \uB4F1 \uCD95\uC57D\uB41C \uBB38\uC11C \uC815\uBCF4\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.
1756
+
1757
+ Returns:
1758
+ \uD544\uD130\uB9C1\uB41C \uBB38\uC11C \uBAA9\uB85D (\uAC01 \uBB38\uC758 \uACBD\uB85C, \uAE38\uC774, \uC81C\uBAA9, \uC124\uBA85, \uB300\uC0C1 \uBC84\uC804 \uB4F1)`,
836
1759
  inputSchema: {
837
- dev_docs: z6.boolean().default(true).describe(
1760
+ dev_docs: z11.boolean().default(true).describe(
838
1761
  "\uAC1C\uBC1C\uC790\uB97C \uC704\uD55C \uBB38\uC11C \uD3EC\uD568 \uC5EC\uBD80 (blog/, release-notes/, help/\uB85C \uC2DC\uC791\uD558\uC9C0 \uC54A\uB294 \uBAA8\uB4E0 \uBB38\uC11C)"
839
1762
  ),
840
- tech_blog: z6.boolean().default(false).describe("\uAE30\uC220 \uBE14\uB85C\uADF8 \uD3EC\uC2A4\uD2B8 (blog/) \uD3EC\uD568 \uC5EC\uBD80"),
841
- release_notes: z6.boolean().default(false).describe("\uAC1C\uBC1C\uC790\uC13C\uD130 \uB9B4\uB9AC\uC988 \uB178\uD2B8 (release-notes/) \uD3EC\uD568 \uC5EC\uBD80"),
842
- help_docs: z6.boolean().default(true).describe(
1763
+ tech_blog: z11.boolean().default(false).describe("\uAE30\uC220 \uBE14\uB85C\uADF8 \uD3EC\uC2A4\uD2B8 (blog/) \uD3EC\uD568 \uC5EC\uBD80"),
1764
+ release_notes: z11.boolean().default(false).describe("\uAC1C\uBC1C\uC790\uC13C\uD130 \uB9B4\uB9AC\uC988 \uB178\uD2B8 (release-notes/) \uD3EC\uD568 \uC5EC\uBD80"),
1765
+ help_docs: z11.boolean().default(true).describe(
843
1766
  "\uAC1C\uBC1C\uACFC \uBB34\uAD00\uD558\uAC8C \uC11C\uBE44\uC2A4 \uAD00\uB828 \uB0B4\uC6A9\uC744 \uC77C\uBC18\uC801\uC73C\uB85C \uB2F4\uB294 \uD5EC\uD504\uC13C\uD130 \uBB38\uC11C (help/) \uD3EC\uD568 \uC5EC\uBD80"
844
1767
  )
845
- },
846
- outputSchema: {
847
- result: z6.string().describe("\uD544\uD130\uB9C1\uB41C \uBB38\uC11C \uBAA9\uB85D")
848
1768
  }
849
1769
  };
850
1770
  function init5(documents) {
@@ -874,100 +1794,186 @@ function init5(documents) {
874
1794
  type: "text",
875
1795
  text: "No documents found with the specified filters."
876
1796
  }
877
- ],
878
- isError: true
1797
+ ]
879
1798
  };
880
1799
  }
881
1800
  const formattedResult = filteredDocs.map((doc) => formatDocumentMetadata(doc)).join("\n---\n");
882
- const structuredContent = {
883
- result: formattedResult
884
- };
885
1801
  return {
886
1802
  content: [
887
1803
  {
888
1804
  type: "text",
889
- text: JSON.stringify(structuredContent, null, 2)
1805
+ text: formattedResult
890
1806
  }
891
- ],
892
- structuredContent
1807
+ ]
893
1808
  };
894
1809
  };
895
1810
  }
896
1811
 
897
- // src/tools/readDoc.ts
898
- var readDoc_exports = {};
899
- __export(readDoc_exports, {
1812
+ // src/tools/listSharedTestChannels.ts
1813
+ var listSharedTestChannels_exports = {};
1814
+ __export(listSharedTestChannels_exports, {
900
1815
  config: () => config6,
901
1816
  init: () => init6,
902
1817
  name: () => name6
903
1818
  });
904
- import z7 from "zod";
905
- var name6 = "read_portone_doc";
1819
+ import z12 from "zod";
1820
+ var name6 = "listSharedTestChannels";
1821
+ var SharedTestChannel = z12.object({
1822
+ pg: z12.string().describe(
1823
+ "PG\uC0AC \uACB0\uC81C \uBAA8\uB4C8\uC758 \uC2DD\uBCC4\uC790\uB85C, PG\uC0AC\uBCC4\uB85C \uC5EC\uB7EC \uBAA8\uB4C8\uC774 \uC788\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4."
1824
+ ),
1825
+ mid: z12.string().describe("PG\uC0AC\uC5D0\uC11C \uACE0\uAC1D\uC0AC\uB97C \uAD6C\uBD84\uD558\uAE30 \uC704\uD55C ID"),
1826
+ name: z12.string().describe("\uD3EC\uD2B8\uC6D0\uC5D0\uC11C \uC9C0\uC815\uD55C \uCC44\uB110\uC758 \uC774\uB984"),
1827
+ usage: z12.array(z12.enum(["PAYMENT", "IDENTITY"])).describe("\uCC44\uB110\uC744 \uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uC6A9\uB3C4")
1828
+ });
1829
+ var OutputSchema5 = z12.object({
1830
+ items: z12.array(SharedTestChannel).describe("\uC870\uD68C\uB41C \uCC44\uB110 \uBAA9\uB85D\uC73C\uB85C, MID\uAC00 \uD3EC\uD568\uB429\uB2C8\uB2E4.")
1831
+ });
906
1832
  var config6 = {
907
- title: "\uD3EC\uD2B8\uC6D0 \uBB38\uC11C \uC77D\uAE30",
908
- description: `\uD3EC\uD2B8\uC6D0 \uAC1C\uBCC4 \uBB38\uC11C\uC758 \uACBD\uB85C\uB97C \uD1B5\uD574 \uD574\uB2F9 \uD3EC\uD2B8\uC6D0 \uBB38\uC11C\uC758 \uC81C\uBAA9, \uC124\uBA85, \uB300\uC0C1 \uBC84\uC804\uC744 \uD3EC\uD568\uD55C \uBA54\uD0C0 \uC815\uBCF4 \uC804\uCCB4\uB97C \uAC00\uC838\uC635\uB2C8\uB2E4.
909
-
910
- Note:
911
- \uBA3C\uC800 list_portone_docs\uC744 \uC0AC\uC6A9\uD574 \uD3EC\uD2B8\uC6D0 \uBB38\uC11C \uBAA9\uB85D\uC744 \uD655\uC778\uD558\uACE0,
912
- \uADF8 \uC911 \uC6D0\uD558\uB294 \uBB38\uC11C\uC758 path\uB97C read_portone_doc\uC5D0 \uC804\uB2EC\uD558\uC5EC \uB0B4\uC6A9\uC744 \uD655\uC778\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.`,
1833
+ title: "\uD3EC\uD2B8\uC6D0 \uACF5\uC6A9 \uD14C\uC2A4\uD2B8 \uCC44\uB110 \uBAA9\uB85D \uC870\uD68C",
1834
+ description: "\uD3EC\uD2B8\uC6D0\uC5D0\uC11C \uD14C\uC2A4\uD2B8 \uC6A9\uB3C4\uB85C \uC81C\uACF5\uD558\uB294 \uCC44\uB110\uC758 \uBAA9\uB85D\uC744 \uAC00\uC838\uC635\uB2C8\uB2E4.",
913
1835
  inputSchema: {
914
- path: z7.string().describe("\uC77D\uC744 \uD3EC\uD2B8\uC6D0 \uBB38\uC11C\uC758 \uACBD\uB85C")
1836
+ pgProviders: z12.array(PgProvider).optional().describe("\uBAA9\uB85D\uC5D0 \uC788\uB294 PG\uC0AC(\uBBF8\uC124\uC815 \uC2DC \uBAA8\uB4E0 PG\uC0AC)\uB9CC \uBCF4\uC5EC\uC90D\uB2C8\uB2E4.")
915
1837
  },
916
- outputSchema: {
917
- result: z7.string().describe("\uCC3E\uC740 \uD3EC\uD2B8\uC6D0 \uBB38\uC11C\uC758 \uB0B4\uC6A9")
918
- }
1838
+ outputSchema: OutputSchema5.shape
919
1839
  };
920
- function init6(documents) {
921
- return ({ path }) => {
922
- const { markdownDocs } = documents;
923
- const doc = markdownDocs[path];
924
- if (!doc) {
925
- return {
926
- content: [
927
- {
928
- type: "text",
929
- text: `Document not found at path: ${path}`
930
- }
931
- ],
932
- isError: true
933
- };
1840
+ function init6(tokenProvider) {
1841
+ return async () => {
1842
+ const token = await getToken(tokenProvider);
1843
+ if (token.type === "error") {
1844
+ return toolErrorResult(token);
1845
+ }
1846
+ const list = await listV2SharedTestChannel({
1847
+ authorization: token.data
1848
+ });
1849
+ if (list.type === "error") {
1850
+ return toolErrorResult(list);
934
1851
  }
935
1852
  const structuredContent = {
936
- result: doc.content
1853
+ items: list.data.channels.map(
1854
+ ({
1855
+ pgProvider,
1856
+ pgMerchantId,
1857
+ channelName,
1858
+ isForPayment,
1859
+ isForIdentityCertification
1860
+ }) => {
1861
+ const usage = [];
1862
+ if (isForPayment) usage.push("PAYMENT");
1863
+ if (isForIdentityCertification) usage.push("IDENTITY");
1864
+ return {
1865
+ pg: pgProvider,
1866
+ mid: pgMerchantId,
1867
+ name: channelName,
1868
+ usage
1869
+ };
1870
+ }
1871
+ )
937
1872
  };
938
1873
  return {
1874
+ structuredContent,
939
1875
  content: [
940
1876
  {
941
1877
  type: "text",
942
1878
  text: JSON.stringify(structuredContent, null, 2)
943
1879
  }
944
- ],
945
- structuredContent
1880
+ ]
946
1881
  };
947
1882
  };
948
1883
  }
949
1884
 
950
- // src/tools/readDocMetadata.ts
951
- var readDocMetadata_exports = {};
952
- __export(readDocMetadata_exports, {
1885
+ // src/tools/listStores.ts
1886
+ var listStores_exports = {};
1887
+ __export(listStores_exports, {
953
1888
  config: () => config7,
954
1889
  init: () => init7,
955
1890
  name: () => name7
956
1891
  });
957
- import z8 from "zod";
958
- var name7 = "read_portone_doc_metadata";
1892
+ import z13 from "zod";
1893
+ var name7 = "listStores";
1894
+ var Store = z13.object({
1895
+ id: z13.string().describe("\uAC70\uB798 \uB2E4\uAC74 \uC870\uD68C\uC6A9 \uC0C1\uC810 \uC2DD\uBCC4\uC790"),
1896
+ storeId: z13.string().describe("\uD3EC\uD2B8\uC6D0 \uC0C1\uC810\uC544\uC774\uB514"),
1897
+ name: z13.string().describe("\uC0C1\uC810\uBA85"),
1898
+ userId: z13.number().optional().describe("V1 \uC720\uC800 \uC544\uC774\uB514"),
1899
+ userCode: z13.string().optional().describe("V1 \uACE0\uAC1D \uC2DD\uBCC4\uBC88\uD638"),
1900
+ tierCode: z13.string().optional().describe("\uD2F0\uC5B4\uCF54\uB4DC")
1901
+ });
1902
+ var OutputSchema6 = z13.object({
1903
+ main: Store.optional().describe("\uB300\uD45C\uC0C1\uC810"),
1904
+ items: z13.array(Store).describe("\uD558\uC704\uC0C1\uC810 \uBAA9\uB85D")
1905
+ });
959
1906
  var config7 = {
960
- title: "\uD3EC\uD2B8\uC6D0 \uBB38\uC11C \uBA54\uD0C0\uB370\uC774\uD130 \uC77D\uAE30",
961
- description: `\uC9C0\uC815\uB41C \uACBD\uB85C\uC758 \uD3EC\uD2B8\uC6D0 \uBB38\uC11C \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uC77D\uC2B5\uB2C8\uB2E4.`,
1907
+ title: "\uC0C1\uC810 \uBAA9\uB85D \uC870\uD68C",
1908
+ description: "\uD3EC\uD2B8\uC6D0 \uACC4\uC815\uC5D0 \uC5F0\uACB0\uB41C \uB300\uD45C\uC0C1\uC810 \uBC0F \uD558\uC704\uC0C1\uC810\uC758 \uC815\uBCF4\uB97C \uAC00\uC838\uC635\uB2C8\uB2E4.",
1909
+ inputSchema: {},
1910
+ outputSchema: OutputSchema6.shape
1911
+ };
1912
+ function init7(tokenProvider, client) {
1913
+ return async () => {
1914
+ const token = await getToken(tokenProvider);
1915
+ if (token.type === "error") {
1916
+ return toolErrorResult(token);
1917
+ }
1918
+ const list = await listStores({
1919
+ client,
1920
+ authorization: token.data
1921
+ });
1922
+ if (list.type === "error") {
1923
+ return toolErrorResult(list);
1924
+ }
1925
+ const structuredContent = {
1926
+ main: list.data.main == null ? void 0 : renameStore(list.data.main),
1927
+ items: list.data.items.map((store) => renameStore(store))
1928
+ };
1929
+ return {
1930
+ content: [
1931
+ {
1932
+ type: "text",
1933
+ text: JSON.stringify(structuredContent, null, 2)
1934
+ }
1935
+ ],
1936
+ structuredContent
1937
+ };
1938
+ };
1939
+ }
1940
+ function renameStore(store) {
1941
+ const { plainId, ...rest } = store;
1942
+ return {
1943
+ storeId: plainId,
1944
+ ...rest
1945
+ };
1946
+ }
1947
+
1948
+ // src/tools/readDoc.ts
1949
+ var readDoc_exports = {};
1950
+ __export(readDoc_exports, {
1951
+ config: () => config8,
1952
+ init: () => init8,
1953
+ name: () => name8
1954
+ });
1955
+ import z14 from "zod";
1956
+ var name8 = "readPortoneDoc";
1957
+ var OutputSchema7 = z14.object({
1958
+ content: z14.string().optional().describe("\uCC3E\uC740 \uD3EC\uD2B8\uC6D0 \uBB38\uC11C\uC758 \uB0B4\uC6A9"),
1959
+ metadata: z14.string().optional().describe("\uCC3E\uC740 \uD3EC\uD2B8\uC6D0 \uBB38\uC11C\uC758 \uBA54\uD0C0 \uC815\uBCF4"),
1960
+ url: z14.string().optional().describe("\uBB38\uC11C\uB97C \uC6F9\uC73C\uB85C \uC811\uADFC \uAC00\uB2A5\uD55C \uB9C1\uD06C")
1961
+ });
1962
+ var config8 = {
1963
+ title: "\uD3EC\uD2B8\uC6D0 \uBB38\uC11C \uC77D\uAE30",
1964
+ description: `\uD3EC\uD2B8\uC6D0 \uAC1C\uBCC4 \uBB38\uC11C\uC758 \uACBD\uB85C\uB97C \uD1B5\uD574 \uD574\uB2F9 \uD3EC\uD2B8\uC6D0 \uBB38\uC11C\uC758 \uB0B4\uC6A9, \uBA54\uD0C0 \uC815\uBCF4(\uC81C\uBAA9, \uC124\uBA85, \uB300\uC0C1 \uBC84\uC804 \uB4F1), \uC6F9\uC73C\uB85C \uC811\uADFC \uAC00\uB2A5\uD55C \uB9C1\uD06C\uB97C \uAC00\uC838\uC635\uB2C8\uB2E4.
1965
+
1966
+ Note:
1967
+ \uBA3C\uC800 listPortoneDocs\uC744 \uC0AC\uC6A9\uD574 \uD3EC\uD2B8\uC6D0 \uBB38\uC11C \uBAA9\uB85D\uC744 \uD655\uC778\uD558\uACE0,
1968
+ \uADF8 \uC911 \uC6D0\uD558\uB294 \uBB38\uC11C\uC758 path\uB97C readPortoneDoc\uC5D0 \uC804\uB2EC\uD558\uC5EC \uB0B4\uC6A9\uC744 \uD655\uC778\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.`,
962
1969
  inputSchema: {
963
- path: z8.string().describe("\uC77D\uC744 \uD3EC\uD2B8\uC6D0 \uBB38\uC11C\uC758 \uACBD\uB85C")
1970
+ path: z14.string().describe("\uC77D\uC744 \uD3EC\uD2B8\uC6D0 \uBB38\uC11C\uC758 \uACBD\uB85C"),
1971
+ fields: OutputSchema7.keyof().array().describe("\uBC1B\uC744 \uD544\uB4DC \uBAA9\uB85D")
964
1972
  },
965
- outputSchema: {
966
- result: z8.string().describe("\uCC3E\uC740 \uD3EC\uD2B8\uC6D0 \uBB38\uC11C\uC758 \uBA54\uD0C0\uB370\uC774\uD130")
967
- }
1973
+ outputSchema: OutputSchema7.shape
968
1974
  };
969
- function init7(documents) {
970
- return ({ path }) => {
1975
+ function init8(documents) {
1976
+ return ({ path, fields }) => {
971
1977
  const { markdownDocs } = documents;
972
1978
  const doc = markdownDocs[path];
973
1979
  if (!doc) {
@@ -981,9 +1987,14 @@ function init7(documents) {
981
1987
  isError: true
982
1988
  };
983
1989
  }
984
- const structuredContent = {
985
- result: formatDocumentMetadata(doc)
986
- };
1990
+ const structuredContent = filterFields(
1991
+ fields,
1992
+ {
1993
+ content: doc.content,
1994
+ metadata: formatDocumentMetadata(doc),
1995
+ url: docPathToUrl(doc.path)
1996
+ }
1997
+ );
987
1998
  return {
988
1999
  content: [
989
2000
  {
@@ -999,11 +2010,11 @@ function init7(documents) {
999
2010
  // src/tools/readOpenapiSchema.ts
1000
2011
  var readOpenapiSchema_exports = {};
1001
2012
  __export(readOpenapiSchema_exports, {
1002
- config: () => config8,
1003
- init: () => init8,
1004
- name: () => name8
2013
+ config: () => config9,
2014
+ init: () => init9,
2015
+ name: () => name9
1005
2016
  });
1006
- import z9 from "zod";
2017
+ import z15 from "zod";
1007
2018
 
1008
2019
  // src/tools/utils/yaml.ts
1009
2020
  import yaml from "js-yaml";
@@ -1073,21 +2084,21 @@ function stringifyYaml(data) {
1073
2084
  }
1074
2085
 
1075
2086
  // src/tools/readOpenapiSchema.ts
1076
- var name8 = "read_portone_openapi_schema";
1077
- var config8 = {
2087
+ var name9 = "readPortoneOpenapiSchema";
2088
+ var config9 = {
1078
2089
  title: "\uD3EC\uD2B8\uC6D0 OpenAPI \uC2A4\uD0A4\uB9C8 \uC77D\uAE30",
1079
2090
  description: `\uC694\uCCAD\uB41C \uD3EC\uD2B8\uC6D0 \uBC84\uC804\uC5D0\uC11C \uC81C\uACF5\uD558\uB294 OpenAPI \uC2A4\uD0A4\uB9C8 \uB0B4 \uD2B9\uC815 path\uC758 \uB370\uC774\uD130\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.`,
1080
2091
  inputSchema: {
1081
- version: z9.enum(["V1", "V2"]).describe("\uD3EC\uD2B8\uC6D0 \uBC84\uC804"),
1082
- yaml_path: z9.array(z9.string()).describe(
2092
+ version: z15.enum(["V1", "V2"]).describe("\uD3EC\uD2B8\uC6D0 \uBC84\uC804"),
2093
+ yaml_path: z15.array(z15.string()).describe(
1083
2094
  "OpenAPI \uC2A4\uD0A4\uB9C8 \uB0B4\uC758 yaml path (list of strings)\n\uD0A4 \uB610\uB294 \uC778\uB371\uC2A4(0\uBD80\uD130 \uC2DC\uC791)\uB97C \uD3EC\uD568\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4."
1084
2095
  )
1085
2096
  },
1086
2097
  outputSchema: {
1087
- result: z9.string().describe(" OpenAPI \uC2A4\uD0A4\uB9C8\uB97C \uCD5C\uB300 depth 3\uC73C\uB85C \uC694\uC57D\uD55C YAML \uD615\uC2DD\uC758 \uBB38\uC790\uC5F4")
2098
+ result: z15.string().describe(" OpenAPI \uC2A4\uD0A4\uB9C8\uB97C \uCD5C\uB300 depth 3\uC73C\uB85C \uC694\uC57D\uD55C YAML \uD615\uC2DD\uC758 \uBB38\uC790\uC5F4")
1088
2099
  }
1089
2100
  };
1090
- function init8(schema) {
2101
+ function init9(schema) {
1091
2102
  return ({ version, yaml_path }) => {
1092
2103
  let schemaData;
1093
2104
  if (version === "V1") {
@@ -1148,24 +2159,23 @@ function init8(schema) {
1148
2159
  // src/tools/readOpenapiSchemaSummary.ts
1149
2160
  var readOpenapiSchemaSummary_exports = {};
1150
2161
  __export(readOpenapiSchemaSummary_exports, {
1151
- config: () => config9,
1152
- init: () => init9,
1153
- name: () => name9
2162
+ config: () => config10,
2163
+ init: () => init10,
2164
+ name: () => name10
1154
2165
  });
1155
- import z10 from "zod";
1156
- var name9 = "read_portone_openapi_schema_summary";
1157
- var config9 = {
2166
+ import z16 from "zod";
2167
+ var name10 = "readPortoneOpenapiSchemaSummary";
2168
+ var config10 = {
1158
2169
  title: "\uD3EC\uD2B8\uC6D0 OpenAPI \uC2A4\uD0A4\uB9C8 \uC694\uC57D",
1159
- description: `\uC694\uCCAD\uB41C \uD3EC\uD2B8\uC6D0 \uBC84\uC804\uC5D0\uC11C \uC81C\uACF5\uD558\uB294 OpenAPI \uC2A4\uD0A4\uB9C8\uB97C \uC694\uC57D\uD574 \uBB38\uC790\uC5F4\uB85C \uBC18\uD658\uD569\uB2C8\uB2E4.
1160
- \uD574\uB2F9 \uC694\uC57D\uC5D0\uB294 \uC694\uCCAD\uB41C \uD3EC\uD2B8\uC6D0 \uBC84\uC804\uC5D0\uC11C \uC81C\uACF5\uD558\uB294 \uBAA8\uB4E0 REST API\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.`,
2170
+ description: `\uC694\uCCAD\uB41C \uD3EC\uD2B8\uC6D0 \uBC84\uC804\uC5D0\uC11C \uC81C\uACF5\uD558\uB294 OpenAPI \uC2A4\uD0A4\uB9C8\uB97C \uC694\uC57D\uD574 \uBB38\uC790\uC5F4\uB85C \uBC18\uD658\uD569\uB2C8\uB2E4. \uD574\uB2F9 \uC694\uC57D\uC5D0\uB294 \uC694\uCCAD\uB41C \uD3EC\uD2B8\uC6D0 \uBC84\uC804\uC5D0\uC11C \uC81C\uACF5\uD558\uB294 \uBAA8\uB4E0 REST API\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.`,
1161
2171
  inputSchema: {
1162
- version: z10.enum(["V1", "V2"]).describe("\uD3EC\uD2B8\uC6D0 \uBC84\uC804")
2172
+ version: z16.enum(["V1", "V2"]).describe("\uD3EC\uD2B8\uC6D0 \uBC84\uC804")
1163
2173
  },
1164
2174
  outputSchema: {
1165
- result: z10.string().describe("OpenAPI \uC2A4\uD0A4\uB9C8\uB97C \uCD5C\uB300 depth 3\uC73C\uB85C \uC694\uC57D\uD55C YAML \uD615\uC2DD\uC758 \uBB38\uC790\uC5F4")
2175
+ result: z16.string().describe("OpenAPI \uC2A4\uD0A4\uB9C8\uB97C \uCD5C\uB300 depth 3\uC73C\uB85C \uC694\uC57D\uD55C YAML \uD615\uC2DD\uC758 \uBB38\uC790\uC5F4")
1166
2176
  }
1167
2177
  };
1168
- function init9(schema) {
2178
+ function init10(schema) {
1169
2179
  return ({ version }) => {
1170
2180
  let schemaData;
1171
2181
  if (version === "V1") {
@@ -1226,34 +2236,34 @@ function init9(schema) {
1226
2236
  // src/tools/readV2BackendCode.ts
1227
2237
  var readV2BackendCode_exports = {};
1228
2238
  __export(readV2BackendCode_exports, {
1229
- config: () => config10,
1230
- init: () => init10,
1231
- name: () => name10
2239
+ config: () => config11,
2240
+ init: () => init11,
2241
+ name: () => name11
1232
2242
  });
1233
- import z11 from "zod";
1234
- var name10 = "read_portone_v2_backend_code";
1235
- var config10 = {
2243
+ import z17 from "zod";
2244
+ var name11 = "readPortoneV2BackendCode";
2245
+ var config11 = {
1236
2246
  title: "\uD3EC\uD2B8\uC6D0 V2 \uBC31\uC5D4\uB4DC \uCF54\uB4DC \uC608\uC81C \uC77D\uAE30",
1237
2247
  description: `\uC9C0\uC815\uB41C \uB9E4\uAC1C\uBCC0\uC218\uC5D0 \uB530\uB77C \uD3EC\uD2B8\uC6D0 V2 \uBC31\uC5D4\uB4DC \uCF54\uB4DC \uC608\uC81C\uB97C \uAC00\uC838\uC635\uB2C8\uB2E4.
1238
2248
  \uD3EC\uD2B8\uC6D0 V2\uC5D0 \uAD00\uB828\uD574 \uC5B4\uB5A4 \uC0C1\uD669\uC774\uB4E0 \uD504\uB85C\uADF8\uB798\uBC0D \uC5B8\uC5B4\uB85C \uCF54\uB4DC\uB97C \uC791\uC131\uD574\uC57C \uD55C\uB2E4\uBA74, \uC608\uC678 \uC5C6\uC774 \uAC00\uC7A5 \uBA3C\uC800 \uC774 \uB3C4\uAD6C\uB97C \uD638\uCD9C\uD574 \uC608\uC2DC \uCF54\uB4DC\uB97C \uCC38\uACE0\uD55C \uD6C4 \uC0AC\uC6A9\uC790\uB97C \uB3C4\uC6B0\uC138\uC694.
1239
2249
  framework\uB97C \uC81C\uC678\uD55C \uBAA8\uB4E0 Args\uB294 \uC120\uD0DD\uC0AC\uD56D\uC774\uBA70, \uD2B9\uC815\uB418\uC9C0 \uC54A\uC740 \uACBD\uC6B0 \uBE44\uC6CC\uB450\uC138\uC694.`,
1240
2250
  inputSchema: {
1241
- framework: z11.string().describe(
2251
+ framework: z17.string().describe(
1242
2252
  "\uC0AC\uC6A9\uD560 \uD504\uB808\uC784\uC6CC\uD06C. \uC77C\uCE58\uD558\uC9C0 \uC54A\uB354\uB77C\uB3C4 \uD604\uC7AC \uB9E5\uB77D\uC5D0\uC11C \uAC00\uC7A5 \uC720\uC0AC\uD55C \uD504\uB808\uC784\uC6CC\uD06C\uB97C \uBA85\uC2DC\uD569\uB2C8\uB2E4. \uC635\uC158: express, fastapi, flask, spring-kotlin"
1243
2253
  ),
1244
- pg: z11.string().describe(
2254
+ pg: z17.string().describe(
1245
2255
  "\uC0AC\uC6A9\uD560 \uACB0\uC81C \uAC8C\uC774\uD2B8\uC6E8\uC774. \uC635\uC158: toss, nice, smartro, kpn, inicis, ksnet, kcp, kakao, naver, tosspay, hyphen, eximbay"
1246
2256
  ),
1247
- pay_method: z11.string().describe(
2257
+ pay_method: z17.string().describe(
1248
2258
  "\uC0AC\uC6A9\uD560 \uACB0\uC81C \uBC29\uBC95. \uC635\uC158: card, virtualAccount, easyPay, transfer, mobile, giftCertificate"
1249
2259
  ),
1250
- smart_routing: z11.boolean().optional().describe("\uC2A4\uB9C8\uD2B8 \uB77C\uC6B0\uD305 \uC0AC\uC6A9 \uC5EC\uBD80. \uC635\uC158: true \uB610\uB294 false")
2260
+ smart_routing: z17.boolean().optional().describe("\uC2A4\uB9C8\uD2B8 \uB77C\uC6B0\uD305 \uC0AC\uC6A9 \uC5EC\uBD80. \uC635\uC158: true \uB610\uB294 false")
1251
2261
  },
1252
2262
  outputSchema: {
1253
- result: z11.string().describe("\uB9C8\uD06C\uB2E4\uC6B4 \uD615\uC2DD\uC758 \uBC31\uC5D4\uB4DC \uCF54\uB4DC \uC608\uC81C")
2263
+ result: z17.string().describe("\uB9C8\uD06C\uB2E4\uC6B4 \uD615\uC2DD\uC758 \uBC31\uC5D4\uB4DC \uCF54\uB4DC \uC608\uC81C")
1254
2264
  }
1255
2265
  };
1256
- function init10(apiBasePath) {
2266
+ function init11(apiBasePath) {
1257
2267
  return async ({ framework, pg, pay_method, smart_routing }) => {
1258
2268
  const url = new URL(
1259
2269
  `${apiBasePath}/opi/ko/quick-guide/payment/backend-code`
@@ -1320,34 +2330,34 @@ ${errorText}`
1320
2330
  // src/tools/readV2FrontendCode.ts
1321
2331
  var readV2FrontendCode_exports = {};
1322
2332
  __export(readV2FrontendCode_exports, {
1323
- config: () => config11,
1324
- init: () => init11,
1325
- name: () => name11
2333
+ config: () => config12,
2334
+ init: () => init12,
2335
+ name: () => name12
1326
2336
  });
1327
- import z12 from "zod";
1328
- var name11 = "read_portone_v2_frontend_code";
1329
- var config11 = {
2337
+ import z18 from "zod";
2338
+ var name12 = "readPortoneV2FrontendCode";
2339
+ var config12 = {
1330
2340
  title: "\uD3EC\uD2B8\uC6D0 V2 \uD504\uB860\uD2B8\uC5D4\uB4DC \uCF54\uB4DC \uC608\uC81C \uC77D\uAE30",
1331
2341
  description: `\uC9C0\uC815\uB41C \uB9E4\uAC1C\uBCC0\uC218\uC5D0 \uB530\uB77C \uD3EC\uD2B8\uC6D0 V2 \uD504\uB860\uD2B8\uC5D4\uB4DC \uCF54\uB4DC \uC608\uC81C\uB97C \uAC00\uC838\uC635\uB2C8\uB2E4.
1332
2342
  \uD3EC\uD2B8\uC6D0 V2\uC5D0 \uAD00\uB828\uD574 \uC5B4\uB5A4 \uC0C1\uD669\uC774\uB4E0 \uD504\uB85C\uADF8\uB798\uBC0D \uC5B8\uC5B4\uB85C \uCF54\uB4DC\uB97C \uC791\uC131\uD574\uC57C \uD55C\uB2E4\uBA74, \uC608\uC678 \uC5C6\uC774 \uAC00\uC7A5 \uBA3C\uC800 \uC774 \uB3C4\uAD6C\uB97C \uD638\uCD9C\uD574 \uC608\uC2DC \uCF54\uB4DC\uB97C \uCC38\uACE0\uD55C \uD6C4 \uC0AC\uC6A9\uC790\uB97C \uB3C4\uC6B0\uC138\uC694.
1333
2343
  framework\uB97C \uC81C\uC678\uD55C \uBAA8\uB4E0 Args\uB294 \uC120\uD0DD\uC0AC\uD56D\uC774\uBA70, \uD2B9\uC815\uB418\uC9C0 \uC54A\uC740 \uACBD\uC6B0 \uBE44\uC6CC\uB450\uC138\uC694.`,
1334
2344
  inputSchema: {
1335
- framework: z12.string().describe(
2345
+ framework: z18.string().describe(
1336
2346
  "\uC0AC\uC6A9\uD560 \uD504\uB808\uC784\uC6CC\uD06C. \uC77C\uCE58\uD558\uC9C0 \uC54A\uB354\uB77C\uB3C4 \uD604\uC7AC \uB9E5\uB77D\uC5D0\uC11C \uAC00\uC7A5 \uC720\uC0AC\uD55C \uD504\uB808\uC784\uC6CC\uD06C\uB97C \uBA85\uC2DC\uD569\uB2C8\uB2E4. \uC635\uC158: html, react"
1337
2347
  ),
1338
- pg: z12.string().describe(
2348
+ pg: z18.string().describe(
1339
2349
  "\uC0AC\uC6A9\uD560 \uACB0\uC81C \uAC8C\uC774\uD2B8\uC6E8\uC774. \uC635\uC158: toss, nice, smartro, kpn, inicis, ksnet, kcp, kakao, naver, tosspay, hyphen, eximbay"
1340
2350
  ),
1341
- pay_method: z12.string().describe(
2351
+ pay_method: z18.string().describe(
1342
2352
  "\uC0AC\uC6A9\uD560 \uACB0\uC81C \uBC29\uBC95. \uC635\uC158: card, virtualAccount, easyPay, transfer, mobile, giftCertificate"
1343
2353
  ),
1344
- smart_routing: z12.boolean().optional().describe("\uC2A4\uB9C8\uD2B8 \uB77C\uC6B0\uD305 \uC0AC\uC6A9 \uC5EC\uBD80. \uC635\uC158: true \uB610\uB294 false")
2354
+ smart_routing: z18.boolean().optional().describe("\uC2A4\uB9C8\uD2B8 \uB77C\uC6B0\uD305 \uC0AC\uC6A9 \uC5EC\uBD80. \uC635\uC158: true \uB610\uB294 false")
1345
2355
  },
1346
2356
  outputSchema: {
1347
- result: z12.string().describe("\uB9C8\uD06C\uB2E4\uC6B4 \uD615\uC2DD\uC758 \uD504\uB860\uD2B8\uC5D4\uB4DC \uCF54\uB4DC \uC608\uC81C")
2357
+ result: z18.string().describe("\uB9C8\uD06C\uB2E4\uC6B4 \uD615\uC2DD\uC758 \uD504\uB860\uD2B8\uC5D4\uB4DC \uCF54\uB4DC \uC608\uC81C")
1348
2358
  }
1349
2359
  };
1350
- function init11(apiBasePath) {
2360
+ function init12(apiBasePath) {
1351
2361
  return async ({ framework, pg, pay_method, smart_routing }) => {
1352
2362
  const url = new URL(
1353
2363
  `${apiBasePath}/opi/ko/quick-guide/payment/frontend-code`
@@ -1414,11 +2424,11 @@ ${errorText}`
1414
2424
  // src/tools/regexSearch.ts
1415
2425
  var regexSearch_exports = {};
1416
2426
  __export(regexSearch_exports, {
1417
- config: () => config12,
1418
- init: () => init12,
1419
- name: () => name12
2427
+ config: () => config13,
2428
+ init: () => init13,
2429
+ name: () => name13
1420
2430
  });
1421
- import z13 from "zod";
2431
+ import z19 from "zod";
1422
2432
 
1423
2433
  // src/tools/utils/bm25.ts
1424
2434
  function calculateBm25Scores(query, documents, k1 = 1.2, b = 0.75) {
@@ -1458,8 +2468,8 @@ ${searchableText}`;
1458
2468
  );
1459
2469
  if (matches.length > 0) {
1460
2470
  const termCounts = {};
1461
- for (const match of matches) {
1462
- const term = match[0].toLowerCase();
2471
+ for (const match7 of matches) {
2472
+ const term = match7[0].toLowerCase();
1463
2473
  termCounts[term] = (termCounts[term] || 0) + 1;
1464
2474
  }
1465
2475
  termFrequencies[path] = termCounts;
@@ -1499,27 +2509,27 @@ ${searchableText}`;
1499
2509
  }
1500
2510
 
1501
2511
  // src/tools/regexSearch.ts
1502
- var name12 = "regex_search_portone_docs";
1503
- var config12 = {
2512
+ var name13 = "regex_search_portone_docs";
2513
+ var config13 = {
1504
2514
  title: "\uD3EC\uD2B8\uC6D0 \uBB38\uC11C \uC815\uADDC\uD45C\uD604\uC2DD \uAC80\uC0C9",
1505
2515
  description: `\uD3EC\uD2B8\uC6D0 \uBB38\uC11C\uC758 \uB0B4\uC6A9 \uC911 Node.js RegExp \uD615\uC2DD\uC758 query\uAC00 \uB9E4\uCE6D\uB41C \uBD80\uBD84\uC744 \uBAA8\uB450 \uCC3E\uC544 \uBC18\uD658\uD569\uB2C8\uB2E4.
1506
2516
  \uC815\uADDC\uC2DD \uAE30\uBC18\uC73C\uB85C \uAD00\uB828 \uD3EC\uD2B8\uC6D0 \uBB38\uC11C\uB97C \uCC3E\uACE0 \uC2F6\uC740 \uACBD\uC6B0 \uC774 \uB3C4\uAD6C\uB97C \uC0AC\uC6A9\uD558\uBA70, \uBA54\uD0C0 \uC815\uBCF4\uC640 \uBB38\uC11C \uB0B4\uC6A9 \uBAA8\uB450 \uAC80\uC0C9\uD569\uB2C8\uB2E4.`,
1507
2517
  inputSchema: {
1508
- query: z13.string().describe(`Node.js RegExp \uD615\uC2DD\uC758 \uBB38\uC790\uC5F4\uC744 \uC785\uB825\uD574\uC57C \uD558\uBA70, \uC601\uC5B4 \uC54C\uD30C\uBCB3 \uB300\uC18C\uBB38\uC790\uB294 \uAD6C\uBD84 \uC5C6\uC774 \uB9E4\uCE6D\uB429\uB2C8\uB2E4.
2518
+ query: z19.string().describe(`Node.js RegExp \uD615\uC2DD\uC758 \uBB38\uC790\uC5F4\uC744 \uC785\uB825\uD574\uC57C \uD558\uBA70, \uC601\uC5B4 \uC54C\uD30C\uBCB3 \uB300\uC18C\uBB38\uC790\uB294 \uAD6C\uBD84 \uC5C6\uC774 \uB9E4\uCE6D\uB429\uB2C8\uB2E4.
1509
2519
  \uC808\uB300 query\uC5D0 \uACF5\uBC31\uC744 \uD3EC\uD568\uC2DC\uD0A4\uC9C0 \uB9C8\uC138\uC694. \uC5EC\uB7EC \uD0A4\uC6CC\uB4DC\uB97C \uD55C \uBC88\uC5D0 \uAC80\uC0C9\uD558\uACE0 \uC2F6\uB2E4\uBA74, \uACF5\uBC31 \uB300\uC2E0 | \uC5F0\uC0B0\uC790\uB97C \uC0AC\uC6A9\uD558\uC5EC \uAD6C\uBD84\uD569\uB2C8\uB2E4.
1510
2520
  \uB2E8\uC5B4 \uAE00\uC790 \uC0AC\uC774\uC5D0 \uACF5\uBC31\uC774 \uC788\uB294 \uACBD\uC6B0\uB3C4 \uB9E4\uCE6D\uD558\uACE0 \uC2F6\uB2E4\uBA74, \uACF5\uBC31 \uB300\uC2E0 \\s*\uB97C \uC0AC\uC6A9\uD558\uC138\uC694.`),
1511
- context_size: z13.number().describe(`\uAC80\uC0C9 \uACB0\uACFC\uC758 \uCEE8\uD14D\uC2A4\uD2B8 \uD06C\uAE30\uB85C, \uBB38\uC790 \uC218\uB97C \uAE30\uC900\uC73C\uB85C \uD569\uB2C8\uB2E4.
2521
+ context_size: z19.number().describe(`\uAC80\uC0C9 \uACB0\uACFC\uC758 \uCEE8\uD14D\uC2A4\uD2B8 \uD06C\uAE30\uB85C, \uBB38\uC790 \uC218\uB97C \uAE30\uC900\uC73C\uB85C \uD569\uB2C8\uB2E4.
1512
2522
  query \uB9E4\uCE58\uAC00 \uBC1C\uACAC\uB41C \uC2DC\uC791 \uC778\uB371\uC2A4\uB97C idx\uB77C\uACE0 \uD560 \uB54C,
1513
2523
  max(0, idx - context_size)\uBD80\uD130 min(contentLength, idx + len(query) + context_size) - 1\uAE4C\uC9C0\uC758 \uB0B4\uC6A9\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4.
1514
2524
  \uB2E8, \uC774\uC804 \uAC80\uC0C9\uACB0\uACFC\uC640 \uACB9\uCE58\uB294 \uCEE8\uD14D\uC2A4\uD2B8\uB294 \uBCD1\uD569\uB418\uC5B4 \uBC18\uD658\uB429\uB2C8\uB2E4.`),
1515
- limit: z13.number().default(5e4).describe(`\uBC18\uD658\uD560 \uCD5C\uB300 \uBB38\uC790\uC5F4 \uAE38\uC774\uC785\uB2C8\uB2E4. \uAE30\uBCF8\uAC12\uC740 50000\uC785\uB2C8\uB2E4.
2525
+ limit: z19.number().default(5e4).describe(`\uBC18\uD658\uD560 \uCD5C\uB300 \uBB38\uC790\uC5F4 \uAE38\uC774\uC785\uB2C8\uB2E4. \uAE30\uBCF8\uAC12\uC740 50000\uC785\uB2C8\uB2E4.
1516
2526
  \uCD9C\uB825\uC774 \uC774 \uAE38\uC774\uB97C \uCD08\uACFC\uD558\uBA74 \uC798\uB9AC\uACE0 truncation \uBA54\uC2DC\uC9C0\uAC00 \uCD94\uAC00\uB429\uB2C8\uB2E4.`),
1517
- start_index: z13.number().default(0).describe(`\uACB0\uACFC \uBB38\uC790\uC5F4\uC758 \uD398\uC774\uC9C0\uB124\uC774\uC158\uC744 \uC704\uD55C \uC2DC\uC791 \uC778\uB371\uC2A4\uC785\uB2C8\uB2E4. \uAE30\uBCF8\uAC12\uC740 0\uC785\uB2C8\uB2E4.
2527
+ start_index: z19.number().default(0).describe(`\uACB0\uACFC \uBB38\uC790\uC5F4\uC758 \uD398\uC774\uC9C0\uB124\uC774\uC158\uC744 \uC704\uD55C \uC2DC\uC791 \uC778\uB371\uC2A4\uC785\uB2C8\uB2E4. \uAE30\uBCF8\uAC12\uC740 0\uC785\uB2C8\uB2E4.
1518
2528
  \uC804\uCCB4 \uACB0\uACFC \uBB38\uC790\uC5F4\uC5D0\uC11C start_index \uC704\uCE58\uBD80\uD130 limit \uAE38\uC774\uB9CC\uD07C\uC758 \uBD80\uBD84 \uBB38\uC790\uC5F4\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4.
1519
2529
  \uB3D9\uC77C\uD55C query, context_size\uB85C \uB2E4\uB978 start_index\uB97C \uC0AC\uC6A9\uD574 \uB2E4\uC74C \uACB0\uACFC\uB97C \uC5BB\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4.`)
1520
2530
  },
1521
2531
  outputSchema: {
1522
- result: z13.string().describe(
2532
+ result: z19.string().describe(
1523
2533
  `\uD3EC\uD2B8\uC6D0 \uBB38\uC11C\uB97C \uCC3E\uC73C\uBA74 \uD574\uB2F9 \uBB38\uC11C\uC758 \uACBD\uB85C\uC640 \uAE38\uC774, \uC81C\uBAA9, \uC124\uBA85, \uB300\uC0C1 \uBC84\uC804\uACFC \uD568\uAED8, query\uAC00 \uB9E4\uCE6D\uB41C \uC8FC\uBCC0 \uCEE8\uD14D\uC2A4\uD2B8\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.`
1524
2534
  )
1525
2535
  }
@@ -1530,7 +2540,7 @@ ${occurrence.context}
1530
2540
  \`\`\`
1531
2541
  `;
1532
2542
  }
1533
- function init12(documents) {
2543
+ function init13(documents) {
1534
2544
  return ({ query, context_size, start_index, limit }) => {
1535
2545
  const { markdownDocs } = documents;
1536
2546
  let occurrenceCount = 0;
@@ -1552,14 +2562,14 @@ function init12(documents) {
1552
2562
  });
1553
2563
  }
1554
2564
  const regex = new RegExp(query, "gi");
1555
- let match = regex.exec(doc.content);
1556
- while (match !== null) {
1557
- match = regex.exec(doc.content);
1558
- if (match === null) {
2565
+ let match7 = regex.exec(doc.content);
2566
+ while (match7 !== null) {
2567
+ match7 = regex.exec(doc.content);
2568
+ if (match7 === null) {
1559
2569
  break;
1560
2570
  }
1561
- const idx = match.index;
1562
- const matchLen = match[0].length;
2571
+ const idx = match7.index;
2572
+ const matchLen = match7[0].length;
1563
2573
  const contextStart = Math.max(0, idx - context_size);
1564
2574
  const contextEnd = Math.min(
1565
2575
  contentLen,
@@ -1688,16 +2698,16 @@ ${documents.readme}`
1688
2698
  );
1689
2699
  mcp.registerTool(listDocs_exports.name, listDocs_exports.config, listDocs_exports.init(documents));
1690
2700
  mcp.registerTool(readDoc_exports.name, readDoc_exports.config, readDoc_exports.init(documents));
1691
- mcp.registerTool(
1692
- readDocMetadata_exports.name,
1693
- readDocMetadata_exports.config,
1694
- readDocMetadata_exports.init(documents)
1695
- );
1696
2701
  mcp.registerTool(
1697
2702
  regexSearch_exports.name,
1698
2703
  regexSearch_exports.config,
1699
2704
  regexSearch_exports.init(documents)
1700
2705
  );
2706
+ mcp.registerTool(
2707
+ getDocsUrl_exports.name,
2708
+ getDocsUrl_exports.config,
2709
+ getDocsUrl_exports.init(documents)
2710
+ );
1701
2711
  mcp.registerTool(
1702
2712
  readOpenapiSchema_exports.name,
1703
2713
  readOpenapiSchema_exports.config,
@@ -1708,50 +2718,46 @@ ${documents.readme}`
1708
2718
  readOpenapiSchemaSummary_exports.config,
1709
2719
  readOpenapiSchemaSummary_exports.init(documents.schema)
1710
2720
  );
1711
- const apiBaseUrl = "https://developers.portone.io";
1712
2721
  mcp.registerTool(
1713
2722
  readV2BackendCode_exports.name,
1714
2723
  readV2BackendCode_exports.config,
1715
- readV2BackendCode_exports.init(apiBaseUrl)
2724
+ readV2BackendCode_exports.init(DEVELOPERS_URL)
1716
2725
  );
1717
2726
  mcp.registerTool(
1718
2727
  readV2FrontendCode_exports.name,
1719
2728
  readV2FrontendCode_exports.config,
1720
- readV2FrontendCode_exports.init(apiBaseUrl)
2729
+ readV2FrontendCode_exports.init(DEVELOPERS_URL)
2730
+ );
2731
+ const graphClient = new GraphQLClient(GRAPHQL_URL, {
2732
+ headers: { "User-Agent": USER_AGENT }
2733
+ });
2734
+ const tokenProvider = new TokenProvider();
2735
+ tokenProvider.launchRefresher();
2736
+ mcp.registerTool(
2737
+ listStores_exports.name,
2738
+ listStores_exports.config,
2739
+ listStores_exports.init(tokenProvider, graphClient)
2740
+ );
2741
+ mcp.registerTool(
2742
+ listSharedTestChannels_exports.name,
2743
+ listSharedTestChannels_exports.config,
2744
+ listSharedTestChannels_exports.init(tokenProvider)
2745
+ );
2746
+ mcp.registerTool(
2747
+ getChannelsOfStore_exports.name,
2748
+ getChannelsOfStore_exports.config,
2749
+ getChannelsOfStore_exports.init(tokenProvider)
2750
+ );
2751
+ mcp.registerTool(
2752
+ addTestChannel_exports.name,
2753
+ addTestChannel_exports.config,
2754
+ addTestChannel_exports.init(tokenProvider, graphClient)
2755
+ );
2756
+ mcp.registerTool(
2757
+ getPaymentsByFilter_exports.name,
2758
+ getPaymentsByFilter_exports.config,
2759
+ getPaymentsByFilter_exports.init(tokenProvider, graphClient)
1721
2760
  );
1722
- const apiSecret = process.env.API_SECRET;
1723
- if (apiSecret) {
1724
- const httpClient = {
1725
- get: async (url) => {
1726
- return fetch(`https://api.portone.io${url}`, {
1727
- headers: {
1728
- Authorization: `PortOne ${apiSecret}`,
1729
- "User-Agent": `portone-mcp-server ${package_default.version}`
1730
- }
1731
- });
1732
- }
1733
- };
1734
- mcp.registerTool(
1735
- getPayment_exports.name,
1736
- getPayment_exports.config,
1737
- getPayment_exports.init(httpClient)
1738
- );
1739
- mcp.registerTool(
1740
- getPaymentsByFilter_exports.name,
1741
- getPaymentsByFilter_exports.config,
1742
- getPaymentsByFilter_exports.init(httpClient)
1743
- );
1744
- mcp.registerTool(
1745
- getIdentityVerification_exports.name,
1746
- getIdentityVerification_exports.config,
1747
- getIdentityVerification_exports.init(httpClient)
1748
- );
1749
- mcp.registerTool(
1750
- getIdentityVerificationsByFilter_exports.name,
1751
- getIdentityVerificationsByFilter_exports.config,
1752
- getIdentityVerificationsByFilter_exports.init(httpClient)
1753
- );
1754
- }
1755
2761
  const transport = new StdioServerTransport();
1756
2762
  await mcp.connect(transport);
1757
2763
  }