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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 sjk4425
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,159 @@
1
+ # Ncloud MCP Server
2
+
3
+ [English](./README_EN.md)
4
+
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![Node.js](https://img.shields.io/badge/Node.js-20%2B-green.svg)](https://nodejs.org/)
7
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue.svg)](https://www.typescriptlang.org/)
8
+
9
+ Naver Cloud Platform(Ncloud) 인프라를 AI 어시스턴트에서 직접 관리할 수 있는 [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) 서버입니다.
10
+
11
+ ## 주요 기능
12
+
13
+ Ncloud의 **60개 이상 서비스**, **1,000개 이상 API 도구**를 MCP 프로토콜로 제공합니다.
14
+
15
+ | 카테고리 | 서비스 |
16
+ |---------|--------|
17
+ | **Compute** | Server, Block Storage, Snapshot, Public IP, Init Script, Login Key, Placement Group, Fabric Cluster |
18
+ | **Networking** | VPC, Subnet, ACG, Network ACL, NAT Gateway, Route Table, VPC Peering, Network Interface, Load Balancer, Target Group, Global DNS, Global Traffic Manager |
19
+ | **Database** | Cloud DB for MySQL, PostgreSQL, MSSQL, MongoDB, Redis |
20
+ | **Storage** | Object Storage (S3 호환), NAS, Archive Storage (Swift 호환) |
21
+ | **Containers** | Ncloud Kubernetes Service (NKS), Container Registry |
22
+ | **Monitoring** | Cloud Insight (Dashboard, Event, Rule, Plugin, Schema, Data, Integration) |
23
+ | **DevTools** | SourceCommit, SourceBuild, SourceDeploy, SourcePipeline |
24
+ | **Media** | VOD Station, Live Station, Image Optimizer |
25
+ | **Security** | Certificate Manager, Private CA, KMS, Security Monitoring |
26
+ | **Application** | Cloud Functions, API Gateway, SENS (SMS/Push) |
27
+ | **Analytics** | Search Engine Service, Cloud Hadoop, Cloud Data Streaming Service, Data Catalog, Data Forest, Data Flow, Data Query |
28
+ | **Management** | Sub Account, Activity Tracer, Resource Manager, Log Analytics, Cloud Advisor, Billing |
29
+ | **Content Delivery** | Global Edge |
30
+ | **Auto Scaling** | Launch Configuration, Auto Scaling Group, Scaling Policy |
31
+
32
+ ## 참고 사항
33
+
34
+ - 이 MCP 서버는 **Ncloud 민간존(Public)** 기준으로 구현되었습니다. 금융존/공공존 환경에서는 API 엔드포인트가 다를 수 있습니다.
35
+ - API 스펙은 [Ncloud API 공식 문서](https://api.ncloud-docs.com/docs/home)를 기반으로 작성되었습니다.
36
+ - 한국(KR) 리전 위주로 테스트되었습니다. 다른 리전에서는 일부 API의 동작이 다를 수 있습니다.
37
+
38
+ ## 사전 요구사항
39
+
40
+ - Node.js 20 이상
41
+ - Ncloud API 인증키 ([포털에서 발급](https://www.ncloud.com/mypage/manage/authkey))
42
+
43
+ ## 설치
44
+
45
+ ```bash
46
+ # 저장소 클론
47
+ git clone https://github.com/sjk4425/ncloud-mcp-server.git
48
+ cd ncloud-mcp-server
49
+
50
+ # 의존성 설치 및 빌드
51
+ npm install
52
+ npm run build
53
+ ```
54
+
55
+ ## 환경 변수
56
+
57
+ | 변수 | 필수 | 설명 | 기본값 |
58
+ |------|------|------|--------|
59
+ | `NCLOUD_ACCESS_KEY` | ✅ | Ncloud API Access Key | - |
60
+ | `NCLOUD_SECRET_KEY` | ✅ | Ncloud API Secret Key | - |
61
+ | `NCLOUD_REGION` | - | 리전 코드 | `KR` |
62
+ | `NCLOUD_API_URL` | - | API 기본 URL | `https://ncloud.apigw.ntruss.com` |
63
+ | `NCLOUD_ARCHIVE_PROJECT_ID` | - | Archive Storage 프로젝트 ID | - |
64
+ | `NCLOUD_ARCHIVE_DOMAIN_ID` | - | Archive Storage 도메인 ID | - |
65
+
66
+ ## MCP 클라이언트 설정
67
+
68
+ ### Kiro / Claude Desktop / Cursor
69
+
70
+ `mcp.json` (또는 해당 클라이언트의 MCP 설정 파일)에 추가:
71
+
72
+ ```json
73
+ {
74
+ "mcpServers": {
75
+ "ncloud": {
76
+ "command": "node",
77
+ "args": ["path/to/ncloud-mcp-server/dist/index.js"],
78
+ "env": {
79
+ "NCLOUD_ACCESS_KEY": "your-access-key",
80
+ "NCLOUD_SECRET_KEY": "your-secret-key",
81
+ "NCLOUD_REGION": "KR"
82
+ }
83
+ }
84
+ }
85
+ }
86
+ ```
87
+
88
+ ## 사용 예시
89
+
90
+ MCP 클라이언트에서 자연어로 Ncloud 인프라를 관리할 수 있습니다:
91
+
92
+ ```
93
+ "현재 서버 목록을 보여줘"
94
+ "KR-2 존에 Ubuntu 서버를 하나 만들어줘"
95
+ "my-vpc의 서브넷 목록을 조회해줘"
96
+ "Cloud DB for MySQL 인스턴스 상태를 확인해줘"
97
+ "Object Storage에 새 버킷을 만들어줘"
98
+ "로드밸런서에 연결된 타겟 그룹을 확인해줘"
99
+ "Cloud Insight에서 CPU 사용률 상위 서버를 조회해줘"
100
+ ```
101
+
102
+ ## 지원 리전
103
+
104
+ | 리전 | 코드 |
105
+ |------|------|
106
+ | 한국 | `KR` |
107
+ | 일본 | `JPN` |
108
+ | 싱가포르 | `SGN` |
109
+ | 미국 서부 | `USWN` |
110
+ | 독일 | `DEN` |
111
+
112
+ ## 프로젝트 구조
113
+
114
+ ```
115
+ ncloud-mcp-server/
116
+ ├── src/
117
+ │ ├── index.ts # MCP 서버 엔트리포인트 (stdio transport)
118
+ │ ├── auth/
119
+ │ │ └── signature.ts # HMAC-SHA256 서명 생성
120
+ │ ├── client/
121
+ │ │ ├── ncloud-client.ts # Ncloud API HTTP 클라이언트
122
+ │ │ ├── s3-compatible-client.ts # Object Storage (S3 호환)
123
+ │ │ └── swift-compatible-client.ts # Archive Storage (Swift 호환)
124
+ │ └── tools/ # 서비스별 MCP 도구 (63개 파일)
125
+ │ ├── compute-server.ts
126
+ │ ├── vpc.ts
127
+ │ ├── cloud-insight.ts
128
+ │ └── ...
129
+ ├── package.json
130
+ ├── tsconfig.json
131
+ ├── LICENSE
132
+ └── README.md
133
+ ```
134
+
135
+ ## 개발
136
+
137
+ ```bash
138
+ # 빌드
139
+ npm run build
140
+
141
+ # 테스트
142
+ npm test
143
+
144
+ # 타입 체크
145
+ npx tsc --noEmit
146
+ ```
147
+
148
+ ## 기여
149
+
150
+ 이슈와 PR을 환영합니다. 기여 시 다음을 참고해주세요:
151
+
152
+ 1. Fork 후 feature 브랜치에서 작업
153
+ 2. `npm run build`로 빌드 확인
154
+ 3. `npm test`로 테스트 통과 확인
155
+ 4. PR 제출
156
+
157
+ ## 라이선스
158
+
159
+ [MIT](./LICENSE)
package/README_EN.md ADDED
@@ -0,0 +1,159 @@
1
+ # Ncloud MCP Server
2
+
3
+ [한국어](./README.md)
4
+
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![Node.js](https://img.shields.io/badge/Node.js-20%2B-green.svg)](https://nodejs.org/)
7
+ [![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue.svg)](https://www.typescriptlang.org/)
8
+
9
+ A [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server for managing Naver Cloud Platform (Ncloud) infrastructure directly from AI assistants.
10
+
11
+ ## Features
12
+
13
+ Provides **1,000+ API tools** across **60+ Ncloud services** via MCP protocol.
14
+
15
+ | Category | Services |
16
+ |----------|----------|
17
+ | **Compute** | Server, Block Storage, Snapshot, Public IP, Init Script, Login Key, Placement Group, Fabric Cluster |
18
+ | **Networking** | VPC, Subnet, ACG, Network ACL, NAT Gateway, Route Table, VPC Peering, Network Interface, Load Balancer, Target Group, Global DNS, Global Traffic Manager |
19
+ | **Database** | Cloud DB for MySQL, PostgreSQL, MSSQL, MongoDB, Redis |
20
+ | **Storage** | Object Storage (S3-compatible), NAS, Archive Storage (Swift-compatible) |
21
+ | **Containers** | Ncloud Kubernetes Service (NKS), Container Registry |
22
+ | **Monitoring** | Cloud Insight (Dashboard, Event, Rule, Plugin, Schema, Data, Integration) |
23
+ | **DevTools** | SourceCommit, SourceBuild, SourceDeploy, SourcePipeline |
24
+ | **Media** | VOD Station, Live Station, Image Optimizer |
25
+ | **Security** | Certificate Manager, Private CA, KMS, Security Monitoring |
26
+ | **Application** | Cloud Functions, API Gateway, SENS (SMS/Push) |
27
+ | **Analytics** | Search Engine Service, Cloud Hadoop, Cloud Data Streaming Service, Data Catalog, Data Forest, Data Flow, Data Query |
28
+ | **Management** | Sub Account, Activity Tracer, Resource Manager, Log Analytics, Cloud Advisor, Billing |
29
+ | **Content Delivery** | Global Edge |
30
+ | **Auto Scaling** | Launch Configuration, Auto Scaling Group, Scaling Policy |
31
+
32
+ ## Notes
33
+
34
+ - This MCP server is built for the **Ncloud Public (민간존)** environment. API endpoints may differ for Financial or Government zones.
35
+ - API specifications are based on the [Ncloud Official API Documentation](https://api.ncloud-docs.com/docs/home).
36
+ - Primarily tested in the Korea (KR) region. Some APIs may behave differently in other regions.
37
+
38
+ ## Prerequisites
39
+
40
+ - Node.js 20+
41
+ - Ncloud API credentials ([Get from portal](https://www.ncloud.com/mypage/manage/authkey))
42
+
43
+ ## Installation
44
+
45
+ ```bash
46
+ # Clone the repository
47
+ git clone https://github.com/sjk4425/ncloud-mcp-server.git
48
+ cd ncloud-mcp-server
49
+
50
+ # Install dependencies and build
51
+ npm install
52
+ npm run build
53
+ ```
54
+
55
+ ## Environment Variables
56
+
57
+ | Variable | Required | Description | Default |
58
+ |----------|----------|-------------|---------|
59
+ | `NCLOUD_ACCESS_KEY` | ✅ | Ncloud API Access Key | - |
60
+ | `NCLOUD_SECRET_KEY` | ✅ | Ncloud API Secret Key | - |
61
+ | `NCLOUD_REGION` | - | Region code | `KR` |
62
+ | `NCLOUD_API_URL` | - | API base URL | `https://ncloud.apigw.ntruss.com` |
63
+ | `NCLOUD_ARCHIVE_PROJECT_ID` | - | Archive Storage project ID | - |
64
+ | `NCLOUD_ARCHIVE_DOMAIN_ID` | - | Archive Storage domain ID | - |
65
+
66
+ ## MCP Client Configuration
67
+
68
+ ### Kiro / Claude Desktop / Cursor
69
+
70
+ Add to your `mcp.json` (or equivalent MCP config file):
71
+
72
+ ```json
73
+ {
74
+ "mcpServers": {
75
+ "ncloud": {
76
+ "command": "node",
77
+ "args": ["path/to/ncloud-mcp-server/dist/index.js"],
78
+ "env": {
79
+ "NCLOUD_ACCESS_KEY": "your-access-key",
80
+ "NCLOUD_SECRET_KEY": "your-secret-key",
81
+ "NCLOUD_REGION": "KR"
82
+ }
83
+ }
84
+ }
85
+ }
86
+ ```
87
+
88
+ ## Usage Examples
89
+
90
+ Manage Ncloud infrastructure using natural language through your MCP client:
91
+
92
+ ```
93
+ "List all my servers"
94
+ "Create an Ubuntu server in KR-2 zone"
95
+ "Show subnets in my-vpc"
96
+ "Check Cloud DB for MySQL instance status"
97
+ "Create a new bucket in Object Storage"
98
+ "Show target groups attached to the load balancer"
99
+ "Query top CPU usage servers from Cloud Insight"
100
+ ```
101
+
102
+ ## Supported Regions
103
+
104
+ | Region | Code |
105
+ |--------|------|
106
+ | Korea | `KR` |
107
+ | Japan | `JPN` |
108
+ | Singapore | `SGN` |
109
+ | US West | `USWN` |
110
+ | Germany | `DEN` |
111
+
112
+ ## Project Structure
113
+
114
+ ```
115
+ ncloud-mcp-server/
116
+ ├── src/
117
+ │ ├── index.ts # MCP server entry point (stdio transport)
118
+ │ ├── auth/
119
+ │ │ └── signature.ts # HMAC-SHA256 signature generation
120
+ │ ├── client/
121
+ │ │ ├── ncloud-client.ts # Ncloud API HTTP client
122
+ │ │ ├── s3-compatible-client.ts # Object Storage (S3-compatible)
123
+ │ │ └── swift-compatible-client.ts # Archive Storage (Swift-compatible)
124
+ │ └── tools/ # Service-specific MCP tools (63 files)
125
+ │ ├── compute-server.ts
126
+ │ ├── vpc.ts
127
+ │ ├── cloud-insight.ts
128
+ │ └── ...
129
+ ├── package.json
130
+ ├── tsconfig.json
131
+ ├── LICENSE
132
+ └── README.md
133
+ ```
134
+
135
+ ## Development
136
+
137
+ ```bash
138
+ # Build
139
+ npm run build
140
+
141
+ # Test
142
+ npm test
143
+
144
+ # Type check
145
+ npx tsc --noEmit
146
+ ```
147
+
148
+ ## Contributing
149
+
150
+ Issues and PRs are welcome. When contributing:
151
+
152
+ 1. Fork and work on a feature branch
153
+ 2. Verify build with `npm run build`
154
+ 3. Ensure tests pass with `npm test`
155
+ 4. Submit a PR
156
+
157
+ ## License
158
+
159
+ [MIT](./LICENSE)
@@ -0,0 +1,16 @@
1
+ export interface SignatureInput {
2
+ method: string;
3
+ url: string;
4
+ timestamp: string;
5
+ accessKey: string;
6
+ secretKey: string;
7
+ }
8
+ /**
9
+ * Creates the signing message in the format:
10
+ * "{METHOD} {URL}\n{TIMESTAMP}\n{ACCESS_KEY}"
11
+ */
12
+ export declare function makeSignatureMessage(input: Omit<SignatureInput, "secretKey">): string;
13
+ /**
14
+ * Generates HMAC-SHA256 signature encoded in Base64.
15
+ */
16
+ export declare function generateSignature(input: SignatureInput): string;
@@ -0,0 +1,18 @@
1
+ import crypto from "node:crypto";
2
+ /**
3
+ * Creates the signing message in the format:
4
+ * "{METHOD} {URL}\n{TIMESTAMP}\n{ACCESS_KEY}"
5
+ */
6
+ export function makeSignatureMessage(input) {
7
+ return `${input.method} ${input.url}\n${input.timestamp}\n${input.accessKey}`;
8
+ }
9
+ /**
10
+ * Generates HMAC-SHA256 signature encoded in Base64.
11
+ */
12
+ export function generateSignature(input) {
13
+ const message = makeSignatureMessage(input);
14
+ const hmac = crypto.createHmac("sha256", input.secretKey);
15
+ hmac.update(message);
16
+ return hmac.digest("base64");
17
+ }
18
+ //# sourceMappingURL=signature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.js","sourceRoot":"","sources":["../../src/auth/signature.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAUjC;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAwC;IAExC,OAAO,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;AAChF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAqB;IACrD,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,90 @@
1
+ import { describe, test, expect } from "vitest";
2
+ import fc from "fast-check";
3
+ import crypto from "node:crypto";
4
+ import { makeSignatureMessage, generateSignature } from "./signature.js";
5
+ describe("Feature: ncloud-mcp-server, Property 1: 서명 메시지 포맷 일관성", () => {
6
+ test("makeSignatureMessage produces correct format for any valid inputs", () => {
7
+ const methodArb = fc.constantFrom("GET", "POST");
8
+ const pathArb = fc.stringMatching(/^\/[a-z0-9/]+$/);
9
+ const queryArb = fc.stringMatching(/^[a-zA-Z0-9=&_]+$/).map((q) => `?${q}`);
10
+ const urlArb = fc.tuple(pathArb, fc.oneof(fc.constant(""), queryArb)).map(([p, q]) => p + q);
11
+ const timestampArb = fc
12
+ .integer({ min: 1000000000000, max: 9999999999999 })
13
+ .map(String);
14
+ const accessKeyArb = fc.stringMatching(/^[A-Za-z0-9]{10,30}$/);
15
+ fc.assert(fc.property(methodArb, urlArb, timestampArb, accessKeyArb, (method, url, timestamp, accessKey) => {
16
+ const message = makeSignatureMessage({ method, url, timestamp, accessKey });
17
+ const lines = message.split("\n");
18
+ // Must have exactly 3 lines
19
+ expect(lines).toHaveLength(3);
20
+ // First line: "{METHOD} {URL}"
21
+ expect(lines[0]).toBe(`${method} ${url}`);
22
+ // Second line: timestamp
23
+ expect(lines[1]).toBe(timestamp);
24
+ // Third line: access key
25
+ expect(lines[2]).toBe(accessKey);
26
+ // URL with query string must be included in the message
27
+ if (url.includes("?")) {
28
+ expect(message).toContain(url);
29
+ }
30
+ }), { numRuns: 100 });
31
+ });
32
+ });
33
+ describe("Feature: ncloud-mcp-server, Property 2: 서명 생성 멱등성 및 유효성", () => {
34
+ test("generateSignature is idempotent and produces valid Base64", () => {
35
+ const methodArb = fc.constantFrom("GET", "POST");
36
+ const urlArb = fc.stringMatching(/^\/[a-z0-9/]+(\?[a-zA-Z0-9=&_]+)?$/);
37
+ const timestampArb = fc
38
+ .integer({ min: 1000000000000, max: 9999999999999 })
39
+ .map(String);
40
+ const keyArb = fc.stringMatching(/^[A-Za-z0-9]{10,40}$/);
41
+ fc.assert(fc.property(methodArb, urlArb, timestampArb, keyArb, keyArb, (method, url, timestamp, accessKey, secretKey) => {
42
+ const input = { method, url, timestamp, accessKey, secretKey };
43
+ // Idempotency: same input → same output
44
+ const sig1 = generateSignature(input);
45
+ const sig2 = generateSignature(input);
46
+ expect(sig1).toBe(sig2);
47
+ // Valid Base64: must match Base64 pattern
48
+ expect(sig1).toMatch(/^[A-Za-z0-9+/]+=*$/);
49
+ // Non-empty
50
+ expect(sig1.length).toBeGreaterThan(0);
51
+ }), { numRuns: 100 });
52
+ });
53
+ });
54
+ describe("Unit: 서명 정확성 검증 (알려진 입력/출력 쌍)", () => {
55
+ const knownInput = {
56
+ method: "GET",
57
+ url: "/vserver/v2/getServerInstanceList?responseFormatType=json",
58
+ timestamp: "1234567890123",
59
+ accessKey: "TestAccessKey",
60
+ secretKey: "TestSecretKey",
61
+ };
62
+ test("makeSignatureMessage produces expected message format", () => {
63
+ const message = makeSignatureMessage(knownInput);
64
+ expect(message).toBe("GET /vserver/v2/getServerInstanceList?responseFormatType=json\n1234567890123\nTestAccessKey");
65
+ });
66
+ test("generateSignature produces expected HMAC-SHA256 Base64 value", () => {
67
+ const signature = generateSignature(knownInput);
68
+ // Pre-computed expected value
69
+ expect(signature).toBe("FPsYYX8fuMAgi+cue3eACOW0dNtIwu1LYWfg/megA2M=");
70
+ });
71
+ test("generateSignature matches manual crypto computation", () => {
72
+ const message = `${knownInput.method} ${knownInput.url}\n${knownInput.timestamp}\n${knownInput.accessKey}`;
73
+ const hmac = crypto.createHmac("sha256", knownInput.secretKey);
74
+ hmac.update(message);
75
+ const expected = hmac.digest("base64");
76
+ const actual = generateSignature(knownInput);
77
+ expect(actual).toBe(expected);
78
+ });
79
+ test("different secret keys produce different signatures", () => {
80
+ const sig1 = generateSignature(knownInput);
81
+ const sig2 = generateSignature({ ...knownInput, secretKey: "DifferentKey" });
82
+ expect(sig1).not.toBe(sig2);
83
+ });
84
+ test("POST method produces different signature than GET", () => {
85
+ const sigGet = generateSignature(knownInput);
86
+ const sigPost = generateSignature({ ...knownInput, method: "POST" });
87
+ expect(sigGet).not.toBe(sigPost);
88
+ });
89
+ });
90
+ //# sourceMappingURL=signature.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.test.js","sourceRoot":"","sources":["../../src/auth/signature.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export interface NcloudClientConfig {
2
+ accessKey: string;
3
+ secretKey: string;
4
+ baseUrl: string;
5
+ regionCode?: string;
6
+ }
7
+ export interface NcloudApiParams {
8
+ [key: string]: string | number | boolean | string[] | undefined;
9
+ }
10
+ export declare class NcloudClient {
11
+ private readonly accessKey;
12
+ private readonly secretKey;
13
+ private readonly baseUrl;
14
+ private regionCode;
15
+ constructor(config: NcloudClientConfig);
16
+ setRegionCode(regionCode: string): void;
17
+ getRegionCode(): string;
18
+ serializeListParams(params: NcloudApiParams): Record<string, string>;
19
+ private buildAuthHeaders;
20
+ request(action: string, params?: NcloudApiParams): Promise<any>;
21
+ requestRaw(method: string, path: string, queryParams?: Record<string, string | number | boolean | undefined>, body?: unknown): Promise<any>;
22
+ postRequest(path: string, body: unknown): Promise<any>;
23
+ putRequest(path: string, body: unknown): Promise<any>;
24
+ deleteRequest(path: string, body?: unknown): Promise<any>;
25
+ private unwrapResponse;
26
+ private handleErrorResponse;
27
+ }