ncloud-mcp-server 1.0.4 → 1.1.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 (147) hide show
  1. package/README.md +18 -2
  2. package/README_EN.md +18 -2
  3. package/dist/index.js +12 -331
  4. package/dist/index.js.map +1 -1
  5. package/dist/tools/_response.d.ts +69 -0
  6. package/dist/tools/_response.js +96 -0
  7. package/dist/tools/_response.js.map +1 -0
  8. package/dist/tools/acg.js +10 -9
  9. package/dist/tools/acg.js.map +1 -1
  10. package/dist/tools/activity-tracer.js +4 -3
  11. package/dist/tools/activity-tracer.js.map +1 -1
  12. package/dist/tools/analytics-cdss.js +51 -50
  13. package/dist/tools/analytics-cdss.js.map +1 -1
  14. package/dist/tools/analytics-datacatalog.js +22 -21
  15. package/dist/tools/analytics-datacatalog.js.map +1 -1
  16. package/dist/tools/analytics-dataflow.js +27 -26
  17. package/dist/tools/analytics-dataflow.js.map +1 -1
  18. package/dist/tools/analytics-dataforest.js +25 -24
  19. package/dist/tools/analytics-dataforest.js.map +1 -1
  20. package/dist/tools/analytics-dataquery.js +6 -5
  21. package/dist/tools/analytics-dataquery.js.map +1 -1
  22. package/dist/tools/analytics-datastream.js +22 -21
  23. package/dist/tools/analytics-datastream.js.map +1 -1
  24. package/dist/tools/analytics-hadoop.js +30 -29
  25. package/dist/tools/analytics-hadoop.js.map +1 -1
  26. package/dist/tools/analytics-ses.js +43 -42
  27. package/dist/tools/analytics-ses.js.map +1 -1
  28. package/dist/tools/api-gateway.js +13 -12
  29. package/dist/tools/api-gateway.js.map +1 -1
  30. package/dist/tools/autoscaling.js +25 -24
  31. package/dist/tools/autoscaling.js.map +1 -1
  32. package/dist/tools/billing.d.ts +0 -11
  33. package/dist/tools/billing.js +210 -48
  34. package/dist/tools/billing.js.map +1 -1
  35. package/dist/tools/certificate-manager.js +4 -3
  36. package/dist/tools/certificate-manager.js.map +1 -1
  37. package/dist/tools/cloud-advisor.js +16 -15
  38. package/dist/tools/cloud-advisor.js.map +1 -1
  39. package/dist/tools/cloud-functions.js +22 -21
  40. package/dist/tools/cloud-functions.js.map +1 -1
  41. package/dist/tools/cloud-insight-integration.js +6 -5
  42. package/dist/tools/cloud-insight-integration.js.map +1 -1
  43. package/dist/tools/cloud-insight-plugin.js +34 -33
  44. package/dist/tools/cloud-insight-plugin.js.map +1 -1
  45. package/dist/tools/cloud-insight-rule.js +28 -27
  46. package/dist/tools/cloud-insight-rule.js.map +1 -1
  47. package/dist/tools/cloud-insight.js +12 -11
  48. package/dist/tools/cloud-insight.js.map +1 -1
  49. package/dist/tools/common.js +6 -5
  50. package/dist/tools/common.js.map +1 -1
  51. package/dist/tools/compute-initscript.js +5 -4
  52. package/dist/tools/compute-initscript.js.map +1 -1
  53. package/dist/tools/compute-loginkey.js +5 -4
  54. package/dist/tools/compute-loginkey.js.map +1 -1
  55. package/dist/tools/compute-placement.js +14 -13
  56. package/dist/tools/compute-placement.js.map +1 -1
  57. package/dist/tools/compute-publicip.js +8 -7
  58. package/dist/tools/compute-publicip.js.map +1 -1
  59. package/dist/tools/compute-server.js +29 -28
  60. package/dist/tools/compute-server.js.map +1 -1
  61. package/dist/tools/compute-storage.js +16 -15
  62. package/dist/tools/compute-storage.js.map +1 -1
  63. package/dist/tools/containers-nks.js +38 -37
  64. package/dist/tools/containers-nks.js.map +1 -1
  65. package/dist/tools/containers-registry.js +13 -12
  66. package/dist/tools/containers-registry.js.map +1 -1
  67. package/dist/tools/database-cache.js +25 -24
  68. package/dist/tools/database-cache.js.map +1 -1
  69. package/dist/tools/database-mongodb.js +25 -24
  70. package/dist/tools/database-mongodb.js.map +1 -1
  71. package/dist/tools/database-mssql.js +23 -22
  72. package/dist/tools/database-mssql.js.map +1 -1
  73. package/dist/tools/database-mysql.js +30 -29
  74. package/dist/tools/database-mysql.js.map +1 -1
  75. package/dist/tools/database-postgresql.js +26 -25
  76. package/dist/tools/database-postgresql.js.map +1 -1
  77. package/dist/tools/global-dns.js +13 -12
  78. package/dist/tools/global-dns.js.map +1 -1
  79. package/dist/tools/global-edge.js +21 -20
  80. package/dist/tools/global-edge.js.map +1 -1
  81. package/dist/tools/global-traffic-manager.js +27 -26
  82. package/dist/tools/global-traffic-manager.js.map +1 -1
  83. package/dist/tools/kms.js +52 -39
  84. package/dist/tools/kms.js.map +1 -1
  85. package/dist/tools/loadbalancer.js +17 -16
  86. package/dist/tools/loadbalancer.js.map +1 -1
  87. package/dist/tools/log-analytics.js +11 -10
  88. package/dist/tools/log-analytics.js.map +1 -1
  89. package/dist/tools/media-imageoptimizer.js +10 -9
  90. package/dist/tools/media-imageoptimizer.js.map +1 -1
  91. package/dist/tools/media-livestation.js +13 -12
  92. package/dist/tools/media-livestation.js.map +1 -1
  93. package/dist/tools/media-vodstation.js +11 -10
  94. package/dist/tools/media-vodstation.js.map +1 -1
  95. package/dist/tools/nat-gateway.js +6 -5
  96. package/dist/tools/nat-gateway.js.map +1 -1
  97. package/dist/tools/network-acl.js +18 -17
  98. package/dist/tools/network-acl.js.map +1 -1
  99. package/dist/tools/network-interface.js +15 -14
  100. package/dist/tools/network-interface.js.map +1 -1
  101. package/dist/tools/private-ca.js +32 -23
  102. package/dist/tools/private-ca.js.map +1 -1
  103. package/dist/tools/registry.d.ts +49 -0
  104. package/dist/tools/registry.js +254 -0
  105. package/dist/tools/registry.js.map +1 -0
  106. package/dist/tools/resource-manager.js +7 -6
  107. package/dist/tools/resource-manager.js.map +1 -1
  108. package/dist/tools/route-table.js +12 -11
  109. package/dist/tools/route-table.js.map +1 -1
  110. package/dist/tools/security-monitoring.js +8 -7
  111. package/dist/tools/security-monitoring.js.map +1 -1
  112. package/dist/tools/sens.js +7 -6
  113. package/dist/tools/sens.js.map +1 -1
  114. package/dist/tools/sourcebuild.js +18 -17
  115. package/dist/tools/sourcebuild.js.map +1 -1
  116. package/dist/tools/sourcecommit.js +13 -12
  117. package/dist/tools/sourcecommit.js.map +1 -1
  118. package/dist/tools/sourcedeploy.js +35 -34
  119. package/dist/tools/sourcedeploy.js.map +1 -1
  120. package/dist/tools/sourcepipeline.js +18 -17
  121. package/dist/tools/sourcepipeline.js.map +1 -1
  122. package/dist/tools/storage-archive.js +13 -12
  123. package/dist/tools/storage-archive.js.map +1 -1
  124. package/dist/tools/storage-nas.js +20 -19
  125. package/dist/tools/storage-nas.js.map +1 -1
  126. package/dist/tools/storage-ncloud.js +25 -24
  127. package/dist/tools/storage-ncloud.js.map +1 -1
  128. package/dist/tools/storage-object.js +29 -28
  129. package/dist/tools/storage-object.js.map +1 -1
  130. package/dist/tools/sub-account.js +19 -18
  131. package/dist/tools/sub-account.js.map +1 -1
  132. package/dist/tools/target-group.js +12 -11
  133. package/dist/tools/target-group.js.map +1 -1
  134. package/dist/tools/vpc-peering.js +8 -7
  135. package/dist/tools/vpc-peering.js.map +1 -1
  136. package/dist/tools/vpc.js +11 -10
  137. package/dist/tools/vpc.js.map +1 -1
  138. package/package.json +1 -1
  139. package/dist/auth/signature.test.d.ts +0 -1
  140. package/dist/auth/signature.test.js +0 -90
  141. package/dist/auth/signature.test.js.map +0 -1
  142. package/dist/client/ncloud-client.test.d.ts +0 -1
  143. package/dist/client/ncloud-client.test.js +0 -477
  144. package/dist/client/ncloud-client.test.js.map +0 -1
  145. package/dist/tools/compute-server.test.d.ts +0 -1
  146. package/dist/tools/compute-server.test.js +0 -224
  147. package/dist/tools/compute-server.test.js.map +0 -1
package/README.md CHANGED
@@ -18,14 +18,14 @@ Ncloud의 **60개 이상 서비스**, **1,000개 이상 API 도구**를 MCP 프
18
18
  | **Compute** | Server, Block Storage, Snapshot, Public IP, Init Script, Login Key, Placement Group, Fabric Cluster |
19
19
  | **Networking** | VPC, Subnet, ACG, Network ACL, NAT Gateway, Route Table, VPC Peering, Network Interface, Load Balancer, Target Group, Global DNS, Global Traffic Manager |
20
20
  | **Database** | Cloud DB for MySQL, PostgreSQL, MSSQL, MongoDB, Redis |
21
- | **Storage** | Object Storage (S3 호환), NAS, Archive Storage (Swift 호환) |
21
+ | **Storage** | Object Storage (S3 호환), Ncloud Storage (S3 호환), NAS, Archive Storage (Swift 호환) |
22
22
  | **Containers** | Ncloud Kubernetes Service (NKS), Container Registry |
23
23
  | **Monitoring** | Cloud Insight (Dashboard, Event, Rule, Plugin, Schema, Data, Integration) |
24
24
  | **DevTools** | SourceCommit, SourceBuild, SourceDeploy, SourcePipeline |
25
25
  | **Media** | VOD Station, Live Station, Image Optimizer |
26
26
  | **Security** | Certificate Manager, Private CA, KMS, Security Monitoring |
27
27
  | **Application** | Cloud Functions, API Gateway, SENS (SMS/Push) |
28
- | **Analytics** | Search Engine Service, Cloud Hadoop, Cloud Data Streaming Service, Data Catalog, Data Forest, Data Flow, Data Query |
28
+ | **Analytics** | Search Engine Service, Cloud Hadoop, Cloud Data Streaming Service, Data Stream, Data Catalog, Data Forest, Data Flow, Data Query |
29
29
  | **Management** | Sub Account, Activity Tracer, Resource Manager, Log Analytics, Cloud Advisor, Billing |
30
30
  | **Content Delivery** | Global Edge |
31
31
  | **Auto Scaling** | Launch Configuration, Auto Scaling Group, Scaling Policy |
@@ -75,6 +75,22 @@ npm run build
75
75
  | `NCLOUD_API_URL` | - | API 기본 URL | `https://ncloud.apigw.ntruss.com` |
76
76
  | `NCLOUD_ARCHIVE_PROJECT_ID` | - | Archive Storage 프로젝트 ID | - |
77
77
  | `NCLOUD_ARCHIVE_DOMAIN_ID` | - | Archive Storage 도메인 ID | - |
78
+ | `NCLOUD_TOOL_GROUPS` | - | 로딩할 도구 그룹 선택(아래 참조). 미설정 시 전체 ON | 전체 |
79
+ | `NCLOUD_RESPONSE_PRUNE` | - | `1`이면 응답에서 빈 값(`null`/`""`/`[]`/`{}`)을 전역 제거 | `0` |
80
+
81
+ ### 도구 그룹 선택 (`NCLOUD_TOOL_GROUPS`)
82
+
83
+ 서비스가 약 1,000개 도구로 구성되어 있어, 필요한 그룹만 로딩하면 컨텍스트 토큰과 도구 선택 정확도가 개선됩니다. `common` 그룹은 항상 등록됩니다.
84
+
85
+ ```
86
+ # 미설정 → 전체 그룹 ON (기존 동작과 동일)
87
+ # 특정 그룹만(+ common):
88
+ NCLOUD_TOOL_GROUPS=compute,network,billing
89
+ # 전부 켜되 일부 제외(감산):
90
+ NCLOUD_TOOL_GROUPS=all,-billing
91
+ ```
92
+
93
+ 사용 가능한 그룹 key: `compute`, `network`, `database`, `storage`, `containers`, `monitoring`, `devtools`, `analytics`, `media`, `global`, `security`, `integration`, `billing` (그리고 항상 켜지는 `common`).
78
94
 
79
95
  ## MCP 클라이언트 설정
80
96
 
package/README_EN.md CHANGED
@@ -18,14 +18,14 @@ Provides **1,000+ API tools** across **60+ Ncloud services** via MCP protocol.
18
18
  | **Compute** | Server, Block Storage, Snapshot, Public IP, Init Script, Login Key, Placement Group, Fabric Cluster |
19
19
  | **Networking** | VPC, Subnet, ACG, Network ACL, NAT Gateway, Route Table, VPC Peering, Network Interface, Load Balancer, Target Group, Global DNS, Global Traffic Manager |
20
20
  | **Database** | Cloud DB for MySQL, PostgreSQL, MSSQL, MongoDB, Redis |
21
- | **Storage** | Object Storage (S3-compatible), NAS, Archive Storage (Swift-compatible) |
21
+ | **Storage** | Object Storage (S3-compatible), Ncloud Storage (S3-compatible), NAS, Archive Storage (Swift-compatible) |
22
22
  | **Containers** | Ncloud Kubernetes Service (NKS), Container Registry |
23
23
  | **Monitoring** | Cloud Insight (Dashboard, Event, Rule, Plugin, Schema, Data, Integration) |
24
24
  | **DevTools** | SourceCommit, SourceBuild, SourceDeploy, SourcePipeline |
25
25
  | **Media** | VOD Station, Live Station, Image Optimizer |
26
26
  | **Security** | Certificate Manager, Private CA, KMS, Security Monitoring |
27
27
  | **Application** | Cloud Functions, API Gateway, SENS (SMS/Push) |
28
- | **Analytics** | Search Engine Service, Cloud Hadoop, Cloud Data Streaming Service, Data Catalog, Data Forest, Data Flow, Data Query |
28
+ | **Analytics** | Search Engine Service, Cloud Hadoop, Cloud Data Streaming Service, Data Stream, Data Catalog, Data Forest, Data Flow, Data Query |
29
29
  | **Management** | Sub Account, Activity Tracer, Resource Manager, Log Analytics, Cloud Advisor, Billing |
30
30
  | **Content Delivery** | Global Edge |
31
31
  | **Auto Scaling** | Launch Configuration, Auto Scaling Group, Scaling Policy |
@@ -75,6 +75,22 @@ npm run build
75
75
  | `NCLOUD_API_URL` | - | API base URL | `https://ncloud.apigw.ntruss.com` |
76
76
  | `NCLOUD_ARCHIVE_PROJECT_ID` | - | Archive Storage project ID | - |
77
77
  | `NCLOUD_ARCHIVE_DOMAIN_ID` | - | Archive Storage domain ID | - |
78
+ | `NCLOUD_TOOL_GROUPS` | - | Select which tool groups to load (see below). All groups ON when unset | all |
79
+ | `NCLOUD_RESPONSE_PRUNE` | - | When `1`, globally strips empty values (`null`/`""`/`[]`/`{}`) from responses | `0` |
80
+
81
+ ### Tool Group Selection (`NCLOUD_TOOL_GROUPS`)
82
+
83
+ The server exposes ~1,000 tools. Loading only the groups you need reduces context tokens and improves tool-selection accuracy. The `common` group is always registered.
84
+
85
+ ```
86
+ # Unset → all groups ON (same as before)
87
+ # Specific groups only (+ common):
88
+ NCLOUD_TOOL_GROUPS=compute,network,billing
89
+ # All groups, but exclude some (subtractive):
90
+ NCLOUD_TOOL_GROUPS=all,-billing
91
+ ```
92
+
93
+ Available group keys: `compute`, `network`, `database`, `storage`, `containers`, `monitoring`, `devtools`, `analytics`, `media`, `global`, `security`, `integration`, `billing` (plus the always-on `common`).
78
94
 
79
95
  ## MCP Client Configuration
80
96
 
package/dist/index.js CHANGED
@@ -1,10 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
3
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
- import { NcloudClient } from "./client/ncloud-client.js";
5
- import { S3CompatibleClient } from "./client/s3-compatible-client.js";
6
- import { SwiftCompatibleClient } from "./client/swift-compatible-client.js";
7
- import { registerCommonTools, registerComputeServerTools, registerComputeStorageTools, registerComputePublicIpTools, registerComputeLoginKeyTools, registerComputeInitScriptTools, registerComputePlacementTools, registerVpcTools, registerAcgTools, registerNetworkAclTools, registerNatGatewayTools, registerRouteTableTools, registerVpcPeeringTools, registerNetworkInterfaceTools, registerLoadBalancerTools, registerTargetGroupTools, registerAutoScalingTools, registerDatabaseMysqlTools, registerDatabasePostgresqlTools, registerDatabaseMssqlTools, registerDatabaseMongodbTools, registerDatabaseCacheTools, registerStorageObjectTools, registerStorageNcloudTools, registerContainersNksTools, registerContainersRegistryTools, registerActivityTracerTools, registerStorageNasTools, registerLogAnalyticsTools, registerCertificateManagerTools, registerSecurityMonitoringTools, registerCloudInsightTools, registerCloudInsightRuleTools, registerCloudInsightPluginTools, registerCloudInsightIntegrationTools, registerSourceCommitTools, registerSourceBuildTools, registerSourceDeployTools, registerSourcePipelineTools, registerGlobalEdgeTools, registerVodStationTools, registerLiveStationTools, registerImageOptimizerTools, registerSubAccountTools, registerApiGatewayTools, registerSensTools, registerSearchEngineServiceTools, registerCloudHadoopTools, registerCloudDataStreamingTools, registerDataStreamTools, registerCloudFunctionsTools, registerResourceManagerTools, registerGlobalDnsTools, registerGlobalTrafficManagerTools, registerStorageArchiveTools, registerDataCatalogTools, registerDataForestTools, registerCloudAdvisorTools, registerDataFlowTools, registerDataQueryTools, registerPrivateCaTools, registerKmsTools, registerBillingTools } from "./tools/index.js";
4
+ import { makeClientFactory, resolveGroups, registerGroups, } from "./tools/registry.js";
8
5
  // Validate required environment variables
9
6
  const accessKey = process.env.NCLOUD_ACCESS_KEY;
10
7
  const secretKey = process.env.NCLOUD_SECRET_KEY;
@@ -17,339 +14,23 @@ if (!secretKey) {
17
14
  process.exit(1);
18
15
  }
19
16
  const regionCode = process.env.NCLOUD_REGION ?? "KR";
20
- const baseUrl = process.env.NCLOUD_API_URL ?? "https://ncloud.apigw.ntruss.com";
21
- // Create NcloudClient for general APIs
22
- const client = new NcloudClient({
23
- accessKey,
24
- secretKey,
25
- baseUrl,
26
- regionCode,
27
- });
28
- // Create NcloudClient for Cloud Insight APIs
29
- const cloudInsightClient = new NcloudClient({
30
- accessKey,
31
- secretKey,
32
- baseUrl: "https://cw.apigw.ntruss.com",
33
- regionCode,
34
- });
35
- // Create NcloudClient for Container Registry APIs
36
- const ncrClient = new NcloudClient({
37
- accessKey,
38
- secretKey,
39
- baseUrl: "https://ncr.apigw.ntruss.com",
40
- regionCode,
41
- });
42
- // Create NcloudClient for Cloud Activity Tracer APIs
43
- const activityTracerClient = new NcloudClient({
44
- accessKey,
45
- secretKey,
46
- baseUrl: "https://cloudactivitytracer.apigw.ntruss.com",
47
- regionCode,
48
- });
49
- // Create NcloudClient for SourceCommit APIs
50
- const sourceCommitClient = new NcloudClient({
51
- accessKey,
52
- secretKey,
53
- baseUrl: "https://sourcecommit.apigw.ntruss.com",
54
- regionCode,
55
- });
56
- // Create NcloudClient for SourceBuild APIs
57
- const sourceBuildClient = new NcloudClient({
58
- accessKey,
59
- secretKey,
60
- baseUrl: "https://sourcebuild.apigw.ntruss.com",
61
- regionCode,
62
- });
63
- // Create NcloudClient for SourceDeploy APIs (VPC)
64
- const sourceDeployClient = new NcloudClient({
65
- accessKey,
66
- secretKey,
67
- baseUrl: "https://vpcsourcedeploy.apigw.ntruss.com",
68
- regionCode,
69
- });
70
- // Create NcloudClient for SourcePipeline APIs (VPC)
71
- const sourcePipelineClient = new NcloudClient({
72
- accessKey,
73
- secretKey,
74
- baseUrl: "https://vpcsourcepipeline.apigw.ntruss.com",
75
- regionCode,
76
- });
77
- // Create NcloudClient for Global Edge APIs
78
- const globalEdgeClient = new NcloudClient({
79
- accessKey,
80
- secretKey,
81
- baseUrl: "https://edge.apigw.ntruss.com",
82
- regionCode,
83
- });
84
- // Create NcloudClient for VOD Station APIs
85
- const vodStationClient = new NcloudClient({
86
- accessKey,
87
- secretKey,
88
- baseUrl: "https://vodstation.apigw.ntruss.com",
89
- regionCode,
90
- });
91
- // Create NcloudClient for Live Station APIs
92
- const liveStationClient = new NcloudClient({
93
- accessKey,
94
- secretKey,
95
- baseUrl: "https://livestation.apigw.ntruss.com",
96
- regionCode,
97
- });
98
- // Create NcloudClient for Image Optimizer APIs
99
- const imageOptimizerClient = new NcloudClient({
100
- accessKey,
101
- secretKey,
102
- baseUrl: "https://imageoptimizer.apigw.ntruss.com",
103
- regionCode,
104
- });
105
- // Create NcloudClient for Sub Account (IAM) APIs
106
- const subAccountClient = new NcloudClient({
107
- accessKey,
108
- secretKey,
109
- baseUrl: "https://subaccount.apigw.ntruss.com",
110
- regionCode,
111
- });
112
- // Create NcloudClient for Certificate Manager APIs (v2)
113
- const certificateManagerClient = new NcloudClient({
114
- accessKey,
115
- secretKey,
116
- baseUrl: "https://certificatemanager.apigw.ntruss.com",
117
- regionCode,
118
- });
119
- // Create NcloudClient for API Gateway APIs
120
- const apiGatewayClient = new NcloudClient({
121
- accessKey,
122
- secretKey,
123
- baseUrl: "https://apigateway.apigw.ntruss.com",
124
- regionCode,
125
- });
126
- // Create NcloudClient for SENS APIs
127
- const sensClient = new NcloudClient({
128
- accessKey,
129
- secretKey,
130
- baseUrl: "https://sens.apigw.ntruss.com",
131
- regionCode,
132
- });
133
- // Create S3CompatibleClient for Object Storage APIs
134
- const s3Client = new S3CompatibleClient({
135
- accessKey,
136
- secretKey,
137
- regionCode,
138
- storageType: "object",
139
- });
140
- // Create S3CompatibleClient for Ncloud Storage APIs
141
- const ncloudStorageClient = new S3CompatibleClient({
142
- accessKey,
143
- secretKey,
144
- regionCode,
145
- storageType: "ncloud",
146
- });
17
+ const creds = { accessKey, secretKey };
147
18
  // Create MCP Server
148
19
  const server = new McpServer({
149
20
  name: "ncloud-mcp-server",
150
- version: "1.0.0",
151
- });
152
- // Register all tools
153
- registerCommonTools(server, client);
154
- registerComputeServerTools(server, client);
155
- registerComputeStorageTools(server, client);
156
- registerComputePublicIpTools(server, client);
157
- registerComputeLoginKeyTools(server, client);
158
- registerComputeInitScriptTools(server, client);
159
- registerComputePlacementTools(server, client);
160
- registerVpcTools(server, client);
161
- registerAcgTools(server, client);
162
- registerNetworkAclTools(server, client);
163
- registerNatGatewayTools(server, client);
164
- registerRouteTableTools(server, client);
165
- registerVpcPeeringTools(server, client);
166
- registerNetworkInterfaceTools(server, client);
167
- registerLoadBalancerTools(server, client);
168
- registerTargetGroupTools(server, client);
169
- registerAutoScalingTools(server, client);
170
- registerDatabaseMysqlTools(server, client);
171
- registerDatabasePostgresqlTools(server, client);
172
- registerDatabaseMssqlTools(server, client);
173
- registerDatabaseMongodbTools(server, client);
174
- registerDatabaseCacheTools(server, client);
175
- registerStorageObjectTools(server, s3Client);
176
- registerStorageNcloudTools(server, ncloudStorageClient);
177
- // Create NcloudClient for NKS (Ncloud Kubernetes Service) APIs
178
- const nksClient = new NcloudClient({
179
- accessKey,
180
- secretKey,
181
- baseUrl: "https://nks.apigw.ntruss.com",
182
- regionCode,
183
- });
184
- registerContainersNksTools(server, nksClient);
185
- registerContainersRegistryTools(server, ncrClient);
186
- registerActivityTracerTools(server, activityTracerClient);
187
- registerStorageNasTools(server, client);
188
- registerLogAnalyticsTools(server, client);
189
- registerCertificateManagerTools(server, certificateManagerClient);
190
- registerSecurityMonitoringTools(server, client);
191
- registerCloudInsightTools(server, cloudInsightClient);
192
- registerCloudInsightRuleTools(server, cloudInsightClient);
193
- registerCloudInsightPluginTools(server, cloudInsightClient);
194
- registerCloudInsightIntegrationTools(server, cloudInsightClient);
195
- registerSourceCommitTools(server, sourceCommitClient);
196
- registerSourceBuildTools(server, sourceBuildClient);
197
- registerSourceDeployTools(server, sourceDeployClient);
198
- registerSourcePipelineTools(server, sourcePipelineClient);
199
- registerGlobalEdgeTools(server, globalEdgeClient);
200
- registerVodStationTools(server, vodStationClient);
201
- registerLiveStationTools(server, liveStationClient);
202
- registerImageOptimizerTools(server, imageOptimizerClient);
203
- registerSubAccountTools(server, subAccountClient);
204
- registerApiGatewayTools(server, apiGatewayClient);
205
- registerSensTools(server, sensClient);
206
- // Create NcloudClient for Search Engine Service APIs
207
- const sesClient = new NcloudClient({
208
- accessKey,
209
- secretKey,
210
- baseUrl: "https://vpcsearchengine.apigw.ntruss.com",
211
- regionCode,
212
- });
213
- registerSearchEngineServiceTools(server, sesClient);
214
- registerCloudHadoopTools(server, client);
215
- // Create NcloudClient for Cloud Data Streaming Service (CDSS) APIs
216
- const cdssClient = new NcloudClient({
217
- accessKey,
218
- secretKey,
219
- baseUrl: "https://clouddatastreamingservice.apigw.ntruss.com",
220
- regionCode,
221
- });
222
- registerCloudDataStreamingTools(server, cdssClient);
223
- // Create NcloudClient for Data Stream APIs (Topic, Connector, Schema)
224
- const dataStreamClient = new NcloudClient({
225
- accessKey,
226
- secretKey,
227
- baseUrl: "https://datastream.apigw.ntruss.com",
228
- regionCode,
21
+ version: "1.1.0",
229
22
  });
230
- // Create NcloudClient for Data Stream Message API (different base URL)
231
- const dataStreamMessageClient = new NcloudClient({
232
- accessKey,
233
- secretKey,
234
- baseUrl: "https://api.datastream.naverncp.com",
23
+ // 그룹 단위 도구 등록 (NCLOUD_TOOL_GROUPS 미설정 전체 ON = 기존 동작 동일)
24
+ const ctx = {
25
+ server,
26
+ client: makeClientFactory(creds, regionCode),
235
27
  regionCode,
236
- });
237
- registerDataStreamTools(server, dataStreamClient, dataStreamMessageClient);
238
- // Create NcloudClient for Cloud Functions APIs (region-specific base URL)
239
- const cloudFunctionsBaseUrlMap = {
240
- KR: "https://cloudfunctions.apigw.ntruss.com",
241
- SGN: "https://sg-cloudfunctions.apigw.ntruss.com",
242
- JPN: "https://jp-cloudfunctions.apigw.ntruss.com",
28
+ creds,
29
+ env: process.env,
243
30
  };
244
- const cloudFunctionsBaseUrl = cloudFunctionsBaseUrlMap[regionCode] ?? "https://cloudfunctions.apigw.ntruss.com";
245
- const cloudFunctionsClient = new NcloudClient({
246
- accessKey,
247
- secretKey,
248
- baseUrl: cloudFunctionsBaseUrl,
249
- regionCode,
250
- });
251
- registerCloudFunctionsTools(server, cloudFunctionsClient);
252
- // Create NcloudClient for Resource Manager APIs
253
- const resourceManagerClient = new NcloudClient({
254
- accessKey,
255
- secretKey,
256
- baseUrl: "https://resourcemanager.apigw.ntruss.com",
257
- regionCode,
258
- });
259
- registerResourceManagerTools(server, resourceManagerClient);
260
- // Create NcloudClient for Global DNS APIs
261
- const globalDnsClient = new NcloudClient({
262
- accessKey,
263
- secretKey,
264
- baseUrl: "https://globaldns.apigw.ntruss.com",
265
- regionCode,
266
- });
267
- registerGlobalDnsTools(server, globalDnsClient);
268
- // Create NcloudClient for Global Traffic Manager APIs
269
- const gtmClient = new NcloudClient({
270
- accessKey,
271
- secretKey,
272
- baseUrl: "https://globaltrafficmanager.apigw.ntruss.com",
273
- regionCode,
274
- });
275
- registerGlobalTrafficManagerTools(server, gtmClient);
276
- // Create NcloudClient for Data Catalog APIs
277
- const dataCatalogClient = new NcloudClient({
278
- accessKey,
279
- secretKey,
280
- baseUrl: "https://datacatalog.apigw.ntruss.com",
281
- regionCode,
282
- });
283
- registerDataCatalogTools(server, dataCatalogClient);
284
- // Create NcloudClient for Data Forest APIs
285
- const dataForestClient = new NcloudClient({
286
- accessKey,
287
- secretKey,
288
- baseUrl: "https://df.apigw.ntruss.com",
289
- regionCode,
290
- });
291
- registerDataForestTools(server, dataForestClient);
292
- // Create NcloudClient for Cloud Advisor APIs
293
- const cloudAdvisorClient = new NcloudClient({
294
- accessKey,
295
- secretKey,
296
- baseUrl: "https://cloud-advisor.apigw.ntruss.com",
297
- regionCode,
298
- });
299
- registerCloudAdvisorTools(server, cloudAdvisorClient);
300
- // Create NcloudClient for Data Flow APIs
301
- const dataFlowClient = new NcloudClient({
302
- accessKey,
303
- secretKey,
304
- baseUrl: "https://dataflow.apigw.ntruss.com",
305
- regionCode,
306
- });
307
- registerDataFlowTools(server, dataFlowClient);
308
- // Create NcloudClient for Data Query APIs
309
- const dataQueryClient = new NcloudClient({
310
- accessKey,
311
- secretKey,
312
- baseUrl: "https://kr.dataquery.naverncp.com",
313
- regionCode,
314
- });
315
- registerDataQueryTools(server, dataQueryClient);
316
- // Create NcloudClient for Private CA APIs
317
- const privateCaClient = new NcloudClient({
318
- accessKey,
319
- secretKey,
320
- baseUrl: "https://pca.apigw.ntruss.com",
321
- regionCode,
322
- });
323
- registerPrivateCaTools(server, privateCaClient);
324
- // Create NcloudClient for KMS API 2.0
325
- const kmsClient = new NcloudClient({
326
- accessKey,
327
- secretKey,
328
- baseUrl: "https://ocapi.ncloud.com",
329
- regionCode,
330
- });
331
- registerKmsTools(server, kmsClient);
332
- // Create NcloudClient for Billing APIs (List Price, Cost and Usage, Discount)
333
- const billingClient = new NcloudClient({
334
- accessKey,
335
- secretKey,
336
- baseUrl: "https://billingapi.apigw.ntruss.com",
337
- regionCode,
338
- });
339
- registerBillingTools(server, billingClient);
340
- // Create SwiftCompatibleClient for Archive Storage APIs (optional — requires NCLOUD_ARCHIVE_PROJECT_ID and NCLOUD_ARCHIVE_DOMAIN_ID)
341
- const archiveProjectId = process.env.NCLOUD_ARCHIVE_PROJECT_ID;
342
- const archiveDomainId = process.env.NCLOUD_ARCHIVE_DOMAIN_ID;
343
- if (archiveProjectId && archiveDomainId) {
344
- const swiftClient = new SwiftCompatibleClient({
345
- accessKey,
346
- secretKey,
347
- projectId: archiveProjectId,
348
- domainId: archiveDomainId,
349
- regionCode,
350
- });
351
- registerStorageArchiveTools(server, swiftClient);
352
- }
31
+ const groups = resolveGroups(process.env.NCLOUD_TOOL_GROUPS);
32
+ registerGroups(ctx, groups);
33
+ console.error(`ncloud-mcp-server: ${groups.length}개 그룹 등록 (${groups.map((g) => g.key).join(", ")})`);
353
34
  // Connect via stdio transport
354
35
  async function main() {
355
36
  const transport = new StdioServerTransport();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,cAAc,GAEf,MAAM,qBAAqB,CAAC;AAE7B,0CAA0C;AAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAChD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAEhD,IAAI,CAAC,SAAS,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,CAAC,SAAS,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC;AACrD,MAAM,KAAK,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAEvC,oBAAoB;AACpB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,mBAAmB;IACzB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,0DAA0D;AAC1D,MAAM,GAAG,GAAgB;IACvB,MAAM;IACN,MAAM,EAAE,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC;IAC5C,UAAU;IACV,KAAK;IACL,GAAG,EAAE,OAAO,CAAC,GAAG;CACjB,CAAC;AACF,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAC7D,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC5B,OAAO,CAAC,KAAK,CACX,sBAAsB,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACtF,CAAC;AAEF,8BAA8B;AAC9B,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * 공통 MCP 도구 응답 헬퍼.
3
+ *
4
+ * 모든 도구는 `{ content: [{ type: "text", text: ... }] }` 형태로 응답한다(CLAUDE.md 컨벤션).
5
+ * 기존에는 각 도구가 `JSON.stringify(result, null, 2)`를 직접 호출해 들여쓰기가 포함된
6
+ * 큰 응답을 만들었다. `toolText()`로 통일해 들여쓰기를 제거하고(토큰 30~40% 절감),
7
+ * 선택적으로 빈 값을 prune 한다.
8
+ *
9
+ * 설계: DESIGN_modularization-and-response.md §3
10
+ */
11
+ /**
12
+ * 응답 객체에서 "정보 없음"에 해당하는 빈 값을 재귀적으로 제거한다.
13
+ * 제거 대상: `null`, `undefined`, 빈 문자열 `""`, 빈 배열 `[]`, 빈 객체 `{}`.
14
+ * 보존: 숫자 `0`, 불리언 `false` (의미 있는 값).
15
+ *
16
+ * ⚠️ 일부 NCP API는 의미 있는 `""`(빈 문자열)을 반환할 수 있으므로 기본 OFF(옵트인).
17
+ */
18
+ export declare function prune(v: any): any;
19
+ export interface ToolTextOptions {
20
+ /** 빈 값 제거. 미지정 시 `NCLOUD_RESPONSE_PRUNE === "1"` 전역 설정을 따른다. */
21
+ prune?: boolean;
22
+ }
23
+ /**
24
+ * 도구 결과를 표준 MCP 텍스트 응답으로 직렬화한다.
25
+ * 들여쓰기 없이(`JSON.stringify(data)`) 직렬화해 토큰을 절감한다.
26
+ */
27
+ export declare function toolText(result: any, opts?: ToolTextOptions): {
28
+ content: {
29
+ type: "text";
30
+ text: string;
31
+ }[];
32
+ };
33
+ export interface PageMeta {
34
+ pageNo: number;
35
+ pageSize: number;
36
+ /** 이 페이지에서 실제 반환된 항목 수(가드로 줄었을 수 있음). */
37
+ returnedRows: number;
38
+ /** 페이징 대상 전체 대비 더 받을 항목이 남았는지. */
39
+ hasMore: boolean;
40
+ /** 다음 페이지 번호. 가드로 잘렸으면(=페이지 건너뛰기 손실 위험) null. */
41
+ nextPageNo: number | null;
42
+ /** 하드 크기 가드가 이 페이지에서 항목을 잘랐으면 true. */
43
+ truncated?: boolean;
44
+ /**
45
+ * 가드 발동 시, 이 값 이하의 `pageSize`로 재조회하면 (결정적 정렬 위에서) 전수를
46
+ * 누락 없이 순회할 수 있다는 회복 힌트. 가드 미발동 시 미포함.
47
+ */
48
+ suggestedPageSize?: number;
49
+ }
50
+ export interface PageResult {
51
+ items: any[];
52
+ meta: PageMeta;
53
+ }
54
+ /**
55
+ * 가공 완료된 항목 배열을 페이지로 자르고, 직렬화 크기 하드 가드를 적용한다.
56
+ *
57
+ * - 페이지네이션(`pageNo`/`pageSize`)이 주 메커니즘 — 안정 정렬된 배열을 결정적으로 슬라이스.
58
+ * - 하드 가드는 backstop — 슬라이스 직렬화 길이가 `maxBytes` 초과 시 **항목 단위로**
59
+ * 뒤에서부터 제거(글자 수 컷 금지 → JSON 깨짐/부분 항목 방지). 최소 1개는 남긴다.
60
+ * - 가드가 발동하면 페이지 건너뛰기로 항목이 조용히 사라지는 걸 막기 위해 `nextPageNo`를
61
+ * 주지 않는다(사용자는 `pageSize`를 줄이거나 쿼리를 좁혀 재조회).
62
+ *
63
+ * 호출자는 도메인 메타(`totalRows`/`matchedRows` 등)와 안내 문구를 결과에 합쳐 반환한다.
64
+ */
65
+ export declare function paginateWithGuard(items: any[], opts: {
66
+ pageNo?: number;
67
+ pageSize: number;
68
+ maxBytes: number;
69
+ }): PageResult;
@@ -0,0 +1,96 @@
1
+ /**
2
+ * 공통 MCP 도구 응답 헬퍼.
3
+ *
4
+ * 모든 도구는 `{ content: [{ type: "text", text: ... }] }` 형태로 응답한다(CLAUDE.md 컨벤션).
5
+ * 기존에는 각 도구가 `JSON.stringify(result, null, 2)`를 직접 호출해 들여쓰기가 포함된
6
+ * 큰 응답을 만들었다. `toolText()`로 통일해 들여쓰기를 제거하고(토큰 30~40% 절감),
7
+ * 선택적으로 빈 값을 prune 한다.
8
+ *
9
+ * 설계: DESIGN_modularization-and-response.md §3
10
+ */
11
+ /**
12
+ * 응답 객체에서 "정보 없음"에 해당하는 빈 값을 재귀적으로 제거한다.
13
+ * 제거 대상: `null`, `undefined`, 빈 문자열 `""`, 빈 배열 `[]`, 빈 객체 `{}`.
14
+ * 보존: 숫자 `0`, 불리언 `false` (의미 있는 값).
15
+ *
16
+ * ⚠️ 일부 NCP API는 의미 있는 `""`(빈 문자열)을 반환할 수 있으므로 기본 OFF(옵트인).
17
+ */
18
+ export function prune(v) {
19
+ if (Array.isArray(v)) {
20
+ const arr = v.map(prune).filter((x) => !isEmpty(x));
21
+ return arr;
22
+ }
23
+ if (v !== null && typeof v === "object") {
24
+ const out = {};
25
+ for (const [k, val] of Object.entries(v)) {
26
+ const pruned = prune(val);
27
+ if (!isEmpty(pruned))
28
+ out[k] = pruned;
29
+ }
30
+ return out;
31
+ }
32
+ return v;
33
+ }
34
+ function isEmpty(v) {
35
+ if (v === null || v === undefined)
36
+ return true;
37
+ if (v === "")
38
+ return true;
39
+ if (Array.isArray(v))
40
+ return v.length === 0;
41
+ if (typeof v === "object")
42
+ return Object.keys(v).length === 0;
43
+ return false;
44
+ }
45
+ /**
46
+ * 도구 결과를 표준 MCP 텍스트 응답으로 직렬화한다.
47
+ * 들여쓰기 없이(`JSON.stringify(data)`) 직렬화해 토큰을 절감한다.
48
+ */
49
+ export function toolText(result, opts) {
50
+ const doPrune = opts?.prune ?? (process.env.NCLOUD_RESPONSE_PRUNE === "1");
51
+ const data = doPrune ? prune(result) : result;
52
+ return { content: [{ type: "text", text: JSON.stringify(data) }] };
53
+ }
54
+ /**
55
+ * 가공 완료된 항목 배열을 페이지로 자르고, 직렬화 크기 하드 가드를 적용한다.
56
+ *
57
+ * - 페이지네이션(`pageNo`/`pageSize`)이 주 메커니즘 — 안정 정렬된 배열을 결정적으로 슬라이스.
58
+ * - 하드 가드는 backstop — 슬라이스 직렬화 길이가 `maxBytes` 초과 시 **항목 단위로**
59
+ * 뒤에서부터 제거(글자 수 컷 금지 → JSON 깨짐/부분 항목 방지). 최소 1개는 남긴다.
60
+ * - 가드가 발동하면 페이지 건너뛰기로 항목이 조용히 사라지는 걸 막기 위해 `nextPageNo`를
61
+ * 주지 않는다(사용자는 `pageSize`를 줄이거나 쿼리를 좁혀 재조회).
62
+ *
63
+ * 호출자는 도메인 메타(`totalRows`/`matchedRows` 등)와 안내 문구를 결과에 합쳐 반환한다.
64
+ */
65
+ export function paginateWithGuard(items, opts) {
66
+ const pageNo = Math.max(1, Math.floor(opts.pageNo ?? 1));
67
+ const pageSize = Math.max(1, Math.floor(opts.pageSize));
68
+ const start = (pageNo - 1) * pageSize;
69
+ let slice = items.slice(start, start + pageSize);
70
+ let truncated = false;
71
+ while (slice.length > 1 && JSON.stringify(slice).length > opts.maxBytes) {
72
+ slice = slice.slice(0, -1);
73
+ truncated = true;
74
+ }
75
+ // 단일 항목 자체가 임계 초과면 더 줄일 수 없음 — 그래도 truncated로 표기(요약 필요 신호).
76
+ if (slice.length >= 1 && JSON.stringify(slice).length > opts.maxBytes) {
77
+ truncated = true;
78
+ }
79
+ const consumed = start + slice.length;
80
+ const hasMore = consumed < items.length;
81
+ const nextPageNo = truncated ? null : hasMore ? pageNo + 1 : null;
82
+ return {
83
+ items: slice,
84
+ meta: {
85
+ pageNo,
86
+ pageSize,
87
+ returnedRows: slice.length,
88
+ hasMore,
89
+ nextPageNo,
90
+ // 가드로 잘렸으면 현재 pageSize로는 다음 페이지가 안전하지 않으므로(=항목 건너뛰기
91
+ // 손실), 이번에 들어간 건수를 회복용 pageSize로 제안한다.
92
+ ...(truncated ? { truncated: true, suggestedPageSize: Math.max(1, slice.length) } : {}),
93
+ },
94
+ };
95
+ }
96
+ //# sourceMappingURL=_response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_response.js","sourceRoot":"","sources":["../../src/tools/_response.ts"],"names":[],"mappings":"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"}