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.
Files changed (51) hide show
  1. package/README.md +45 -16
  2. package/dist/adapters/azure.d.ts +44 -0
  3. package/dist/adapters/azure.d.ts.map +1 -0
  4. package/dist/adapters/azure.js +393 -0
  5. package/dist/adapters/azure.js.map +1 -0
  6. package/dist/adapters/gcp.d.ts +38 -0
  7. package/dist/adapters/gcp.d.ts.map +1 -0
  8. package/dist/adapters/gcp.js +364 -0
  9. package/dist/adapters/gcp.js.map +1 -0
  10. package/dist/index.js +78 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/lib/providers.d.ts.map +1 -1
  13. package/dist/lib/providers.js +7 -3
  14. package/dist/lib/providers.js.map +1 -1
  15. package/dist/premium/compliance_snapshot.d.ts +23 -0
  16. package/dist/premium/compliance_snapshot.d.ts.map +1 -0
  17. package/dist/premium/compliance_snapshot.js +184 -0
  18. package/dist/premium/compliance_snapshot.js.map +1 -0
  19. package/dist/premium/cost_anomalies.d.ts +22 -0
  20. package/dist/premium/cost_anomalies.d.ts.map +1 -0
  21. package/dist/premium/cost_anomalies.js +108 -0
  22. package/dist/premium/cost_anomalies.js.map +1 -0
  23. package/dist/premium/cost_forecast.d.ts +22 -0
  24. package/dist/premium/cost_forecast.d.ts.map +1 -0
  25. package/dist/premium/cost_forecast.js +111 -0
  26. package/dist/premium/cost_forecast.js.map +1 -0
  27. package/dist/premium/cross_cloud_report.d.ts +42 -0
  28. package/dist/premium/cross_cloud_report.d.ts.map +1 -0
  29. package/dist/premium/cross_cloud_report.js +139 -0
  30. package/dist/premium/cross_cloud_report.js.map +1 -0
  31. package/dist/premium/idle_resources.d.ts +23 -0
  32. package/dist/premium/idle_resources.d.ts.map +1 -0
  33. package/dist/premium/idle_resources.js +88 -0
  34. package/dist/premium/idle_resources.js.map +1 -0
  35. package/dist/premium/security_scan.d.ts +24 -0
  36. package/dist/premium/security_scan.d.ts.map +1 -0
  37. package/dist/premium/security_scan.js +159 -0
  38. package/dist/premium/security_scan.js.map +1 -0
  39. package/dist/tools/cost_current.d.ts +16 -0
  40. package/dist/tools/cost_current.d.ts.map +1 -0
  41. package/dist/tools/cost_current.js +78 -0
  42. package/dist/tools/cost_current.js.map +1 -0
  43. package/dist/tools/health_dashboard.d.ts +15 -0
  44. package/dist/tools/health_dashboard.d.ts.map +1 -0
  45. package/dist/tools/health_dashboard.js +41 -0
  46. package/dist/tools/health_dashboard.js.map +1 -0
  47. package/dist/tools/resource_tags.d.ts +18 -0
  48. package/dist/tools/resource_tags.d.ts.map +1 -0
  49. package/dist/tools/resource_tags.js +50 -0
  50. package/dist/tools/resource_tags.js.map +1 -0
  51. package/package.json +1 -1
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  [![npm version](https://img.shields.io/npm/v/cloudvault-mcp?color=06b6d4&style=flat-square)](https://www.npmjs.com/package/cloudvault-mcp)
8
8
  [![npm downloads](https://img.shields.io/npm/dm/cloudvault-mcp?color=06b6d4&style=flat-square)](https://www.npmjs.com/package/cloudvault-mcp)
9
9
  [![License: MIT](https://img.shields.io/badge/License-MIT-06b6d4.svg?style=flat-square)](LICENSE)
10
- [![Tests](https://img.shields.io/badge/tests-106%20passing-06b6d4?style=flat-square)](#testing)
10
+ [![Tests](https://img.shields.io/badge/tests-265%20passing-06b6d4?style=flat-square)](#testing)
11
11
  [![MCP](https://img.shields.io/badge/MCP-compatible-06b6d4?style=flat-square)](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<br/>coming soon]
28
- B --> E[Azure<br/>coming soon]
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 — AWS Inventory (free)
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 (coming)
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 (coming)
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, unattached volumes |
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 | | coming | coming |
78
- | Azure | | | coming |
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
- 106 tests across gate (14), fetch-retry (6), audit (8), providers (11), AWS adapter (26), and 4 tools (41).
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"}