ncloud-mcp-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +159 -0
- package/README_EN.md +159 -0
- package/dist/auth/signature.d.ts +16 -0
- package/dist/auth/signature.js +18 -0
- package/dist/auth/signature.js.map +1 -0
- package/dist/auth/signature.test.d.ts +1 -0
- package/dist/auth/signature.test.js +90 -0
- package/dist/auth/signature.test.js.map +1 -0
- package/dist/client/ncloud-client.d.ts +27 -0
- package/dist/client/ncloud-client.js +270 -0
- package/dist/client/ncloud-client.js.map +1 -0
- package/dist/client/ncloud-client.test.d.ts +1 -0
- package/dist/client/ncloud-client.test.js +477 -0
- package/dist/client/ncloud-client.test.js.map +1 -0
- package/dist/client/s3-compatible-client.d.ts +49 -0
- package/dist/client/s3-compatible-client.js +210 -0
- package/dist/client/s3-compatible-client.js.map +1 -0
- package/dist/client/swift-compatible-client.d.ts +68 -0
- package/dist/client/swift-compatible-client.js +173 -0
- package/dist/client/swift-compatible-client.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +362 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/acg.d.ts +3 -0
- package/dist/tools/acg.js +220 -0
- package/dist/tools/acg.js.map +1 -0
- package/dist/tools/activity-tracer.d.ts +3 -0
- package/dist/tools/activity-tracer.js +77 -0
- package/dist/tools/activity-tracer.js.map +1 -0
- package/dist/tools/analytics-cdss.d.ts +3 -0
- package/dist/tools/analytics-cdss.js +618 -0
- package/dist/tools/analytics-cdss.js.map +1 -0
- package/dist/tools/analytics-datacatalog.d.ts +10 -0
- package/dist/tools/analytics-datacatalog.js +409 -0
- package/dist/tools/analytics-datacatalog.js.map +1 -0
- package/dist/tools/analytics-dataflow.d.ts +16 -0
- package/dist/tools/analytics-dataflow.js +478 -0
- package/dist/tools/analytics-dataflow.js.map +1 -0
- package/dist/tools/analytics-dataforest.d.ts +10 -0
- package/dist/tools/analytics-dataforest.js +379 -0
- package/dist/tools/analytics-dataforest.js.map +1 -0
- package/dist/tools/analytics-dataquery.d.ts +16 -0
- package/dist/tools/analytics-dataquery.js +143 -0
- package/dist/tools/analytics-dataquery.js.map +1 -0
- package/dist/tools/analytics-datastream.d.ts +13 -0
- package/dist/tools/analytics-datastream.js +359 -0
- package/dist/tools/analytics-datastream.js.map +1 -0
- package/dist/tools/analytics-hadoop.d.ts +12 -0
- package/dist/tools/analytics-hadoop.js +450 -0
- package/dist/tools/analytics-hadoop.js.map +1 -0
- package/dist/tools/analytics-ses.d.ts +3 -0
- package/dist/tools/analytics-ses.js +653 -0
- package/dist/tools/analytics-ses.js.map +1 -0
- package/dist/tools/api-gateway.d.ts +3 -0
- package/dist/tools/api-gateway.js +202 -0
- package/dist/tools/api-gateway.js.map +1 -0
- package/dist/tools/autoscaling.d.ts +3 -0
- package/dist/tools/autoscaling.js +430 -0
- package/dist/tools/autoscaling.js.map +1 -0
- package/dist/tools/billing.d.ts +14 -0
- package/dist/tools/billing.js +545 -0
- package/dist/tools/billing.js.map +1 -0
- package/dist/tools/certificate-manager.d.ts +18 -0
- package/dist/tools/certificate-manager.js +84 -0
- package/dist/tools/certificate-manager.js.map +1 -0
- package/dist/tools/cloud-advisor.d.ts +3 -0
- package/dist/tools/cloud-advisor.js +202 -0
- package/dist/tools/cloud-advisor.js.map +1 -0
- package/dist/tools/cloud-functions.d.ts +3 -0
- package/dist/tools/cloud-functions.js +497 -0
- package/dist/tools/cloud-functions.js.map +1 -0
- package/dist/tools/cloud-insight-integration.d.ts +3 -0
- package/dist/tools/cloud-insight-integration.js +90 -0
- package/dist/tools/cloud-insight-integration.js.map +1 -0
- package/dist/tools/cloud-insight-plugin.d.ts +3 -0
- package/dist/tools/cloud-insight-plugin.js +600 -0
- package/dist/tools/cloud-insight-plugin.js.map +1 -0
- package/dist/tools/cloud-insight-rule.d.ts +3 -0
- package/dist/tools/cloud-insight-rule.js +570 -0
- package/dist/tools/cloud-insight-rule.js.map +1 -0
- package/dist/tools/cloud-insight.d.ts +3 -0
- package/dist/tools/cloud-insight.js +246 -0
- package/dist/tools/cloud-insight.js.map +1 -0
- package/dist/tools/common.d.ts +3 -0
- package/dist/tools/common.js +120 -0
- package/dist/tools/common.js.map +1 -0
- package/dist/tools/compute-initscript.d.ts +3 -0
- package/dist/tools/compute-initscript.js +62 -0
- package/dist/tools/compute-initscript.js.map +1 -0
- package/dist/tools/compute-loginkey.d.ts +3 -0
- package/dist/tools/compute-loginkey.js +59 -0
- package/dist/tools/compute-loginkey.js.map +1 -0
- package/dist/tools/compute-placement.d.ts +3 -0
- package/dist/tools/compute-placement.js +196 -0
- package/dist/tools/compute-placement.js.map +1 -0
- package/dist/tools/compute-publicip.d.ts +3 -0
- package/dist/tools/compute-publicip.js +97 -0
- package/dist/tools/compute-publicip.js.map +1 -0
- package/dist/tools/compute-server.d.ts +3 -0
- package/dist/tools/compute-server.js +445 -0
- package/dist/tools/compute-server.js.map +1 -0
- package/dist/tools/compute-server.test.d.ts +1 -0
- package/dist/tools/compute-server.test.js +224 -0
- package/dist/tools/compute-server.test.js.map +1 -0
- package/dist/tools/compute-storage.d.ts +3 -0
- package/dist/tools/compute-storage.js +240 -0
- package/dist/tools/compute-storage.js.map +1 -0
- package/dist/tools/containers-nks.d.ts +13 -0
- package/dist/tools/containers-nks.js +576 -0
- package/dist/tools/containers-nks.js.map +1 -0
- package/dist/tools/containers-registry.d.ts +3 -0
- package/dist/tools/containers-registry.js +181 -0
- package/dist/tools/containers-registry.js.map +1 -0
- package/dist/tools/database-cache.d.ts +3 -0
- package/dist/tools/database-cache.js +388 -0
- package/dist/tools/database-cache.js.map +1 -0
- package/dist/tools/database-mongodb.d.ts +3 -0
- package/dist/tools/database-mongodb.js +460 -0
- package/dist/tools/database-mongodb.js.map +1 -0
- package/dist/tools/database-mssql.d.ts +3 -0
- package/dist/tools/database-mssql.js +345 -0
- package/dist/tools/database-mssql.js.map +1 -0
- package/dist/tools/database-mysql.d.ts +3 -0
- package/dist/tools/database-mysql.js +500 -0
- package/dist/tools/database-mysql.js.map +1 -0
- package/dist/tools/database-postgresql.d.ts +3 -0
- package/dist/tools/database-postgresql.js +432 -0
- package/dist/tools/database-postgresql.js.map +1 -0
- package/dist/tools/global-dns.d.ts +3 -0
- package/dist/tools/global-dns.js +207 -0
- package/dist/tools/global-dns.js.map +1 -0
- package/dist/tools/global-edge.d.ts +3 -0
- package/dist/tools/global-edge.js +386 -0
- package/dist/tools/global-edge.js.map +1 -0
- package/dist/tools/global-traffic-manager.d.ts +3 -0
- package/dist/tools/global-traffic-manager.js +497 -0
- package/dist/tools/global-traffic-manager.js.map +1 -0
- package/dist/tools/index.d.ts +63 -0
- package/dist/tools/index.js +64 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/kms.d.ts +8 -0
- package/dist/tools/kms.js +529 -0
- package/dist/tools/kms.js.map +1 -0
- package/dist/tools/loadbalancer.d.ts +3 -0
- package/dist/tools/loadbalancer.js +341 -0
- package/dist/tools/loadbalancer.js.map +1 -0
- package/dist/tools/log-analytics.d.ts +3 -0
- package/dist/tools/log-analytics.js +183 -0
- package/dist/tools/log-analytics.js.map +1 -0
- package/dist/tools/media-imageoptimizer.d.ts +3 -0
- package/dist/tools/media-imageoptimizer.js +187 -0
- package/dist/tools/media-imageoptimizer.js.map +1 -0
- package/dist/tools/media-livestation.d.ts +3 -0
- package/dist/tools/media-livestation.js +252 -0
- package/dist/tools/media-livestation.js.map +1 -0
- package/dist/tools/media-vodstation.d.ts +3 -0
- package/dist/tools/media-vodstation.js +197 -0
- package/dist/tools/media-vodstation.js.map +1 -0
- package/dist/tools/nat-gateway.d.ts +3 -0
- package/dist/tools/nat-gateway.js +91 -0
- package/dist/tools/nat-gateway.js.map +1 -0
- package/dist/tools/network-acl.d.ts +3 -0
- package/dist/tools/network-acl.js +322 -0
- package/dist/tools/network-acl.js.map +1 -0
- package/dist/tools/network-interface.d.ts +3 -0
- package/dist/tools/network-interface.js +193 -0
- package/dist/tools/network-interface.js.map +1 -0
- package/dist/tools/private-ca.d.ts +8 -0
- package/dist/tools/private-ca.js +368 -0
- package/dist/tools/private-ca.js.map +1 -0
- package/dist/tools/resource-manager.d.ts +3 -0
- package/dist/tools/resource-manager.js +151 -0
- package/dist/tools/resource-manager.js.map +1 -0
- package/dist/tools/route-table.d.ts +3 -0
- package/dist/tools/route-table.js +205 -0
- package/dist/tools/route-table.js.map +1 -0
- package/dist/tools/security-monitoring.d.ts +3 -0
- package/dist/tools/security-monitoring.js +182 -0
- package/dist/tools/security-monitoring.js.map +1 -0
- package/dist/tools/sens.d.ts +3 -0
- package/dist/tools/sens.js +240 -0
- package/dist/tools/sens.js.map +1 -0
- package/dist/tools/sourcebuild.d.ts +3 -0
- package/dist/tools/sourcebuild.js +481 -0
- package/dist/tools/sourcebuild.js.map +1 -0
- package/dist/tools/sourcecommit.d.ts +13 -0
- package/dist/tools/sourcecommit.js +228 -0
- package/dist/tools/sourcecommit.js.map +1 -0
- package/dist/tools/sourcedeploy.d.ts +3 -0
- package/dist/tools/sourcedeploy.js +448 -0
- package/dist/tools/sourcedeploy.js.map +1 -0
- package/dist/tools/sourcepipeline.d.ts +12 -0
- package/dist/tools/sourcepipeline.js +357 -0
- package/dist/tools/sourcepipeline.js.map +1 -0
- package/dist/tools/storage-archive.d.ts +3 -0
- package/dist/tools/storage-archive.js +337 -0
- package/dist/tools/storage-archive.js.map +1 -0
- package/dist/tools/storage-nas.d.ts +3 -0
- package/dist/tools/storage-nas.js +288 -0
- package/dist/tools/storage-nas.js.map +1 -0
- package/dist/tools/storage-ncloud.d.ts +3 -0
- package/dist/tools/storage-ncloud.js +864 -0
- package/dist/tools/storage-ncloud.js.map +1 -0
- package/dist/tools/storage-object.d.ts +3 -0
- package/dist/tools/storage-object.js +982 -0
- package/dist/tools/storage-object.js.map +1 -0
- package/dist/tools/sub-account.d.ts +3 -0
- package/dist/tools/sub-account.js +311 -0
- package/dist/tools/sub-account.js.map +1 -0
- package/dist/tools/target-group.d.ts +3 -0
- package/dist/tools/target-group.js +207 -0
- package/dist/tools/target-group.js.map +1 -0
- package/dist/tools/vpc-peering.d.ts +3 -0
- package/dist/tools/vpc-peering.js +109 -0
- package/dist/tools/vpc-peering.js.map +1 -0
- package/dist/tools/vpc.d.ts +3 -0
- package/dist/tools/vpc.js +194 -0
- package/dist/tools/vpc.js.map +1 -0
- package/package.json +53 -0
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
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
[](https://nodejs.org/)
|
|
7
|
+
[](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
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
[](https://nodejs.org/)
|
|
7
|
+
[](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
|
+
}
|