cloudvault-mcp 1.0.0 → 2.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/README.md +45 -16
- package/dist/adapters/azure.d.ts +44 -0
- package/dist/adapters/azure.d.ts.map +1 -0
- package/dist/adapters/azure.js +393 -0
- package/dist/adapters/azure.js.map +1 -0
- package/dist/adapters/gcp.d.ts +38 -0
- package/dist/adapters/gcp.d.ts.map +1 -0
- package/dist/adapters/gcp.js +364 -0
- package/dist/adapters/gcp.js.map +1 -0
- package/dist/index.js +78 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/providers.d.ts.map +1 -1
- package/dist/lib/providers.js +7 -3
- package/dist/lib/providers.js.map +1 -1
- package/dist/premium/compliance_snapshot.d.ts +23 -0
- package/dist/premium/compliance_snapshot.d.ts.map +1 -0
- package/dist/premium/compliance_snapshot.js +184 -0
- package/dist/premium/compliance_snapshot.js.map +1 -0
- package/dist/premium/cost_anomalies.d.ts +22 -0
- package/dist/premium/cost_anomalies.d.ts.map +1 -0
- package/dist/premium/cost_anomalies.js +108 -0
- package/dist/premium/cost_anomalies.js.map +1 -0
- package/dist/premium/cost_forecast.d.ts +22 -0
- package/dist/premium/cost_forecast.d.ts.map +1 -0
- package/dist/premium/cost_forecast.js +111 -0
- package/dist/premium/cost_forecast.js.map +1 -0
- package/dist/premium/cross_cloud_report.d.ts +42 -0
- package/dist/premium/cross_cloud_report.d.ts.map +1 -0
- package/dist/premium/cross_cloud_report.js +139 -0
- package/dist/premium/cross_cloud_report.js.map +1 -0
- package/dist/premium/idle_resources.d.ts +23 -0
- package/dist/premium/idle_resources.d.ts.map +1 -0
- package/dist/premium/idle_resources.js +88 -0
- package/dist/premium/idle_resources.js.map +1 -0
- package/dist/premium/security_scan.d.ts +24 -0
- package/dist/premium/security_scan.d.ts.map +1 -0
- package/dist/premium/security_scan.js +159 -0
- package/dist/premium/security_scan.js.map +1 -0
- package/dist/tools/cost_current.d.ts +16 -0
- package/dist/tools/cost_current.d.ts.map +1 -0
- package/dist/tools/cost_current.js +78 -0
- package/dist/tools/cost_current.js.map +1 -0
- package/dist/tools/health_dashboard.d.ts +15 -0
- package/dist/tools/health_dashboard.d.ts.map +1 -0
- package/dist/tools/health_dashboard.js +41 -0
- package/dist/tools/health_dashboard.js.map +1 -0
- package/dist/tools/resource_tags.d.ts +18 -0
- package/dist/tools/resource_tags.d.ts.map +1 -0
- package/dist/tools/resource_tags.js +50 -0
- package/dist/tools/resource_tags.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GCP Adapter — implements CloudProvider using native fetch to GCP REST APIs.
|
|
3
|
+
* Auth: GOOGLE_ACCESS_TOKEN env var (direct token for MCP context simplicity).
|
|
4
|
+
*
|
|
5
|
+
* Env vars:
|
|
6
|
+
* GOOGLE_CLOUD_PROJECT — GCP project ID
|
|
7
|
+
* GOOGLE_ACCESS_TOKEN — OAuth2 access token
|
|
8
|
+
*/
|
|
9
|
+
export class GcpAdapter {
|
|
10
|
+
project;
|
|
11
|
+
token;
|
|
12
|
+
constructor() {
|
|
13
|
+
if (!process.env.GOOGLE_CLOUD_PROJECT) {
|
|
14
|
+
throw new Error('GOOGLE_CLOUD_PROJECT environment variable required');
|
|
15
|
+
}
|
|
16
|
+
if (!process.env.GOOGLE_ACCESS_TOKEN) {
|
|
17
|
+
throw new Error('GOOGLE_ACCESS_TOKEN environment variable required');
|
|
18
|
+
}
|
|
19
|
+
this.project = process.env.GOOGLE_CLOUD_PROJECT;
|
|
20
|
+
this.token = process.env.GOOGLE_ACCESS_TOKEN;
|
|
21
|
+
}
|
|
22
|
+
async gcpFetch(url, options) {
|
|
23
|
+
const response = await fetch(url, {
|
|
24
|
+
...options,
|
|
25
|
+
headers: {
|
|
26
|
+
Authorization: `Bearer ${this.token}`,
|
|
27
|
+
'Content-Type': 'application/json',
|
|
28
|
+
...(options?.headers ?? {}),
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
if (response.status === 401 || response.status === 403) {
|
|
32
|
+
throw new Error('Insufficient permissions for gcp. Check IAM policy.');
|
|
33
|
+
}
|
|
34
|
+
if (!response.ok) {
|
|
35
|
+
const text = await response.text();
|
|
36
|
+
throw new Error(`GCP API error ${response.status}: ${text}`);
|
|
37
|
+
}
|
|
38
|
+
return response.json();
|
|
39
|
+
}
|
|
40
|
+
async listInstances(options) {
|
|
41
|
+
const url = `https://compute.googleapis.com/compute/v1/projects/${this.project}/aggregated/instances`;
|
|
42
|
+
const data = await this.gcpFetch(url);
|
|
43
|
+
const instances = [];
|
|
44
|
+
for (const [zone, zoneData] of Object.entries(data.items ?? {})) {
|
|
45
|
+
const zoneName = zone.replace('zones/', '');
|
|
46
|
+
for (const inst of zoneData.instances ?? []) {
|
|
47
|
+
const mapped = this.mapInstance(inst, zoneName);
|
|
48
|
+
if (options?.state && mapped.state !== options.state)
|
|
49
|
+
continue;
|
|
50
|
+
if (options?.tags) {
|
|
51
|
+
const labels = inst.labels ?? {};
|
|
52
|
+
const match = Object.entries(options.tags).every(([k, v]) => labels[k] === v);
|
|
53
|
+
if (!match)
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
instances.push(mapped);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return instances;
|
|
60
|
+
}
|
|
61
|
+
mapInstance(inst, zone) {
|
|
62
|
+
const tags = { ...(inst.labels ?? {}) };
|
|
63
|
+
const stateMap = {
|
|
64
|
+
RUNNING: 'running',
|
|
65
|
+
STOPPED: 'stopped',
|
|
66
|
+
TERMINATED: 'terminated',
|
|
67
|
+
STOPPING: 'stopped',
|
|
68
|
+
STAGING: 'pending',
|
|
69
|
+
PROVISIONING: 'pending',
|
|
70
|
+
SUSPENDED: 'stopped',
|
|
71
|
+
};
|
|
72
|
+
const rawState = inst.status ?? 'UNKNOWN';
|
|
73
|
+
const state = stateMap[rawState] ?? 'unknown';
|
|
74
|
+
// Extract region from zone (e.g., us-central1-a -> us-central1)
|
|
75
|
+
const region = zone.replace(/-[a-z]$/, '');
|
|
76
|
+
// Extract machine type name from full URL
|
|
77
|
+
const machineType = inst.machineType
|
|
78
|
+
? inst.machineType.split('/').pop() ?? inst.machineType
|
|
79
|
+
: 'unknown';
|
|
80
|
+
// Get public/private IPs from network interfaces
|
|
81
|
+
const networkInterface = (inst.networkInterfaces ?? [])[0];
|
|
82
|
+
const ip_private = networkInterface?.networkIP;
|
|
83
|
+
const ip_public = networkInterface?.accessConfigs?.[0]?.natIP;
|
|
84
|
+
return {
|
|
85
|
+
id: inst.id ?? '',
|
|
86
|
+
name: inst.name ?? '',
|
|
87
|
+
type: machineType,
|
|
88
|
+
state,
|
|
89
|
+
ip_public,
|
|
90
|
+
ip_private,
|
|
91
|
+
region,
|
|
92
|
+
zone,
|
|
93
|
+
launch_time: inst.creationTimestamp,
|
|
94
|
+
tags,
|
|
95
|
+
provider: 'gcp',
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
async listDatabases(options) {
|
|
99
|
+
const url = `https://sqladmin.googleapis.com/v1/projects/${this.project}/instances`;
|
|
100
|
+
const data = await this.gcpFetch(url);
|
|
101
|
+
const databases = [];
|
|
102
|
+
for (const db of data.items ?? []) {
|
|
103
|
+
const mapped = this.mapDatabase(db);
|
|
104
|
+
if (options?.engine && mapped.engine !== options.engine)
|
|
105
|
+
continue;
|
|
106
|
+
databases.push(mapped);
|
|
107
|
+
}
|
|
108
|
+
return databases;
|
|
109
|
+
}
|
|
110
|
+
mapDatabase(db) {
|
|
111
|
+
const tags = {};
|
|
112
|
+
const statusMap = {
|
|
113
|
+
RUNNABLE: 'available',
|
|
114
|
+
CREATING: 'creating',
|
|
115
|
+
DELETING: 'deleting',
|
|
116
|
+
SUSPENDED: 'stopped',
|
|
117
|
+
FAILED: 'error',
|
|
118
|
+
UNKNOWN_STATE: 'unknown',
|
|
119
|
+
};
|
|
120
|
+
const rawStatus = db.state ?? 'UNKNOWN_STATE';
|
|
121
|
+
const status = statusMap[rawStatus] ?? 'unknown';
|
|
122
|
+
// Extract engine from databaseVersion e.g., POSTGRES_15 -> postgres
|
|
123
|
+
const dbVersion = db.databaseVersion ?? '';
|
|
124
|
+
let engine = 'unknown';
|
|
125
|
+
let version = 'unknown';
|
|
126
|
+
if (dbVersion.startsWith('POSTGRES')) {
|
|
127
|
+
engine = 'postgres';
|
|
128
|
+
version = dbVersion.replace('POSTGRES_', '');
|
|
129
|
+
}
|
|
130
|
+
else if (dbVersion.startsWith('MYSQL')) {
|
|
131
|
+
engine = 'mysql';
|
|
132
|
+
version = dbVersion.replace('MYSQL_', '').replace(/_/g, '.');
|
|
133
|
+
}
|
|
134
|
+
else if (dbVersion.startsWith('SQLSERVER')) {
|
|
135
|
+
engine = 'sqlserver';
|
|
136
|
+
version = dbVersion.replace('SQLSERVER_', '').replace(/_/g, ' ');
|
|
137
|
+
}
|
|
138
|
+
const region = db.region ?? 'unknown';
|
|
139
|
+
const storageGb = db.settings?.dataDiskSizeGb
|
|
140
|
+
? parseInt(db.settings.dataDiskSizeGb, 10)
|
|
141
|
+
: 0;
|
|
142
|
+
const backupEnabled = db.settings?.backupConfiguration?.enabled ?? false;
|
|
143
|
+
const backupRetention = db.settings?.backupConfiguration?.backupRetentionSettings?.retainedBackups
|
|
144
|
+
? parseInt(db.settings.backupConfiguration.backupRetentionSettings.retainedBackups, 10)
|
|
145
|
+
: undefined;
|
|
146
|
+
const endpoint = db.ipAddresses?.find((ip) => ip.type === 'PRIMARY')?.ipAddress;
|
|
147
|
+
return {
|
|
148
|
+
id: db.name ?? '',
|
|
149
|
+
name: db.name ?? '',
|
|
150
|
+
engine,
|
|
151
|
+
version,
|
|
152
|
+
instance_class: db.settings?.tier ?? 'unknown',
|
|
153
|
+
storage_gb: storageGb,
|
|
154
|
+
status,
|
|
155
|
+
endpoint,
|
|
156
|
+
backup_enabled: backupEnabled,
|
|
157
|
+
backup_retention_days: backupRetention,
|
|
158
|
+
region,
|
|
159
|
+
tags,
|
|
160
|
+
provider: 'gcp',
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
async listStorage(_options) {
|
|
164
|
+
const url = `https://storage.googleapis.com/storage/v1/b?project=${this.project}`;
|
|
165
|
+
const data = await this.gcpFetch(url);
|
|
166
|
+
const buckets = [];
|
|
167
|
+
for (const bucket of data.items ?? []) {
|
|
168
|
+
buckets.push(this.mapBucket(bucket));
|
|
169
|
+
}
|
|
170
|
+
return buckets;
|
|
171
|
+
}
|
|
172
|
+
mapBucket(bucket) {
|
|
173
|
+
const isPublic = (bucket.iamConfiguration?.publicAccessPrevention === 'inherited') ||
|
|
174
|
+
(bucket.acl ?? []).some((acl) => acl.entity === 'allUsers' || acl.entity === 'allAuthenticatedUsers');
|
|
175
|
+
const encrypted = bucket.encryption !== undefined ||
|
|
176
|
+
bucket.defaultObjectAcl !== undefined ||
|
|
177
|
+
true; // GCS always encrypts at rest by default
|
|
178
|
+
return {
|
|
179
|
+
name: bucket.name ?? '',
|
|
180
|
+
region: bucket.location?.toLowerCase() ?? 'unknown',
|
|
181
|
+
size_bytes: undefined,
|
|
182
|
+
object_count: undefined,
|
|
183
|
+
public_access: isPublic,
|
|
184
|
+
encryption: encrypted,
|
|
185
|
+
versioning: bucket.versioning?.enabled ?? false,
|
|
186
|
+
created_at: bucket.timeCreated,
|
|
187
|
+
provider: 'gcp',
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
async getSecrets(options) {
|
|
191
|
+
const url = `https://secretmanager.googleapis.com/v1/projects/${this.project}/secrets`;
|
|
192
|
+
const data = await this.gcpFetch(url);
|
|
193
|
+
const secrets = [];
|
|
194
|
+
for (const secret of data.secrets ?? []) {
|
|
195
|
+
// Extract name from full resource path: projects/{project}/secrets/{name}
|
|
196
|
+
const shortName = secret.name?.split('/').pop() ?? secret.name ?? '';
|
|
197
|
+
if (options?.prefix && !shortName.startsWith(options.prefix))
|
|
198
|
+
continue;
|
|
199
|
+
const tags = { ...(secret.labels ?? {}) };
|
|
200
|
+
const rotationEnabled = secret.rotation !== undefined;
|
|
201
|
+
secrets.push({
|
|
202
|
+
name: shortName,
|
|
203
|
+
created_at: secret.createTime,
|
|
204
|
+
rotation_enabled: rotationEnabled,
|
|
205
|
+
tags,
|
|
206
|
+
provider: 'gcp',
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
return secrets;
|
|
210
|
+
}
|
|
211
|
+
async getResourcesByTag(tagKey, tagValue) {
|
|
212
|
+
const resources = [];
|
|
213
|
+
const instances = await this.listInstances();
|
|
214
|
+
for (const inst of instances) {
|
|
215
|
+
if (tagKey in inst.tags &&
|
|
216
|
+
(tagValue === undefined || inst.tags[tagKey] === tagValue)) {
|
|
217
|
+
resources.push({
|
|
218
|
+
resource_id: inst.id,
|
|
219
|
+
resource_type: 'instance',
|
|
220
|
+
resource_name: inst.name,
|
|
221
|
+
tags: inst.tags,
|
|
222
|
+
provider: 'gcp',
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
const databases = await this.listDatabases();
|
|
227
|
+
for (const db of databases) {
|
|
228
|
+
if (tagKey in db.tags &&
|
|
229
|
+
(tagValue === undefined || db.tags[tagKey] === tagValue)) {
|
|
230
|
+
resources.push({
|
|
231
|
+
resource_id: db.id,
|
|
232
|
+
resource_type: 'database',
|
|
233
|
+
resource_name: db.name,
|
|
234
|
+
tags: db.tags,
|
|
235
|
+
provider: 'gcp',
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return resources;
|
|
240
|
+
}
|
|
241
|
+
async getHealthStatus() {
|
|
242
|
+
const [instances, databases, storage] = await Promise.all([
|
|
243
|
+
this.listInstances(),
|
|
244
|
+
this.listDatabases(),
|
|
245
|
+
this.listStorage(),
|
|
246
|
+
]);
|
|
247
|
+
const instStats = {
|
|
248
|
+
running: instances.filter((i) => i.state === 'running').length,
|
|
249
|
+
stopped: instances.filter((i) => i.state === 'stopped').length,
|
|
250
|
+
error: instances.filter((i) => i.state === 'unknown').length,
|
|
251
|
+
total: instances.length,
|
|
252
|
+
};
|
|
253
|
+
const dbStats = {
|
|
254
|
+
available: databases.filter((d) => d.status === 'available').length,
|
|
255
|
+
error: databases.filter((d) => d.status === 'error').length,
|
|
256
|
+
total: databases.length,
|
|
257
|
+
};
|
|
258
|
+
const storageStats = {
|
|
259
|
+
total_buckets: storage.length,
|
|
260
|
+
public_buckets: storage.filter((b) => b.public_access).length,
|
|
261
|
+
};
|
|
262
|
+
let overall = 'healthy';
|
|
263
|
+
if (instStats.error > 0 || dbStats.error > 0) {
|
|
264
|
+
overall = 'critical';
|
|
265
|
+
}
|
|
266
|
+
else if (storageStats.public_buckets > 0 || instStats.stopped > 0) {
|
|
267
|
+
overall = 'warning';
|
|
268
|
+
}
|
|
269
|
+
return {
|
|
270
|
+
provider: 'gcp',
|
|
271
|
+
instances: instStats,
|
|
272
|
+
databases: dbStats,
|
|
273
|
+
storage: storageStats,
|
|
274
|
+
pending_maintenance: [],
|
|
275
|
+
overall,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
async getCurrentCost(month) {
|
|
279
|
+
const now = new Date();
|
|
280
|
+
const targetMonth = month ??
|
|
281
|
+
`${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}`;
|
|
282
|
+
// GCP Cloud Billing uses the billing account; here we query the project's billing
|
|
283
|
+
// For simplicity, we use a lightweight approach: return 0 if billing not configured
|
|
284
|
+
// In practice, billing API requires a billing account ID which we don't have from env
|
|
285
|
+
const url = `https://cloudbilling.googleapis.com/v1/projects/${this.project}/billingInfo`;
|
|
286
|
+
let billingAccountName = '';
|
|
287
|
+
try {
|
|
288
|
+
const billingInfo = await this.gcpFetch(url);
|
|
289
|
+
billingAccountName = billingInfo.billingAccountName ?? '';
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
// Billing info not accessible — return zero breakdown
|
|
293
|
+
return {
|
|
294
|
+
provider: 'gcp',
|
|
295
|
+
period: targetMonth,
|
|
296
|
+
total_usd: 0,
|
|
297
|
+
by_service: [],
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
if (!billingAccountName) {
|
|
301
|
+
return {
|
|
302
|
+
provider: 'gcp',
|
|
303
|
+
period: targetMonth,
|
|
304
|
+
total_usd: 0,
|
|
305
|
+
by_service: [],
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
// Query billing account costs
|
|
309
|
+
const [year, mon] = targetMonth.split('-').map(Number);
|
|
310
|
+
if (!year || !mon) {
|
|
311
|
+
throw new Error(`Invalid month format: ${targetMonth}. Expected YYYY-MM`);
|
|
312
|
+
}
|
|
313
|
+
const startDate = `${targetMonth}-01`;
|
|
314
|
+
const endDate = new Date(year, mon, 0);
|
|
315
|
+
const endDateStr = `${targetMonth}-${String(endDate.getDate()).padStart(2, '0')}`;
|
|
316
|
+
const costUrl = `https://cloudbilling.googleapis.com/v1/${billingAccountName}:query`;
|
|
317
|
+
try {
|
|
318
|
+
const costData = await this.gcpFetch(costUrl, {
|
|
319
|
+
method: 'POST',
|
|
320
|
+
body: JSON.stringify({
|
|
321
|
+
query: {
|
|
322
|
+
dateRange: {
|
|
323
|
+
startDate: { year: year, month: mon, day: 1 },
|
|
324
|
+
endDate: {
|
|
325
|
+
year: endDate.getFullYear(),
|
|
326
|
+
month: endDate.getMonth() + 1,
|
|
327
|
+
day: endDate.getDate(),
|
|
328
|
+
},
|
|
329
|
+
},
|
|
330
|
+
groupBy: [{ type: 'SERVICE' }],
|
|
331
|
+
},
|
|
332
|
+
}),
|
|
333
|
+
});
|
|
334
|
+
void startDate;
|
|
335
|
+
void endDateStr;
|
|
336
|
+
const byService = [];
|
|
337
|
+
let total = 0;
|
|
338
|
+
for (const row of costData.costRecords ?? []) {
|
|
339
|
+
const amount = row.cost?.amount ?? 0;
|
|
340
|
+
total += amount;
|
|
341
|
+
byService.push({
|
|
342
|
+
service: row.serviceName ?? 'Unknown',
|
|
343
|
+
amount_usd: amount,
|
|
344
|
+
pct: 0,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
// Calculate percentages
|
|
348
|
+
for (const svc of byService) {
|
|
349
|
+
svc.pct = total > 0 ? Math.round((svc.amount_usd / total) * 100) : 0;
|
|
350
|
+
}
|
|
351
|
+
return {
|
|
352
|
+
provider: 'gcp',
|
|
353
|
+
period: targetMonth,
|
|
354
|
+
total_usd: total,
|
|
355
|
+
by_service: byService,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
catch (err) {
|
|
359
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
360
|
+
throw new Error(`Cost data unavailable. Cost Explorer API costs $0.01/request. Error: ${message}`);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=gcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcp.js","sourceRoot":"","sources":["../../src/adapters/gcp.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,15 @@ import { list_instances } from './tools/list_instances.js';
|
|
|
10
10
|
import { list_databases } from './tools/list_databases.js';
|
|
11
11
|
import { list_storage } from './tools/list_storage.js';
|
|
12
12
|
import { get_secrets } from './tools/get_secrets.js';
|
|
13
|
+
import { resource_tags } from './tools/resource_tags.js';
|
|
14
|
+
import { health_dashboard } from './tools/health_dashboard.js';
|
|
15
|
+
import { cost_current } from './tools/cost_current.js';
|
|
16
|
+
import { cost_forecast } from './premium/cost_forecast.js';
|
|
17
|
+
import { cost_anomalies } from './premium/cost_anomalies.js';
|
|
18
|
+
import { idle_resources } from './premium/idle_resources.js';
|
|
19
|
+
import { security_scan } from './premium/security_scan.js';
|
|
20
|
+
import { cross_cloud_report } from './premium/cross_cloud_report.js';
|
|
21
|
+
import { compliance_snapshot } from './premium/compliance_snapshot.js';
|
|
13
22
|
const server = new McpServer({
|
|
14
23
|
name: 'cloudvault-mcp',
|
|
15
24
|
version: '1.0.0',
|
|
@@ -45,6 +54,75 @@ server.tool('get_secrets', 'List secret names and metadata. SECURITY: Secret val
|
|
|
45
54
|
}, async (input) => {
|
|
46
55
|
return get_secrets(input);
|
|
47
56
|
});
|
|
57
|
+
// resource_tags
|
|
58
|
+
server.tool('resource_tags', 'List and search resources by tag key/value pairs across instances, databases, and storage.', {
|
|
59
|
+
provider: z.enum(['aws', 'gcp', 'azure']).describe('Cloud provider'),
|
|
60
|
+
tag_key: z.string().describe('Tag/label key to search for (e.g., Environment)'),
|
|
61
|
+
tag_value: z.string().optional().describe('Tag/label value to filter by (e.g., production)'),
|
|
62
|
+
resource_type: z
|
|
63
|
+
.enum(['instance', 'database', 'storage', 'secret', 'other'])
|
|
64
|
+
.optional()
|
|
65
|
+
.describe('Filter by resource type'),
|
|
66
|
+
}, async (input) => {
|
|
67
|
+
return resource_tags(input);
|
|
68
|
+
});
|
|
69
|
+
// health_dashboard
|
|
70
|
+
server.tool('health_dashboard', 'Get aggregate health status: running/stopped/error counts, pending maintenance, and overall health level.', {
|
|
71
|
+
provider: z.enum(['aws', 'gcp', 'azure']).describe('Cloud provider'),
|
|
72
|
+
}, async (input) => {
|
|
73
|
+
return health_dashboard(input);
|
|
74
|
+
});
|
|
75
|
+
// cost_current
|
|
76
|
+
server.tool('cost_current', 'Current month cost breakdown by service with comparison to previous month. NOTE: AWS Cost Explorer costs $0.01/request.', {
|
|
77
|
+
provider: z.enum(['aws', 'gcp', 'azure']).describe('Cloud provider'),
|
|
78
|
+
month: z
|
|
79
|
+
.string()
|
|
80
|
+
.optional()
|
|
81
|
+
.describe('Month in YYYY-MM format (defaults to current month)'),
|
|
82
|
+
}, async (input) => {
|
|
83
|
+
return cost_current(input);
|
|
84
|
+
});
|
|
85
|
+
// cost_forecast (PRO)
|
|
86
|
+
server.tool('cost_forecast', '[PRO] 3/6/12-month cost projections with conservative, realistic, and optimistic scenarios.', {
|
|
87
|
+
provider: z.enum(['aws', 'gcp', 'azure']).describe('Cloud provider'),
|
|
88
|
+
months: z.union([z.literal(3), z.literal(6), z.literal(12)]).optional().describe('Forecast horizon in months (default 6)'),
|
|
89
|
+
based_on_months: z.union([z.literal(3), z.literal(6)]).optional().describe('Historical months to base forecast on (default 3)'),
|
|
90
|
+
}, async (input) => {
|
|
91
|
+
return cost_forecast(input);
|
|
92
|
+
});
|
|
93
|
+
// cost_anomalies (PRO)
|
|
94
|
+
server.tool('cost_anomalies', '[PRO] Detect cost spikes vs 30-day baseline. Flags services with >50% deviation by default.', {
|
|
95
|
+
provider: z.enum(['aws', 'gcp', 'azure']).describe('Cloud provider'),
|
|
96
|
+
threshold_pct: z.number().optional().describe('Deviation threshold percentage to flag as anomaly (default 50)'),
|
|
97
|
+
}, async (input) => {
|
|
98
|
+
return cost_anomalies(input);
|
|
99
|
+
});
|
|
100
|
+
// idle_resources (PRO)
|
|
101
|
+
server.tool('idle_resources', '[PRO] Detect underutilized resources: stopped instances, empty buckets, unattached volumes.', {
|
|
102
|
+
provider: z.enum(['aws', 'gcp', 'azure']).describe('Cloud provider'),
|
|
103
|
+
}, async (input) => {
|
|
104
|
+
return idle_resources(input);
|
|
105
|
+
});
|
|
106
|
+
// security_scan (PRO)
|
|
107
|
+
server.tool('security_scan', '[PRO] INFORMATIONAL ONLY — Scan for public buckets, unencrypted storage, unrotated secrets. Not a security audit.', {
|
|
108
|
+
provider: z.enum(['aws', 'gcp', 'azure']).describe('Cloud provider'),
|
|
109
|
+
}, async (input) => {
|
|
110
|
+
return security_scan(input);
|
|
111
|
+
});
|
|
112
|
+
// cross_cloud_report (PRO)
|
|
113
|
+
server.tool('cross_cloud_report', '[PRO] Unified inventory across all cloud providers with inconsistency flags (e.g., missing env parity).', {
|
|
114
|
+
providers: z
|
|
115
|
+
.array(z.enum(['aws', 'gcp', 'azure']))
|
|
116
|
+
.describe('Cloud providers to include in the report'),
|
|
117
|
+
}, async (input) => {
|
|
118
|
+
return cross_cloud_report(input);
|
|
119
|
+
});
|
|
120
|
+
// compliance_snapshot (PRO)
|
|
121
|
+
server.tool('compliance_snapshot', '[PRO] NOT LEGAL ADVICE — Map infrastructure to SOC2/ISO27001 controls as a reference guide.', {
|
|
122
|
+
provider: z.enum(['aws', 'gcp', 'azure']).describe('Cloud provider'),
|
|
123
|
+
}, async (input) => {
|
|
124
|
+
return compliance_snapshot(input);
|
|
125
|
+
});
|
|
48
126
|
// Start server
|
|
49
127
|
const transport = new StdioServerTransport();
|
|
50
128
|
await server.connect(transport);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/lib/providers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/lib/providers.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI1D,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,CAAC;AAEnD,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,aAAa,CAoB7D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,aAAa,EAAE,CAEnE;AAED,4CAA4C;AAC5C,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
|
package/dist/lib/providers.js
CHANGED
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
* Phase 3: + azure
|
|
9
9
|
*/
|
|
10
10
|
import { AwsAdapter } from '../adapters/aws.js';
|
|
11
|
+
import { GcpAdapter } from '../adapters/gcp.js';
|
|
12
|
+
import { AzureAdapter } from '../adapters/azure.js';
|
|
11
13
|
const cache = new Map();
|
|
12
14
|
export function getProvider(name) {
|
|
13
15
|
if (cache.has(name))
|
|
@@ -18,11 +20,13 @@ export function getProvider(name) {
|
|
|
18
20
|
adapter = new AwsAdapter();
|
|
19
21
|
break;
|
|
20
22
|
case 'gcp':
|
|
21
|
-
|
|
23
|
+
adapter = new GcpAdapter();
|
|
24
|
+
break;
|
|
22
25
|
case 'azure':
|
|
23
|
-
|
|
26
|
+
adapter = new AzureAdapter();
|
|
27
|
+
break;
|
|
24
28
|
default:
|
|
25
|
-
throw new Error(`Unknown provider: ${name}. Supported: aws`);
|
|
29
|
+
throw new Error(`Unknown provider: ${name}. Supported: aws, gcp, azure`);
|
|
26
30
|
}
|
|
27
31
|
cache.set(name, adapter);
|
|
28
32
|
return adapter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/lib/providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/lib/providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;AAI/C,MAAM,UAAU,WAAW,CAAC,IAAkB;IAC5C,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;IAE7C,IAAI,OAAsB,CAAC;IAC3B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,KAAK;YACR,OAAO,GAAG,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM;QACR,KAAK,KAAK;YACR,OAAO,GAAG,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM;QACR,KAAK,OAAO;YACV,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;YAC7B,MAAM;QACR;YACE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAc,8BAA8B,CAAC,CAAC;IACvF,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAqB;IAChD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,kBAAkB;IAChC,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* compliance_snapshot tool (PRO) — map findings to SOC2/ISO27001 controls.
|
|
3
|
+
*
|
|
4
|
+
* Controls checked:
|
|
5
|
+
* SOC2 CC6.1 — Logical and physical access controls (encryption)
|
|
6
|
+
* SOC2 CC6.6 — Logical access controls (secrets rotation / access control)
|
|
7
|
+
* ISO27001 A.10.1 — Cryptographic controls (encryption at rest)
|
|
8
|
+
* ISO27001 A.12.3 — Information backup (backup enabled for databases)
|
|
9
|
+
*
|
|
10
|
+
* DISCLAIMER: NOT LEGAL ADVICE. This tool provides a reference mapping only.
|
|
11
|
+
* It does not constitute a compliance certification or formal audit.
|
|
12
|
+
*/
|
|
13
|
+
import { type ProviderName } from '../lib/providers.js';
|
|
14
|
+
export interface ComplianceSnapshotInput {
|
|
15
|
+
provider: ProviderName;
|
|
16
|
+
}
|
|
17
|
+
export declare function compliance_snapshot(input: ComplianceSnapshotInput): Promise<{
|
|
18
|
+
content: Array<{
|
|
19
|
+
type: 'text';
|
|
20
|
+
text: string;
|
|
21
|
+
}>;
|
|
22
|
+
}>;
|
|
23
|
+
//# sourceMappingURL=compliance_snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compliance_snapshot.d.ts","sourceRoot":"","sources":["../../src/premium/compliance_snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIrE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,YAAY,CAAC;CACxB;AAKD,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC;IACjF,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD,CAAC,CAuLD"}
|