#!/usr/bin/env node
const https = require('https');
const axios = require('axios');
const axiosInstance = axios.create({
httpsAgent: new https.Agent({ rejectUnauthorized: false }),
timeout: 30000
});
async function testClaudeExactQuery() {
console.log('\nββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ');
console.log(' TESTING EXACT QUERY FROM CLAUDE DESKTOP LOGS');
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n');
const baseUrl = 'https://api.umbrellacost.io/api/v1';
try {
// Authenticate as AllCloud user
console.log('Authenticating as david+allcloud@umbrellacost.com...');
const authResponse = await axiosInstance.post(`${baseUrl}/users/signin`, {
username: 'david+allcloud@umbrellacost.com',
password: 'Dsamsung1!123'
});
const token = authResponse.data.jwtToken;
const tokenPayload = JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString());
const userKey = tokenPayload.username || tokenPayload.sub;
console.log('β
Authenticated. User Key:', userKey);
// Build API key exactly as MCP does
const apiKey = `${userKey}:22676:139`;
console.log('API Key:', apiKey);
// EXACT parameters from Claude Desktop logs
console.log('\nπ Testing EXACT query from Claude logs:');
console.log('Query: "Show me Bank Leumi costs per month for 2025"');
const params = new URLSearchParams({
accountId: '696314371547',
customer_account_key: '22676',
customer_division_id: '139',
startDate: '2025-01-01',
endDate: '2025-09-21',
periodGranLevel: 'month',
groupBy: 'none',
costType: 'cost',
isUnblended: 'true'
});
// Add discount as second costType
params.append('costType', 'discount');
// Add tax exclusion (MCP server does this automatically for MSP customers)
params.append('excludeFilters[chargetype]', 'Tax');
console.log('\nπ Sending request with parameters:');
console.log(' accountId:', '696314371547');
console.log(' customer_account_key:', '22676');
console.log(' customer_division_id:', '139');
console.log(' groupBy:', 'none');
console.log(' costType:', '["cost", "discount"]');
console.log(' excludeFilters[chargetype]:', 'Tax');
const response = await axiosInstance.get(`${baseUrl}/invoices/caui?${params}`, {
headers: {
'Authorization': token,
'apikey': apiKey,
'commonparams': JSON.stringify({ isPpApplied: true })
}
});
console.log('\nπ RESPONSE DATA:');
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββ');
if (response.data && Array.isArray(response.data)) {
console.log(`Total results: ${response.data.length}`);
// Group by month if needed
const monthlyData = {};
response.data.forEach(item => {
const month = item.usage_date;
if (!monthlyData[month]) {
monthlyData[month] = 0;
}
monthlyData[month] += item.total_cost;
});
console.log('\nπ MONTHLY COSTS:');
console.log('Month Total Cost');
console.log('ββββββββββββββββββββββββ');
Object.keys(monthlyData).sort().forEach(month => {
const cost = monthlyData[month];
const monthName = {
'2025-01': 'Jan 2025',
'2025-02': 'Feb 2025',
'2025-03': 'Mar 2025',
'2025-04': 'Apr 2025',
'2025-05': 'May 2025',
'2025-06': 'Jun 2025',
'2025-07': 'Jul 2025',
'2025-08': 'Aug 2025',
'2025-09': 'Sep 2025'
}[month] || month;
console.log(`${monthName.padEnd(12)} $${cost.toFixed(6)}`);
});
console.log('\nπ EXPECTED VALUES (from MANUAL_ANSWERS.txt):');
console.log('Aug 2025 $0.002684');
const august = monthlyData['2025-08'] || 0;
const expected = 0.0026837670123269763;
const diff = Math.abs(august - expected);
const match = diff < 0.0001;
console.log(`\n${match ? 'β
' : 'β'} August comparison:`);
console.log(` Actual: $${august.toFixed(10)}`);
console.log(` Expected: $${expected.toFixed(10)}`);
console.log(` Diff: $${diff.toFixed(10)}`);
// Show raw response for debugging
console.log('\nπ RAW RESPONSE (first item):');
console.log(JSON.stringify(response.data[0], null, 2));
} else {
console.log('β No data returned or unexpected format');
console.log('Raw response:', JSON.stringify(response.data, null, 2));
}
} catch (error) {
console.error('\nβ Error:', error.message);
if (error.response) {
console.error('Response status:', error.response.status);
console.error('Response data:', error.response.data);
}
}
}
testClaudeExactQuery().catch(console.error);