Skip to main content
Glama
bank-leumi-monthly-breakdown.cjsβ€’7.45 kB
#!/usr/bin/env node /** * Get Bank Leumi monthly breakdown for last 8 months with corrected division ID */ const { spawn } = require('child_process'); const path = require('path'); console.log('🏦 BANK LEUMI - MONTHLY BREAKDOWN (LAST 8 MONTHS)'); console.log('═'.repeat(80)); console.log('Using Division ID 139 (corrected)'); console.log('═'.repeat(80)); // Calculate 8 months back const today = new Date(); const eightMonthsAgo = new Date(today); eightMonthsAgo.setMonth(today.getMonth() - 8); eightMonthsAgo.setDate(1); const startDate = eightMonthsAgo.toISOString().split('T')[0]; const endDate = today.toISOString().split('T')[0]; console.log(`πŸ“… Period: ${startDate} to ${endDate}\n`); const serverPath = path.join(__dirname, 'src', 'index.ts'); const server = spawn('npx', ['tsx', serverPath], { env: { ...process.env }, stdio: ['pipe', 'pipe', 'pipe'] }); let responses = {}; let responseBuffer = ''; server.stdout.on('data', (data) => { responseBuffer += data.toString(); const lines = responseBuffer.split('\n'); for (let i = 0; i < lines.length - 1; i++) { const line = lines[i].trim(); if (line) { try { const response = JSON.parse(line); if (response.id) { responses[response.id] = response; } } catch (e) {} } } responseBuffer = lines[lines.length - 1]; }); server.stderr.on('data', (data) => { const output = data.toString(); if (output.includes('Umbrella MCP Server started successfully')) { setTimeout(() => runAnalysis(), 1000); } }); async function runAnalysis() { console.log('πŸš€ Starting Bank Leumi monthly analysis...\n'); // Initialize server.stdin.write(JSON.stringify({ jsonrpc: '2.0', method: 'initialize', params: { protocolVersion: '0.1.0', capabilities: {}, clientInfo: { name: 'leumi-monthly', version: '1.0.0' }}, id: 0 }) + '\n'); await new Promise(resolve => setTimeout(resolve, 2000)); // Authenticate console.log('πŸ” Authenticating...'); server.stdin.write(JSON.stringify({ jsonrpc: '2.0', method: 'tools/call', params: { name: 'authenticate_user', arguments: { username: 'david+allcloud@umbrellacost.com', password: 'B4*zcI7#F7poEC' } }, id: 1 }) + '\n'); await new Promise(resolve => setTimeout(resolve, 10000)); console.log('βœ… Authenticated\n'); // Get Bank Leumi monthly costs console.log('πŸ“Š Requesting Bank Leumi monthly breakdown...\n'); server.stdin.write(JSON.stringify({ jsonrpc: '2.0', method: 'tools/call', params: { name: 'api___invoices_caui', arguments: { userQuery: 'Show me Bank Leumi costs by month', startDate: startDate, endDate: endDate, groupBy: 'none', periodGranLevel: 'month', costType: ['cost', 'discount'], isUnblended: true, cloud_context: 'aws' } }, id: 2 }) + '\n'); await new Promise(resolve => setTimeout(resolve, 15000)); displayMonthlyBreakdown(); } function displayMonthlyBreakdown() { console.log('πŸ’° **BANK LEUMI - MONTHLY COST BREAKDOWN**'); console.log('═'.repeat(80)); if (!responses[2]) { console.log('❌ No response received'); server.kill(); return; } if (responses[2].error) { console.log('❌ Request error:', responses[2].error); server.kill(); return; } const content = responses[2].result?.content?.find(c => c.type === 'text')?.text || ''; const jsonMatch = content.match(/```json\n([\s\S]*?)\n```/); if (jsonMatch) { try { const data = JSON.parse(jsonMatch[1]); if (Array.isArray(data) && data.length > 0) { const monthNames = { '01': 'January', '02': 'February', '03': 'March', '04': 'April', '05': 'May', '06': 'June', '07': 'July', '08': 'August', '09': 'September', '10': 'October', '11': 'November', '12': 'December' }; let totalCost = 0; const monthlyData = []; console.log('πŸ“… **MONTH-BY-MONTH BREAKDOWN:**\n'); data.forEach((item, index) => { const [year, month] = (item.usage_date || '').split('-'); const monthName = monthNames[month] || month; const cost = parseFloat(item.total_cost || 0); totalCost += cost; monthlyData.push({ month: `${monthName} ${year}`, cost: cost }); const costDisplay = cost < 0 ? `-$${Math.abs(cost).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})}` : `$${cost.toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2})}`; const indicator = cost > 1000 ? 'πŸ’°' : cost > 0 ? 'πŸ’΅' : cost < 0 ? 'πŸ’Έ' : 'βšͺ'; console.log(`Month ${index + 1}: **${monthName} ${year}**`); console.log(`${indicator} Cost: ${costDisplay}`); // Add trend if not first month if (index > 0) { const prevCost = parseFloat(data[index-1].total_cost || 0); const change = cost - prevCost; const changePercent = prevCost !== 0 ? ((change / Math.abs(prevCost)) * 100) : 0; const trend = change > 0 ? '↗️ Increase' : change < 0 ? 'β†˜οΈ Decrease' : 'β†’ No change'; const changeDisplay = change < 0 ? `-$${Math.abs(change).toLocaleString('en-US', {minimumFractionDigits: 2})}` : `+$${change.toLocaleString('en-US', {minimumFractionDigits: 2})}`; console.log(`πŸ“ˆ Change from previous: ${changeDisplay} (${changePercent.toFixed(1)}%) ${trend}`); } console.log('─'.repeat(60)); }); console.log('\nπŸ“Š **SUMMARY:**'); console.log('─'.repeat(40)); console.log(`πŸ“… Months with data: ${data.length}`); console.log(`πŸ’° Total cost: $${totalCost.toLocaleString('en-US', {minimumFractionDigits: 2})}`); console.log(`πŸ“ˆ Average monthly: $${(totalCost / data.length).toLocaleString('en-US', {minimumFractionDigits: 2})}`); // Find highest and lowest const sorted = [...monthlyData].sort((a, b) => b.cost - a.cost); if (sorted.length > 0) { console.log(`πŸ“ Highest month: ${sorted[0].month} ($${sorted[0].cost.toLocaleString('en-US', {minimumFractionDigits: 2})})`); console.log(`πŸ“ Lowest month: ${sorted[sorted.length-1].month} ($${sorted[sorted.length-1].cost.toLocaleString('en-US', {minimumFractionDigits: 2})})`); } console.log('\nβœ… **DATA VERIFICATION:**'); console.log(`- Account Key: 22676`); console.log(`- Division ID: 139 (from customerDivisions)`); console.log(`- Account Name: Reseller-1`); console.log(`- Cloud: AWS`); } else { console.log('⚠️ No data returned or empty array'); } } catch (e) { console.log('❌ Error parsing data:', e.message); } } else { console.log('⚠️ No JSON data found in response'); } console.log('\n🏦 **BANK LEUMI MONTHLY ANALYSIS COMPLETE**'); console.log('═'.repeat(80)); server.kill(); } setTimeout(() => { console.error('❌ Analysis timeout'); server.kill(); process.exit(1); }, 35000);

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