Skip to main content
Glama
cloudwatch-30day-cost.cjsβ€’4.78 kB
#!/usr/bin/env node const { spawn } = require('child_process'); async function getCloudWatch30DayCost() { console.log('πŸ’° CLOUDWATCH 30-DAY AMORTIZED COST ANALYSIS'); console.log('=' .repeat(50)); console.log('πŸ“… Period: Last 30 days (July 27 - August 26, 2025)'); console.log('πŸ’³ Cost Type: Amortized'); console.log('πŸ”§ Service: Amazon CloudWatch'); const server = spawn('node', ['dist/index.js'], { stdio: ['pipe', 'pipe', 'pipe'], env: { ...process.env, UMBRELLA_API_BASE_URL: 'https://api-front.umbrellacost.io/api/v1' } }); const responses = []; server.stdout.on('data', (data) => { const lines = data.toString().split('\n').filter(line => line.trim()); for (const line of lines) { try { const response = JSON.parse(line); responses.push(response); } catch (e) {} } }); await new Promise(resolve => setTimeout(resolve, 2000)); // Auth server.stdin.write(JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/call", params: { name: 'authenticate_user', arguments: { username: 'david+saola@umbrellacost.com', password: 'Dsamsung1!' } } }) + '\n'); console.log('πŸ” Authenticating...'); await new Promise(resolve => setTimeout(resolve, 5000)); // CloudWatch cost request - last 30 days const startDate = new Date(); startDate.setDate(startDate.getDate() - 30); const endDate = new Date(); const startDateStr = startDate.toISOString().split('T')[0]; const endDateStr = endDate.toISOString().split('T')[0]; server.stdin.write(JSON.stringify({ jsonrpc: "2.0", id: 2, method: "tools/call", params: { name: 'api___cost_and_usage', arguments: { startDate: startDateStr, endDate: endDateStr, filters: { service: "Amazon CloudWatch" }, granularity: "MONTHLY", metrics: "AmortizedCost" } } }) + '\n'); console.log(`πŸ” Requesting CloudWatch costs from ${startDateStr} to ${endDateStr}...`); let found = false; for (let i = 0; i < 30 && !found; i++) { await new Promise(resolve => setTimeout(resolve, 1000)); const response = responses.find(r => r.id === 2); if (response && response.result?.content?.[0]?.text) { found = true; const text = response.result.content[0].text; console.log(`βœ… Response received (${text.length} chars)`); // Look for JSON data const jsonMatch = text.match(/```json\n([\s\S]*?)\n```/); if (jsonMatch) { try { const data = JSON.parse(jsonMatch[1]); console.log('\nπŸ’° CLOUDWATCH 30-DAY COST BREAKDOWN'); console.log('=' .repeat(45)); if (data.ResultsByTime && data.ResultsByTime.length > 0) { let totalCost = 0; data.ResultsByTime.forEach((period, i) => { const periodStart = period.TimePeriod.Start; const periodEnd = period.TimePeriod.End; const cost = parseFloat(period.Total.AmortizedCost?.Amount || 0); totalCost += cost; console.log(`πŸ“… Period ${i+1}: ${periodStart} to ${periodEnd}`); console.log(` πŸ’° Amortized Cost: $${cost.toFixed(4)}`); if (period.Total.AmortizedCost?.Unit) { console.log(` πŸ’± Currency: ${period.Total.AmortizedCost.Unit}`); } }); console.log(`\nπŸ† TOTAL CLOUDWATCH COST (30 days): $${totalCost.toFixed(4)}`); console.log(`πŸ“Š Cost Type: Amortized`); console.log(`πŸ”§ Service: Amazon CloudWatch`); console.log(`πŸ“… Period: ${startDateStr} to ${endDateStr}`); // Daily average const dailyAvg = totalCost / 30; console.log(`πŸ“ˆ Daily Average: $${dailyAvg.toFixed(4)}`); } else { console.log('❌ No cost data found for CloudWatch in the last 30 days'); console.log('Data structure:', Object.keys(data)); } } catch (e) { console.log('❌ JSON parsing error:', e.message); console.log('Response preview:', text.substring(0, 500)); } } else { console.log('❌ No JSON block found'); console.log('Response preview:', text.substring(0, 300)); } break; } if (i % 10 === 0 && i > 0) { console.log(`⏳ Waiting ${i}s... (${responses.length} responses)`); } } if (!found) { console.log('❌ No response received within 30 seconds'); } server.kill(); } getCloudWatch30DayCost().catch(console.error);

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/daviddraiumbrella/invoice-monitoring'

If you have feedback or need assistance with the MCP directory API, please join our Discord server