ncloud-mcp-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +159 -0
- package/README_EN.md +159 -0
- package/dist/auth/signature.d.ts +16 -0
- package/dist/auth/signature.js +18 -0
- package/dist/auth/signature.js.map +1 -0
- package/dist/auth/signature.test.d.ts +1 -0
- package/dist/auth/signature.test.js +90 -0
- package/dist/auth/signature.test.js.map +1 -0
- package/dist/client/ncloud-client.d.ts +27 -0
- package/dist/client/ncloud-client.js +270 -0
- package/dist/client/ncloud-client.js.map +1 -0
- package/dist/client/ncloud-client.test.d.ts +1 -0
- package/dist/client/ncloud-client.test.js +477 -0
- package/dist/client/ncloud-client.test.js.map +1 -0
- package/dist/client/s3-compatible-client.d.ts +49 -0
- package/dist/client/s3-compatible-client.js +210 -0
- package/dist/client/s3-compatible-client.js.map +1 -0
- package/dist/client/swift-compatible-client.d.ts +68 -0
- package/dist/client/swift-compatible-client.js +173 -0
- package/dist/client/swift-compatible-client.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +362 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/acg.d.ts +3 -0
- package/dist/tools/acg.js +220 -0
- package/dist/tools/acg.js.map +1 -0
- package/dist/tools/activity-tracer.d.ts +3 -0
- package/dist/tools/activity-tracer.js +77 -0
- package/dist/tools/activity-tracer.js.map +1 -0
- package/dist/tools/analytics-cdss.d.ts +3 -0
- package/dist/tools/analytics-cdss.js +618 -0
- package/dist/tools/analytics-cdss.js.map +1 -0
- package/dist/tools/analytics-datacatalog.d.ts +10 -0
- package/dist/tools/analytics-datacatalog.js +409 -0
- package/dist/tools/analytics-datacatalog.js.map +1 -0
- package/dist/tools/analytics-dataflow.d.ts +16 -0
- package/dist/tools/analytics-dataflow.js +478 -0
- package/dist/tools/analytics-dataflow.js.map +1 -0
- package/dist/tools/analytics-dataforest.d.ts +10 -0
- package/dist/tools/analytics-dataforest.js +379 -0
- package/dist/tools/analytics-dataforest.js.map +1 -0
- package/dist/tools/analytics-dataquery.d.ts +16 -0
- package/dist/tools/analytics-dataquery.js +143 -0
- package/dist/tools/analytics-dataquery.js.map +1 -0
- package/dist/tools/analytics-datastream.d.ts +13 -0
- package/dist/tools/analytics-datastream.js +359 -0
- package/dist/tools/analytics-datastream.js.map +1 -0
- package/dist/tools/analytics-hadoop.d.ts +12 -0
- package/dist/tools/analytics-hadoop.js +450 -0
- package/dist/tools/analytics-hadoop.js.map +1 -0
- package/dist/tools/analytics-ses.d.ts +3 -0
- package/dist/tools/analytics-ses.js +653 -0
- package/dist/tools/analytics-ses.js.map +1 -0
- package/dist/tools/api-gateway.d.ts +3 -0
- package/dist/tools/api-gateway.js +202 -0
- package/dist/tools/api-gateway.js.map +1 -0
- package/dist/tools/autoscaling.d.ts +3 -0
- package/dist/tools/autoscaling.js +430 -0
- package/dist/tools/autoscaling.js.map +1 -0
- package/dist/tools/billing.d.ts +14 -0
- package/dist/tools/billing.js +545 -0
- package/dist/tools/billing.js.map +1 -0
- package/dist/tools/certificate-manager.d.ts +18 -0
- package/dist/tools/certificate-manager.js +84 -0
- package/dist/tools/certificate-manager.js.map +1 -0
- package/dist/tools/cloud-advisor.d.ts +3 -0
- package/dist/tools/cloud-advisor.js +202 -0
- package/dist/tools/cloud-advisor.js.map +1 -0
- package/dist/tools/cloud-functions.d.ts +3 -0
- package/dist/tools/cloud-functions.js +497 -0
- package/dist/tools/cloud-functions.js.map +1 -0
- package/dist/tools/cloud-insight-integration.d.ts +3 -0
- package/dist/tools/cloud-insight-integration.js +90 -0
- package/dist/tools/cloud-insight-integration.js.map +1 -0
- package/dist/tools/cloud-insight-plugin.d.ts +3 -0
- package/dist/tools/cloud-insight-plugin.js +600 -0
- package/dist/tools/cloud-insight-plugin.js.map +1 -0
- package/dist/tools/cloud-insight-rule.d.ts +3 -0
- package/dist/tools/cloud-insight-rule.js +570 -0
- package/dist/tools/cloud-insight-rule.js.map +1 -0
- package/dist/tools/cloud-insight.d.ts +3 -0
- package/dist/tools/cloud-insight.js +246 -0
- package/dist/tools/cloud-insight.js.map +1 -0
- package/dist/tools/common.d.ts +3 -0
- package/dist/tools/common.js +120 -0
- package/dist/tools/common.js.map +1 -0
- package/dist/tools/compute-initscript.d.ts +3 -0
- package/dist/tools/compute-initscript.js +62 -0
- package/dist/tools/compute-initscript.js.map +1 -0
- package/dist/tools/compute-loginkey.d.ts +3 -0
- package/dist/tools/compute-loginkey.js +59 -0
- package/dist/tools/compute-loginkey.js.map +1 -0
- package/dist/tools/compute-placement.d.ts +3 -0
- package/dist/tools/compute-placement.js +196 -0
- package/dist/tools/compute-placement.js.map +1 -0
- package/dist/tools/compute-publicip.d.ts +3 -0
- package/dist/tools/compute-publicip.js +97 -0
- package/dist/tools/compute-publicip.js.map +1 -0
- package/dist/tools/compute-server.d.ts +3 -0
- package/dist/tools/compute-server.js +445 -0
- package/dist/tools/compute-server.js.map +1 -0
- package/dist/tools/compute-server.test.d.ts +1 -0
- package/dist/tools/compute-server.test.js +224 -0
- package/dist/tools/compute-server.test.js.map +1 -0
- package/dist/tools/compute-storage.d.ts +3 -0
- package/dist/tools/compute-storage.js +240 -0
- package/dist/tools/compute-storage.js.map +1 -0
- package/dist/tools/containers-nks.d.ts +13 -0
- package/dist/tools/containers-nks.js +576 -0
- package/dist/tools/containers-nks.js.map +1 -0
- package/dist/tools/containers-registry.d.ts +3 -0
- package/dist/tools/containers-registry.js +181 -0
- package/dist/tools/containers-registry.js.map +1 -0
- package/dist/tools/database-cache.d.ts +3 -0
- package/dist/tools/database-cache.js +388 -0
- package/dist/tools/database-cache.js.map +1 -0
- package/dist/tools/database-mongodb.d.ts +3 -0
- package/dist/tools/database-mongodb.js +460 -0
- package/dist/tools/database-mongodb.js.map +1 -0
- package/dist/tools/database-mssql.d.ts +3 -0
- package/dist/tools/database-mssql.js +345 -0
- package/dist/tools/database-mssql.js.map +1 -0
- package/dist/tools/database-mysql.d.ts +3 -0
- package/dist/tools/database-mysql.js +500 -0
- package/dist/tools/database-mysql.js.map +1 -0
- package/dist/tools/database-postgresql.d.ts +3 -0
- package/dist/tools/database-postgresql.js +432 -0
- package/dist/tools/database-postgresql.js.map +1 -0
- package/dist/tools/global-dns.d.ts +3 -0
- package/dist/tools/global-dns.js +207 -0
- package/dist/tools/global-dns.js.map +1 -0
- package/dist/tools/global-edge.d.ts +3 -0
- package/dist/tools/global-edge.js +386 -0
- package/dist/tools/global-edge.js.map +1 -0
- package/dist/tools/global-traffic-manager.d.ts +3 -0
- package/dist/tools/global-traffic-manager.js +497 -0
- package/dist/tools/global-traffic-manager.js.map +1 -0
- package/dist/tools/index.d.ts +63 -0
- package/dist/tools/index.js +64 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/kms.d.ts +8 -0
- package/dist/tools/kms.js +529 -0
- package/dist/tools/kms.js.map +1 -0
- package/dist/tools/loadbalancer.d.ts +3 -0
- package/dist/tools/loadbalancer.js +341 -0
- package/dist/tools/loadbalancer.js.map +1 -0
- package/dist/tools/log-analytics.d.ts +3 -0
- package/dist/tools/log-analytics.js +183 -0
- package/dist/tools/log-analytics.js.map +1 -0
- package/dist/tools/media-imageoptimizer.d.ts +3 -0
- package/dist/tools/media-imageoptimizer.js +187 -0
- package/dist/tools/media-imageoptimizer.js.map +1 -0
- package/dist/tools/media-livestation.d.ts +3 -0
- package/dist/tools/media-livestation.js +252 -0
- package/dist/tools/media-livestation.js.map +1 -0
- package/dist/tools/media-vodstation.d.ts +3 -0
- package/dist/tools/media-vodstation.js +197 -0
- package/dist/tools/media-vodstation.js.map +1 -0
- package/dist/tools/nat-gateway.d.ts +3 -0
- package/dist/tools/nat-gateway.js +91 -0
- package/dist/tools/nat-gateway.js.map +1 -0
- package/dist/tools/network-acl.d.ts +3 -0
- package/dist/tools/network-acl.js +322 -0
- package/dist/tools/network-acl.js.map +1 -0
- package/dist/tools/network-interface.d.ts +3 -0
- package/dist/tools/network-interface.js +193 -0
- package/dist/tools/network-interface.js.map +1 -0
- package/dist/tools/private-ca.d.ts +8 -0
- package/dist/tools/private-ca.js +368 -0
- package/dist/tools/private-ca.js.map +1 -0
- package/dist/tools/resource-manager.d.ts +3 -0
- package/dist/tools/resource-manager.js +151 -0
- package/dist/tools/resource-manager.js.map +1 -0
- package/dist/tools/route-table.d.ts +3 -0
- package/dist/tools/route-table.js +205 -0
- package/dist/tools/route-table.js.map +1 -0
- package/dist/tools/security-monitoring.d.ts +3 -0
- package/dist/tools/security-monitoring.js +182 -0
- package/dist/tools/security-monitoring.js.map +1 -0
- package/dist/tools/sens.d.ts +3 -0
- package/dist/tools/sens.js +240 -0
- package/dist/tools/sens.js.map +1 -0
- package/dist/tools/sourcebuild.d.ts +3 -0
- package/dist/tools/sourcebuild.js +481 -0
- package/dist/tools/sourcebuild.js.map +1 -0
- package/dist/tools/sourcecommit.d.ts +13 -0
- package/dist/tools/sourcecommit.js +228 -0
- package/dist/tools/sourcecommit.js.map +1 -0
- package/dist/tools/sourcedeploy.d.ts +3 -0
- package/dist/tools/sourcedeploy.js +448 -0
- package/dist/tools/sourcedeploy.js.map +1 -0
- package/dist/tools/sourcepipeline.d.ts +12 -0
- package/dist/tools/sourcepipeline.js +357 -0
- package/dist/tools/sourcepipeline.js.map +1 -0
- package/dist/tools/storage-archive.d.ts +3 -0
- package/dist/tools/storage-archive.js +337 -0
- package/dist/tools/storage-archive.js.map +1 -0
- package/dist/tools/storage-nas.d.ts +3 -0
- package/dist/tools/storage-nas.js +288 -0
- package/dist/tools/storage-nas.js.map +1 -0
- package/dist/tools/storage-ncloud.d.ts +3 -0
- package/dist/tools/storage-ncloud.js +864 -0
- package/dist/tools/storage-ncloud.js.map +1 -0
- package/dist/tools/storage-object.d.ts +3 -0
- package/dist/tools/storage-object.js +982 -0
- package/dist/tools/storage-object.js.map +1 -0
- package/dist/tools/sub-account.d.ts +3 -0
- package/dist/tools/sub-account.js +311 -0
- package/dist/tools/sub-account.js.map +1 -0
- package/dist/tools/target-group.d.ts +3 -0
- package/dist/tools/target-group.js +207 -0
- package/dist/tools/target-group.js.map +1 -0
- package/dist/tools/vpc-peering.d.ts +3 -0
- package/dist/tools/vpc-peering.js +109 -0
- package/dist/tools/vpc-peering.js.map +1 -0
- package/dist/tools/vpc.d.ts +3 -0
- package/dist/tools/vpc.js +194 -0
- package/dist/tools/vpc.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerLoadBalancerTools(server, client) {
|
|
3
|
+
// ─── Load Balancer Query Tools ─────────────────────────────────────────────
|
|
4
|
+
server.tool("ncloud_list_load_balancers", "List all load balancer instances in the current region", {
|
|
5
|
+
loadBalancerInstanceNoList: z.array(z.string()).optional().describe("Filter by load balancer instance numbers"),
|
|
6
|
+
loadBalancerType: z.string().optional().describe("Filter by LB type (APPLICATION, NETWORK, NETWORK_PROXY)"),
|
|
7
|
+
loadBalancerNetworkType: z.string().optional().describe("Filter by network type (PUBLIC, PRIVATE)"),
|
|
8
|
+
vpcNo: z.string().optional().describe("Filter by VPC number"),
|
|
9
|
+
pageNo: z.number().optional().describe("Page number for pagination"),
|
|
10
|
+
pageSize: z.number().optional().describe("Page size for pagination"),
|
|
11
|
+
}, async (params) => {
|
|
12
|
+
try {
|
|
13
|
+
const result = await client.request("/vloadbalancer/v2/getLoadBalancerInstanceList", params);
|
|
14
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
server.tool("ncloud_get_load_balancer_detail", "Get detailed information about a specific load balancer instance", {
|
|
21
|
+
loadBalancerInstanceNo: z.string().describe("Load balancer instance number to query"),
|
|
22
|
+
}, async (params) => {
|
|
23
|
+
try {
|
|
24
|
+
const result = await client.request("/vloadbalancer/v2/getLoadBalancerInstanceDetail", params);
|
|
25
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
// ─── Load Balancer Create Tool ─────────────────────────────────────────────
|
|
32
|
+
server.tool("ncloud_create_load_balancer", "Create a new load balancer instance. Use dryRun=true to preview without creating.", {
|
|
33
|
+
loadBalancerTypeCode: z.string({
|
|
34
|
+
required_error: "필수 파라미터 'loadBalancerTypeCode'가 누락되었습니다.",
|
|
35
|
+
}).describe("Load balancer type (APPLICATION, NETWORK, NETWORK_PROXY)"),
|
|
36
|
+
loadBalancerNetworkTypeCode: z.string().optional().describe("Network type (PUBLIC or PRIVATE). Default: PUBLIC"),
|
|
37
|
+
loadBalancerName: z.string().max(30, {
|
|
38
|
+
message: "잘못된 파라미터: 'loadBalancerName'은 30자 이하여야 합니다.",
|
|
39
|
+
}).optional().describe("Load balancer name (max 30 characters)"),
|
|
40
|
+
loadBalancerDescription: z.string().optional().describe("Load balancer description"),
|
|
41
|
+
vpcNo: z.string({
|
|
42
|
+
required_error: "필수 파라미터 'vpcNo'가 누락되었습니다.",
|
|
43
|
+
}).describe("VPC number"),
|
|
44
|
+
subnetNoList: z.array(z.string(), {
|
|
45
|
+
required_error: "필수 파라미터 'subnetNoList'가 누락되었습니다.",
|
|
46
|
+
}).describe("List of subnet numbers for the load balancer (one LB-only subnet per zone)"),
|
|
47
|
+
throughputTypeCode: z.string().optional().describe("Throughput type (SMALL, MEDIUM, LARGE, XLARGE for ALB/NProxy; DYNAMIC for NLB)"),
|
|
48
|
+
idleTimeout: z.number().optional().describe("Idle timeout in seconds (1-3600, default: 60). Cannot be set for NETWORK type"),
|
|
49
|
+
listenerList: z.array(z.object({
|
|
50
|
+
protocolTypeCode: z.string().describe("Listener protocol (HTTP, HTTPS, TCP, UDP, TLS)"),
|
|
51
|
+
port: z.number().describe("Listener port number (1-65534)"),
|
|
52
|
+
targetGroupNo: z.string().describe("Target group number for default rule"),
|
|
53
|
+
sslCertificateNo: z.string().optional().describe("SSL certificate number (required for HTTPS/TLS)"),
|
|
54
|
+
useHttp2: z.boolean().optional().describe("Whether to use HTTP/2 protocol (only for HTTPS listener)"),
|
|
55
|
+
tlsMinVersionTypeCode: z.string().optional().describe("TLS minimum version (TLSV10, TLSV11, TLSV12, TLSV13). Only for HTTPS/TLS"),
|
|
56
|
+
cipherSuiteList: z.array(z.string()).optional().describe("List of cipher suites. Only for HTTPS/TLS"),
|
|
57
|
+
}), {
|
|
58
|
+
required_error: "필수 파라미터 'listenerList'가 누락되었습니다.",
|
|
59
|
+
}).describe("List of listener configurations"),
|
|
60
|
+
dryRun: z.boolean().optional().default(false).describe("If true, returns a preview without actually creating the load balancer"),
|
|
61
|
+
}, async (params) => {
|
|
62
|
+
try {
|
|
63
|
+
if (params.dryRun) {
|
|
64
|
+
const preview = {
|
|
65
|
+
label: "🔍 Dry-Run Preview: Load Balancer Creation",
|
|
66
|
+
loadBalancerTypeCode: params.loadBalancerTypeCode,
|
|
67
|
+
loadBalancerNetworkTypeCode: params.loadBalancerNetworkTypeCode ?? "PUBLIC",
|
|
68
|
+
loadBalancerName: params.loadBalancerName ?? "(auto-generated)",
|
|
69
|
+
vpcNo: params.vpcNo,
|
|
70
|
+
subnetNoList: params.subnetNoList,
|
|
71
|
+
listenerCount: params.listenerList.length,
|
|
72
|
+
listeners: params.listenerList.map((l) => `${l.protocolTypeCode}:${l.port} → TG:${l.targetGroupNo}`),
|
|
73
|
+
message: "이 요청은 실제 로드 밸런서를 생성하지 않습니다. dryRun=false로 호출하면 로드 밸런서가 생성됩니다.",
|
|
74
|
+
};
|
|
75
|
+
return { content: [{ type: "text", text: JSON.stringify(preview, null, 2) }] };
|
|
76
|
+
}
|
|
77
|
+
const { dryRun, listenerList, subnetNoList, ...restParams } = params;
|
|
78
|
+
const apiParams = { ...restParams, subnetNoList };
|
|
79
|
+
// Serialize listenerList for Ncloud API format (loadBalancerListenerList.N.*)
|
|
80
|
+
listenerList.forEach((listener, idx) => {
|
|
81
|
+
const n = idx + 1;
|
|
82
|
+
apiParams[`loadBalancerListenerList.${n}.protocolTypeCode`] = listener.protocolTypeCode;
|
|
83
|
+
apiParams[`loadBalancerListenerList.${n}.port`] = listener.port;
|
|
84
|
+
apiParams[`loadBalancerListenerList.${n}.targetGroupNo`] = listener.targetGroupNo;
|
|
85
|
+
if (listener.sslCertificateNo) {
|
|
86
|
+
apiParams[`loadBalancerListenerList.${n}.sslCertificateNo`] = listener.sslCertificateNo;
|
|
87
|
+
}
|
|
88
|
+
if (listener.useHttp2 !== undefined) {
|
|
89
|
+
apiParams[`loadBalancerListenerList.${n}.useHttp2`] = listener.useHttp2;
|
|
90
|
+
}
|
|
91
|
+
if (listener.tlsMinVersionTypeCode) {
|
|
92
|
+
apiParams[`loadBalancerListenerList.${n}.tlsMinVersionTypeCode`] = listener.tlsMinVersionTypeCode;
|
|
93
|
+
}
|
|
94
|
+
if (listener.cipherSuiteList) {
|
|
95
|
+
listener.cipherSuiteList.forEach((cipher, cIdx) => {
|
|
96
|
+
apiParams[`loadBalancerListenerList.${n}.cipherSuiteList.${cIdx + 1}`] = cipher;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
const result = await client.request("/vloadbalancer/v2/createLoadBalancerInstance", apiParams);
|
|
101
|
+
const instance = result.loadBalancerInstanceList?.[0];
|
|
102
|
+
const summary = {
|
|
103
|
+
리소스타입: "LoadBalancer",
|
|
104
|
+
리소스ID: instance?.loadBalancerInstanceNo ?? "unknown",
|
|
105
|
+
리소스명: instance?.loadBalancerName ?? params.loadBalancerName ?? "unknown",
|
|
106
|
+
상태: instance?.loadBalancerInstanceStatus?.codeName ?? "creating",
|
|
107
|
+
생성시각: instance?.createDate ?? new Date().toISOString(),
|
|
108
|
+
타입: params.loadBalancerTypeCode,
|
|
109
|
+
도메인: instance?.loadBalancerDomain ?? "pending",
|
|
110
|
+
리스너설정: params.listenerList.map((l) => `${l.protocolTypeCode}:${l.port}`).join(", "),
|
|
111
|
+
};
|
|
112
|
+
return { content: [{ type: "text", text: JSON.stringify(summary, null, 2) }] };
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
// ─── Load Balancer Destructive Tool ────────────────────────────────────────
|
|
119
|
+
server.tool("ncloud_delete_load_balancers", "⚠️ Destructive: Permanently delete load balancer instances. Set confirm=true to execute.", {
|
|
120
|
+
loadBalancerInstanceNoList: z.array(z.string(), {
|
|
121
|
+
required_error: "필수 파라미터 'loadBalancerInstanceNoList'가 누락되었습니다.",
|
|
122
|
+
}).describe("List of load balancer instance numbers to delete"),
|
|
123
|
+
confirm: z.boolean().optional().default(false).describe("Must be true to actually execute the destructive operation"),
|
|
124
|
+
}, async (params) => {
|
|
125
|
+
try {
|
|
126
|
+
if (!params.confirm) {
|
|
127
|
+
const message = `⚠️ This will permanently delete Load Balancer(s) [${params.loadBalancerInstanceNoList.join(", ")}]. Do you want to proceed? (yes/no)\n\nTo execute, call this tool again with confirm=true.`;
|
|
128
|
+
return { content: [{ type: "text", text: message }] };
|
|
129
|
+
}
|
|
130
|
+
const { confirm, ...apiParams } = params;
|
|
131
|
+
const result = await client.request("/vloadbalancer/v2/deleteLoadBalancerInstances", apiParams);
|
|
132
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
// ─── Load Balancer Configuration Tools ──────────────────────────────────────
|
|
139
|
+
server.tool("ncloud_change_lb_config", "Change load balancer instance configuration (idle timeout, throughput type)", {
|
|
140
|
+
loadBalancerInstanceNo: z.string({
|
|
141
|
+
required_error: "필수 파라미터 'loadBalancerInstanceNo'가 누락되었습니다.",
|
|
142
|
+
}).describe("Load balancer instance number"),
|
|
143
|
+
idleTimeout: z.number().optional().describe("Idle timeout in seconds (1-3600, default: 60). Cannot be set for NETWORK type"),
|
|
144
|
+
throughputTypeCode: z.string().optional().describe("Throughput type code (SMALL, MEDIUM, LARGE, XLARGE for ALB/NProxy; DYNAMIC for NLB)"),
|
|
145
|
+
}, async (params) => {
|
|
146
|
+
try {
|
|
147
|
+
const result = await client.request("/vloadbalancer/v2/changeLoadBalancerInstanceConfiguration", params);
|
|
148
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
server.tool("ncloud_set_lb_description", "Set or update the description of a load balancer instance", {
|
|
155
|
+
loadBalancerInstanceNo: z.string({
|
|
156
|
+
required_error: "필수 파라미터 'loadBalancerInstanceNo'가 누락되었습니다.",
|
|
157
|
+
}).describe("Load balancer instance number"),
|
|
158
|
+
loadBalancerDescription: z.string({
|
|
159
|
+
required_error: "필수 파라미터 'loadBalancerDescription'이 누락되었습니다.",
|
|
160
|
+
}).describe("New description for the load balancer"),
|
|
161
|
+
}, async (params) => {
|
|
162
|
+
try {
|
|
163
|
+
const result = await client.request("/vloadbalancer/v2/setLoadBalancerDescription", params);
|
|
164
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
server.tool("ncloud_set_lb_subnet", "Set subnets for a load balancer instance", {
|
|
171
|
+
loadBalancerInstanceNo: z.string({
|
|
172
|
+
required_error: "필수 파라미터 'loadBalancerInstanceNo'가 누락되었습니다.",
|
|
173
|
+
}).describe("Load balancer instance number"),
|
|
174
|
+
subnetNoList: z.array(z.string(), {
|
|
175
|
+
required_error: "필수 파라미터 'subnetNoList'가 누락되었습니다.",
|
|
176
|
+
}).describe("List of subnet numbers to assign to the load balancer"),
|
|
177
|
+
}, async (params) => {
|
|
178
|
+
try {
|
|
179
|
+
const result = await client.request("/vloadbalancer/v2/setLoadBalancerInstanceSubnet", params);
|
|
180
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
// ─── Listener Configuration Tools ─────────────────────────────────────────
|
|
187
|
+
server.tool("ncloud_change_lb_listener_config", "Change load balancer listener configuration (protocol, port, SSL, TLS settings)", {
|
|
188
|
+
loadBalancerListenerNo: z.string({
|
|
189
|
+
required_error: "필수 파라미터 'loadBalancerListenerNo'가 누락되었습니다.",
|
|
190
|
+
}).describe("Load balancer listener number"),
|
|
191
|
+
protocolTypeCode: z.string({
|
|
192
|
+
required_error: "필수 파라미터 'protocolTypeCode'가 누락되었습니다.",
|
|
193
|
+
}).describe("Listener protocol type (HTTP, HTTPS, TCP, UDP, TLS)"),
|
|
194
|
+
port: z.number({
|
|
195
|
+
required_error: "필수 파라미터 'port'가 누락되었습니다.",
|
|
196
|
+
}).describe("Listener port number (1-65534)"),
|
|
197
|
+
useHttp2: z.boolean().optional().describe("Whether to use HTTP/2 protocol (only for HTTPS listener)"),
|
|
198
|
+
sslCertificateNo: z.string().optional().describe("SSL certificate number (required for HTTPS/TLS)"),
|
|
199
|
+
tlsMinVersionTypeCode: z.string().optional().describe("TLS minimum version (TLSV10, TLSV11, TLSV12). Only for HTTPS/TLS"),
|
|
200
|
+
cipherSuiteList: z.array(z.string()).optional().describe("List of cipher suites. Only for HTTPS/TLS"),
|
|
201
|
+
}, async (params) => {
|
|
202
|
+
try {
|
|
203
|
+
const result = await client.request("/vloadbalancer/v2/changeLoadBalancerListenerConfiguration", params);
|
|
204
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
// ─── Load Balancer Rule Tools ──────────────────────────────────────────────
|
|
211
|
+
server.tool("ncloud_list_lb_rules", "List rules registered to a load balancer listener", {
|
|
212
|
+
loadBalancerListenerNo: z.string({
|
|
213
|
+
required_error: "필수 파라미터 'loadBalancerListenerNo'가 누락되었습니다.",
|
|
214
|
+
}).describe("Load balancer listener number"),
|
|
215
|
+
}, async (params) => {
|
|
216
|
+
try {
|
|
217
|
+
const result = await client.request("/vloadbalancer/v2/getLoadBalancerRuleList", params);
|
|
218
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
// ─── Listener Certificate Tools ────────────────────────────────────────────
|
|
225
|
+
server.tool("ncloud_add_lb_listener_certificate", "Add an SNI-based TLS certificate to a load balancer listener", {
|
|
226
|
+
loadBalancerListenerNo: z.string({
|
|
227
|
+
required_error: "필수 파라미터 'loadBalancerListenerNo'가 누락되었습니다.",
|
|
228
|
+
}).describe("Load balancer listener number"),
|
|
229
|
+
sslCertificateNo: z.string({
|
|
230
|
+
required_error: "필수 파라미터 'sslCertificateNo'가 누락되었습니다.",
|
|
231
|
+
}).describe("SSL certificate number to add"),
|
|
232
|
+
}, async (params) => {
|
|
233
|
+
try {
|
|
234
|
+
const result = await client.request("/vloadbalancer/v2/addLoadBalancerListenerCertificate", params);
|
|
235
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
server.tool("ncloud_remove_lb_listener_certificate", "⚠️ DESTRUCTIVE: Remove an SNI-based TLS certificate from a load balancer listener. Set confirm=true to execute.", {
|
|
242
|
+
loadBalancerListenerNo: z.string({
|
|
243
|
+
required_error: "필수 파라미터 'loadBalancerListenerNo'가 누락되었습니다.",
|
|
244
|
+
}).describe("Load balancer listener number"),
|
|
245
|
+
sslCertificateNo: z.string({
|
|
246
|
+
required_error: "필수 파라미터 'sslCertificateNo'가 누락되었습니다.",
|
|
247
|
+
}).describe("SSL certificate number to remove"),
|
|
248
|
+
confirm: z.boolean().optional().default(false).describe("⚠️ DESTRUCTIVE: Must be true to actually execute the certificate removal"),
|
|
249
|
+
}, async (params) => {
|
|
250
|
+
try {
|
|
251
|
+
if (!params.confirm) {
|
|
252
|
+
const message = `⚠️ This will remove SSL certificate [${params.sslCertificateNo}] from Listener [${params.loadBalancerListenerNo}]. Do you want to proceed? (yes/no)\n\nTo execute, call this tool again with confirm=true.`;
|
|
253
|
+
return { content: [{ type: "text", text: message }] };
|
|
254
|
+
}
|
|
255
|
+
const { confirm, ...apiParams } = params;
|
|
256
|
+
const result = await client.request("/vloadbalancer/v2/removeLoadBalancerListenerCertificate", apiParams);
|
|
257
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
server.tool("ncloud_list_lb_listener_certificates", "List TLS certificates associated with a load balancer listener", {
|
|
264
|
+
loadBalancerListenerNo: z.string({
|
|
265
|
+
required_error: "필수 파라미터 'loadBalancerListenerNo'가 누락되었습니다.",
|
|
266
|
+
}).describe("Load balancer listener number"),
|
|
267
|
+
}, async (params) => {
|
|
268
|
+
try {
|
|
269
|
+
const result = await client.request("/vloadbalancer/v2/getLoadBalancerListenerCertificateList", params);
|
|
270
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
// ─── Listener Query Tools ──────────────────────────────────────────────────
|
|
277
|
+
server.tool("ncloud_list_lb_listeners", "List all listeners for a specific load balancer", {
|
|
278
|
+
loadBalancerInstanceNo: z.string({
|
|
279
|
+
required_error: "필수 파라미터 'loadBalancerInstanceNo'가 누락되었습니다.",
|
|
280
|
+
}).describe("Load balancer instance number"),
|
|
281
|
+
}, async (params) => {
|
|
282
|
+
try {
|
|
283
|
+
const result = await client.request("/vloadbalancer/v2/getLoadBalancerListenerList", params);
|
|
284
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
// ─── Listener Create Tool ──────────────────────────────────────────────────
|
|
291
|
+
server.tool("ncloud_create_lb_listener", "Create a new listener for a load balancer", {
|
|
292
|
+
loadBalancerInstanceNo: z.string({
|
|
293
|
+
required_error: "필수 파라미터 'loadBalancerInstanceNo'가 누락되었습니다.",
|
|
294
|
+
}).describe("Load balancer instance number"),
|
|
295
|
+
protocolTypeCode: z.string({
|
|
296
|
+
required_error: "필수 파라미터 'protocolTypeCode'가 누락되었습니다.",
|
|
297
|
+
}).describe("Listener protocol type (HTTP, HTTPS, TCP, UDP, TLS)"),
|
|
298
|
+
port: z.number({
|
|
299
|
+
required_error: "필수 파라미터 'port'가 누락되었습니다.",
|
|
300
|
+
}).describe("Listener port number (1-65534)"),
|
|
301
|
+
targetGroupNo: z.string({
|
|
302
|
+
required_error: "필수 파라미터 'targetGroupNo'가 누락되었습니다.",
|
|
303
|
+
}).describe("Target group number for default rule"),
|
|
304
|
+
useHttp2: z.boolean().optional().describe("Whether to use HTTP/2 protocol (only for HTTPS listener)"),
|
|
305
|
+
sslCertificateNo: z.string().optional().describe("SSL certificate number (required for HTTPS/TLS)"),
|
|
306
|
+
tlsMinVersionTypeCode: z.string().optional().describe("TLS minimum version (TLSV10, TLSV11, TLSV12). Only for HTTPS/TLS"),
|
|
307
|
+
cipherSuiteList: z.array(z.string()).optional().describe("List of cipher suites. Only for HTTPS/TLS"),
|
|
308
|
+
}, async (params) => {
|
|
309
|
+
try {
|
|
310
|
+
const result = await client.request("/vloadbalancer/v2/createLoadBalancerListener", params);
|
|
311
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
// ─── Listener Destructive Tool ─────────────────────────────────────────────
|
|
318
|
+
server.tool("ncloud_delete_lb_listeners", "⚠️ Destructive: Delete listeners from a load balancer. Set confirm=true to execute.", {
|
|
319
|
+
loadBalancerInstanceNo: z.string({
|
|
320
|
+
required_error: "필수 파라미터 'loadBalancerInstanceNo'가 누락되었습니다.",
|
|
321
|
+
}).describe("Load balancer instance number"),
|
|
322
|
+
loadBalancerListenerNoList: z.array(z.string(), {
|
|
323
|
+
required_error: "필수 파라미터 'loadBalancerListenerNoList'가 누락되었습니다.",
|
|
324
|
+
}).describe("List of listener numbers to delete"),
|
|
325
|
+
confirm: z.boolean().optional().default(false).describe("Must be true to actually execute the destructive operation"),
|
|
326
|
+
}, async (params) => {
|
|
327
|
+
try {
|
|
328
|
+
if (!params.confirm) {
|
|
329
|
+
const message = `⚠️ This will permanently delete Listener(s) [${params.loadBalancerListenerNoList.join(", ")}] from Load Balancer [${params.loadBalancerInstanceNo}]. Do you want to proceed? (yes/no)\n\nTo execute, call this tool again with confirm=true.`;
|
|
330
|
+
return { content: [{ type: "text", text: message }] };
|
|
331
|
+
}
|
|
332
|
+
const { confirm, ...apiParams } = params;
|
|
333
|
+
const result = await client.request("/vloadbalancer/v2/deleteLoadBalancerListeners", apiParams);
|
|
334
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
//# sourceMappingURL=loadbalancer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadbalancer.js","sourceRoot":"","sources":["../../src/tools/loadbalancer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerLogAnalyticsTools(server, client) {
|
|
3
|
+
// ncloud_search_logs — Search logs by keyword, period, and log source
|
|
4
|
+
server.tool("ncloud_search_logs", "Search cloud log analytics logs with filtering by keyword, time period, and log source", {
|
|
5
|
+
keyword: z.string().optional().describe("Search keyword to filter logs"),
|
|
6
|
+
startTime: z.string().optional().describe("Start time in ISO 8601 format (e.g., \"2024-01-01T00:00:00Z\")"),
|
|
7
|
+
endTime: z.string().optional().describe("End time in ISO 8601 format (e.g., \"2024-01-31T23:59:59Z\")"),
|
|
8
|
+
logSource: z.string().optional().describe("Log source identifier to filter (e.g., server, database, loadbalancer)"),
|
|
9
|
+
regionCode: z.string().optional().describe("Region code (KR, JPN, SGN, etc.)"),
|
|
10
|
+
pageNo: z.number().optional().describe("Page number (default 1)"),
|
|
11
|
+
pageSize: z.number().optional().describe("Page size (default 50)"),
|
|
12
|
+
}, async (params) => {
|
|
13
|
+
try {
|
|
14
|
+
const apiParams = {};
|
|
15
|
+
if (params.keyword !== undefined)
|
|
16
|
+
apiParams.keyword = params.keyword;
|
|
17
|
+
if (params.startTime !== undefined)
|
|
18
|
+
apiParams.startTime = params.startTime;
|
|
19
|
+
if (params.endTime !== undefined)
|
|
20
|
+
apiParams.endTime = params.endTime;
|
|
21
|
+
if (params.logSource !== undefined)
|
|
22
|
+
apiParams.logSource = params.logSource;
|
|
23
|
+
if (params.regionCode !== undefined)
|
|
24
|
+
apiParams.regionCode = params.regionCode;
|
|
25
|
+
if (params.pageNo !== undefined)
|
|
26
|
+
apiParams.pageNo = params.pageNo;
|
|
27
|
+
if (params.pageSize !== undefined)
|
|
28
|
+
apiParams.pageSize = params.pageSize;
|
|
29
|
+
const result = await client.request("/cloudloganalytics/v2/searchLogs", apiParams);
|
|
30
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
// ncloud_list_log_sources — List available log sources for collection
|
|
37
|
+
server.tool("ncloud_list_log_sources", "Get list of available log sources that can be collected by Cloud Log Analytics", {
|
|
38
|
+
regionCode: z.string().optional().describe("Region code (KR, JPN, SGN, etc.)"),
|
|
39
|
+
}, async (params) => {
|
|
40
|
+
try {
|
|
41
|
+
const apiParams = {};
|
|
42
|
+
if (params.regionCode !== undefined)
|
|
43
|
+
apiParams.regionCode = params.regionCode;
|
|
44
|
+
const result = await client.request("/cloudloganalytics/v2/getLogSourceList", apiParams);
|
|
45
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
// ncloud_get_log_config — Get current log collection configuration
|
|
52
|
+
server.tool("ncloud_get_log_config", "Get current log collection configuration for Cloud Log Analytics", {
|
|
53
|
+
regionCode: z.string().optional().describe("Region code (KR, JPN, SGN, etc.)"),
|
|
54
|
+
}, async (params) => {
|
|
55
|
+
try {
|
|
56
|
+
const apiParams = {};
|
|
57
|
+
if (params.regionCode !== undefined)
|
|
58
|
+
apiParams.regionCode = params.regionCode;
|
|
59
|
+
const result = await client.request("/cloudloganalytics/v2/getLogConfig", apiParams);
|
|
60
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
// ncloud_get_log_count_total — Get total collected log count
|
|
67
|
+
server.tool("ncloud_get_log_count_total", "Get total number of collected logs in Cloud Log Analytics", {
|
|
68
|
+
regionCode: z.string({ required_error: "필수 파라미터 'regionCode'가 누락되었습니다." }).describe("Region code (KR, JPN, SGN, etc.)"),
|
|
69
|
+
}, async (params) => {
|
|
70
|
+
try {
|
|
71
|
+
const result = await client.request("/cloudloganalytics/v2/getLogCountTotal", {
|
|
72
|
+
regionCode: params.regionCode,
|
|
73
|
+
});
|
|
74
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// ncloud_get_log_count_recent — Get recent (last 1 minute) collected log count
|
|
81
|
+
server.tool("ncloud_get_log_count_recent", "Get number of logs collected in the last 1 minute in Cloud Log Analytics", {
|
|
82
|
+
regionCode: z.string({ required_error: "필수 파라미터 'regionCode'가 누락되었습니다." }).describe("Region code (KR, JPN, SGN, etc.)"),
|
|
83
|
+
}, async (params) => {
|
|
84
|
+
try {
|
|
85
|
+
const result = await client.request("/cloudloganalytics/v2/getLogCountRecent", {
|
|
86
|
+
regionCode: params.regionCode,
|
|
87
|
+
});
|
|
88
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
// ncloud_get_log_count_by_period — Get collected log count by period
|
|
95
|
+
server.tool("ncloud_get_log_count_by_period", "Get number of collected logs grouped by time period in Cloud Log Analytics", {
|
|
96
|
+
regionCode: z.string({ required_error: "필수 파라미터 'regionCode'가 누락되었습니다." }).describe("Region code (KR, JPN, SGN, etc.)"),
|
|
97
|
+
startTime: z.string({ required_error: "필수 파라미터 'startTime'이 누락되었습니다." }).describe("Start time in ISO 8601 format (e.g., \"2024-01-01T00:00:00Z\")"),
|
|
98
|
+
endTime: z.string({ required_error: "필수 파라미터 'endTime'이 누락되었습니다." }).describe("End time in ISO 8601 format (e.g., \"2024-01-31T23:59:59Z\")"),
|
|
99
|
+
}, async (params) => {
|
|
100
|
+
try {
|
|
101
|
+
const result = await client.request("/cloudloganalytics/v2/getLogCountByPeriod", {
|
|
102
|
+
regionCode: params.regionCode,
|
|
103
|
+
startTime: params.startTime,
|
|
104
|
+
endTime: params.endTime,
|
|
105
|
+
});
|
|
106
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
// ncloud_get_log_count_by_type — Get collected log count by type
|
|
113
|
+
server.tool("ncloud_get_log_count_by_type", "Get number of collected logs grouped by log type in Cloud Log Analytics", {
|
|
114
|
+
regionCode: z.string({ required_error: "필수 파라미터 'regionCode'가 누락되었습니다." }).describe("Region code (KR, JPN, SGN, etc.)"),
|
|
115
|
+
startTime: z.string({ required_error: "필수 파라미터 'startTime'이 누락되었습니다." }).describe("Start time in ISO 8601 format (e.g., \"2024-01-01T00:00:00Z\")"),
|
|
116
|
+
endTime: z.string({ required_error: "필수 파라미터 'endTime'이 누락되었습니다." }).describe("End time in ISO 8601 format (e.g., \"2024-01-31T23:59:59Z\")"),
|
|
117
|
+
}, async (params) => {
|
|
118
|
+
try {
|
|
119
|
+
const result = await client.request("/cloudloganalytics/v2/getLogCountByType", {
|
|
120
|
+
regionCode: params.regionCode,
|
|
121
|
+
startTime: params.startTime,
|
|
122
|
+
endTime: params.endTime,
|
|
123
|
+
});
|
|
124
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
// ncloud_export_logs — Export collected logs to Object Storage
|
|
131
|
+
server.tool("ncloud_export_logs", "Export collected logs to Object Storage bucket in Cloud Log Analytics", {
|
|
132
|
+
regionCode: z.string({ required_error: "필수 파라미터 'regionCode'가 누락되었습니다." }).describe("Region code (KR, JPN, SGN, etc.)"),
|
|
133
|
+
bucketName: z.string({ required_error: "필수 파라미터 'bucketName'이 누락되었습니다." }).describe("Object Storage bucket name to export logs to"),
|
|
134
|
+
startTime: z.string({ required_error: "필수 파라미터 'startTime'이 누락되었습니다." }).describe("Export start time in ISO 8601 format (e.g., \"2024-01-01T00:00:00Z\")"),
|
|
135
|
+
endTime: z.string({ required_error: "필수 파라미터 'endTime'이 누락되었습니다." }).describe("Export end time in ISO 8601 format (e.g., \"2024-01-31T23:59:59Z\")"),
|
|
136
|
+
logType: z.string().optional().describe("Log type to export (optional filter)"),
|
|
137
|
+
}, async (params) => {
|
|
138
|
+
try {
|
|
139
|
+
const apiParams = {
|
|
140
|
+
regionCode: params.regionCode,
|
|
141
|
+
bucketName: params.bucketName,
|
|
142
|
+
startTime: params.startTime,
|
|
143
|
+
endTime: params.endTime,
|
|
144
|
+
};
|
|
145
|
+
if (params.logType !== undefined)
|
|
146
|
+
apiParams.logType = params.logType;
|
|
147
|
+
const result = await client.request("/cloudloganalytics/v2/exportLogs", apiParams);
|
|
148
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
// ncloud_get_log_export_history — Get log export history
|
|
155
|
+
server.tool("ncloud_get_log_export_history", "Get history of log exports to Object Storage in Cloud Log Analytics", {
|
|
156
|
+
regionCode: z.string({ required_error: "필수 파라미터 'regionCode'가 누락되었습니다." }).describe("Region code (KR, JPN, SGN, etc.)"),
|
|
157
|
+
}, async (params) => {
|
|
158
|
+
try {
|
|
159
|
+
const result = await client.request("/cloudloganalytics/v2/getLogExportHistory", {
|
|
160
|
+
regionCode: params.regionCode,
|
|
161
|
+
});
|
|
162
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
// ncloud_get_log_usage — Get Cloud Log Analytics usage
|
|
169
|
+
server.tool("ncloud_get_log_usage", "Get Cloud Log Analytics usage information including storage and collection volume", {
|
|
170
|
+
regionCode: z.string({ required_error: "필수 파라미터 'regionCode'가 누락되었습니다." }).describe("Region code (KR, JPN, SGN, etc.)"),
|
|
171
|
+
}, async (params) => {
|
|
172
|
+
try {
|
|
173
|
+
const result = await client.request("/cloudloganalytics/v2/getLogUsage", {
|
|
174
|
+
regionCode: params.regionCode,
|
|
175
|
+
});
|
|
176
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
177
|
+
}
|
|
178
|
+
catch (error) {
|
|
179
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=log-analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-analytics.js","sourceRoot":"","sources":["../../src/tools/log-analytics.ts"],"names":[],"mappings":"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"}
|