@kakaopay-develop/agent-toolkit
Version:
KakaoPay Agent Toolkit
463 lines (440 loc) • 16.3 kB
JavaScript
// src/modelcontextprotocol/toolkit.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
// src/shared/configuration.ts
function isToolAllowed(tool9, configuration) {
if (!configuration.actions) {
return true;
}
const toolActions = tool9.actions;
if (!toolActions) {
return true;
}
for (const [product, actions] of Object.entries(
toolActions
)) {
if (configuration.actions[product]) {
for (const [action, allowed] of Object.entries(
actions
)) {
if (allowed && configuration.actions[product][action]) {
return true;
}
}
}
}
return false;
}
// src/shared/payment/demoPayment.ts
import { z } from "zod";
// src/shared/client.ts
import axios from "axios";
var KakaoPayClient = class {
constructor(secretKey) {
const baseURL = "https://open-api.kakaopay.com";
this.client = axios.create({
baseURL: `${baseURL}`,
headers: {
Authorization: `SECRET_KEY ${secretKey}`,
"Content-Type": "application/json"
}
});
}
async post(url, data) {
return await this.client.post(url, data);
}
};
var KAKAO_PAY_API_ENDPOINTS = {
PAYMENT_READY: "/online/v1/payment/ready",
PAYMENT_APPROVE: "/online/v1/payment/approve",
PAYMENT_ORDER: "/online/v1/payment/order",
PAYMENT_CANCEL: "/online/v1/payment/cancel",
SUBSCRIPTION_REQUEST: "/online/v1/payment/subscription",
SUBSCRIPTION_INACTIVE: "/online/v1/payment/manage/subscription/inactive",
SUBSCRIPTION_GET: "/online/v1/payment/manage/subscription/status"
};
// src/shared/payment/demoPayment.ts
var demoPaymentPrompt = (_context = {}) => `
\uC774 \uB3C4\uAD6C\uB294 \uCE74\uCE74\uC624\uD398\uC774 \uB370\uBAA8 \uACB0\uC81C \uB9C1\uD06C\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4.
\uD544\uC694\uD55C \uC778\uC218:
- item_name (string): \uC0C1\uD488\uBA85
- total_amount (number): \uC0C1\uD488 \uCD1D\uC561
- link_type (string): \uB9C1\uD06C \uC720\uD615 (PC \uB610\uB294 MOBILE)
`;
var demoPaymentParameters = (_context = {}) => z.object({
item_name: z.string().default("\uD14C\uC2A4\uD2B8 \uC0C1\uD488\uBA85").describe("\uC0C1\uD488\uBA85 (\uCD5C\uB300 100\uC790)"),
total_amount: z.number().int().positive().default(1e3).describe("\uC0C1\uD488 \uCD1D\uC561"),
link_type: z.enum(["PC", "MOBILE"]).default("PC").describe("\uB9C1\uD06C \uC720\uD615")
});
var demoPayment = async (client, context, params) => {
const apiParams = {
partner_order_id: "partner_order_id",
partner_user_id: "partner_user_id",
item_name: params.item_name,
quantity: 1,
total_amount: params.total_amount,
tax_free_amount: 0,
approval_url: "https://payment-demo.kakaopay.com/online/approval",
cancel_url: "https://payment-demo.kakaopay.com/online/cancel",
fail_url: "https://payment-demo.kakaopay.com/online/fail"
};
const response = await client.post(KAKAO_PAY_API_ENDPOINTS.PAYMENT_READY, {
cid: context.cid,
...apiParams
});
const responseData = response.data;
const link = params.link_type === "PC" ? responseData.next_redirect_pc_url : responseData.next_redirect_mobile_url;
return {
demo_link: `${link}?kpayTid=${responseData.tid}`,
tid: responseData.tid
};
};
var tool = (context) => ({
method: "demo_payment",
name: "Demo Payment",
description: demoPaymentPrompt(context),
parameters: demoPaymentParameters(context),
actions: {
payment: {
demo: true
}
},
execute: demoPayment
});
var demoPayment_default = tool;
// src/shared/payment/getPayment.ts
import { z as z2 } from "zod";
var getPaymentPrompt = (_context = {}) => `
\uC774 \uB3C4\uAD6C\uB294 \uCE74\uCE74\uC624\uD398\uC774 \uC8FC\uBB38 \uC0C1\uD0DC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4.
\uD544\uC694\uD55C \uC778\uC218:
- tid (string): \uACB0\uC81C \uACE0\uC720\uBC88\uD638
`;
var getPaymentParameters = (_context = {}) => z2.object({
tid: z2.string().describe("\uACB0\uC81C \uACE0\uC720\uBC88\uD638")
});
var getPayment = async (client, context, params) => {
const response = await client.post(KAKAO_PAY_API_ENDPOINTS.PAYMENT_ORDER, {
cid: context.cid,
...params
});
return response.data;
};
var tool2 = (context) => ({
method: "get_payment",
name: "Get Payment",
description: getPaymentPrompt(context),
parameters: getPaymentParameters(context),
actions: {
payment: {
get: true
}
},
execute: getPayment
});
var getPayment_default = tool2;
// src/shared/payment/readyPayment.ts
import { z as z3 } from "zod";
var readyPaymentPrompt = (_context = {}) => `
\uC774 \uB3C4\uAD6C\uB294 \uCE74\uCE74\uC624\uD398\uC774 \uACB0\uC81C\uB97C \uC900\uBE44\uD569\uB2C8\uB2E4.
\uD544\uC694\uD55C \uC778\uC218:
- partner_order_id (string): \uAC00\uB9F9\uC810 \uC8FC\uBB38\uBC88\uD638
- partner_user_id (string): \uAC00\uB9F9\uC810 \uD68C\uC6D0 ID
- item_name (string): \uC0C1\uD488\uBA85
- quantity (number): \uC0C1\uD488 \uC218\uB7C9
- total_amount (number): \uC0C1\uD488 \uCD1D\uC561
- tax_free_amount (number): \uC0C1\uD488 \uBE44\uACFC\uC138 \uAE08\uC561
- approval_url (string): \uACB0\uC81C \uC131\uACF5 \uC2DC redirect url
- cancel_url (string): \uACB0\uC81C \uCDE8\uC18C \uC2DC redirect url
- fail_url (string): \uACB0\uC81C \uC2E4\uD328 \uC2DC redirect url
`;
var ReadyPaymentSchema = z3.object({
partner_order_id: z3.string().describe("\uAC00\uB9F9\uC810 \uC8FC\uBB38\uBC88\uD638 (\uCD5C\uB300 100\uC790)"),
partner_user_id: z3.string().describe("\uAC00\uB9F9\uC810 \uD68C\uC6D0 ID (\uCD5C\uB300 100\uC790)"),
item_name: z3.string().describe("\uC0C1\uD488\uBA85 (\uCD5C\uB300 100\uC790)"),
quantity: z3.number().int().positive().describe("\uC0C1\uD488 \uC218\uB7C9"),
total_amount: z3.number().int().positive().describe("\uC0C1\uD488 \uCD1D\uC561"),
tax_free_amount: z3.number().int().min(0).describe("\uC0C1\uD488 \uBE44\uACFC\uC138 \uAE08\uC561"),
approval_url: z3.string().url().describe("\uACB0\uC81C \uC131\uACF5 \uC2DC redirect url"),
cancel_url: z3.string().url().describe("\uACB0\uC81C \uCDE8\uC18C \uC2DC redirect url"),
fail_url: z3.string().url().describe("\uACB0\uC81C \uC2E4\uD328 \uC2DC redirect url")
});
var readyPaymentParameters = (_context = {}) => ReadyPaymentSchema;
var readyPayment = async (client, context, params) => {
const response = await client.post(KAKAO_PAY_API_ENDPOINTS.PAYMENT_READY, {
cid: context.cid,
...params
});
return response.data;
};
var tool3 = (context) => ({
method: "ready_payment",
name: "Ready Payment",
description: readyPaymentPrompt(context),
parameters: readyPaymentParameters(context),
actions: {
payment: {
ready: true
}
},
execute: readyPayment
});
var readyPayment_default = tool3;
// src/shared/payment/approvePayment.ts
import { z as z4 } from "zod";
var approvePaymentPrompt = (_context = {}) => `
\uC774 \uB3C4\uAD6C\uB294 \uCE74\uCE74\uC624\uD398\uC774 \uB2E8\uAC74 \uACB0\uC81C\uB97C \uC2B9\uC778\uD569\uB2C8\uB2E4.
\uD544\uC694\uD55C \uC778\uC218:
- tid (string): \uACB0\uC81C \uACE0\uC720\uBC88\uD638
- partner_order_id (string): \uAC00\uB9F9\uC810 \uC8FC\uBB38\uBC88\uD638
- partner_user_id (string): \uAC00\uB9F9\uC810 \uD68C\uC6D0 ID
- pg_token (string): \uACB0\uC81C\uC2B9\uC778 \uC694\uCCAD\uC744 \uC778\uC99D\uD558\uB294 \uD1A0\uD070
`;
var approvePaymentParameters = (_context = {}) => z4.object({
tid: z4.string().describe("\uACB0\uC81C \uACE0\uC720\uBC88\uD638 (\uACB0\uC81C \uC900\uBE44\uC5D0\uC11C \uBC1B\uC740 tid)"),
partner_order_id: z4.string().describe("\uAC00\uB9F9\uC810 \uC8FC\uBB38\uBC88\uD638 (\uACB0\uC81C \uC900\uBE44 API \uC694\uCCAD\uACFC \uC77C\uCE58)"),
partner_user_id: z4.string().describe("\uAC00\uB9F9\uC810 \uD68C\uC6D0 ID (\uACB0\uC81C \uC900\uBE44 API \uC694\uCCAD\uACFC \uC77C\uCE58)"),
pg_token: z4.string().describe(
"\uACB0\uC81C\uC2B9\uC778 \uC694\uCCAD\uC744 \uC778\uC99D\uD558\uB294 \uD1A0\uD070 (\uACB0\uC81C \uC218\uB2E8 \uC120\uD0DD \uC644\uB8CC \uD6C4 \uB9AC\uB2E4\uC774\uB809\uD2B8\uC5D0\uC11C \uBC1B\uC74C)"
)
});
var approvePayment = async (client, context, params) => {
const response = await client.post(KAKAO_PAY_API_ENDPOINTS.PAYMENT_APPROVE, {
cid: context.cid,
...params
});
return response.data;
};
var tool4 = (context) => ({
method: "approve_payment",
name: "Approve Payment",
description: approvePaymentPrompt(context),
parameters: approvePaymentParameters(context),
actions: {
payment: {
approve: true
}
},
execute: approvePayment
});
var approvePayment_default = tool4;
// src/shared/payment/cancelPayment.ts
import { z as z5 } from "zod";
var cancelPaymentPrompt = (_context = {}) => `
\uC774 \uB3C4\uAD6C\uB294 \uCE74\uCE74\uC624\uD398\uC774 \uACB0\uC81C\uB97C \uCDE8\uC18C\uD569\uB2C8\uB2E4.
\uD544\uC694\uD55C \uC778\uC218:
- tid (string): \uACB0\uC81C \uACE0\uC720\uBC88\uD638
- cancel_amount (number): \uCDE8\uC18C \uAE08\uC561
- cancel_tax_free_amount (number): \uCDE8\uC18C \uBE44\uACFC\uC138 \uAE08\uC561
`;
var cancelPaymentParameters = (_context = {}) => z5.object({
tid: z5.string().describe("\uACB0\uC81C \uACE0\uC720\uBC88\uD638 (20\uC790)"),
cancel_amount: z5.number().int().positive().describe("\uCDE8\uC18C \uAE08\uC561"),
cancel_tax_free_amount: z5.number().int().min(0).describe("\uCDE8\uC18C \uBE44\uACFC\uC138 \uAE08\uC561")
});
var cancelPayment = async (client, context, params) => {
const response = await client.post(KAKAO_PAY_API_ENDPOINTS.PAYMENT_CANCEL, {
cid: context.cid,
...params
});
return response.data;
};
var tool5 = (context) => ({
method: "cancel_payment",
name: "Cancel Payment",
description: cancelPaymentPrompt(context),
parameters: cancelPaymentParameters(context),
actions: {
payment: {
cancel: true
}
},
execute: cancelPayment
});
var cancelPayment_default = tool5;
// src/shared/subscription/requestSubscription.ts
import { z as z6 } from "zod";
var requestSubscriptionPrompt = (_context = {}) => `
\uC774 \uB3C4\uAD6C\uB294 \uCE74\uCE74\uC624\uD398\uC774 \uC815\uAE30 \uACB0\uC81C\uB97C \uC694\uCCAD\uD569\uB2C8\uB2E4.
\uD544\uC694\uD55C \uC778\uC218:
- sid (string): \uC815\uAE30 \uACB0\uC81C \uD0A4
- partner_order_id (string): \uAC00\uB9F9\uC810 \uC8FC\uBB38\uBC88\uD638
- partner_user_id (string): \uAC00\uB9F9\uC810 \uD68C\uC6D0 ID
- item_name (string): \uC0C1\uD488\uBA85
- quantity (number): \uC0C1\uD488 \uC218\uB7C9
- total_amount (number): \uC0C1\uD488 \uCD1D\uC561
- tax_free_amount (number): \uC0C1\uD488 \uBE44\uACFC\uC138 \uAE08\uC561
`;
var requestSubscriptionParameters = (_context = {}) => z6.object({
sid: z6.string().describe("\uC815\uAE30 \uACB0\uC81C \uD0A4 (20\uC790)"),
partner_order_id: z6.string().describe("\uAC00\uB9F9\uC810 \uC8FC\uBB38\uBC88\uD638 (\uCD5C\uB300 100\uC790)"),
partner_user_id: z6.string().describe("\uAC00\uB9F9\uC810 \uD68C\uC6D0 ID (\uCD5C\uB300 100\uC790)"),
item_name: z6.string().describe("\uC0C1\uD488\uBA85 (\uCD5C\uB300 100\uC790)"),
quantity: z6.number().int().positive().describe("\uC0C1\uD488 \uC218\uB7C9"),
total_amount: z6.number().int().positive().describe("\uC0C1\uD488 \uCD1D\uC561"),
tax_free_amount: z6.number().int().min(0).describe("\uC0C1\uD488 \uBE44\uACFC\uC138 \uAE08\uC561")
});
var requestSubscription = async (client, context, params) => {
const response = await client.post(
KAKAO_PAY_API_ENDPOINTS.SUBSCRIPTION_REQUEST,
{ cid: context.cid, ...params }
);
return response.data;
};
var tool6 = (context) => ({
method: "request_subscription",
name: "Request Subscription",
description: requestSubscriptionPrompt(context),
parameters: requestSubscriptionParameters(context),
actions: {
subscription: {
request: true
}
},
execute: requestSubscription
});
var requestSubscription_default = tool6;
// src/shared/subscription/inactiveSubscription.ts
import { z as z7 } from "zod";
var inactiveSubscriptionPrompt = (_context = {}) => `
\uC774 \uB3C4\uAD6C\uB294 \uCE74\uCE74\uC624\uD398\uC774 \uC815\uAE30 \uACB0\uC81C\uB97C \uBE44\uD65C\uC131\uD654\uD569\uB2C8\uB2E4.
\uD544\uC694\uD55C \uC778\uC218:
- sid (string): \uC815\uAE30 \uACB0\uC81C \uACE0\uC720\uBC88\uD638
`;
var inactiveSubscriptionParameters = (_context = {}) => z7.object({
sid: z7.string().describe("\uC815\uAE30 \uACB0\uC81C \uACE0\uC720\uBC88\uD638 (20\uC790)")
});
var inactiveSubscription = async (client, context, params) => {
const response = await client.post(
KAKAO_PAY_API_ENDPOINTS.SUBSCRIPTION_INACTIVE,
{ cid: context.cid, ...params }
);
return response.data;
};
var tool7 = (context) => ({
method: "inactive_subscription",
name: "Inactive Subscription",
description: inactiveSubscriptionPrompt(context),
parameters: inactiveSubscriptionParameters(context),
actions: {
subscription: {
inactive: true
}
},
execute: inactiveSubscription
});
var inactiveSubscription_default = tool7;
// src/shared/subscription/getSubscription.ts
import { z as z8 } from "zod";
var getSubscriptionPrompt = (_context = {}) => `
\uC774 \uB3C4\uAD6C\uB294 \uCE74\uCE74\uC624\uD398\uC774 \uC815\uAE30 \uACB0\uC81C\uB97C \uC2B9\uC778\uD569\uB2C8\uB2E4.
\uD544\uC694\uD55C \uC778\uC218:
- sid (string): \uC815\uAE30 \uACB0\uC81C \uACE0\uC720\uBC88\uD638
`;
var getSubscriptionParameters = (_context = {}) => z8.object({
sid: z8.string().describe("\uC815\uAE30 \uACB0\uC81C \uACE0\uC720\uBC88\uD638 (20\uC790)")
});
var getSubscription = async (client, context, params) => {
const response = await client.post(KAKAO_PAY_API_ENDPOINTS.SUBSCRIPTION_GET, {
cid: context.cid,
...params
});
return response.data;
};
var tool8 = (context) => ({
method: "get_subscription",
name: "Get Subscription",
description: getSubscriptionPrompt(context),
parameters: getSubscriptionParameters(context),
actions: {
subscription: {
get: true
}
},
execute: getSubscription
});
var getSubscription_default = tool8;
// src/shared/tools.ts
var tools = (context) => [
demoPayment_default(context),
getPayment_default(context),
readyPayment_default(context),
approvePayment_default(context),
cancelPayment_default(context),
requestSubscription_default(context),
inactiveSubscription_default(context),
getSubscription_default(context)
];
var tools_default = tools;
// src/shared/api.ts
var KakaoPayAPI = class {
constructor(secretKey, context) {
this.context = context || {};
this.kakaoPayClient = new KakaoPayClient(secretKey);
this.tools = tools_default(this.context);
}
async run(method, arg) {
try {
const tool9 = this.tools.find((t) => t.method === method);
if (!tool9) {
throw new Error(`Invalid MCP method: ${method}`);
}
const output = await tool9.execute(this.kakaoPayClient, this.context, arg);
return JSON.stringify(output);
} catch (error) {
if (error.response) {
return JSON.stringify({
error: { http_status: error.response.status, ...error.response.data }
});
}
const errorMessage = error.message || "Unknown error";
return JSON.stringify({
error: {
error_message: errorMessage
}
});
}
}
};
var api_default = KakaoPayAPI;
// package.json
var version = "0.1.2";
// src/modelcontextprotocol/toolkit.ts
var KakaoPayAgentToolkit = class extends McpServer {
constructor({
secretKey,
configuration
}) {
super({
name: "KakaoPay",
version
});
this._kakaopay = new api_default(secretKey, configuration.context);
const context = configuration.context || {};
const filteredTools = tools_default(context).filter(
(tool9) => isToolAllowed(tool9, configuration)
);
filteredTools.forEach((tool9) => {
this.tool(
tool9.method,
tool9.description,
tool9.parameters.shape,
async (arg, _extra) => {
const result = await this._kakaopay.run(tool9.method, arg);
return {
content: [
{
type: "text",
text: String(result)
}
]
};
}
);
});
}
};
var toolkit_default = KakaoPayAgentToolkit;
export {
api_default as KakaoPayAPI,
toolkit_default as KakaoPayAgentToolkit
};
//# sourceMappingURL=index.mjs.map