ncloud-mcp-server 1.0.4 → 1.1.1
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/README.md +18 -2
- package/README_EN.md +18 -2
- package/dist/index.js +12 -331
- package/dist/index.js.map +1 -1
- package/dist/tools/_response.d.ts +69 -0
- package/dist/tools/_response.js +96 -0
- package/dist/tools/_response.js.map +1 -0
- package/dist/tools/acg.js +10 -9
- package/dist/tools/acg.js.map +1 -1
- package/dist/tools/activity-tracer.js +4 -3
- package/dist/tools/activity-tracer.js.map +1 -1
- package/dist/tools/analytics-cdss.js +51 -50
- package/dist/tools/analytics-cdss.js.map +1 -1
- package/dist/tools/analytics-datacatalog.js +22 -21
- package/dist/tools/analytics-datacatalog.js.map +1 -1
- package/dist/tools/analytics-dataflow.js +27 -26
- package/dist/tools/analytics-dataflow.js.map +1 -1
- package/dist/tools/analytics-dataforest.js +25 -24
- package/dist/tools/analytics-dataforest.js.map +1 -1
- package/dist/tools/analytics-dataquery.js +6 -5
- package/dist/tools/analytics-dataquery.js.map +1 -1
- package/dist/tools/analytics-datastream.js +22 -21
- package/dist/tools/analytics-datastream.js.map +1 -1
- package/dist/tools/analytics-hadoop.js +30 -29
- package/dist/tools/analytics-hadoop.js.map +1 -1
- package/dist/tools/analytics-ses.js +43 -42
- package/dist/tools/analytics-ses.js.map +1 -1
- package/dist/tools/api-gateway.js +13 -12
- package/dist/tools/api-gateway.js.map +1 -1
- package/dist/tools/autoscaling.js +25 -24
- package/dist/tools/autoscaling.js.map +1 -1
- package/dist/tools/billing.d.ts +0 -11
- package/dist/tools/billing.js +210 -48
- package/dist/tools/billing.js.map +1 -1
- package/dist/tools/certificate-manager.js +4 -3
- package/dist/tools/certificate-manager.js.map +1 -1
- package/dist/tools/cloud-advisor.js +16 -15
- package/dist/tools/cloud-advisor.js.map +1 -1
- package/dist/tools/cloud-functions.js +22 -21
- package/dist/tools/cloud-functions.js.map +1 -1
- package/dist/tools/cloud-insight-integration.js +56 -35
- package/dist/tools/cloud-insight-integration.js.map +1 -1
- package/dist/tools/cloud-insight-plugin.js +291 -353
- package/dist/tools/cloud-insight-plugin.js.map +1 -1
- package/dist/tools/cloud-insight-rule.js +28 -27
- package/dist/tools/cloud-insight-rule.js.map +1 -1
- package/dist/tools/cloud-insight.js +12 -11
- package/dist/tools/cloud-insight.js.map +1 -1
- package/dist/tools/common.js +6 -5
- package/dist/tools/common.js.map +1 -1
- package/dist/tools/compute-initscript.js +5 -4
- package/dist/tools/compute-initscript.js.map +1 -1
- package/dist/tools/compute-loginkey.js +5 -4
- package/dist/tools/compute-loginkey.js.map +1 -1
- package/dist/tools/compute-placement.js +14 -13
- package/dist/tools/compute-placement.js.map +1 -1
- package/dist/tools/compute-publicip.js +8 -7
- package/dist/tools/compute-publicip.js.map +1 -1
- package/dist/tools/compute-server.js +29 -28
- package/dist/tools/compute-server.js.map +1 -1
- package/dist/tools/compute-storage.js +16 -15
- package/dist/tools/compute-storage.js.map +1 -1
- package/dist/tools/containers-nks.js +38 -37
- package/dist/tools/containers-nks.js.map +1 -1
- package/dist/tools/containers-registry.js +13 -12
- package/dist/tools/containers-registry.js.map +1 -1
- package/dist/tools/database-cache.js +25 -24
- package/dist/tools/database-cache.js.map +1 -1
- package/dist/tools/database-mongodb.js +25 -24
- package/dist/tools/database-mongodb.js.map +1 -1
- package/dist/tools/database-mssql.js +23 -22
- package/dist/tools/database-mssql.js.map +1 -1
- package/dist/tools/database-mysql.js +30 -29
- package/dist/tools/database-mysql.js.map +1 -1
- package/dist/tools/database-postgresql.js +26 -25
- package/dist/tools/database-postgresql.js.map +1 -1
- package/dist/tools/global-dns.js +13 -12
- package/dist/tools/global-dns.js.map +1 -1
- package/dist/tools/global-edge.js +21 -20
- package/dist/tools/global-edge.js.map +1 -1
- package/dist/tools/global-traffic-manager.js +27 -26
- package/dist/tools/global-traffic-manager.js.map +1 -1
- package/dist/tools/kms.js +52 -39
- package/dist/tools/kms.js.map +1 -1
- package/dist/tools/loadbalancer.js +17 -16
- package/dist/tools/loadbalancer.js.map +1 -1
- package/dist/tools/log-analytics.js +118 -110
- package/dist/tools/log-analytics.js.map +1 -1
- package/dist/tools/media-imageoptimizer.js +10 -9
- package/dist/tools/media-imageoptimizer.js.map +1 -1
- package/dist/tools/media-livestation.js +13 -12
- package/dist/tools/media-livestation.js.map +1 -1
- package/dist/tools/media-vodstation.js +11 -10
- package/dist/tools/media-vodstation.js.map +1 -1
- package/dist/tools/nat-gateway.js +6 -5
- package/dist/tools/nat-gateway.js.map +1 -1
- package/dist/tools/network-acl.js +18 -17
- package/dist/tools/network-acl.js.map +1 -1
- package/dist/tools/network-interface.js +15 -14
- package/dist/tools/network-interface.js.map +1 -1
- package/dist/tools/private-ca.js +32 -23
- package/dist/tools/private-ca.js.map +1 -1
- package/dist/tools/registry.d.ts +49 -0
- package/dist/tools/registry.js +254 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/resource-manager.js +7 -6
- package/dist/tools/resource-manager.js.map +1 -1
- package/dist/tools/route-table.js +12 -11
- package/dist/tools/route-table.js.map +1 -1
- package/dist/tools/security-monitoring.js +120 -129
- package/dist/tools/security-monitoring.js.map +1 -1
- package/dist/tools/sens.js +7 -6
- package/dist/tools/sens.js.map +1 -1
- package/dist/tools/sourcebuild.js +18 -17
- package/dist/tools/sourcebuild.js.map +1 -1
- package/dist/tools/sourcecommit.js +13 -12
- package/dist/tools/sourcecommit.js.map +1 -1
- package/dist/tools/sourcedeploy.js +35 -34
- package/dist/tools/sourcedeploy.js.map +1 -1
- package/dist/tools/sourcepipeline.js +18 -17
- package/dist/tools/sourcepipeline.js.map +1 -1
- package/dist/tools/storage-archive.js +13 -12
- package/dist/tools/storage-archive.js.map +1 -1
- package/dist/tools/storage-nas.js +20 -19
- package/dist/tools/storage-nas.js.map +1 -1
- package/dist/tools/storage-ncloud.js +25 -24
- package/dist/tools/storage-ncloud.js.map +1 -1
- package/dist/tools/storage-object.js +29 -28
- package/dist/tools/storage-object.js.map +1 -1
- package/dist/tools/sub-account.js +19 -18
- package/dist/tools/sub-account.js.map +1 -1
- package/dist/tools/target-group.js +12 -11
- package/dist/tools/target-group.js.map +1 -1
- package/dist/tools/vpc-peering.js +8 -7
- package/dist/tools/vpc-peering.js.map +1 -1
- package/dist/tools/vpc.js +11 -10
- package/dist/tools/vpc.js.map +1 -1
- package/package.json +1 -1
- package/dist/auth/signature.test.d.ts +0 -1
- package/dist/auth/signature.test.js +0 -90
- package/dist/auth/signature.test.js.map +0 -1
- package/dist/client/ncloud-client.test.d.ts +0 -1
- package/dist/client/ncloud-client.test.js +0 -477
- package/dist/client/ncloud-client.test.js.map +0 -1
- package/dist/tools/compute-server.test.d.ts +0 -1
- package/dist/tools/compute-server.test.js +0 -224
- 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 {
|
|
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
|
|
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.
|
|
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.1",
|
|
229
22
|
});
|
|
230
|
-
//
|
|
231
|
-
const
|
|
232
|
-
|
|
233
|
-
|
|
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
|
-
|
|
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
|
|
245
|
-
|
|
246
|
-
|
|
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":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,
|
|
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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"}
|