Skip to main content
Glama
compare-accounts.cjsβ€’6.89 kB
#!/usr/bin/env node const { spawn } = require('child_process'); class AccountComparison { constructor() { this.server = null; this.requestId = 1; } async start() { console.log('πŸ”„ COMPARING MSP vs DIRECT ACCOUNTS'); console.log('==================================='); this.server = spawn('node', ['dist/index.js'], { stdio: ['pipe', 'pipe', 'pipe'] }); await new Promise(resolve => setTimeout(resolve, 3000)); console.log('βœ… Server ready\n'); } async sendRequest(method, params = {}) { return new Promise((resolve, reject) => { const request = { jsonrpc: '2.0', id: this.requestId++, method, params }; this.server.stdin.write(JSON.stringify(request) + '\n'); const timeout = setTimeout(() => { reject(new Error(`Timeout: ${method}`)); }, 25000); const handleData = (data) => { clearTimeout(timeout); this.server.stdout.removeListener('data', handleData); try { const lines = data.toString().split('\n').filter(line => line.trim()); const lastLine = lines[lines.length - 1]; if (lastLine) { const response = JSON.parse(lastLine); resolve(response); } } catch (error) { reject(error); } }; this.server.stdout.on('data', handleData); }); } async testAccount(username, password, accountType) { console.log(`\nπŸ” Testing ${accountType} Account: ${username}`); console.log(''.padEnd(50, '-')); try { // Logout previous session await this.sendRequest('tools/call', { name: 'logout', arguments: {} }); // Authenticate new account const authResp = await this.sendRequest('tools/call', { name: 'authenticate_user', arguments: { username, password } }); if (authResp.error) { console.log(`❌ Authentication failed: ${authResp.error.message}`); return; } console.log('βœ… Authentication successful'); // Test recommendations const recsResp = await this.sendRequest('tools/call', { name: 'api___recommendations_report', arguments: {} }); const recsContent = recsResp.result?.content?.[0]?.text; // Extract savings data const savingsMatch = recsContent?.match(/Total.*?\$([0-9,]+)/i) || recsContent?.match(/\$([0-9,]+)/); const countMatch = recsContent?.match(/(\d+) recommendations/); const totalSavings = savingsMatch ? parseInt(savingsMatch[1].replace(/,/g, '')) : 0; const recCount = countMatch ? parseInt(countMatch[1]) : 0; console.log(`πŸ’° Recommendations Data:`); console.log(` Total Savings: $${totalSavings.toLocaleString()}`); console.log(` Recommendation Count: ${recCount}`); console.log(` Has Data: ${totalSavings > 0 || recCount > 0 ? 'βœ… Yes' : '❌ No'}`); // Test customer management for MSP accounts if (accountType === 'MSP') { const custResp = await this.sendRequest('tools/call', { name: 'api___user_management_accounts', arguments: {} }); const custContent = custResp.result?.content?.[0]?.text; const customerCount = custContent?.match(/(\d+) customers/) || custContent?.match(/Found (\d+)/); console.log(`πŸ‘₯ MSP Customers: ${customerCount?.[1] || '0'}`); // Check if Bank Hapoalim is visible const hasBankHapoalim = custContent?.includes('Bank') || custContent?.includes('Hapoalim') || custContent?.includes('16185'); console.log(`🏦 Bank Hapoalim Visible: ${hasBankHapoalim ? 'βœ… Yes' : '❌ No'}`); } return { accountType, username, totalSavings, recCount, hasData: totalSavings > 0 || recCount > 0 }; } catch (error) { console.log(`❌ Error testing ${accountType} account: ${error.message}`); return null; } } async compare() { const accounts = [ { username: 'david+allcloud@umbrellacost.com', password: 'B4*zcI7#F7poEC', type: 'MSP' }, { username: 'david+saola@umbrellacost.com', password: 'Dsamsung1!', type: 'Direct Customer' } ]; const results = []; for (const account of accounts) { const result = await this.testAccount(account.username, account.password, account.type); if (result) { results.push(result); } await new Promise(resolve => setTimeout(resolve, 2000)); // Brief pause between tests } console.log('\nπŸ“Š COMPARISON SUMMARY'); console.log('===================='); results.forEach(result => { console.log(`\n${result.accountType} (${result.username}):`); console.log(` Total Savings: $${result.totalSavings.toLocaleString()}`); console.log(` Recommendations: ${result.recCount}`); console.log(` Data Available: ${result.hasData ? 'βœ… Yes' : '❌ No'}`); }); const mspResult = results.find(r => r.accountType === 'MSP'); const directResult = results.find(r => r.accountType === 'Direct Customer'); console.log('\nπŸ” ANALYSIS:'); if (directResult?.hasData && !mspResult?.hasData) { console.log('βœ… DIRECT CUSTOMER account has recommendations data'); console.log('❌ MSP account shows no recommendations data'); console.log('\nThis indicates:'); console.log(' 1. Recommendations service is working (Direct Customer proves this)'); console.log(' 2. MSP account configuration issue OR'); console.log(' 3. MSP accounts don\'t have recommendations enabled OR'); console.log(' 4. MSP recommendations require specific customer context'); } else if (!directResult?.hasData && !mspResult?.hasData) { console.log('❌ BOTH accounts show no recommendations data'); console.log('\nThis indicates:'); console.log(' 1. Recommendations service not configured for these accounts'); console.log(' 2. Environment issue (sandbox/test data)'); console.log(' 3. Recommendations service may be disabled globally'); } else if (mspResult?.hasData) { console.log('βœ… MSP account has recommendations data'); console.log('\nThe $5000 savings expectation may be:'); console.log(' 1. Outdated/stale data expectations'); console.log(' 2. Environment-specific (prod vs dev data)'); } } async cleanup() { if (this.server) { this.server.kill(); } } async run() { try { await this.start(); await this.compare(); } finally { await this.cleanup(); console.log('\n🏁 Account Comparison Complete'); } } } const comparator = new AccountComparison(); comparator.run();

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