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,224 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
+
import fc from "fast-check";
|
|
3
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
|
+
import { NcloudClient } from "../client/ncloud-client.js";
|
|
5
|
+
import { registerComputeServerTools } from "./compute-server.js";
|
|
6
|
+
// Helper to create a mock client
|
|
7
|
+
function createMockClient() {
|
|
8
|
+
const client = new NcloudClient({
|
|
9
|
+
accessKey: "testAccessKey",
|
|
10
|
+
secretKey: "testSecretKey",
|
|
11
|
+
baseUrl: "https://ncloud.apigw.ntruss.com",
|
|
12
|
+
regionCode: "KR",
|
|
13
|
+
});
|
|
14
|
+
return client;
|
|
15
|
+
}
|
|
16
|
+
// Helper to extract tool handler from McpServer
|
|
17
|
+
function getToolHandler(server, toolName) {
|
|
18
|
+
// Access internal tool registry
|
|
19
|
+
const tools = server._registeredTools;
|
|
20
|
+
if (!tools) {
|
|
21
|
+
throw new Error("No registered tools found on server");
|
|
22
|
+
}
|
|
23
|
+
// _registeredTools may be a Map or plain object
|
|
24
|
+
const entry = tools instanceof Map ? tools.get(toolName) : tools[toolName];
|
|
25
|
+
if (!entry) {
|
|
26
|
+
throw new Error(`Tool ${toolName} not found`);
|
|
27
|
+
}
|
|
28
|
+
return entry.handler;
|
|
29
|
+
}
|
|
30
|
+
describe("Feature: ncloud-mcp-server, Property 9: 파괴적 작업 확인 게이트", () => {
|
|
31
|
+
let server;
|
|
32
|
+
let client;
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
server = new McpServer({ name: "test", version: "1.0.0" });
|
|
35
|
+
client = createMockClient();
|
|
36
|
+
registerComputeServerTools(server, client);
|
|
37
|
+
});
|
|
38
|
+
it("ncloud_terminate_server with confirm=false should NOT call API and should return confirmation prompt", async () => {
|
|
39
|
+
await fc.assert(fc.asyncProperty(fc.array(fc.stringMatching(/^[0-9]{4,10}$/), { minLength: 1, maxLength: 5 }), async (serverInstanceNoList) => {
|
|
40
|
+
const requestSpy = vi.spyOn(client, "request");
|
|
41
|
+
const handler = getToolHandler(server, "ncloud_terminate_server");
|
|
42
|
+
const result = await handler({ serverInstanceNoList, confirm: false }, {});
|
|
43
|
+
// Should NOT call the API
|
|
44
|
+
expect(requestSpy).not.toHaveBeenCalled();
|
|
45
|
+
// Should return a confirmation prompt containing resource IDs
|
|
46
|
+
const text = result.content[0].text;
|
|
47
|
+
expect(text).toContain("⚠️");
|
|
48
|
+
for (const id of serverInstanceNoList) {
|
|
49
|
+
expect(text).toContain(id);
|
|
50
|
+
}
|
|
51
|
+
// Should NOT have isError
|
|
52
|
+
expect(result.isError).toBeUndefined();
|
|
53
|
+
requestSpy.mockRestore();
|
|
54
|
+
}), { numRuns: 100 });
|
|
55
|
+
});
|
|
56
|
+
it("ncloud_delete_server_images with confirm=false should NOT call API and should return confirmation prompt", async () => {
|
|
57
|
+
await fc.assert(fc.asyncProperty(fc.array(fc.stringMatching(/^[0-9]{4,10}$/), { minLength: 1, maxLength: 5 }), async (serverImageInstanceNoList) => {
|
|
58
|
+
const requestSpy = vi.spyOn(client, "request");
|
|
59
|
+
const handler = getToolHandler(server, "ncloud_delete_server_images");
|
|
60
|
+
const result = await handler({ serverImageInstanceNoList, confirm: false }, {});
|
|
61
|
+
expect(requestSpy).not.toHaveBeenCalled();
|
|
62
|
+
const text = result.content[0].text;
|
|
63
|
+
expect(text).toContain("⚠️");
|
|
64
|
+
for (const id of serverImageInstanceNoList) {
|
|
65
|
+
expect(text).toContain(id);
|
|
66
|
+
}
|
|
67
|
+
expect(result.isError).toBeUndefined();
|
|
68
|
+
requestSpy.mockRestore();
|
|
69
|
+
}), { numRuns: 100 });
|
|
70
|
+
});
|
|
71
|
+
it("ncloud_delete_member_server_images with confirm=false should NOT call API and should return confirmation prompt", async () => {
|
|
72
|
+
await fc.assert(fc.asyncProperty(fc.array(fc.stringMatching(/^[0-9]{4,10}$/), { minLength: 1, maxLength: 5 }), async (memberServerImageInstanceNoList) => {
|
|
73
|
+
const requestSpy = vi.spyOn(client, "request");
|
|
74
|
+
const handler = getToolHandler(server, "ncloud_delete_member_server_images");
|
|
75
|
+
const result = await handler({ memberServerImageInstanceNoList, confirm: false }, {});
|
|
76
|
+
expect(requestSpy).not.toHaveBeenCalled();
|
|
77
|
+
const text = result.content[0].text;
|
|
78
|
+
expect(text).toContain("⚠️");
|
|
79
|
+
for (const id of memberServerImageInstanceNoList) {
|
|
80
|
+
expect(text).toContain(id);
|
|
81
|
+
}
|
|
82
|
+
expect(result.isError).toBeUndefined();
|
|
83
|
+
requestSpy.mockRestore();
|
|
84
|
+
}), { numRuns: 100 });
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
describe("Feature: ncloud-mcp-server, Property 10: Dry-Run API 호출 차단", () => {
|
|
88
|
+
let server;
|
|
89
|
+
let client;
|
|
90
|
+
beforeEach(() => {
|
|
91
|
+
server = new McpServer({ name: "test", version: "1.0.0" });
|
|
92
|
+
client = createMockClient();
|
|
93
|
+
registerComputeServerTools(server, client);
|
|
94
|
+
});
|
|
95
|
+
it("ncloud_create_server with dryRun=true should NOT call API and should return preview", async () => {
|
|
96
|
+
await fc.assert(fc.asyncProperty(fc.record({
|
|
97
|
+
serverImageProductCode: fc.stringMatching(/^[A-Z0-9_-]{5,30}$/),
|
|
98
|
+
serverProductCode: fc.stringMatching(/^[A-Z0-9_-]{5,30}$/),
|
|
99
|
+
vpcNo: fc.stringMatching(/^[0-9]{4,10}$/),
|
|
100
|
+
subnetNo: fc.stringMatching(/^[0-9]{4,10}$/),
|
|
101
|
+
}), async ({ serverImageProductCode, serverProductCode, vpcNo, subnetNo }) => {
|
|
102
|
+
const requestSpy = vi.spyOn(client, "request");
|
|
103
|
+
const handler = getToolHandler(server, "ncloud_create_server");
|
|
104
|
+
const result = await handler({
|
|
105
|
+
serverImageProductCode,
|
|
106
|
+
serverProductCode,
|
|
107
|
+
vpcNo,
|
|
108
|
+
subnetNo,
|
|
109
|
+
dryRun: true,
|
|
110
|
+
}, {});
|
|
111
|
+
// Should NOT call the API
|
|
112
|
+
expect(requestSpy).not.toHaveBeenCalled();
|
|
113
|
+
// Should return a preview response
|
|
114
|
+
const text = result.content[0].text;
|
|
115
|
+
const parsed = JSON.parse(text);
|
|
116
|
+
expect(parsed.label).toContain("Dry-Run");
|
|
117
|
+
expect(parsed.serverImageProductCode).toBe(serverImageProductCode);
|
|
118
|
+
expect(parsed.serverProductCode).toBe(serverProductCode);
|
|
119
|
+
expect(parsed.vpcNo).toBe(vpcNo);
|
|
120
|
+
expect(parsed.subnetNo).toBe(subnetNo);
|
|
121
|
+
// Should NOT have isError
|
|
122
|
+
expect(result.isError).toBeUndefined();
|
|
123
|
+
requestSpy.mockRestore();
|
|
124
|
+
}), { numRuns: 100 });
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
describe("Unit: confirm=true triggers API call", () => {
|
|
128
|
+
let server;
|
|
129
|
+
let client;
|
|
130
|
+
beforeEach(() => {
|
|
131
|
+
server = new McpServer({ name: "test", version: "1.0.0" });
|
|
132
|
+
client = createMockClient();
|
|
133
|
+
registerComputeServerTools(server, client);
|
|
134
|
+
});
|
|
135
|
+
it("ncloud_terminate_server with confirm=true should call terminateServerInstances API", async () => {
|
|
136
|
+
const mockResponse = {
|
|
137
|
+
serverInstanceList: [
|
|
138
|
+
{ serverInstanceNo: "12345", serverInstanceStatus: { code: "NSTOP" } },
|
|
139
|
+
],
|
|
140
|
+
};
|
|
141
|
+
const requestSpy = vi.spyOn(client, "request").mockResolvedValue(mockResponse);
|
|
142
|
+
const handler = getToolHandler(server, "ncloud_terminate_server");
|
|
143
|
+
const result = await handler({ serverInstanceNoList: ["12345"], confirm: true }, {});
|
|
144
|
+
expect(requestSpy).toHaveBeenCalledWith("/vserver/v2/terminateServerInstances", {
|
|
145
|
+
serverInstanceNoList: ["12345"],
|
|
146
|
+
});
|
|
147
|
+
expect(result.isError).toBeUndefined();
|
|
148
|
+
const parsed = JSON.parse(result.content[0].text);
|
|
149
|
+
expect(parsed.serverInstanceList).toBeDefined();
|
|
150
|
+
requestSpy.mockRestore();
|
|
151
|
+
});
|
|
152
|
+
it("ncloud_delete_server_images with confirm=true should call deleteServerImageInstances API", async () => {
|
|
153
|
+
const mockResponse = { serverImageInstanceList: [] };
|
|
154
|
+
const requestSpy = vi.spyOn(client, "request").mockResolvedValue(mockResponse);
|
|
155
|
+
const handler = getToolHandler(server, "ncloud_delete_server_images");
|
|
156
|
+
const result = await handler({ serverImageInstanceNoList: ["99999"], confirm: true }, {});
|
|
157
|
+
expect(requestSpy).toHaveBeenCalledWith("/vserver/v2/deleteServerImageInstances", {
|
|
158
|
+
serverImageInstanceNoList: ["99999"],
|
|
159
|
+
});
|
|
160
|
+
expect(result.isError).toBeUndefined();
|
|
161
|
+
requestSpy.mockRestore();
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
describe("Unit: Server creation summary format", () => {
|
|
165
|
+
let server;
|
|
166
|
+
let client;
|
|
167
|
+
beforeEach(() => {
|
|
168
|
+
server = new McpServer({ name: "test", version: "1.0.0" });
|
|
169
|
+
client = createMockClient();
|
|
170
|
+
registerComputeServerTools(server, client);
|
|
171
|
+
});
|
|
172
|
+
it("ncloud_create_server with dryRun=false should return structured summary", async () => {
|
|
173
|
+
const mockResponse = {
|
|
174
|
+
serverInstanceList: [
|
|
175
|
+
{
|
|
176
|
+
serverInstanceNo: "12345",
|
|
177
|
+
serverName: "my-server",
|
|
178
|
+
serverInstanceStatus: { codeName: "init" },
|
|
179
|
+
createDate: "2025-01-01T00:00:00+0900",
|
|
180
|
+
privateIp: "10.0.0.5",
|
|
181
|
+
},
|
|
182
|
+
],
|
|
183
|
+
};
|
|
184
|
+
const requestSpy = vi.spyOn(client, "request").mockResolvedValue(mockResponse);
|
|
185
|
+
const handler = getToolHandler(server, "ncloud_create_server");
|
|
186
|
+
const result = await handler({
|
|
187
|
+
serverImageProductCode: "SW.VSVR.OS.LNX64.UBNTU.SVR2004.B050",
|
|
188
|
+
serverProductCode: "SVR.VSVR.HICPU.C002.M004.NET.SSD.B050.G002",
|
|
189
|
+
vpcNo: "1111",
|
|
190
|
+
subnetNo: "2222",
|
|
191
|
+
serverName: "my-server",
|
|
192
|
+
dryRun: false,
|
|
193
|
+
}, {});
|
|
194
|
+
expect(requestSpy).toHaveBeenCalled();
|
|
195
|
+
expect(result.isError).toBeUndefined();
|
|
196
|
+
const parsed = JSON.parse(result.content[0].text);
|
|
197
|
+
expect(parsed.리소스타입).toBe("Server");
|
|
198
|
+
expect(parsed.리소스ID).toBe("12345");
|
|
199
|
+
expect(parsed.리소스명).toBe("my-server");
|
|
200
|
+
expect(parsed.상태).toBe("init");
|
|
201
|
+
expect(parsed.서버스펙).toBe("SVR.VSVR.HICPU.C002.M004.NET.SSD.B050.G002");
|
|
202
|
+
expect(parsed.이미지).toBe("SW.VSVR.OS.LNX64.UBNTU.SVR2004.B050");
|
|
203
|
+
expect(parsed.VPC).toBe("1111");
|
|
204
|
+
expect(parsed.서브넷).toBe("2222");
|
|
205
|
+
expect(parsed.사설IP).toBe("10.0.0.5");
|
|
206
|
+
requestSpy.mockRestore();
|
|
207
|
+
});
|
|
208
|
+
it("ncloud_create_server dryRun preview should contain Dry-Run label", async () => {
|
|
209
|
+
const handler = getToolHandler(server, "ncloud_create_server");
|
|
210
|
+
const result = await handler({
|
|
211
|
+
serverImageProductCode: "IMG001",
|
|
212
|
+
serverProductCode: "SPEC001",
|
|
213
|
+
vpcNo: "1111",
|
|
214
|
+
subnetNo: "2222",
|
|
215
|
+
dryRun: true,
|
|
216
|
+
}, {});
|
|
217
|
+
expect(result.isError).toBeUndefined();
|
|
218
|
+
const parsed = JSON.parse(result.content[0].text);
|
|
219
|
+
expect(parsed.label).toContain("Dry-Run");
|
|
220
|
+
expect(parsed.serverImageProductCode).toBe("IMG001");
|
|
221
|
+
expect(parsed.serverProductCode).toBe("SPEC001");
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
//# sourceMappingURL=compute-server.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute-server.test.js","sourceRoot":"","sources":["../../src/tools/compute-server.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export function registerComputeStorageTools(server, client) {
|
|
3
|
+
// ─── Block Storage Query Tools ─────────────────────────────────────────────
|
|
4
|
+
server.tool("ncloud_list_block_storage", "List all block storage instances in the current region", {
|
|
5
|
+
blockStorageInstanceNoList: z.array(z.string()).optional().describe("Filter by block storage instance numbers"),
|
|
6
|
+
serverInstanceNo: z.string().optional().describe("Filter by attached server instance number"),
|
|
7
|
+
pageNo: z.number().optional().describe("Page number for pagination"),
|
|
8
|
+
pageSize: z.number().optional().describe("Page size for pagination"),
|
|
9
|
+
}, async (params) => {
|
|
10
|
+
try {
|
|
11
|
+
const result = await client.request("/vserver/v2/getBlockStorageInstanceList", params);
|
|
12
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
server.tool("ncloud_get_block_storage_detail", "Get detailed information about a specific block storage instance", {
|
|
19
|
+
blockStorageInstanceNo: z.string().describe("Block storage instance number to query"),
|
|
20
|
+
}, async (params) => {
|
|
21
|
+
try {
|
|
22
|
+
const result = await client.request("/vserver/v2/getBlockStorageInstanceDetail", params);
|
|
23
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
server.tool("ncloud_get_block_storage_volume_types", "Get list of block storage volume types available in the region", {
|
|
30
|
+
regionCode: z.string().optional().describe("Region code (e.g. KR, SGN, JPN)"),
|
|
31
|
+
}, async (params) => {
|
|
32
|
+
try {
|
|
33
|
+
const result = await client.request("/vserver/v2/getBlockStorageVolumeTypeList", params);
|
|
34
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
// ─── Block Storage Create Tools ────────────────────────────────────────────
|
|
41
|
+
server.tool("ncloud_create_block_storage", "Create a new block storage instance. Requires zoneCode + blockStorageVolumeTypeCode + blockStorageSize. For XEN: also provide serverInstanceNo to attach at creation. For KVM: cannot attach at creation — use ncloud_attach_block_storage after. Use dryRun=true to preview.", {
|
|
42
|
+
blockStorageSize: z.number().describe("Block storage size in GB (XEN: 10~2000, KVM: 10~16380, in 10GB increments)"),
|
|
43
|
+
zoneCode: z.string().optional().describe("Zone code (e.g. KR-1, KR-2). Required when serverInstanceNo is not provided."),
|
|
44
|
+
blockStorageVolumeTypeCode: z.string().describe("Volume type code. Valid values: SSD, HDD, CB1, CB2, FB1, FB2. Use ncloud_get_block_storage_volume_types to check available types."),
|
|
45
|
+
serverInstanceNo: z.string().optional().describe("Server instance number (XEN only — creates and attaches to this server. NOT available for KVM)"),
|
|
46
|
+
blockStorageSnapshotInstanceNo: z.string().optional().describe("Snapshot instance number to create block storage from"),
|
|
47
|
+
isReturnProtection: z.boolean().optional().describe("Whether to enable return protection"),
|
|
48
|
+
blockStorageName: z.string().optional().describe("Block storage name"),
|
|
49
|
+
blockStorageDescription: z.string().optional().describe("Block storage description"),
|
|
50
|
+
dryRun: z.boolean().optional().default(false).describe("If true, returns a preview without actually creating"),
|
|
51
|
+
}, async (params) => {
|
|
52
|
+
try {
|
|
53
|
+
// serverInstanceNo 없으면 (KVM) zoneCode 필수
|
|
54
|
+
if (!params.serverInstanceNo && !params.zoneCode) {
|
|
55
|
+
return {
|
|
56
|
+
content: [{ type: "text", text: "zoneCode is required when serverInstanceNo is not provided (KVM standalone creation)." }],
|
|
57
|
+
isError: true,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (params.dryRun) {
|
|
61
|
+
const preview = {
|
|
62
|
+
label: "🔍 Dry-Run Preview: Block Storage Creation",
|
|
63
|
+
mode: params.serverInstanceNo ? "XEN (attach to server)" : "KVM (standalone, attach later)",
|
|
64
|
+
blockStorageSize: `${params.blockStorageSize} GB`,
|
|
65
|
+
zoneCode: params.zoneCode ?? "(resolved from server)",
|
|
66
|
+
blockStorageVolumeTypeCode: params.blockStorageVolumeTypeCode,
|
|
67
|
+
serverInstanceNo: params.serverInstanceNo ?? "(not set)",
|
|
68
|
+
blockStorageSnapshotInstanceNo: params.blockStorageSnapshotInstanceNo ?? "(not set)",
|
|
69
|
+
isReturnProtection: params.isReturnProtection ?? "(not set)",
|
|
70
|
+
blockStorageName: params.blockStorageName ?? "(auto-generated)",
|
|
71
|
+
message: "이 요청은 실제 블록 스토리지를 생성하지 않습니다. dryRun=false로 호출하면 생성됩니다.",
|
|
72
|
+
};
|
|
73
|
+
return { content: [{ type: "text", text: JSON.stringify(preview, null, 2) }] };
|
|
74
|
+
}
|
|
75
|
+
const { dryRun, ...apiParams } = params;
|
|
76
|
+
const result = await client.request("/vserver/v2/createBlockStorageInstance", apiParams);
|
|
77
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
// ─── Block Storage Operation Tools ─────────────────────────────────────────
|
|
84
|
+
server.tool("ncloud_attach_block_storage", "Attach a block storage instance to a server. Automatically waits if the block storage is still being created (polls until status is CREAT).", {
|
|
85
|
+
serverInstanceNo: z.string().describe("Server instance number to attach to"),
|
|
86
|
+
blockStorageInstanceNo: z.string().describe("Block storage instance number to attach"),
|
|
87
|
+
}, async (params) => {
|
|
88
|
+
try {
|
|
89
|
+
// Poll until block storage is ready (status CREAT)
|
|
90
|
+
const maxAttempts = 20;
|
|
91
|
+
const intervalMs = 3000;
|
|
92
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
93
|
+
const detail = await client.request("/vserver/v2/getBlockStorageInstanceDetail", {
|
|
94
|
+
blockStorageInstanceNo: params.blockStorageInstanceNo,
|
|
95
|
+
});
|
|
96
|
+
const instance = detail?.blockStorageInstanceList?.[0];
|
|
97
|
+
const status = instance?.blockStorageInstanceStatus?.code;
|
|
98
|
+
if (status === "CREAT") {
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
if (i === maxAttempts - 1) {
|
|
102
|
+
return {
|
|
103
|
+
content: [{ type: "text", text: `Block storage ${params.blockStorageInstanceNo} is still in status '${status}' after ${maxAttempts * intervalMs / 1000}s. Please try again later.` }],
|
|
104
|
+
isError: true,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
await new Promise((resolve) => setTimeout(resolve, intervalMs));
|
|
108
|
+
}
|
|
109
|
+
const result = await client.request("/vserver/v2/attachBlockStorageInstance", params);
|
|
110
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
server.tool("ncloud_detach_block_storage", "Detach block storage instances from their servers", {
|
|
117
|
+
blockStorageInstanceNoList: z.array(z.string()).min(1).describe("List of block storage instance numbers to detach"),
|
|
118
|
+
}, async (params) => {
|
|
119
|
+
try {
|
|
120
|
+
const result = await client.request("/vserver/v2/detachBlockStorageInstances", params);
|
|
121
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
server.tool("ncloud_change_block_storage", "Change block storage instance (resize volume and/or update name/description). Supports both Gen2 (XEN) and Gen3 (KVM). For attached storage, server must be stopped to resize.", {
|
|
128
|
+
blockStorageInstanceNo: z.string().describe("Block storage instance number to change"),
|
|
129
|
+
blockStorageSize: z.number().describe("New block storage size in GB (XEN: 10~2000, KVM: 10~16380, 10GB increments, must be >= current size)"),
|
|
130
|
+
blockStorageName: z.string().optional().describe("New block storage name"),
|
|
131
|
+
blockStorageDescription: z.string().optional().describe("New block storage description"),
|
|
132
|
+
}, async (params) => {
|
|
133
|
+
try {
|
|
134
|
+
const result = await client.request("/vserver/v2/changeBlockStorageInstance", params);
|
|
135
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
server.tool("ncloud_set_block_storage_protection", "Set return protection for a block storage instance", {
|
|
142
|
+
blockStorageInstanceNo: z.string().describe("Block storage instance number to set protection"),
|
|
143
|
+
isReturnProtection: z.boolean().describe("Whether to enable return protection (true to protect, false to unprotect)"),
|
|
144
|
+
}, async (params) => {
|
|
145
|
+
try {
|
|
146
|
+
const result = await client.request("/vserver/v2/setBlockStorageReturnProtection", params);
|
|
147
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
// ─── Block Storage Destructive Tools ───────────────────────────────────────
|
|
154
|
+
server.tool("ncloud_delete_block_storage", "⚠️ Destructive: Permanently delete one or more block storage instances. Set confirm=true to execute.", {
|
|
155
|
+
blockStorageInstanceNoList: z.array(z.string()).min(1).describe("List of block storage instance numbers to delete"),
|
|
156
|
+
confirm: z.boolean().optional().default(false).describe("Must be true to actually execute the destructive operation"),
|
|
157
|
+
}, async (params) => {
|
|
158
|
+
try {
|
|
159
|
+
if (!params.confirm) {
|
|
160
|
+
const message = `⚠️ This will permanently delete BlockStorage [${params.blockStorageInstanceNoList.join(", ")}]. Do you want to proceed? (yes/no)\n\nTo execute, call this tool again with confirm=true.`;
|
|
161
|
+
return { content: [{ type: "text", text: message }] };
|
|
162
|
+
}
|
|
163
|
+
const { confirm, ...apiParams } = params;
|
|
164
|
+
const result = await client.request("/vserver/v2/deleteBlockStorageInstances", apiParams);
|
|
165
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
// ─── Snapshot Query Tools ──────────────────────────────────────────────────
|
|
172
|
+
server.tool("ncloud_list_snapshots", "List all block storage snapshot instances", {
|
|
173
|
+
blockStorageSnapshotInstanceNoList: z.array(z.string()).optional().describe("Filter by snapshot instance numbers"),
|
|
174
|
+
pageNo: z.number().optional().describe("Page number for pagination"),
|
|
175
|
+
pageSize: z.number().optional().describe("Page size for pagination"),
|
|
176
|
+
}, async (params) => {
|
|
177
|
+
try {
|
|
178
|
+
const result = await client.request("/vserver/v2/getBlockStorageSnapshotInstanceList", params);
|
|
179
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
server.tool("ncloud_get_snapshot_detail", "Get detailed information about a specific block storage snapshot instance", {
|
|
186
|
+
blockStorageSnapshotInstanceNo: z.string().describe("Block storage snapshot instance number to query"),
|
|
187
|
+
}, async (params) => {
|
|
188
|
+
try {
|
|
189
|
+
const result = await client.request("/vserver/v2/getBlockStorageSnapshotInstanceDetail", params);
|
|
190
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
// ─── Snapshot Create Tools ─────────────────────────────────────────────────
|
|
197
|
+
server.tool("ncloud_create_snapshot", "Create a snapshot from a block storage instance. Use dryRun=true to preview.", {
|
|
198
|
+
blockStorageInstanceNo: z.string().describe("Block storage instance number to create snapshot from"),
|
|
199
|
+
blockStorageSnapshotName: z.string().optional().describe("Name for the snapshot"),
|
|
200
|
+
blockStorageSnapshotDescription: z.string().optional().describe("Description for the snapshot"),
|
|
201
|
+
dryRun: z.boolean().optional().default(false).describe("If true, returns a preview without actually creating"),
|
|
202
|
+
}, async (params) => {
|
|
203
|
+
try {
|
|
204
|
+
if (params.dryRun) {
|
|
205
|
+
const preview = {
|
|
206
|
+
label: "🔍 Dry-Run Preview: Snapshot Creation",
|
|
207
|
+
blockStorageInstanceNo: params.blockStorageInstanceNo,
|
|
208
|
+
blockStorageSnapshotName: params.blockStorageSnapshotName ?? "(auto-generated)",
|
|
209
|
+
message: "이 요청은 실제 스냅샷을 생성하지 않습니다. dryRun=false로 호출하면 생성됩니다.",
|
|
210
|
+
};
|
|
211
|
+
return { content: [{ type: "text", text: JSON.stringify(preview, null, 2) }] };
|
|
212
|
+
}
|
|
213
|
+
const { dryRun, ...apiParams } = params;
|
|
214
|
+
const result = await client.request("/vserver/v2/createBlockStorageSnapshotInstance", apiParams);
|
|
215
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
// ─── Snapshot Destructive Tools ────────────────────────────────────────────
|
|
222
|
+
server.tool("ncloud_delete_snapshots", "⚠️ Destructive: Permanently delete one or more block storage snapshot instances. Set confirm=true to execute.", {
|
|
223
|
+
blockStorageSnapshotInstanceNoList: z.array(z.string()).min(1).describe("List of snapshot instance numbers to delete"),
|
|
224
|
+
confirm: z.boolean().optional().default(false).describe("Must be true to actually execute the destructive operation"),
|
|
225
|
+
}, async (params) => {
|
|
226
|
+
try {
|
|
227
|
+
if (!params.confirm) {
|
|
228
|
+
const message = `⚠️ This will permanently delete Snapshot [${params.blockStorageSnapshotInstanceNoList.join(", ")}]. Do you want to proceed? (yes/no)\n\nTo execute, call this tool again with confirm=true.`;
|
|
229
|
+
return { content: [{ type: "text", text: message }] };
|
|
230
|
+
}
|
|
231
|
+
const { confirm, ...apiParams } = params;
|
|
232
|
+
const result = await client.request("/vserver/v2/deleteBlockStorageSnapshotInstances", apiParams);
|
|
233
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=compute-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute-storage.js","sourceRoot":"","sources":["../../src/tools/compute-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { NcloudClient } from "../client/ncloud-client.js";
|
|
3
|
+
/**
|
|
4
|
+
* NKS (Ncloud Kubernetes Service) API Tools
|
|
5
|
+
*
|
|
6
|
+
* Base URL: https://nks.apigw.ntruss.com
|
|
7
|
+
* API Style: RESTful (GET/POST/PATCH/PUT/DELETE with JSON body)
|
|
8
|
+
* Auth: x-ncp-apigw-timestamp, x-ncp-iam-access-key, x-ncp-apigw-signature-v2, Content-Type: application/json
|
|
9
|
+
*
|
|
10
|
+
* NOTE: NKS API does NOT use responseFormatType=json (always returns JSON).
|
|
11
|
+
* All requests use client.requestRaw() instead of client.request().
|
|
12
|
+
*/
|
|
13
|
+
export declare function registerContainersNksTools(server: McpServer, client: NcloudClient): void;
|