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
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
[](https://www.npmjs.com/package/cloudvault-mcp)
|
|
8
8
|
[](https://www.npmjs.com/package/cloudvault-mcp)
|
|
9
9
|
[](LICENSE)
|
|
10
|
-
[](#testing)
|
|
11
11
|
[](https://modelcontextprotocol.io)
|
|
12
12
|
|
|
13
13
|
**Cloud infrastructure analysis for AI agents — AWS, GCP, Azure inventory and cost analysis**
|
|
@@ -24,13 +24,21 @@
|
|
|
24
24
|
graph LR
|
|
25
25
|
A[AI Agent] -->|MCP protocol| B[CloudVault MCP]
|
|
26
26
|
B --> C[AWS]
|
|
27
|
-
B --> D[GCP
|
|
28
|
-
B --> E[Azure
|
|
27
|
+
B --> D[GCP]
|
|
28
|
+
B --> E[Azure]
|
|
29
29
|
|
|
30
30
|
C --> C1[EC2 Instances]
|
|
31
31
|
C --> C2[RDS Databases]
|
|
32
32
|
C --> C3[S3 Buckets]
|
|
33
33
|
C --> C4[Secrets Manager]
|
|
34
|
+
D --> D1[Compute Engine]
|
|
35
|
+
D --> D2[Cloud SQL]
|
|
36
|
+
D --> D3[Cloud Storage]
|
|
37
|
+
D --> D4[Secret Manager]
|
|
38
|
+
E --> E1[Virtual Machines]
|
|
39
|
+
E --> E2[SQL Databases]
|
|
40
|
+
E --> E3[Storage Accounts]
|
|
41
|
+
E --> E4[Key Vault]
|
|
34
42
|
```
|
|
35
43
|
|
|
36
44
|
CloudVault connects your AI agent to your cloud infrastructure. All operations are **read-only** — no create, modify, or delete operations are ever performed.
|
|
@@ -39,16 +47,16 @@ CloudVault connects your AI agent to your cloud infrastructure. All operations a
|
|
|
39
47
|
|
|
40
48
|
## Tools
|
|
41
49
|
|
|
42
|
-
### Phase 1 —
|
|
50
|
+
### Phase 1 — Core Inventory + AWS (free)
|
|
43
51
|
|
|
44
52
|
| Tool | Description |
|
|
45
53
|
|:-----|:-----------|
|
|
46
54
|
| `list_instances` | Compute instances — state, type, IP, region, monthly cost estimate |
|
|
47
55
|
| `list_databases` | Managed databases — engine, version, storage, backup status |
|
|
48
|
-
| `list_storage` | S3 buckets — public access status, encryption, versioning |
|
|
56
|
+
| `list_storage` | S3/GCS buckets — public access status, encryption, versioning |
|
|
49
57
|
| `get_secrets` | Secret names and metadata — **values never returned** |
|
|
50
58
|
|
|
51
|
-
### Phase 2 — Extended Inventory + GCP (
|
|
59
|
+
### Phase 2 — Extended Inventory + GCP (free)
|
|
52
60
|
|
|
53
61
|
| Tool | Description |
|
|
54
62
|
|:-----|:-----------|
|
|
@@ -56,16 +64,16 @@ CloudVault connects your AI agent to your cloud infrastructure. All operations a
|
|
|
56
64
|
| `health_dashboard` | Running/stopped/error counts, pending maintenance |
|
|
57
65
|
| `cost_current` | Current month cost breakdown vs previous month |
|
|
58
66
|
|
|
59
|
-
### Phase 3 — Pro Features + Azure (
|
|
67
|
+
### Phase 3 — Pro Features + Azure (PRO license required)
|
|
60
68
|
|
|
61
69
|
| Tool | Description |
|
|
62
70
|
|:-----|:-----------|
|
|
63
|
-
| `cost_forecast` | 3/6/12-month projections with scenarios |
|
|
64
|
-
| `cost_anomalies` | Detect cost spikes vs 30-day baseline |
|
|
65
|
-
| `idle_resources` | Underutilized instances,
|
|
66
|
-
| `security_scan` | Public buckets, unencrypted storage, unrotated secrets |
|
|
67
|
-
| `cross_cloud_report` | Unified multi-cloud inventory |
|
|
68
|
-
| `compliance_snapshot` | SOC2/ISO27001 control mapping |
|
|
71
|
+
| `cost_forecast` | 3/6/12-month projections with conservative/realistic/optimistic scenarios |
|
|
72
|
+
| `cost_anomalies` | Detect cost spikes vs 30-day baseline, severity classification |
|
|
73
|
+
| `idle_resources` | Underutilized instances, empty buckets — sorted by savings potential |
|
|
74
|
+
| `security_scan` | Public buckets, unencrypted storage, unrotated secrets — **informational only** |
|
|
75
|
+
| `cross_cloud_report` | Unified multi-cloud inventory with environment parity checks |
|
|
76
|
+
| `compliance_snapshot` | SOC2/ISO27001 control mapping — **not legal advice** |
|
|
69
77
|
|
|
70
78
|
---
|
|
71
79
|
|
|
@@ -74,8 +82,8 @@ CloudVault connects your AI agent to your cloud infrastructure. All operations a
|
|
|
74
82
|
| Provider | Phase 1 | Phase 2 | Phase 3 |
|
|
75
83
|
|:---------|:-------:|:-------:|:-------:|
|
|
76
84
|
| AWS | ✅ | ✅ | ✅ |
|
|
77
|
-
| GCP |
|
|
78
|
-
| Azure |
|
|
85
|
+
| GCP | ✅ | ✅ | ✅ |
|
|
86
|
+
| Azure | ✅ | ✅ | ✅ |
|
|
79
87
|
|
|
80
88
|
---
|
|
81
89
|
|
|
@@ -95,6 +103,22 @@ export AWS_SECRET_ACCESS_KEY=your_secret_key
|
|
|
95
103
|
export AWS_REGION=us-east-1 # optional, defaults to us-east-1
|
|
96
104
|
```
|
|
97
105
|
|
|
106
|
+
### GCP Setup
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
export GOOGLE_CLOUD_PROJECT=your_project_id
|
|
110
|
+
export GOOGLE_ACCESS_TOKEN=$(gcloud auth print-access-token)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Azure Setup
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
export AZURE_TENANT_ID=your_tenant_id
|
|
117
|
+
export AZURE_CLIENT_ID=your_client_id
|
|
118
|
+
export AZURE_CLIENT_SECRET=your_client_secret
|
|
119
|
+
export AZURE_SUBSCRIPTION_ID=your_subscription_id
|
|
120
|
+
```
|
|
121
|
+
|
|
98
122
|
### Claude Desktop Config
|
|
99
123
|
|
|
100
124
|
Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
|
|
@@ -143,6 +167,11 @@ Ask your AI agent:
|
|
|
143
167
|
- *"Do any of my S3 buckets have public access enabled?"*
|
|
144
168
|
- *"List all my secrets in AWS Secrets Manager — just names, no values"*
|
|
145
169
|
- *"Which instances are tagged with Environment=production?"*
|
|
170
|
+
- *"Show me the health dashboard for my GCP project"*
|
|
171
|
+
- *"What's my current AWS spend vs last month?"*
|
|
172
|
+
- *"[PRO] Are there any cost anomalies this month?"*
|
|
173
|
+
- *"[PRO] Give me a cross-cloud inventory of all my infrastructure"*
|
|
174
|
+
- *"[PRO] Run a compliance snapshot against SOC2 controls for AWS"*
|
|
146
175
|
|
|
147
176
|
---
|
|
148
177
|
|
|
@@ -226,7 +255,7 @@ Set `PRO_LICENSE=CPK-your-key` to unlock Phase 3 pro tools. Get a license at [cr
|
|
|
226
255
|
npm test
|
|
227
256
|
```
|
|
228
257
|
|
|
229
|
-
|
|
258
|
+
265 tests across gate (14), fetch-retry (6), audit (8), providers (9), AWS adapter (26), GCP adapter (32), Azure adapter (28), 7 tools (74), and 6 PRO tools (68).
|
|
230
259
|
|
|
231
260
|
---
|
|
232
261
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Azure Adapter — implements CloudProvider using Azure REST API with OAuth2.
|
|
3
|
+
* Auth: Service principal client credentials flow.
|
|
4
|
+
*
|
|
5
|
+
* Env vars:
|
|
6
|
+
* AZURE_TENANT_ID — Azure AD tenant
|
|
7
|
+
* AZURE_CLIENT_ID — Service principal app ID
|
|
8
|
+
* AZURE_CLIENT_SECRET — Service principal secret
|
|
9
|
+
* AZURE_SUBSCRIPTION_ID — Azure subscription ID
|
|
10
|
+
*/
|
|
11
|
+
import type { CloudProvider } from './types.js';
|
|
12
|
+
import type { ComputeInstance, ManagedDatabase, StorageBucket, SecretInfo, ResourceTag, HealthStatus, CostBreakdown } from '../types.js';
|
|
13
|
+
export declare class AzureAdapter implements CloudProvider {
|
|
14
|
+
private readonly tenantId;
|
|
15
|
+
private readonly clientId;
|
|
16
|
+
private readonly clientSecret;
|
|
17
|
+
private readonly subscriptionId;
|
|
18
|
+
private tokenCache;
|
|
19
|
+
constructor();
|
|
20
|
+
private getToken;
|
|
21
|
+
private azureFetch;
|
|
22
|
+
listInstances(options?: {
|
|
23
|
+
region?: string;
|
|
24
|
+
state?: string;
|
|
25
|
+
tags?: Record<string, string>;
|
|
26
|
+
}): Promise<ComputeInstance[]>;
|
|
27
|
+
private mapVm;
|
|
28
|
+
listDatabases(options?: {
|
|
29
|
+
region?: string;
|
|
30
|
+
engine?: string;
|
|
31
|
+
}): Promise<ManagedDatabase[]>;
|
|
32
|
+
private mapSqlDb;
|
|
33
|
+
listStorage(_options?: {
|
|
34
|
+
region?: string;
|
|
35
|
+
}): Promise<StorageBucket[]>;
|
|
36
|
+
private mapStorageAccount;
|
|
37
|
+
getSecrets(options?: {
|
|
38
|
+
prefix?: string;
|
|
39
|
+
}): Promise<SecretInfo[]>;
|
|
40
|
+
getResourcesByTag(tagKey: string, tagValue?: string): Promise<ResourceTag[]>;
|
|
41
|
+
getHealthStatus(): Promise<HealthStatus>;
|
|
42
|
+
getCurrentCost(month?: string): Promise<CostBreakdown>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=azure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure.d.ts","sourceRoot":"","sources":["../../src/adapters/azure.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,aAAa,EACb,UAAU,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACd,MAAM,aAAa,CAAC;AAErB,qBAAa,YAAa,YAAW,aAAa;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,UAAU,CAAqD;;YAmBzD,QAAQ;YAsCR,UAAU;IA0BlB,aAAa,CAAC,OAAO,CAAC,EAAE;QAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAyB9B,OAAO,CAAC,KAAK;IAoCP,aAAa,CAAC,OAAO,CAAC,EAAE;QAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA2B9B,OAAO,CAAC,QAAQ;IAwCV,WAAW,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAa3E,OAAO,CAAC,iBAAiB;IAenB,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA6DhE,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,EAAE,CAAC;IAsCnB,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC;IA0CxC,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CAoE7D"}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Azure Adapter — implements CloudProvider using Azure REST API with OAuth2.
|
|
3
|
+
* Auth: Service principal client credentials flow.
|
|
4
|
+
*
|
|
5
|
+
* Env vars:
|
|
6
|
+
* AZURE_TENANT_ID — Azure AD tenant
|
|
7
|
+
* AZURE_CLIENT_ID — Service principal app ID
|
|
8
|
+
* AZURE_CLIENT_SECRET — Service principal secret
|
|
9
|
+
* AZURE_SUBSCRIPTION_ID — Azure subscription ID
|
|
10
|
+
*/
|
|
11
|
+
export class AzureAdapter {
|
|
12
|
+
tenantId;
|
|
13
|
+
clientId;
|
|
14
|
+
clientSecret;
|
|
15
|
+
subscriptionId;
|
|
16
|
+
tokenCache = null;
|
|
17
|
+
constructor() {
|
|
18
|
+
if (!process.env.AZURE_TENANT_ID ||
|
|
19
|
+
!process.env.AZURE_CLIENT_ID ||
|
|
20
|
+
!process.env.AZURE_CLIENT_SECRET ||
|
|
21
|
+
!process.env.AZURE_SUBSCRIPTION_ID) {
|
|
22
|
+
throw new Error('Azure credentials not configured. Set AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_SUBSCRIPTION_ID');
|
|
23
|
+
}
|
|
24
|
+
this.tenantId = process.env.AZURE_TENANT_ID;
|
|
25
|
+
this.clientId = process.env.AZURE_CLIENT_ID;
|
|
26
|
+
this.clientSecret = process.env.AZURE_CLIENT_SECRET;
|
|
27
|
+
this.subscriptionId = process.env.AZURE_SUBSCRIPTION_ID;
|
|
28
|
+
}
|
|
29
|
+
async getToken() {
|
|
30
|
+
// Return cached token if still valid (with 60s buffer)
|
|
31
|
+
if (this.tokenCache && this.tokenCache.expiresAt > Date.now() + 60_000) {
|
|
32
|
+
return this.tokenCache.token;
|
|
33
|
+
}
|
|
34
|
+
const url = `https://login.microsoftonline.com/${this.tenantId}/oauth2/v2.0/token`;
|
|
35
|
+
const body = new URLSearchParams({
|
|
36
|
+
grant_type: 'client_credentials',
|
|
37
|
+
client_id: this.clientId,
|
|
38
|
+
client_secret: this.clientSecret,
|
|
39
|
+
scope: 'https://management.azure.com/.default',
|
|
40
|
+
});
|
|
41
|
+
const response = await fetch(url, {
|
|
42
|
+
method: 'POST',
|
|
43
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
44
|
+
body: body.toString(),
|
|
45
|
+
});
|
|
46
|
+
if (!response.ok) {
|
|
47
|
+
const text = await response.text();
|
|
48
|
+
throw new Error(`Azure authentication failed: ${response.status} ${text}`);
|
|
49
|
+
}
|
|
50
|
+
const data = (await response.json());
|
|
51
|
+
this.tokenCache = {
|
|
52
|
+
token: data.access_token,
|
|
53
|
+
expiresAt: Date.now() + data.expires_in * 1000,
|
|
54
|
+
};
|
|
55
|
+
return data.access_token;
|
|
56
|
+
}
|
|
57
|
+
async azureFetch(url, options) {
|
|
58
|
+
const token = await this.getToken();
|
|
59
|
+
const response = await fetch(url, {
|
|
60
|
+
...options,
|
|
61
|
+
headers: {
|
|
62
|
+
Authorization: `Bearer ${token}`,
|
|
63
|
+
'Content-Type': 'application/json',
|
|
64
|
+
...(options?.headers ?? {}),
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
if (response.status === 401 || response.status === 403) {
|
|
68
|
+
throw new Error('Insufficient permissions for azure. Check IAM policy.');
|
|
69
|
+
}
|
|
70
|
+
if (!response.ok) {
|
|
71
|
+
const text = await response.text();
|
|
72
|
+
throw new Error(`Azure API error ${response.status}: ${text}`);
|
|
73
|
+
}
|
|
74
|
+
return response.json();
|
|
75
|
+
}
|
|
76
|
+
async listInstances(options) {
|
|
77
|
+
const url = `https://management.azure.com/subscriptions/${this.subscriptionId}/providers/Microsoft.Compute/virtualMachines?api-version=2023-03-01`;
|
|
78
|
+
const data = await this.azureFetch(url);
|
|
79
|
+
const instances = [];
|
|
80
|
+
for (const vm of data.value ?? []) {
|
|
81
|
+
const mapped = this.mapVm(vm);
|
|
82
|
+
if (options?.region && mapped.region !== options.region)
|
|
83
|
+
continue;
|
|
84
|
+
if (options?.state && mapped.state !== options.state)
|
|
85
|
+
continue;
|
|
86
|
+
if (options?.tags) {
|
|
87
|
+
const vmTags = vm.tags ?? {};
|
|
88
|
+
const match = Object.entries(options.tags).every(([k, v]) => vmTags[k] === v);
|
|
89
|
+
if (!match)
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
instances.push(mapped);
|
|
93
|
+
}
|
|
94
|
+
return instances;
|
|
95
|
+
}
|
|
96
|
+
mapVm(vm) {
|
|
97
|
+
const tags = { ...(vm.tags ?? {}) };
|
|
98
|
+
// Azure VM power state comes from instanceView, but we may not have it in list
|
|
99
|
+
// Use provisioningState as proxy
|
|
100
|
+
const provState = vm.properties?.provisioningState ?? 'Unknown';
|
|
101
|
+
let state = 'unknown';
|
|
102
|
+
if (provState === 'Succeeded')
|
|
103
|
+
state = 'running';
|
|
104
|
+
else if (provState === 'Failed')
|
|
105
|
+
state = 'unknown';
|
|
106
|
+
else if (provState === 'Deleting')
|
|
107
|
+
state = 'terminated';
|
|
108
|
+
// Check power state if available
|
|
109
|
+
const powerState = vm.properties?.instanceView?.statuses?.find((s) => s.code?.startsWith('PowerState/'));
|
|
110
|
+
if (powerState) {
|
|
111
|
+
const code = powerState.code ?? '';
|
|
112
|
+
if (code === 'PowerState/running')
|
|
113
|
+
state = 'running';
|
|
114
|
+
else if (code === 'PowerState/stopped' || code === 'PowerState/deallocated')
|
|
115
|
+
state = 'stopped';
|
|
116
|
+
else if (code === 'PowerState/starting')
|
|
117
|
+
state = 'pending';
|
|
118
|
+
}
|
|
119
|
+
const region = vm.location ?? 'unknown';
|
|
120
|
+
const vmSize = vm.properties?.hardwareProfile?.vmSize ?? 'unknown';
|
|
121
|
+
return {
|
|
122
|
+
id: vm.id ?? '',
|
|
123
|
+
name: vm.name ?? '',
|
|
124
|
+
type: vmSize,
|
|
125
|
+
state,
|
|
126
|
+
region,
|
|
127
|
+
tags,
|
|
128
|
+
provider: 'azure',
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
async listDatabases(options) {
|
|
132
|
+
const url = `https://management.azure.com/subscriptions/${this.subscriptionId}/providers/Microsoft.Sql/servers?api-version=2022-05-01-preview`;
|
|
133
|
+
const data = await this.azureFetch(url);
|
|
134
|
+
const databases = [];
|
|
135
|
+
for (const server of data.value ?? []) {
|
|
136
|
+
// Fetch databases for each server
|
|
137
|
+
const dbUrl = `https://management.azure.com${server.id}/databases?api-version=2022-05-01-preview`;
|
|
138
|
+
try {
|
|
139
|
+
const dbData = await this.azureFetch(dbUrl);
|
|
140
|
+
for (const db of dbData.value ?? []) {
|
|
141
|
+
// Skip master database
|
|
142
|
+
if (db.name === 'master')
|
|
143
|
+
continue;
|
|
144
|
+
const mapped = this.mapSqlDb(db, server);
|
|
145
|
+
if (options?.engine && mapped.engine !== options.engine)
|
|
146
|
+
continue;
|
|
147
|
+
if (options?.region && mapped.region !== options.region)
|
|
148
|
+
continue;
|
|
149
|
+
databases.push(mapped);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// Skip servers we can't enumerate
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return databases;
|
|
157
|
+
}
|
|
158
|
+
mapSqlDb(db, server) {
|
|
159
|
+
const tags = { ...(db.tags ?? {}) };
|
|
160
|
+
const statusMap = {
|
|
161
|
+
Online: 'available',
|
|
162
|
+
Creating: 'creating',
|
|
163
|
+
Deleting: 'deleting',
|
|
164
|
+
Disabled: 'stopped',
|
|
165
|
+
Paused: 'stopped',
|
|
166
|
+
Pausing: 'stopped',
|
|
167
|
+
Resuming: 'creating',
|
|
168
|
+
Scaling: 'creating',
|
|
169
|
+
Unknown: 'unknown',
|
|
170
|
+
};
|
|
171
|
+
const rawStatus = db.properties?.status ?? 'Unknown';
|
|
172
|
+
const status = statusMap[rawStatus] ?? 'unknown';
|
|
173
|
+
const storageGb = db.properties?.maxSizeBytes
|
|
174
|
+
? Math.round(db.properties.maxSizeBytes / (1024 * 1024 * 1024))
|
|
175
|
+
: 0;
|
|
176
|
+
const endpoint = server.properties?.fullyQualifiedDomainName;
|
|
177
|
+
return {
|
|
178
|
+
id: db.id ?? '',
|
|
179
|
+
name: db.name ?? '',
|
|
180
|
+
engine: 'sqlserver',
|
|
181
|
+
version: 'azure-sql',
|
|
182
|
+
instance_class: db.sku?.name ?? db.sku?.tier ?? 'unknown',
|
|
183
|
+
storage_gb: storageGb,
|
|
184
|
+
status,
|
|
185
|
+
endpoint,
|
|
186
|
+
backup_enabled: true, // Azure SQL always has automated backups
|
|
187
|
+
region: db.location ?? server.location ?? 'unknown',
|
|
188
|
+
tags,
|
|
189
|
+
provider: 'azure',
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
async listStorage(_options) {
|
|
193
|
+
const url = `https://management.azure.com/subscriptions/${this.subscriptionId}/providers/Microsoft.Storage/storageAccounts?api-version=2023-01-01`;
|
|
194
|
+
const data = await this.azureFetch(url);
|
|
195
|
+
const buckets = [];
|
|
196
|
+
for (const account of data.value ?? []) {
|
|
197
|
+
buckets.push(this.mapStorageAccount(account));
|
|
198
|
+
}
|
|
199
|
+
return buckets;
|
|
200
|
+
}
|
|
201
|
+
mapStorageAccount(account) {
|
|
202
|
+
const publicAccess = account.properties?.allowBlobPublicAccess ?? false;
|
|
203
|
+
const encrypted = account.properties?.encryption?.services?.blob?.enabled ?? true; // Azure encrypts by default
|
|
204
|
+
return {
|
|
205
|
+
name: account.name ?? '',
|
|
206
|
+
region: account.location ?? 'unknown',
|
|
207
|
+
public_access: publicAccess,
|
|
208
|
+
encryption: encrypted,
|
|
209
|
+
versioning: account.properties?.isVersioningEnabled ?? false,
|
|
210
|
+
created_at: account.properties?.creationTime,
|
|
211
|
+
provider: 'azure',
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
async getSecrets(options) {
|
|
215
|
+
// Azure Key Vault secrets — list vault first, then secrets
|
|
216
|
+
// For simplicity, list Key Vaults in subscription
|
|
217
|
+
const vaultUrl = `https://management.azure.com/subscriptions/${this.subscriptionId}/providers/Microsoft.KeyVault/vaults?api-version=2023-02-01`;
|
|
218
|
+
const vaultData = await this.azureFetch(vaultUrl);
|
|
219
|
+
const secrets = [];
|
|
220
|
+
for (const vault of vaultData.value ?? []) {
|
|
221
|
+
const vaultUri = vault.properties?.vaultUri;
|
|
222
|
+
if (!vaultUri)
|
|
223
|
+
continue;
|
|
224
|
+
try {
|
|
225
|
+
const secretsUrl = `${vaultUri.replace(/\/$/, '')}/secrets?api-version=7.4`;
|
|
226
|
+
const token = await this.getToken();
|
|
227
|
+
// Key Vault uses a different scope
|
|
228
|
+
const kvResponse = await fetch(secretsUrl, {
|
|
229
|
+
headers: {
|
|
230
|
+
Authorization: `Bearer ${token}`,
|
|
231
|
+
'Content-Type': 'application/json',
|
|
232
|
+
},
|
|
233
|
+
});
|
|
234
|
+
if (!kvResponse.ok)
|
|
235
|
+
continue;
|
|
236
|
+
const secretData = (await kvResponse.json());
|
|
237
|
+
for (const secret of secretData.value ?? []) {
|
|
238
|
+
// ID format: https://vault.vault.azure.net/secrets/{name}/{version}
|
|
239
|
+
// We want the name (second-to-last segment), not the version
|
|
240
|
+
const parts = (secret.id ?? '').split('/');
|
|
241
|
+
const secretsIdx = parts.indexOf('secrets');
|
|
242
|
+
const name = secretsIdx !== -1 && parts[secretsIdx + 1]
|
|
243
|
+
? parts[secretsIdx + 1]
|
|
244
|
+
: parts[parts.length - 2] ?? parts.pop() ?? '';
|
|
245
|
+
if (options?.prefix && !name.startsWith(options.prefix))
|
|
246
|
+
continue;
|
|
247
|
+
const createdAt = secret.attributes?.created
|
|
248
|
+
? new Date(secret.attributes.created * 1000).toISOString()
|
|
249
|
+
: undefined;
|
|
250
|
+
const updatedAt = secret.attributes?.updated
|
|
251
|
+
? new Date(secret.attributes.updated * 1000).toISOString()
|
|
252
|
+
: undefined;
|
|
253
|
+
secrets.push({
|
|
254
|
+
name,
|
|
255
|
+
created_at: createdAt,
|
|
256
|
+
last_rotated: updatedAt,
|
|
257
|
+
rotation_enabled: false, // Azure Key Vault doesn't have rotation natively via this API
|
|
258
|
+
tags: secret.tags ?? {},
|
|
259
|
+
provider: 'azure',
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
// Skip vaults we can't access
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return secrets;
|
|
268
|
+
}
|
|
269
|
+
async getResourcesByTag(tagKey, tagValue) {
|
|
270
|
+
const resources = [];
|
|
271
|
+
const instances = await this.listInstances();
|
|
272
|
+
for (const inst of instances) {
|
|
273
|
+
if (tagKey in inst.tags &&
|
|
274
|
+
(tagValue === undefined || inst.tags[tagKey] === tagValue)) {
|
|
275
|
+
resources.push({
|
|
276
|
+
resource_id: inst.id,
|
|
277
|
+
resource_type: 'instance',
|
|
278
|
+
resource_name: inst.name,
|
|
279
|
+
tags: inst.tags,
|
|
280
|
+
provider: 'azure',
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
const databases = await this.listDatabases();
|
|
285
|
+
for (const db of databases) {
|
|
286
|
+
if (tagKey in db.tags &&
|
|
287
|
+
(tagValue === undefined || db.tags[tagKey] === tagValue)) {
|
|
288
|
+
resources.push({
|
|
289
|
+
resource_id: db.id,
|
|
290
|
+
resource_type: 'database',
|
|
291
|
+
resource_name: db.name,
|
|
292
|
+
tags: db.tags,
|
|
293
|
+
provider: 'azure',
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return resources;
|
|
298
|
+
}
|
|
299
|
+
async getHealthStatus() {
|
|
300
|
+
const [instances, databases, storage] = await Promise.all([
|
|
301
|
+
this.listInstances(),
|
|
302
|
+
this.listDatabases(),
|
|
303
|
+
this.listStorage(),
|
|
304
|
+
]);
|
|
305
|
+
const instStats = {
|
|
306
|
+
running: instances.filter((i) => i.state === 'running').length,
|
|
307
|
+
stopped: instances.filter((i) => i.state === 'stopped').length,
|
|
308
|
+
error: instances.filter((i) => i.state === 'unknown').length,
|
|
309
|
+
total: instances.length,
|
|
310
|
+
};
|
|
311
|
+
const dbStats = {
|
|
312
|
+
available: databases.filter((d) => d.status === 'available').length,
|
|
313
|
+
error: databases.filter((d) => d.status === 'error').length,
|
|
314
|
+
total: databases.length,
|
|
315
|
+
};
|
|
316
|
+
const storageStats = {
|
|
317
|
+
total_buckets: storage.length,
|
|
318
|
+
public_buckets: storage.filter((b) => b.public_access).length,
|
|
319
|
+
};
|
|
320
|
+
let overall = 'healthy';
|
|
321
|
+
if (instStats.error > 0 || dbStats.error > 0) {
|
|
322
|
+
overall = 'critical';
|
|
323
|
+
}
|
|
324
|
+
else if (storageStats.public_buckets > 0 || instStats.stopped > 0) {
|
|
325
|
+
overall = 'warning';
|
|
326
|
+
}
|
|
327
|
+
return {
|
|
328
|
+
provider: 'azure',
|
|
329
|
+
instances: instStats,
|
|
330
|
+
databases: dbStats,
|
|
331
|
+
storage: storageStats,
|
|
332
|
+
pending_maintenance: [],
|
|
333
|
+
overall,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
async getCurrentCost(month) {
|
|
337
|
+
const now = new Date();
|
|
338
|
+
const targetMonth = month ??
|
|
339
|
+
`${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}`;
|
|
340
|
+
const [year, mon] = targetMonth.split('-').map(Number);
|
|
341
|
+
if (!year || !mon) {
|
|
342
|
+
throw new Error(`Invalid month format: ${targetMonth}. Expected YYYY-MM`);
|
|
343
|
+
}
|
|
344
|
+
const startDate = `${targetMonth}-01`;
|
|
345
|
+
const endDate = new Date(year, mon, 0);
|
|
346
|
+
const endDateStr = `${targetMonth}-${String(endDate.getDate()).padStart(2, '0')}`;
|
|
347
|
+
const url = `https://management.azure.com/subscriptions/${this.subscriptionId}/providers/Microsoft.CostManagement/query?api-version=2023-03-01`;
|
|
348
|
+
try {
|
|
349
|
+
const costData = await this.azureFetch(url, {
|
|
350
|
+
method: 'POST',
|
|
351
|
+
body: JSON.stringify({
|
|
352
|
+
type: 'Usage',
|
|
353
|
+
timeframe: 'Custom',
|
|
354
|
+
timePeriod: { from: startDate, to: endDateStr },
|
|
355
|
+
dataset: {
|
|
356
|
+
granularity: 'None',
|
|
357
|
+
grouping: [{ type: 'Dimension', name: 'ServiceName' }],
|
|
358
|
+
aggregation: {
|
|
359
|
+
totalCost: { name: 'Cost', function: 'Sum' },
|
|
360
|
+
},
|
|
361
|
+
},
|
|
362
|
+
}),
|
|
363
|
+
});
|
|
364
|
+
const byService = [];
|
|
365
|
+
let total = 0;
|
|
366
|
+
// Azure Cost Management returns columns + rows format
|
|
367
|
+
const columns = costData.properties?.columns ?? [];
|
|
368
|
+
const rows = costData.properties?.rows ?? [];
|
|
369
|
+
const costColIdx = columns.findIndex((c) => c.name === 'Cost');
|
|
370
|
+
const serviceColIdx = columns.findIndex((c) => c.name === 'ServiceName');
|
|
371
|
+
for (const row of rows) {
|
|
372
|
+
const amount = typeof row[costColIdx] === 'number' ? row[costColIdx] : 0;
|
|
373
|
+
const service = typeof row[serviceColIdx] === 'string' ? row[serviceColIdx] : 'Unknown';
|
|
374
|
+
total += amount;
|
|
375
|
+
byService.push({ service, amount_usd: amount, pct: 0 });
|
|
376
|
+
}
|
|
377
|
+
for (const svc of byService) {
|
|
378
|
+
svc.pct = total > 0 ? Math.round((svc.amount_usd / total) * 100) : 0;
|
|
379
|
+
}
|
|
380
|
+
return {
|
|
381
|
+
provider: 'azure',
|
|
382
|
+
period: targetMonth,
|
|
383
|
+
total_usd: total,
|
|
384
|
+
by_service: byService,
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
catch (err) {
|
|
388
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
389
|
+
throw new Error(`Cost data unavailable. Cost Explorer API costs $0.01/request. Error: ${message}`);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=azure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure.js","sourceRoot":"","sources":["../../src/adapters/azure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
import type { CloudProvider } from './types.js';
|
|
10
|
+
import type { ComputeInstance, ManagedDatabase, StorageBucket, SecretInfo, ResourceTag, HealthStatus, CostBreakdown } from '../types.js';
|
|
11
|
+
export declare class GcpAdapter implements CloudProvider {
|
|
12
|
+
private readonly project;
|
|
13
|
+
private readonly token;
|
|
14
|
+
constructor();
|
|
15
|
+
private gcpFetch;
|
|
16
|
+
listInstances(options?: {
|
|
17
|
+
region?: string;
|
|
18
|
+
state?: string;
|
|
19
|
+
tags?: Record<string, string>;
|
|
20
|
+
}): Promise<ComputeInstance[]>;
|
|
21
|
+
private mapInstance;
|
|
22
|
+
listDatabases(options?: {
|
|
23
|
+
region?: string;
|
|
24
|
+
engine?: string;
|
|
25
|
+
}): Promise<ManagedDatabase[]>;
|
|
26
|
+
private mapDatabase;
|
|
27
|
+
listStorage(_options?: {
|
|
28
|
+
region?: string;
|
|
29
|
+
}): Promise<StorageBucket[]>;
|
|
30
|
+
private mapBucket;
|
|
31
|
+
getSecrets(options?: {
|
|
32
|
+
prefix?: string;
|
|
33
|
+
}): Promise<SecretInfo[]>;
|
|
34
|
+
getResourcesByTag(tagKey: string, tagValue?: string): Promise<ResourceTag[]>;
|
|
35
|
+
getHealthStatus(): Promise<HealthStatus>;
|
|
36
|
+
getCurrentCost(month?: string): Promise<CostBreakdown>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=gcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcp.d.ts","sourceRoot":"","sources":["../../src/adapters/gcp.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,aAAa,EACb,UAAU,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACd,MAAM,aAAa,CAAC;AAErB,qBAAa,UAAW,YAAW,aAAa;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;;YAejB,QAAQ;IAwBhB,aAAa,CAAC,OAAO,CAAC,EAAE;QAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA2B9B,OAAO,CAAC,WAAW;IA4Cb,aAAa,CAAC,OAAO,CAAC,EAAE;QAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAe9B,OAAO,CAAC,WAAW;IA0Db,WAAW,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAa3E,OAAO,CAAC,SAAS;IAuBX,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA2BhE,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,EAAE,CAAC;IAsCnB,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC;IA0CxC,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CAiG7D"}
|