ncloud-mcp-server 1.1.0 → 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/dist/index.js +1 -1
- package/dist/tools/cloud-insight-integration.js +50 -30
- package/dist/tools/cloud-insight-integration.js.map +1 -1
- package/dist/tools/cloud-insight-plugin.js +257 -320
- package/dist/tools/cloud-insight-plugin.js.map +1 -1
- package/dist/tools/log-analytics.js +107 -100
- package/dist/tools/log-analytics.js.map +1 -1
- package/dist/tools/registry.js +2 -2
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/security-monitoring.js +112 -122
- package/dist/tools/security-monitoring.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,178 +1,168 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { toolText } from "./_response.js";
|
|
3
|
+
// Security Monitoring (NCP) API
|
|
4
|
+
// Base host: https://securitymonitoring.apigw.ntruss.com (registry에서 주입)
|
|
5
|
+
// VPC prefix /vsecuritymonitoring/v1/ , 모든 엔드포인트 POST(JSON body).
|
|
6
|
+
// 공통 필수: startDateTime/endDateTime(epoch ms), page, countPerPage.
|
|
7
|
+
// 공식 docs: security-securitymonitoring-*
|
|
8
|
+
const PREFIX = "/vsecuritymonitoring/v1";
|
|
9
|
+
// 목록 공통 파라미터(시간·페이지·공통 필터)
|
|
10
|
+
const listBase = {
|
|
11
|
+
startDateTime: z.number().describe("Search start time in Unix epoch milliseconds"),
|
|
12
|
+
endDateTime: z.number().describe("Search end time in Unix epoch milliseconds"),
|
|
13
|
+
page: z.number().optional().default(1).describe("Page number (>= 1, default 1)"),
|
|
14
|
+
countPerPage: z.number().optional().default(50).describe("Items per page (>= 1, default 50)"),
|
|
15
|
+
order: z.string().optional().describe("Sort order"),
|
|
16
|
+
regionCode: z.string().optional().describe("Region code"),
|
|
17
|
+
zoneName: z.string().optional().describe("Zone name"),
|
|
18
|
+
};
|
|
19
|
+
function buildListBody(p) {
|
|
20
|
+
const body = {
|
|
21
|
+
startDateTime: p.startDateTime,
|
|
22
|
+
endDateTime: p.endDateTime,
|
|
23
|
+
page: p.page ?? 1,
|
|
24
|
+
countPerPage: p.countPerPage ?? 50,
|
|
25
|
+
};
|
|
26
|
+
if (p.order !== undefined)
|
|
27
|
+
body.order = p.order;
|
|
28
|
+
if (p.regionCode !== undefined)
|
|
29
|
+
body.regionCode = p.regionCode;
|
|
30
|
+
if (p.zoneName !== undefined)
|
|
31
|
+
body.zoneName = p.zoneName;
|
|
32
|
+
return body;
|
|
33
|
+
}
|
|
3
34
|
export function registerSecurityMonitoringTools(server, client) {
|
|
4
|
-
//
|
|
5
|
-
server.tool("
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
regionCode: z.string().optional().describe("Region code (KR, JPN, SGN, etc.)"),
|
|
11
|
-
pageNo: z.number().optional().describe("Page number (default 1)"),
|
|
12
|
-
pageSize: z.number().optional().describe("Page size (default 50)"),
|
|
35
|
+
// ncloud_list_av_events — Anti-Virus detection events
|
|
36
|
+
server.tool("ncloud_list_av_events", "List Anti-Virus malware detection events from Security Monitoring. Only for users subscribed to the Security Monitoring service.", {
|
|
37
|
+
...listBase,
|
|
38
|
+
infectedServerIp: z.string().optional().describe("Filter by infected server IP"),
|
|
39
|
+
detectionPath: z.string().optional().describe("Filter by detection path"),
|
|
40
|
+
malwareType: z.string().optional().describe("Filter by malware type"),
|
|
13
41
|
}, async (params) => {
|
|
14
42
|
try {
|
|
15
|
-
const
|
|
16
|
-
if (params.
|
|
17
|
-
|
|
18
|
-
if (params.
|
|
19
|
-
|
|
20
|
-
if (params.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
apiParams.eventTypeCode = params.eventTypeCode;
|
|
24
|
-
if (params.regionCode !== undefined)
|
|
25
|
-
apiParams.regionCode = params.regionCode;
|
|
26
|
-
if (params.pageNo !== undefined)
|
|
27
|
-
apiParams.pageNo = params.pageNo;
|
|
28
|
-
if (params.pageSize !== undefined)
|
|
29
|
-
apiParams.pageSize = params.pageSize;
|
|
30
|
-
const result = await client.request("/vsecuritymonitoring/v1/getSecurityEventList", apiParams);
|
|
43
|
+
const body = buildListBody(params);
|
|
44
|
+
if (params.infectedServerIp !== undefined)
|
|
45
|
+
body.infectedServerIp = params.infectedServerIp;
|
|
46
|
+
if (params.detectionPath !== undefined)
|
|
47
|
+
body.detectionPath = params.detectionPath;
|
|
48
|
+
if (params.malwareType !== undefined)
|
|
49
|
+
body.malwareType = params.malwareType;
|
|
50
|
+
const result = await client.postRequest(`${PREFIX}/getAVList`, body);
|
|
31
51
|
return toolText(result);
|
|
32
52
|
}
|
|
33
53
|
catch (error) {
|
|
34
54
|
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
35
55
|
}
|
|
36
56
|
});
|
|
37
|
-
//
|
|
38
|
-
server.tool("
|
|
39
|
-
|
|
40
|
-
|
|
57
|
+
// ncloud_list_ids_events — IDS detection events
|
|
58
|
+
server.tool("ncloud_list_ids_events", "List IDS intrusion detection events from Security Monitoring. Only for users subscribed to the Security Monitoring service.", {
|
|
59
|
+
...listBase,
|
|
60
|
+
attackType: z.string().optional().describe("Filter by attack type"),
|
|
61
|
+
attackIp: z.string().optional().describe("Filter by attack source IP"),
|
|
62
|
+
targetIp: z.string().optional().describe("Filter by target IP"),
|
|
41
63
|
}, async (params) => {
|
|
42
64
|
try {
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if (params.
|
|
47
|
-
|
|
48
|
-
|
|
65
|
+
const body = buildListBody(params);
|
|
66
|
+
if (params.attackType !== undefined)
|
|
67
|
+
body.attackType = params.attackType;
|
|
68
|
+
if (params.attackIp !== undefined)
|
|
69
|
+
body.attackIp = params.attackIp;
|
|
70
|
+
if (params.targetIp !== undefined)
|
|
71
|
+
body.targetIp = params.targetIp;
|
|
72
|
+
const result = await client.postRequest(`${PREFIX}/getIDSList`, body);
|
|
49
73
|
return toolText(result);
|
|
50
74
|
}
|
|
51
75
|
catch (error) {
|
|
52
76
|
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
53
77
|
}
|
|
54
78
|
});
|
|
55
|
-
//
|
|
56
|
-
server.tool("
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
pageNo: z.number().optional().describe("Page number (default 1)"),
|
|
63
|
-
pageSize: z.number().optional().describe("Page size (default 50)"),
|
|
79
|
+
// ncloud_list_ips_events — IPS prevention events
|
|
80
|
+
server.tool("ncloud_list_ips_events", "List IPS intrusion prevention events from Security Monitoring. Only for users subscribed to the Security Monitoring service.", {
|
|
81
|
+
...listBase,
|
|
82
|
+
eventNm: z.string().optional().describe("Filter by event name"),
|
|
83
|
+
attackIp: z.string().optional().describe("Filter by attack source IP"),
|
|
84
|
+
targetIp: z.string().optional().describe("Filter by target IP"),
|
|
85
|
+
protocol: z.string().optional().describe("Filter by protocol (VPC only)"),
|
|
64
86
|
}, async (params) => {
|
|
65
87
|
try {
|
|
66
|
-
const
|
|
67
|
-
if (params.
|
|
68
|
-
|
|
69
|
-
if (params.
|
|
70
|
-
|
|
71
|
-
if (params.
|
|
72
|
-
|
|
73
|
-
if (params.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
apiParams.regionCode = params.regionCode;
|
|
77
|
-
if (params.pageNo !== undefined)
|
|
78
|
-
apiParams.pageNo = params.pageNo;
|
|
79
|
-
if (params.pageSize !== undefined)
|
|
80
|
-
apiParams.pageSize = params.pageSize;
|
|
81
|
-
const result = await client.request("/vsecuritymonitoring/v1/getIdsEventList", apiParams);
|
|
88
|
+
const body = buildListBody(params);
|
|
89
|
+
if (params.eventNm !== undefined)
|
|
90
|
+
body.eventNm = params.eventNm;
|
|
91
|
+
if (params.attackIp !== undefined)
|
|
92
|
+
body.attackIp = params.attackIp;
|
|
93
|
+
if (params.targetIp !== undefined)
|
|
94
|
+
body.targetIp = params.targetIp;
|
|
95
|
+
if (params.protocol !== undefined)
|
|
96
|
+
body.protocol = params.protocol;
|
|
97
|
+
const result = await client.postRequest(`${PREFIX}/getIPSList`, body);
|
|
82
98
|
return toolText(result);
|
|
83
99
|
}
|
|
84
100
|
catch (error) {
|
|
85
101
|
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
86
102
|
}
|
|
87
103
|
});
|
|
88
|
-
//
|
|
89
|
-
server.tool("
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
pageNo: z.number().optional().describe("Page number (default 1)"),
|
|
96
|
-
pageSize: z.number().optional().describe("Page size (default 50)"),
|
|
104
|
+
// ncloud_list_waf_events — WAF events
|
|
105
|
+
server.tool("ncloud_list_waf_events", "List WAF (Web Application Firewall) security events from Security Monitoring. Only for users subscribed to the Security Monitoring service.", {
|
|
106
|
+
...listBase,
|
|
107
|
+
attackType: z.string().optional().describe("Filter by attack type"),
|
|
108
|
+
eventNm: z.string().optional().describe("Filter by event name"),
|
|
109
|
+
attackIp: z.string().optional().describe("Filter by attack source IP"),
|
|
110
|
+
targetIp: z.string().optional().describe("Filter by target IP"),
|
|
97
111
|
}, async (params) => {
|
|
98
112
|
try {
|
|
99
|
-
const
|
|
100
|
-
if (params.
|
|
101
|
-
|
|
102
|
-
if (params.
|
|
103
|
-
|
|
104
|
-
if (params.
|
|
105
|
-
|
|
106
|
-
if (params.
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
apiParams.regionCode = params.regionCode;
|
|
110
|
-
if (params.pageNo !== undefined)
|
|
111
|
-
apiParams.pageNo = params.pageNo;
|
|
112
|
-
if (params.pageSize !== undefined)
|
|
113
|
-
apiParams.pageSize = params.pageSize;
|
|
114
|
-
const result = await client.request("/vsecuritymonitoring/v1/getAntiVirusEventList", apiParams);
|
|
113
|
+
const body = buildListBody(params);
|
|
114
|
+
if (params.attackType !== undefined)
|
|
115
|
+
body.attackType = params.attackType;
|
|
116
|
+
if (params.eventNm !== undefined)
|
|
117
|
+
body.eventNm = params.eventNm;
|
|
118
|
+
if (params.attackIp !== undefined)
|
|
119
|
+
body.attackIp = params.attackIp;
|
|
120
|
+
if (params.targetIp !== undefined)
|
|
121
|
+
body.targetIp = params.targetIp;
|
|
122
|
+
const result = await client.postRequest(`${PREFIX}/getWAFList`, body);
|
|
115
123
|
return toolText(result);
|
|
116
124
|
}
|
|
117
125
|
catch (error) {
|
|
118
126
|
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
119
127
|
}
|
|
120
128
|
});
|
|
121
|
-
// ncloud_list_ddos_events —
|
|
122
|
-
server.tool("ncloud_list_ddos_events", "List Anti-DDoS security events
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
pageSize: z.number().optional().describe("Page size (default 50)"),
|
|
129
|
+
// ncloud_list_ddos_events — Anti-DDoS events
|
|
130
|
+
server.tool("ncloud_list_ddos_events", "List Anti-DDoS security events from Security Monitoring. Only for users subscribed to the Security Monitoring service.", {
|
|
131
|
+
...listBase,
|
|
132
|
+
attackIp: z.string().optional().describe("Filter by attack source IP"),
|
|
133
|
+
targetIp: z.string().optional().describe("Filter by target IP"),
|
|
127
134
|
}, async (params) => {
|
|
128
135
|
try {
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
if (params.pageSize !== undefined)
|
|
136
|
-
apiParams.pageSize = params.pageSize;
|
|
137
|
-
const result = await client.request("/vsecuritymonitoring/v1/getDDoSList", apiParams);
|
|
136
|
+
const body = buildListBody(params);
|
|
137
|
+
if (params.attackIp !== undefined)
|
|
138
|
+
body.attackIp = params.attackIp;
|
|
139
|
+
if (params.targetIp !== undefined)
|
|
140
|
+
body.targetIp = params.targetIp;
|
|
141
|
+
const result = await client.postRequest(`${PREFIX}/getDDoSList`, body);
|
|
138
142
|
return toolText(result);
|
|
139
143
|
}
|
|
140
144
|
catch (error) {
|
|
141
145
|
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
142
146
|
}
|
|
143
147
|
});
|
|
144
|
-
// ncloud_get_ddos_event_detail —
|
|
145
|
-
server.tool("ncloud_get_ddos_event_detail", "Get detailed information about a specific Anti-DDoS security event.
|
|
146
|
-
|
|
148
|
+
// ncloud_get_ddos_event_detail — Anti-DDoS event detail
|
|
149
|
+
server.tool("ncloud_get_ddos_event_detail", "Get detailed information about a specific Anti-DDoS security event. Only for users subscribed to the Security Monitoring service.", {
|
|
150
|
+
ticketId: z.string().describe("The DDoS event ticket ID to get details for"),
|
|
147
151
|
}, async (params) => {
|
|
148
152
|
try {
|
|
149
|
-
const
|
|
150
|
-
eventId: params.eventId,
|
|
151
|
-
};
|
|
152
|
-
const result = await client.request("/vsecuritymonitoring/v1/getDDoSEventDetail", apiParams);
|
|
153
|
+
const result = await client.postRequest(`${PREFIX}/getDDoSEventDetail`, { ticketId: params.ticketId });
|
|
153
154
|
return toolText(result);
|
|
154
155
|
}
|
|
155
156
|
catch (error) {
|
|
156
157
|
return { content: [{ type: "text", text: error.message }], isError: true };
|
|
157
158
|
}
|
|
158
159
|
});
|
|
159
|
-
//
|
|
160
|
-
server.tool("
|
|
161
|
-
|
|
162
|
-
endDateTime: z.string().describe("End date/time for event search in ISO 8601 format (e.g., \"2024-01-31T23:59:59Z\")"),
|
|
163
|
-
pageNo: z.number().optional().describe("Page number (default 1)"),
|
|
164
|
-
pageSize: z.number().optional().describe("Page size (default 50)"),
|
|
160
|
+
// ncloud_get_ids_event_detail — IDS event detail
|
|
161
|
+
server.tool("ncloud_get_ids_event_detail", "Get detailed information about a specific IDS intrusion detection event. Only for users subscribed to the Security Monitoring service.", {
|
|
162
|
+
ticketId: z.string().describe("The IDS event ticket ID to get details for"),
|
|
165
163
|
}, async (params) => {
|
|
166
164
|
try {
|
|
167
|
-
const
|
|
168
|
-
startDateTime: params.startDateTime,
|
|
169
|
-
endDateTime: params.endDateTime,
|
|
170
|
-
};
|
|
171
|
-
if (params.pageNo !== undefined)
|
|
172
|
-
apiParams.pageNo = params.pageNo;
|
|
173
|
-
if (params.pageSize !== undefined)
|
|
174
|
-
apiParams.pageSize = params.pageSize;
|
|
175
|
-
const result = await client.request("/vsecuritymonitoring/v1/getWAFList", apiParams);
|
|
165
|
+
const result = await client.postRequest(`${PREFIX}/getIDSEventDetail`, { ticketId: params.ticketId });
|
|
176
166
|
return toolText(result);
|
|
177
167
|
}
|
|
178
168
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security-monitoring.js","sourceRoot":"","sources":["../../src/tools/security-monitoring.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,
|
|
1
|
+
{"version":3,"file":"security-monitoring.js","sourceRoot":"","sources":["../../src/tools/security-monitoring.ts"],"names":[],"mappings":"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"}
|