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.
Files changed (220) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +159 -0
  3. package/README_EN.md +159 -0
  4. package/dist/auth/signature.d.ts +16 -0
  5. package/dist/auth/signature.js +18 -0
  6. package/dist/auth/signature.js.map +1 -0
  7. package/dist/auth/signature.test.d.ts +1 -0
  8. package/dist/auth/signature.test.js +90 -0
  9. package/dist/auth/signature.test.js.map +1 -0
  10. package/dist/client/ncloud-client.d.ts +27 -0
  11. package/dist/client/ncloud-client.js +270 -0
  12. package/dist/client/ncloud-client.js.map +1 -0
  13. package/dist/client/ncloud-client.test.d.ts +1 -0
  14. package/dist/client/ncloud-client.test.js +477 -0
  15. package/dist/client/ncloud-client.test.js.map +1 -0
  16. package/dist/client/s3-compatible-client.d.ts +49 -0
  17. package/dist/client/s3-compatible-client.js +210 -0
  18. package/dist/client/s3-compatible-client.js.map +1 -0
  19. package/dist/client/swift-compatible-client.d.ts +68 -0
  20. package/dist/client/swift-compatible-client.js +173 -0
  21. package/dist/client/swift-compatible-client.js.map +1 -0
  22. package/dist/index.d.ts +2 -0
  23. package/dist/index.js +362 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/tools/acg.d.ts +3 -0
  26. package/dist/tools/acg.js +220 -0
  27. package/dist/tools/acg.js.map +1 -0
  28. package/dist/tools/activity-tracer.d.ts +3 -0
  29. package/dist/tools/activity-tracer.js +77 -0
  30. package/dist/tools/activity-tracer.js.map +1 -0
  31. package/dist/tools/analytics-cdss.d.ts +3 -0
  32. package/dist/tools/analytics-cdss.js +618 -0
  33. package/dist/tools/analytics-cdss.js.map +1 -0
  34. package/dist/tools/analytics-datacatalog.d.ts +10 -0
  35. package/dist/tools/analytics-datacatalog.js +409 -0
  36. package/dist/tools/analytics-datacatalog.js.map +1 -0
  37. package/dist/tools/analytics-dataflow.d.ts +16 -0
  38. package/dist/tools/analytics-dataflow.js +478 -0
  39. package/dist/tools/analytics-dataflow.js.map +1 -0
  40. package/dist/tools/analytics-dataforest.d.ts +10 -0
  41. package/dist/tools/analytics-dataforest.js +379 -0
  42. package/dist/tools/analytics-dataforest.js.map +1 -0
  43. package/dist/tools/analytics-dataquery.d.ts +16 -0
  44. package/dist/tools/analytics-dataquery.js +143 -0
  45. package/dist/tools/analytics-dataquery.js.map +1 -0
  46. package/dist/tools/analytics-datastream.d.ts +13 -0
  47. package/dist/tools/analytics-datastream.js +359 -0
  48. package/dist/tools/analytics-datastream.js.map +1 -0
  49. package/dist/tools/analytics-hadoop.d.ts +12 -0
  50. package/dist/tools/analytics-hadoop.js +450 -0
  51. package/dist/tools/analytics-hadoop.js.map +1 -0
  52. package/dist/tools/analytics-ses.d.ts +3 -0
  53. package/dist/tools/analytics-ses.js +653 -0
  54. package/dist/tools/analytics-ses.js.map +1 -0
  55. package/dist/tools/api-gateway.d.ts +3 -0
  56. package/dist/tools/api-gateway.js +202 -0
  57. package/dist/tools/api-gateway.js.map +1 -0
  58. package/dist/tools/autoscaling.d.ts +3 -0
  59. package/dist/tools/autoscaling.js +430 -0
  60. package/dist/tools/autoscaling.js.map +1 -0
  61. package/dist/tools/billing.d.ts +14 -0
  62. package/dist/tools/billing.js +545 -0
  63. package/dist/tools/billing.js.map +1 -0
  64. package/dist/tools/certificate-manager.d.ts +18 -0
  65. package/dist/tools/certificate-manager.js +84 -0
  66. package/dist/tools/certificate-manager.js.map +1 -0
  67. package/dist/tools/cloud-advisor.d.ts +3 -0
  68. package/dist/tools/cloud-advisor.js +202 -0
  69. package/dist/tools/cloud-advisor.js.map +1 -0
  70. package/dist/tools/cloud-functions.d.ts +3 -0
  71. package/dist/tools/cloud-functions.js +497 -0
  72. package/dist/tools/cloud-functions.js.map +1 -0
  73. package/dist/tools/cloud-insight-integration.d.ts +3 -0
  74. package/dist/tools/cloud-insight-integration.js +90 -0
  75. package/dist/tools/cloud-insight-integration.js.map +1 -0
  76. package/dist/tools/cloud-insight-plugin.d.ts +3 -0
  77. package/dist/tools/cloud-insight-plugin.js +600 -0
  78. package/dist/tools/cloud-insight-plugin.js.map +1 -0
  79. package/dist/tools/cloud-insight-rule.d.ts +3 -0
  80. package/dist/tools/cloud-insight-rule.js +570 -0
  81. package/dist/tools/cloud-insight-rule.js.map +1 -0
  82. package/dist/tools/cloud-insight.d.ts +3 -0
  83. package/dist/tools/cloud-insight.js +246 -0
  84. package/dist/tools/cloud-insight.js.map +1 -0
  85. package/dist/tools/common.d.ts +3 -0
  86. package/dist/tools/common.js +120 -0
  87. package/dist/tools/common.js.map +1 -0
  88. package/dist/tools/compute-initscript.d.ts +3 -0
  89. package/dist/tools/compute-initscript.js +62 -0
  90. package/dist/tools/compute-initscript.js.map +1 -0
  91. package/dist/tools/compute-loginkey.d.ts +3 -0
  92. package/dist/tools/compute-loginkey.js +59 -0
  93. package/dist/tools/compute-loginkey.js.map +1 -0
  94. package/dist/tools/compute-placement.d.ts +3 -0
  95. package/dist/tools/compute-placement.js +196 -0
  96. package/dist/tools/compute-placement.js.map +1 -0
  97. package/dist/tools/compute-publicip.d.ts +3 -0
  98. package/dist/tools/compute-publicip.js +97 -0
  99. package/dist/tools/compute-publicip.js.map +1 -0
  100. package/dist/tools/compute-server.d.ts +3 -0
  101. package/dist/tools/compute-server.js +445 -0
  102. package/dist/tools/compute-server.js.map +1 -0
  103. package/dist/tools/compute-server.test.d.ts +1 -0
  104. package/dist/tools/compute-server.test.js +224 -0
  105. package/dist/tools/compute-server.test.js.map +1 -0
  106. package/dist/tools/compute-storage.d.ts +3 -0
  107. package/dist/tools/compute-storage.js +240 -0
  108. package/dist/tools/compute-storage.js.map +1 -0
  109. package/dist/tools/containers-nks.d.ts +13 -0
  110. package/dist/tools/containers-nks.js +576 -0
  111. package/dist/tools/containers-nks.js.map +1 -0
  112. package/dist/tools/containers-registry.d.ts +3 -0
  113. package/dist/tools/containers-registry.js +181 -0
  114. package/dist/tools/containers-registry.js.map +1 -0
  115. package/dist/tools/database-cache.d.ts +3 -0
  116. package/dist/tools/database-cache.js +388 -0
  117. package/dist/tools/database-cache.js.map +1 -0
  118. package/dist/tools/database-mongodb.d.ts +3 -0
  119. package/dist/tools/database-mongodb.js +460 -0
  120. package/dist/tools/database-mongodb.js.map +1 -0
  121. package/dist/tools/database-mssql.d.ts +3 -0
  122. package/dist/tools/database-mssql.js +345 -0
  123. package/dist/tools/database-mssql.js.map +1 -0
  124. package/dist/tools/database-mysql.d.ts +3 -0
  125. package/dist/tools/database-mysql.js +500 -0
  126. package/dist/tools/database-mysql.js.map +1 -0
  127. package/dist/tools/database-postgresql.d.ts +3 -0
  128. package/dist/tools/database-postgresql.js +432 -0
  129. package/dist/tools/database-postgresql.js.map +1 -0
  130. package/dist/tools/global-dns.d.ts +3 -0
  131. package/dist/tools/global-dns.js +207 -0
  132. package/dist/tools/global-dns.js.map +1 -0
  133. package/dist/tools/global-edge.d.ts +3 -0
  134. package/dist/tools/global-edge.js +386 -0
  135. package/dist/tools/global-edge.js.map +1 -0
  136. package/dist/tools/global-traffic-manager.d.ts +3 -0
  137. package/dist/tools/global-traffic-manager.js +497 -0
  138. package/dist/tools/global-traffic-manager.js.map +1 -0
  139. package/dist/tools/index.d.ts +63 -0
  140. package/dist/tools/index.js +64 -0
  141. package/dist/tools/index.js.map +1 -0
  142. package/dist/tools/kms.d.ts +8 -0
  143. package/dist/tools/kms.js +529 -0
  144. package/dist/tools/kms.js.map +1 -0
  145. package/dist/tools/loadbalancer.d.ts +3 -0
  146. package/dist/tools/loadbalancer.js +341 -0
  147. package/dist/tools/loadbalancer.js.map +1 -0
  148. package/dist/tools/log-analytics.d.ts +3 -0
  149. package/dist/tools/log-analytics.js +183 -0
  150. package/dist/tools/log-analytics.js.map +1 -0
  151. package/dist/tools/media-imageoptimizer.d.ts +3 -0
  152. package/dist/tools/media-imageoptimizer.js +187 -0
  153. package/dist/tools/media-imageoptimizer.js.map +1 -0
  154. package/dist/tools/media-livestation.d.ts +3 -0
  155. package/dist/tools/media-livestation.js +252 -0
  156. package/dist/tools/media-livestation.js.map +1 -0
  157. package/dist/tools/media-vodstation.d.ts +3 -0
  158. package/dist/tools/media-vodstation.js +197 -0
  159. package/dist/tools/media-vodstation.js.map +1 -0
  160. package/dist/tools/nat-gateway.d.ts +3 -0
  161. package/dist/tools/nat-gateway.js +91 -0
  162. package/dist/tools/nat-gateway.js.map +1 -0
  163. package/dist/tools/network-acl.d.ts +3 -0
  164. package/dist/tools/network-acl.js +322 -0
  165. package/dist/tools/network-acl.js.map +1 -0
  166. package/dist/tools/network-interface.d.ts +3 -0
  167. package/dist/tools/network-interface.js +193 -0
  168. package/dist/tools/network-interface.js.map +1 -0
  169. package/dist/tools/private-ca.d.ts +8 -0
  170. package/dist/tools/private-ca.js +368 -0
  171. package/dist/tools/private-ca.js.map +1 -0
  172. package/dist/tools/resource-manager.d.ts +3 -0
  173. package/dist/tools/resource-manager.js +151 -0
  174. package/dist/tools/resource-manager.js.map +1 -0
  175. package/dist/tools/route-table.d.ts +3 -0
  176. package/dist/tools/route-table.js +205 -0
  177. package/dist/tools/route-table.js.map +1 -0
  178. package/dist/tools/security-monitoring.d.ts +3 -0
  179. package/dist/tools/security-monitoring.js +182 -0
  180. package/dist/tools/security-monitoring.js.map +1 -0
  181. package/dist/tools/sens.d.ts +3 -0
  182. package/dist/tools/sens.js +240 -0
  183. package/dist/tools/sens.js.map +1 -0
  184. package/dist/tools/sourcebuild.d.ts +3 -0
  185. package/dist/tools/sourcebuild.js +481 -0
  186. package/dist/tools/sourcebuild.js.map +1 -0
  187. package/dist/tools/sourcecommit.d.ts +13 -0
  188. package/dist/tools/sourcecommit.js +228 -0
  189. package/dist/tools/sourcecommit.js.map +1 -0
  190. package/dist/tools/sourcedeploy.d.ts +3 -0
  191. package/dist/tools/sourcedeploy.js +448 -0
  192. package/dist/tools/sourcedeploy.js.map +1 -0
  193. package/dist/tools/sourcepipeline.d.ts +12 -0
  194. package/dist/tools/sourcepipeline.js +357 -0
  195. package/dist/tools/sourcepipeline.js.map +1 -0
  196. package/dist/tools/storage-archive.d.ts +3 -0
  197. package/dist/tools/storage-archive.js +337 -0
  198. package/dist/tools/storage-archive.js.map +1 -0
  199. package/dist/tools/storage-nas.d.ts +3 -0
  200. package/dist/tools/storage-nas.js +288 -0
  201. package/dist/tools/storage-nas.js.map +1 -0
  202. package/dist/tools/storage-ncloud.d.ts +3 -0
  203. package/dist/tools/storage-ncloud.js +864 -0
  204. package/dist/tools/storage-ncloud.js.map +1 -0
  205. package/dist/tools/storage-object.d.ts +3 -0
  206. package/dist/tools/storage-object.js +982 -0
  207. package/dist/tools/storage-object.js.map +1 -0
  208. package/dist/tools/sub-account.d.ts +3 -0
  209. package/dist/tools/sub-account.js +311 -0
  210. package/dist/tools/sub-account.js.map +1 -0
  211. package/dist/tools/target-group.d.ts +3 -0
  212. package/dist/tools/target-group.js +207 -0
  213. package/dist/tools/target-group.js.map +1 -0
  214. package/dist/tools/vpc-peering.d.ts +3 -0
  215. package/dist/tools/vpc-peering.js +109 -0
  216. package/dist/tools/vpc-peering.js.map +1 -0
  217. package/dist/tools/vpc.d.ts +3 -0
  218. package/dist/tools/vpc.js +194 -0
  219. package/dist/tools/vpc.js.map +1 -0
  220. package/package.json +53 -0
@@ -0,0 +1,653 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Search Engine Service (SES) API
4
+ *
5
+ * Base URL: https://vpcsearchengine.apigw.ntruss.com
6
+ * - Korea: /api/v2/...
7
+ * - Singapore: /api/sgn-v2/...
8
+ * - Japan: /api/jpn-v2/...
9
+ *
10
+ * HTTP Methods vary per API (GET, POST, DELETE)
11
+ * Response format: { code, message, result, requestId }
12
+ */
13
+ function getApiPrefix(regionCode) {
14
+ switch (regionCode) {
15
+ case "SGN": return "/api/sgn-v2";
16
+ case "JPN": return "/api/jpn-v2";
17
+ default: return "/api/v2";
18
+ }
19
+ }
20
+ export function registerSearchEngineServiceTools(server, client) {
21
+ // ─── Cluster List ──────────────────────────────────────────────────────────
22
+ server.tool("ncloud_ses_list_clusters", "List all Search Engine Service (Elasticsearch/OpenSearch) clusters in the current region", {
23
+ inputText: z.string().optional().describe("Search keyword to filter cluster names"),
24
+ vpcName: z.string().optional().describe("VPC name to filter (exact match)"),
25
+ pageNo: z.number().optional().describe("Page number (default: 1)"),
26
+ pageSize: z.number().optional().describe("Page size (default: 10)"),
27
+ }, async (params) => {
28
+ try {
29
+ const prefix = getApiPrefix(client.getRegionCode());
30
+ const queryParams = {};
31
+ if (params.inputText)
32
+ queryParams["inputText"] = params.inputText;
33
+ if (params.vpcName)
34
+ queryParams["vpcName"] = params.vpcName;
35
+ if (params.pageNo)
36
+ queryParams["pageNo"] = params.pageNo;
37
+ if (params.pageSize)
38
+ queryParams["pageSize"] = params.pageSize;
39
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getClusterInfoList`, queryParams);
40
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
41
+ }
42
+ catch (error) {
43
+ return { content: [{ type: "text", text: error.message }], isError: true };
44
+ }
45
+ });
46
+ // ─── Cluster Detail ────────────────────────────────────────────────────────
47
+ server.tool("ncloud_ses_get_cluster_detail", "Get detailed information about a specific Search Engine Service cluster", {
48
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number (from getClusterInfoList)"),
49
+ }, async (params) => {
50
+ try {
51
+ const prefix = getApiPrefix(client.getRegionCode());
52
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getClusterInfo/${params.serviceGroupInstanceNo}`);
53
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
54
+ }
55
+ catch (error) {
56
+ return { content: [{ type: "text", text: error.message }], isError: true };
57
+ }
58
+ });
59
+ // ─── Cluster ACG List ──────────────────────────────────────────────────────
60
+ server.tool("ncloud_ses_get_cluster_acg", "Get ACG (Access Control Group) rules for a Search Engine Service cluster", {
61
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
62
+ }, async (params) => {
63
+ try {
64
+ const prefix = getApiPrefix(client.getRegionCode());
65
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getClusterAcgInfo/${params.serviceGroupInstanceNo}`);
66
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
67
+ }
68
+ catch (error) {
69
+ return { content: [{ type: "text", text: error.message }], isError: true };
70
+ }
71
+ });
72
+ // ─── Cluster Node List ─────────────────────────────────────────────────────
73
+ server.tool("ncloud_ses_get_node_list", "Get node list for a Search Engine Service cluster", {
74
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
75
+ }, async (params) => {
76
+ try {
77
+ const prefix = getApiPrefix(client.getRegionCode());
78
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getClusterNodeList/${params.serviceGroupInstanceNo}`);
79
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
80
+ }
81
+ catch (error) {
82
+ return { content: [{ type: "text", text: error.message }], isError: true };
83
+ }
84
+ });
85
+ // ─── Get Version List ──────────────────────────────────────────────────────
86
+ server.tool("ncloud_ses_get_versions", "Get available Search Engine (Elasticsearch/OpenSearch) versions", {}, async () => {
87
+ try {
88
+ const prefix = getApiPrefix(client.getRegionCode());
89
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getSearchEngineVersionList`);
90
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
91
+ }
92
+ catch (error) {
93
+ return { content: [{ type: "text", text: error.message }], isError: true };
94
+ }
95
+ });
96
+ // ─── Get Server Generation List ───────────────────────────────────────────
97
+ server.tool("ncloud_ses_get_server_generations", "Get available node server generations for Search Engine Service", {}, async () => {
98
+ try {
99
+ const prefix = getApiPrefix(client.getRegionCode());
100
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getSearchEngineServerGenerationList`);
101
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
102
+ }
103
+ catch (error) {
104
+ return { content: [{ type: "text", text: error.message }], isError: true };
105
+ }
106
+ });
107
+ // ─── Get Server Type (G2) ─────────────────────────────────────────────────
108
+ server.tool("ncloud_ses_get_node_products", "Get available node server types (product codes) for Search Engine Service (G2)", {
109
+ softwareProductCode: z.string().describe("OS product code (from getOsProductList)"),
110
+ }, async (params) => {
111
+ try {
112
+ const prefix = getApiPrefix(client.getRegionCode());
113
+ const result = await client.requestRaw("POST", `${prefix}/cluster/getNodeProductList`, undefined, {
114
+ softwareProductCode: params.softwareProductCode,
115
+ });
116
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
117
+ }
118
+ catch (error) {
119
+ return { content: [{ type: "text", text: error.message }], isError: true };
120
+ }
121
+ });
122
+ // ─── Get Server Type (G3) ─────────────────────────────────────────────────
123
+ server.tool("ncloud_ses_get_server_specs", "Get available node server types for Search Engine Service (G3/KVM only)", {
124
+ softwareProductCode: z.string().describe("OS product code (from getClusterServerImageList)"),
125
+ }, async (params) => {
126
+ try {
127
+ const prefix = getApiPrefix(client.getRegionCode());
128
+ const result = await client.requestRaw("POST", `${prefix}/cluster/getServerSpecList`, undefined, {
129
+ softwareProductCode: params.softwareProductCode,
130
+ });
131
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
132
+ }
133
+ catch (error) {
134
+ return { content: [{ type: "text", text: error.message }], isError: true };
135
+ }
136
+ });
137
+ // ─── Get OS Product List (G2) ─────────────────────────────────────────────
138
+ server.tool("ncloud_ses_get_os_products", "Get available OS types for Search Engine Service (G2)", {}, async () => {
139
+ try {
140
+ const prefix = getApiPrefix(client.getRegionCode());
141
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getOsProductList`);
142
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
143
+ }
144
+ catch (error) {
145
+ return { content: [{ type: "text", text: error.message }], isError: true };
146
+ }
147
+ });
148
+ // ─── Get OS Product List (G3) ─────────────────────────────────────────────
149
+ server.tool("ncloud_ses_get_cluster_server_images", "Get available OS types for Search Engine Service (G3/KVM only)", {}, async () => {
150
+ try {
151
+ const prefix = getApiPrefix(client.getRegionCode());
152
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getClusterServerImageList`);
153
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
154
+ }
155
+ catch (error) {
156
+ return { content: [{ type: "text", text: error.message }], isError: true };
157
+ }
158
+ });
159
+ // ─── Get VPC List ─────────────────────────────────────────────────────────
160
+ server.tool("ncloud_ses_get_vpc_list", "Get available VPC list for Search Engine Service cluster creation", {}, async () => {
161
+ try {
162
+ const prefix = getApiPrefix(client.getRegionCode());
163
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getVpcList`);
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
+ // ─── Get Subnet List ──────────────────────────────────────────────────────
171
+ server.tool("ncloud_ses_get_subnet_list", "Get available subnet list for Search Engine Service cluster creation", {
172
+ vpcNo: z.number().describe("VPC number"),
173
+ }, async (params) => {
174
+ try {
175
+ const prefix = getApiPrefix(client.getRegionCode());
176
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getSubnetList`, { vpcNo: params.vpcNo });
177
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
178
+ }
179
+ catch (error) {
180
+ return { content: [{ type: "text", text: error.message }], isError: true };
181
+ }
182
+ });
183
+ // ─── Get Subnet List (G3) ─────────────────────────────────────────────────
184
+ server.tool("ncloud_ses_get_subnet_list_g3", "Get available subnet list for Search Engine Service cluster creation (G3/KVM only)", {
185
+ vpcNo: z.number().describe("VPC number"),
186
+ }, async (params) => {
187
+ try {
188
+ const prefix = getApiPrefix(client.getRegionCode());
189
+ const result = await client.requestRaw("POST", `${prefix}/cluster/getVpcAvailableSubnetList`, undefined, {
190
+ vpcNo: params.vpcNo,
191
+ });
192
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
193
+ }
194
+ catch (error) {
195
+ return { content: [{ type: "text", text: error.message }], isError: true };
196
+ }
197
+ });
198
+ // ─── Get Login Key List ───────────────────────────────────────────────────
199
+ server.tool("ncloud_ses_get_login_keys", "Get authentication key list for SSH access to Search Engine Service manager nodes", {}, async () => {
200
+ try {
201
+ const prefix = getApiPrefix(client.getRegionCode());
202
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getLoginKeyList`);
203
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
204
+ }
205
+ catch (error) {
206
+ return { content: [{ type: "text", text: error.message }], isError: true };
207
+ }
208
+ });
209
+ // ─── Create Cluster (G2) ───────────────────────────────────────────────────
210
+ server.tool("ncloud_ses_create_cluster", "Create a new Search Engine Service cluster (G2). Use dryRun=true to preview.", {
211
+ clusterName: z.string().describe("Cluster name (3-15 chars, lowercase+numbers+'-')"),
212
+ searchEngineVersionCode: z.string().describe("Search engine version code (from getSearchEngineVersionList)"),
213
+ searchEngineDashboardPort: z.string().describe("Dashboard port (1025-65534, not 9090/9200/9300)"),
214
+ searchEngineUserName: z.string().describe("Admin account ID (3-15 chars)"),
215
+ searchEngineUserPassword: z.string().describe("Admin password (8-20 chars, letters+numbers+special)"),
216
+ softwareProductCode: z.string().describe("OS type code (from getOsProductList)"),
217
+ vpcNo: z.number().describe("VPC number"),
218
+ managerNodeSubnetNo: z.number().describe("Manager node subnet number"),
219
+ managerNodeProductCode: z.string().describe("Manager node server type code"),
220
+ dataNodeSubnetNo: z.number().describe("Data node subnet number"),
221
+ dataNodeCount: z.number().describe("Number of data nodes (3-10)"),
222
+ dataNodeProductCode: z.string().describe("Data node server type code"),
223
+ dataNodeStorageSize: z.number().describe("Data node storage size in GB (100-2000, 10GB increment)"),
224
+ loginKeyName: z.string().describe("Authentication key name for SSH access"),
225
+ isDualManager: z.boolean().optional().describe("Manager node redundancy (default: true)"),
226
+ isMasterOnlyNodeActivated: z.boolean().optional().describe("Enable dedicated master nodes"),
227
+ masterNodeSubnetNo: z.number().optional().describe("Master node subnet (required if master enabled)"),
228
+ masterNodeCount: z.number().optional().describe("Number of master nodes (3 or 5)"),
229
+ masterNodeProductCode: z.string().optional().describe("Master node server type code"),
230
+ dryRun: z.boolean().optional().default(false).describe("If true, preview only without creating"),
231
+ }, async (params) => {
232
+ try {
233
+ if (params.dryRun) {
234
+ const { dryRun, ...rest } = params;
235
+ const preview = {
236
+ label: "Dry-Run Preview: SES Cluster Creation (G2)",
237
+ ...rest,
238
+ message: "This is a dry-run preview. Call again with dryRun=false to create.",
239
+ };
240
+ return { content: [{ type: "text", text: JSON.stringify(preview, null, 2) }] };
241
+ }
242
+ const { dryRun, ...apiParams } = params;
243
+ const prefix = getApiPrefix(client.getRegionCode());
244
+ const result = await client.requestRaw("POST", `${prefix}/cluster/createSearchEngineCluster`, undefined, apiParams);
245
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
246
+ }
247
+ catch (error) {
248
+ return { content: [{ type: "text", text: error.message }], isError: true };
249
+ }
250
+ });
251
+ // ─── Create Cluster (G3/KVM) ──────────────────────────────────────────────
252
+ server.tool("ncloud_ses_create_cluster_g3", "Create a new Search Engine Service cluster (G3/KVM). Use dryRun=true to preview.", {
253
+ clusterName: z.string().describe("Cluster name (3-15 chars, lowercase+numbers+'-')"),
254
+ searchEngineVersionCode: z.string().describe("Search engine version code"),
255
+ searchEngineDashboardPort: z.string().describe("Dashboard port (1025-65534, not 9090/9200/9300)"),
256
+ searchEngineUserName: z.string().describe("Admin account ID (3-15 chars)"),
257
+ searchEngineUserPassword: z.string().describe("Admin password (8-20 chars)"),
258
+ softwareProductCode: z.string().describe("OS type code (from getClusterServerImageList)"),
259
+ vpcNo: z.number().describe("VPC number"),
260
+ managerNodeSubnetNo: z.number().describe("Manager node subnet number"),
261
+ managerNodeServerSpecCode: z.string().describe("Manager node server spec code (from getServerSpecList)"),
262
+ dataNodeSubnetNo: z.number().describe("Data node subnet number"),
263
+ dataNodeCount: z.number().describe("Number of data nodes (3-10)"),
264
+ dataNodeServerSpecCode: z.string().describe("Data node server spec code"),
265
+ dataNodeStorageSize: z.number().describe("Data node storage size in GB (100-2000)"),
266
+ loginKeyName: z.string().describe("Authentication key name"),
267
+ isDualManager: z.boolean().optional().describe("Manager node redundancy (default: true)"),
268
+ isMasterOnlyNodeActivated: z.boolean().optional().describe("Enable dedicated master nodes"),
269
+ masterNodeSubnetNo: z.number().optional().describe("Master node subnet"),
270
+ masterNodeCount: z.number().optional().describe("Number of master nodes (3 or 5)"),
271
+ masterNodeServerSpecCode: z.string().optional().describe("Master node server spec code"),
272
+ dryRun: z.boolean().optional().default(false).describe("If true, preview only without creating"),
273
+ }, async (params) => {
274
+ try {
275
+ if (params.dryRun) {
276
+ const { dryRun, ...rest } = params;
277
+ const preview = {
278
+ label: "Dry-Run Preview: SES Cluster Creation (G3/KVM)",
279
+ ...rest,
280
+ message: "This is a dry-run preview. Call again with dryRun=false to create.",
281
+ };
282
+ return { content: [{ type: "text", text: JSON.stringify(preview, null, 2) }] };
283
+ }
284
+ const { dryRun, ...apiParams } = params;
285
+ const prefix = getApiPrefix(client.getRegionCode());
286
+ const result = await client.requestRaw("POST", `${prefix}/cluster/createKvmSearchEngineCluster`, undefined, apiParams);
287
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
288
+ }
289
+ catch (error) {
290
+ return { content: [{ type: "text", text: error.message }], isError: true };
291
+ }
292
+ });
293
+ // ─── Restart Cluster ───────────────────────────────────────────────────────
294
+ server.tool("ncloud_ses_restart_cluster", "Restart a Search Engine Service cluster", {
295
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
296
+ }, async (params) => {
297
+ try {
298
+ const prefix = getApiPrefix(client.getRegionCode());
299
+ const result = await client.requestRaw("POST", `${prefix}/cluster/restartCluster/${params.serviceGroupInstanceNo}`);
300
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
301
+ }
302
+ catch (error) {
303
+ return { content: [{ type: "text", text: error.message }], isError: true };
304
+ }
305
+ });
306
+ // ─── Delete Cluster ────────────────────────────────────────────────────────
307
+ server.tool("ncloud_ses_delete_cluster", "⚠️ Destructive: Permanently delete a Search Engine Service cluster. All data and indices will be lost. Set confirm=true to execute.", {
308
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number to delete"),
309
+ confirm: z.boolean().optional().default(false).describe("Must be true to actually execute the destructive operation"),
310
+ }, async (params) => {
311
+ try {
312
+ if (!params.confirm) {
313
+ return {
314
+ content: [{
315
+ type: "text",
316
+ text: `⚠️ This will permanently delete Search Engine Service cluster [${params.serviceGroupInstanceNo}]. All data and indices will be lost.\n\nTo execute, call this tool again with confirm=true.`,
317
+ }],
318
+ };
319
+ }
320
+ const prefix = getApiPrefix(client.getRegionCode());
321
+ const result = await client.requestRaw("DELETE", `${prefix}/cluster/deleteSearchEngineCluster/${params.serviceGroupInstanceNo}`);
322
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
323
+ }
324
+ catch (error) {
325
+ return { content: [{ type: "text", text: error.message }], isError: true };
326
+ }
327
+ });
328
+ // ─── Add Node ──────────────────────────────────────────────────────────────
329
+ server.tool("ncloud_ses_add_node", "Add data nodes to a Search Engine Service cluster", {
330
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
331
+ addDataNodeCount: z.number().describe("Number of data nodes to add"),
332
+ }, async (params) => {
333
+ try {
334
+ const prefix = getApiPrefix(client.getRegionCode());
335
+ const result = await client.requestRaw("POST", `${prefix}/cluster/changeCountOfDataNode`, undefined, {
336
+ serviceGroupInstanceNo: params.serviceGroupInstanceNo,
337
+ addDataNodeCount: params.addDataNodeCount,
338
+ });
339
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
340
+ }
341
+ catch (error) {
342
+ return { content: [{ type: "text", text: error.message }], isError: true };
343
+ }
344
+ });
345
+ // ─── Get Node Spec Detail ──────────────────────────────────────────────────
346
+ server.tool("ncloud_ses_get_node_spec_detail", "Get server specifications for each node in a Search Engine Service cluster", {
347
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
348
+ }, async (params) => {
349
+ try {
350
+ const prefix = getApiPrefix(client.getRegionCode());
351
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getNodeSpecDetail/${params.serviceGroupInstanceNo}`);
352
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
353
+ }
354
+ catch (error) {
355
+ return { content: [{ type: "text", text: error.message }], isError: true };
356
+ }
357
+ });
358
+ // ─── Change Node Spec ──────────────────────────────────────────────────────
359
+ server.tool("ncloud_ses_change_node_spec", "Change server specifications for nodes in a Search Engine Service cluster", {
360
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
361
+ computeInstanceNoList: z.array(z.number()).describe("List of node instance numbers to change"),
362
+ productCode: z.string().describe("New server product code"),
363
+ }, async (params) => {
364
+ try {
365
+ const prefix = getApiPrefix(client.getRegionCode());
366
+ const result = await client.requestRaw("POST", `${prefix}/cluster/changeSpecNode`, undefined, params);
367
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
368
+ }
369
+ catch (error) {
370
+ return { content: [{ type: "text", text: error.message }], isError: true };
371
+ }
372
+ });
373
+ // ─── Change Disk Capacity ──────────────────────────────────────────────────
374
+ server.tool("ncloud_ses_change_disk_size", "Change data node disk capacity for a Search Engine Service cluster", {
375
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
376
+ dataNodeStorageSize: z.number().describe("New storage size in GB (100-2000, 10GB increment)"),
377
+ }, async (params) => {
378
+ try {
379
+ const prefix = getApiPrefix(client.getRegionCode());
380
+ const result = await client.requestRaw("POST", `${prefix}/cluster/changeClusterNodeDiskSize`, undefined, params);
381
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
382
+ }
383
+ catch (error) {
384
+ return { content: [{ type: "text", text: error.message }], isError: true };
385
+ }
386
+ });
387
+ // ─── Reset Account Password ────────────────────────────────────────────────
388
+ server.tool("ncloud_ses_reset_password", "Reset the Search Engine admin account password", {
389
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
390
+ searchEngineUserPassword: z.string().describe("New admin password (8-20 chars)"),
391
+ }, async (params) => {
392
+ try {
393
+ const prefix = getApiPrefix(client.getRegionCode());
394
+ const result = await client.requestRaw("POST", `${prefix}/cluster/resetSearchEngineUserPassword`, undefined, params);
395
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
396
+ }
397
+ catch (error) {
398
+ return { content: [{ type: "text", text: error.message }], isError: true };
399
+ }
400
+ });
401
+ // ─── Dashboard ─────────────────────────────────────────────────────────────
402
+ server.tool("ncloud_ses_get_dashboard", "Get dashboard information for a Search Engine Service cluster", {
403
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
404
+ }, async (params) => {
405
+ try {
406
+ const prefix = getApiPrefix(client.getRegionCode());
407
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getDashboard/${params.serviceGroupInstanceNo}`);
408
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
409
+ }
410
+ catch (error) {
411
+ return { content: [{ type: "text", text: error.message }], isError: true };
412
+ }
413
+ });
414
+ // ─── Monitoring ────────────────────────────────────────────────────────────
415
+ server.tool("ncloud_ses_get_monitoring", "Get monitoring data for a Search Engine Service cluster or node", {
416
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
417
+ startDateTime: z.string().optional().describe("Start time (ISO 8601 format)"),
418
+ endDateTime: z.string().optional().describe("End time (ISO 8601 format)"),
419
+ }, async (params) => {
420
+ try {
421
+ const prefix = getApiPrefix(client.getRegionCode());
422
+ const queryParams = {
423
+ serviceGroupInstanceNo: params.serviceGroupInstanceNo,
424
+ };
425
+ if (params.startDateTime)
426
+ queryParams["startDateTime"] = params.startDateTime;
427
+ if (params.endDateTime)
428
+ queryParams["endDateTime"] = params.endDateTime;
429
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getMonitoringData`, queryParams);
430
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
431
+ }
432
+ catch (error) {
433
+ return { content: [{ type: "text", text: error.message }], isError: true };
434
+ }
435
+ });
436
+ server.tool("ncloud_ses_get_os_monitoring", "Get OS-level monitoring data for a Search Engine Service node", {
437
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
438
+ computeInstanceNo: z.string().describe("Node instance number"),
439
+ startDateTime: z.string().optional().describe("Start time (ISO 8601 format)"),
440
+ endDateTime: z.string().optional().describe("End time (ISO 8601 format)"),
441
+ }, async (params) => {
442
+ try {
443
+ const prefix = getApiPrefix(client.getRegionCode());
444
+ const queryParams = {
445
+ serviceGroupInstanceNo: params.serviceGroupInstanceNo,
446
+ computeInstanceNo: params.computeInstanceNo,
447
+ };
448
+ if (params.startDateTime)
449
+ queryParams["startDateTime"] = params.startDateTime;
450
+ if (params.endDateTime)
451
+ queryParams["endDateTime"] = params.endDateTime;
452
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getOsMonitoringData`, queryParams);
453
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
454
+ }
455
+ catch (error) {
456
+ return { content: [{ type: "text", text: error.message }], isError: true };
457
+ }
458
+ });
459
+ // ─── Snapshot ──────────────────────────────────────────────────────────────
460
+ server.tool("ncloud_ses_get_snapshot_buckets", "Get Object Storage bucket list available for storing cluster snapshots", {
461
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
462
+ }, async (params) => {
463
+ try {
464
+ const prefix = getApiPrefix(client.getRegionCode());
465
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getSnapshotBucketList`, {
466
+ serviceGroupInstanceNo: params.serviceGroupInstanceNo,
467
+ });
468
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
469
+ }
470
+ catch (error) {
471
+ return { content: [{ type: "text", text: error.message }], isError: true };
472
+ }
473
+ });
474
+ server.tool("ncloud_ses_set_snapshot_api_key", "Set API authentication key for Object Storage access (for snapshots)", {
475
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
476
+ accessKeyId: z.string().describe("Object Storage access key"),
477
+ secretAccessKey: z.string().describe("Object Storage secret key"),
478
+ }, async (params) => {
479
+ try {
480
+ const prefix = getApiPrefix(client.getRegionCode());
481
+ const result = await client.requestRaw("POST", `${prefix}/cluster/setSnapshotApiKey`, undefined, params);
482
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
483
+ }
484
+ catch (error) {
485
+ return { content: [{ type: "text", text: error.message }], isError: true };
486
+ }
487
+ });
488
+ server.tool("ncloud_ses_create_snapshot", "Create a snapshot of a Search Engine Service cluster", {
489
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
490
+ bucketName: z.string().describe("Object Storage bucket name for snapshot storage"),
491
+ }, async (params) => {
492
+ try {
493
+ const prefix = getApiPrefix(client.getRegionCode());
494
+ const result = await client.requestRaw("POST", `${prefix}/cluster/createSnapshot`, undefined, params);
495
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
496
+ }
497
+ catch (error) {
498
+ return { content: [{ type: "text", text: error.message }], isError: true };
499
+ }
500
+ });
501
+ server.tool("ncloud_ses_get_snapshot_history", "Get snapshot creation history for a Search Engine Service cluster", {
502
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
503
+ }, async (params) => {
504
+ try {
505
+ const prefix = getApiPrefix(client.getRegionCode());
506
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getSnapshotHistory`, {
507
+ serviceGroupInstanceNo: params.serviceGroupInstanceNo,
508
+ });
509
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
510
+ }
511
+ catch (error) {
512
+ return { content: [{ type: "text", text: error.message }], isError: true };
513
+ }
514
+ });
515
+ server.tool("ncloud_ses_set_snapshot_schedule", "Set snapshot scheduling for a Search Engine Service cluster", {
516
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
517
+ bucketName: z.string().describe("Object Storage bucket name"),
518
+ scheduleExpression: z.string().describe("Cron expression for scheduling"),
519
+ }, async (params) => {
520
+ try {
521
+ const prefix = getApiPrefix(client.getRegionCode());
522
+ const result = await client.requestRaw("POST", `${prefix}/cluster/setSnapshotSchedule`, undefined, params);
523
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
524
+ }
525
+ catch (error) {
526
+ return { content: [{ type: "text", text: error.message }], isError: true };
527
+ }
528
+ });
529
+ server.tool("ncloud_ses_unset_snapshot_schedule", "Unset (disable) snapshot scheduling for a Search Engine Service cluster. This only removes the schedule, not existing snapshots.", {
530
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
531
+ }, async (params) => {
532
+ try {
533
+ const prefix = getApiPrefix(client.getRegionCode());
534
+ const result = await client.requestRaw("POST", `${prefix}/cluster/removeSnapshotSchedule`, undefined, params);
535
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
536
+ }
537
+ catch (error) {
538
+ return { content: [{ type: "text", text: error.message }], isError: true };
539
+ }
540
+ });
541
+ // ─── Import ────────────────────────────────────────────────────────────────
542
+ server.tool("ncloud_ses_get_import_buckets", "Get Object Storage bucket list available for data import", {
543
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
544
+ }, async (params) => {
545
+ try {
546
+ const prefix = getApiPrefix(client.getRegionCode());
547
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getImportBucketList`, {
548
+ serviceGroupInstanceNo: params.serviceGroupInstanceNo,
549
+ });
550
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
551
+ }
552
+ catch (error) {
553
+ return { content: [{ type: "text", text: error.message }], isError: true };
554
+ }
555
+ });
556
+ server.tool("ncloud_ses_run_import", "Run data import from Object Storage to a Search Engine Service cluster", {
557
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
558
+ bucketName: z.string().describe("Object Storage bucket name"),
559
+ filePath: z.string().describe("File path in the bucket"),
560
+ indexName: z.string().describe("Target index name"),
561
+ }, async (params) => {
562
+ try {
563
+ const prefix = getApiPrefix(client.getRegionCode());
564
+ const result = await client.requestRaw("POST", `${prefix}/cluster/runImport`, undefined, params);
565
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
566
+ }
567
+ catch (error) {
568
+ return { content: [{ type: "text", text: error.message }], isError: true };
569
+ }
570
+ });
571
+ server.tool("ncloud_ses_get_import_history", "Get data import history for a Search Engine Service cluster", {
572
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
573
+ }, async (params) => {
574
+ try {
575
+ const prefix = getApiPrefix(client.getRegionCode());
576
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getImportHistory`, {
577
+ serviceGroupInstanceNo: params.serviceGroupInstanceNo,
578
+ });
579
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
580
+ }
581
+ catch (error) {
582
+ return { content: [{ type: "text", text: error.message }], isError: true };
583
+ }
584
+ });
585
+ server.tool("ncloud_ses_stop_import", "Stop a running data import operation", {
586
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
587
+ importTaskId: z.string().describe("Import task ID to stop"),
588
+ }, async (params) => {
589
+ try {
590
+ const prefix = getApiPrefix(client.getRegionCode());
591
+ const result = await client.requestRaw("POST", `${prefix}/cluster/stopImport`, undefined, params);
592
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
593
+ }
594
+ catch (error) {
595
+ return { content: [{ type: "text", text: error.message }], isError: true };
596
+ }
597
+ });
598
+ // ─── Version Upgrade ───────────────────────────────────────────────────────
599
+ server.tool("ncloud_ses_upgrade_version", "Upgrade Search Engine version for a cluster", {
600
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
601
+ searchEngineVersionCode: z.string().describe("Target version code"),
602
+ }, async (params) => {
603
+ try {
604
+ const prefix = getApiPrefix(client.getRegionCode());
605
+ const result = await client.requestRaw("POST", `${prefix}/cluster/rollingUpgradeCluster`, undefined, params);
606
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
607
+ }
608
+ catch (error) {
609
+ return { content: [{ type: "text", text: error.message }], isError: true };
610
+ }
611
+ });
612
+ server.tool("ncloud_ses_precheck_upgrade", "Pre-check before upgrading Search Engine version", {
613
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
614
+ searchEngineVersionCode: z.string().describe("Target version code"),
615
+ }, async (params) => {
616
+ try {
617
+ const prefix = getApiPrefix(client.getRegionCode());
618
+ const result = await client.requestRaw("POST", `${prefix}/cluster/rollingUpgradePreCheck`, undefined, params);
619
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
620
+ }
621
+ catch (error) {
622
+ return { content: [{ type: "text", text: error.message }], isError: true };
623
+ }
624
+ });
625
+ server.tool("ncloud_ses_get_upgrade_progress", "Get version upgrade progress for a Search Engine Service cluster", {
626
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
627
+ }, async (params) => {
628
+ try {
629
+ const prefix = getApiPrefix(client.getRegionCode());
630
+ const result = await client.requestRaw("GET", `${prefix}/cluster/getRollingUpgradeProgress/${params.serviceGroupInstanceNo}`);
631
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
632
+ }
633
+ catch (error) {
634
+ return { content: [{ type: "text", text: error.message }], isError: true };
635
+ }
636
+ });
637
+ // ─── Change Node Type (Hot/Warm) ──────────────────────────────────────────
638
+ server.tool("ncloud_ses_change_node_type", "Change data node type (Hot/Warm) for a Search Engine Service cluster", {
639
+ serviceGroupInstanceNo: z.string().describe("Cluster instance number"),
640
+ hotDataNodeCount: z.number().describe("Number of hot data nodes"),
641
+ warmDataNodeCount: z.number().describe("Number of warm data nodes"),
642
+ }, async (params) => {
643
+ try {
644
+ const prefix = getApiPrefix(client.getRegionCode());
645
+ const result = await client.requestRaw("POST", `${prefix}/cluster/setHotWarmNode`, undefined, params);
646
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
647
+ }
648
+ catch (error) {
649
+ return { content: [{ type: "text", text: error.message }], isError: true };
650
+ }
651
+ });
652
+ }
653
+ //# sourceMappingURL=analytics-ses.js.map