Skip to main content
Glama
analyze-divisions-structure.cjs7.25 kB
#!/usr/bin/env node /** * Analyze division structure to understand where Bank Leumi might be */ const { spawn } = require('child_process'); async function analyzeDivisions() { console.log('🔍 ANALYZING DIVISION STRUCTURE'); console.log('=' .repeat(50)); const server = spawn('node', ['dist/index.js'], { stdio: ['pipe', 'pipe', 'pipe'], env: process.env }); let responses = {}; let responseBuffer = ''; let divisionData = { divisionIds: new Set(), accountsByDivision: new Map() }; 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', () => { // Suppress debug output to focus on analysis }); await new Promise(resolve => setTimeout(resolve, 2000)); // Initialize and authenticate server.stdin.write('{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"0.1.0","capabilities":{},"clientInfo":{"name":"div-analysis","version":"1.0.0"}}}\n'); await new Promise(resolve => setTimeout(resolve, 1000)); server.stdin.write(JSON.stringify({ jsonrpc: "2.0", id: 2, method: "tools/call", params: { name: "authenticate_user", arguments: { username: "david+allcloud@umbrellacost.com", password: "B4*zcI7#F7poEC" }} }) + '\n'); await new Promise(resolve => setTimeout(resolve, 8000)); // Get users data to analyze division structure server.stdin.write('{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"api___users","arguments":{}}}\n'); await new Promise(resolve => setTimeout(resolve, 8000)); server.kill(); // Analyze the users response if (responses[3]?.result?.content?.[0]?.text) { const text = responses[3].result.content[0].text; try { const jsonMatch = text.match(/```json\s*([\s\S]*?)\s*```/); if (jsonMatch) { const userData = JSON.parse(jsonMatch[1]); console.log('📊 DIVISION ANALYSIS:'); console.log('=' .repeat(50)); // Analyze divisionsIds array if (userData.divisionsIds) { const uniqueDivisions = [...new Set(userData.divisionsIds)].sort((a,b) => a-b); console.log(`\n🎯 Found ${uniqueDivisions.length} unique division IDs:`); uniqueDivisions.forEach(divId => { const count = userData.divisionsIds.filter(id => id === divId).length; console.log(` Division ${divId}: ${count} occurrences`); }); const nonZeroDivisions = uniqueDivisions.filter(id => id !== 0); console.log(`\n✅ Non-zero divisions (real customers): ${nonZeroDivisions.join(', ')}`); } // Analyze accounts by division if (userData.accounts) { console.log(`\n📋 ACCOUNTS BY DIVISION (${userData.accounts.length} total accounts):`); const divisionGroups = new Map(); userData.accounts.forEach(account => { const divId = account.divisionId || 0; if (!divisionGroups.has(divId)) { divisionGroups.set(divId, []); } divisionGroups.get(divId).push(account); }); // Sort by division ID const sortedDivisions = Array.from(divisionGroups.keys()).sort((a,b) => a-b); sortedDivisions.forEach(divId => { const accounts = divisionGroups.get(divId); console.log(`\n 📁 Division ${divId} (${divId === 0 ? 'Unassigned' : 'CUSTOMER'}): ${accounts.length} accounts`); if (divId !== 0) { // This is a real customer division - show details console.log(` 🏢 CUSTOMER DIVISION - These accounts belong to a customer:`); accounts.slice(0, 5).forEach((acc, index) => { console.log(` ${index + 1}. ${acc.accountName} (Key: ${acc.accountKey})`); }); if (accounts.length > 5) { console.log(` ... and ${accounts.length - 5} more accounts`); } // Check for bank-like account names const bankAccounts = accounts.filter(acc => acc.accountName.toLowerCase().includes('bank') || acc.accountName.toLowerCase().includes('leumi') || acc.accountName.toLowerCase().includes('hapoalim') ); if (bankAccounts.length > 0) { console.log(` 🏦 BANK ACCOUNTS IN THIS DIVISION:`); bankAccounts.forEach(acc => { console.log(` 🎯 ${acc.accountName} (Key: ${acc.accountKey})`); }); } } else { // Division 0 - show first few examples console.log(` Examples: ${accounts.slice(0, 3).map(a => a.accountName).join(', ')}`); } }); // Key findings const customerDivisions = sortedDivisions.filter(id => id !== 0); console.log(`\n🎯 KEY FINDINGS:`); console.log(` Total customer divisions: ${customerDivisions.length}`); console.log(` Customer division IDs: ${customerDivisions.join(', ')}`); if (customerDivisions.length > 0) { console.log(`\n💡 IMPORTANT: Bank Leumi likely exists as one of these customer divisions.`); console.log(` The division NAME (like "Bank Leumi") is stored separately from this account data.`); console.log(` Each division ID corresponds to a customer name in the USER_DIVISIONS table.`); customerDivisions.forEach(divId => { const accounts = divisionGroups.get(divId); console.log(`\n 🔍 Division ${divId} could be "Bank Leumi" with ${accounts.length} accounts:`); const accountKeys = accounts.map(acc => acc.accountKey); console.log(` Account Keys: ${accountKeys.join(', ')}`); }); } else { console.log(`\n⚠️ No customer divisions found - all accounts in division 0 (unassigned)`); console.log(` This suggests either:`); console.log(` 1. This user doesn't have access to customer divisions`); console.log(` 2. Bank Leumi is in a different MSP environment`); console.log(` 3. The division structure is not properly configured`); } } } else { console.log('❌ Could not find JSON in users response'); } } catch (e) { console.log('❌ Error parsing users response:', e.message); } } else { console.log('❌ No users response received'); } console.log('\n✅ Division structure analysis complete'); } analyzeDivisions().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