/**
* Lighthouse MCP Server - Tool Tests
*
* Tests all 28 available tools against the live API
* No API key required
*/
import { LighthouseClient } from '../src/api-client.js';
const client = new LighthouseClient();
interface TestResult {
name: string;
status: 'PASS' | 'FAIL';
time: number;
error?: string;
}
const results: TestResult[] = [];
async function test(name: string, fn: () => Promise<any>): Promise<void> {
const start = Date.now();
try {
await fn();
const elapsed = Date.now() - start;
results.push({ name, status: 'PASS', time: elapsed });
console.log(`✅ ${name.padEnd(25)} ${elapsed}ms`);
} catch (error) {
const elapsed = Date.now() - start;
const message = error instanceof Error ? error.message : String(error);
results.push({ name, status: 'FAIL', time: elapsed, error: message });
console.log(`❌ ${name.padEnd(25)} ${elapsed}ms - ${message}`);
}
}
async function runTests() {
console.log('='.repeat(60));
console.log('LIGHTHOUSE MCP SERVER - TOOL TESTS');
console.log('='.repeat(60));
console.log(`Test Date: ${new Date().toISOString()}`);
console.log(`API: https://lighthouse.cantonloop.com/api`);
console.log('');
// Get test IDs first
console.log('Gathering test IDs...');
let partyId = 'Global-Synchronizer-Foundation::1220b0867964b602f2cc7ea61324a95f000f0060e735cfaf4f23f424fdab02c170ac';
let govId = '';
let contractId = '';
let txId = '';
try {
const gov = await client.listGovernance() as any;
govId = gov.vote_requests?.[0]?.id || '';
console.log(` Governance ID: ${govId.substring(0, 40)}...`);
} catch (e) { console.log(' Could not get governance ID'); }
try {
const contracts = await client.listContracts(1) as any;
contractId = contracts.contracts?.[0]?.contract_id || '';
console.log(` Contract ID: ${contractId.substring(0, 40)}...`);
} catch (e) { console.log(' Could not get contract ID'); }
try {
const txs = await client.listTransactions(1) as any;
txId = txs.transactions?.[0]?.update_id || '';
console.log(` Transaction ID: ${txId.substring(0, 40)}...`);
} catch (e) { console.log(' Could not get transaction ID'); }
console.log('');
console.log('Running tests...');
console.log('-'.repeat(60));
// CNS
await test('cns_list', () => client.listCns());
// Contracts
await test('contracts_list', () => client.listContracts());
if (contractId) {
await test('contract_get', () => client.getContract(contractId));
}
// Featured Apps
await test('featured_apps_get', () => client.getFeaturedApps());
// Governance
await test('governance_list', () => client.listGovernance());
await test('governance_stats', () => client.getGovernanceStats());
if (govId) {
await test('governance_get', () => client.getGovernance(govId));
}
// Party (using Super Validator which always has data)
await test('party_balance', () => client.getPartyBalance(partyId));
await test('party_burns', () => client.getPartyBurns(partyId));
await test('party_pnl', () => client.getPartyPnl(partyId));
await test('party_rewards', () => client.getPartyRewards(partyId));
await test('party_burn_stats', () => client.getPartyBurnStats(partyId));
await test('party_reward_stats', () => client.getPartyRewardStats(partyId));
await test('party_transfers', () => client.getPartyTransfers(partyId));
await test('party_transactions', () => client.getPartyTransactions(partyId));
// Preapprovals
await test('preapprovals_list', () => client.listPreapprovals());
// Prices
await test('price_get', () => client.getPrice());
await test('price_history', () => client.getPriceRange());
// Rounds
await test('rounds_list', () => client.listRounds());
await test('round_get', () => client.getRound(80900));
// Search
await test('search', () => client.search('Cumberland'));
// Stats
await test('stats_get', () => client.getStats());
// Transactions
await test('transactions_list', () => client.listTransactions());
if (txId) {
await test('transaction_get', () => client.getTransaction(txId));
}
// Transfers
await test('transfers_list', () => client.listTransfers());
// Validators
await test('validators_list', () => client.listValidators());
await test('validator_get', () => client.getValidator(partyId));
// Summary
console.log('-'.repeat(60));
console.log('');
const passed = results.filter(r => r.status === 'PASS').length;
const failed = results.filter(r => r.status === 'FAIL').length;
const avgTime = Math.round(results.reduce((a, r) => a + r.time, 0) / results.length);
console.log('SUMMARY');
console.log('='.repeat(60));
console.log(`Total Tests: ${results.length}`);
console.log(`Passed: ${passed} ✅`);
console.log(`Failed: ${failed} ❌`);
console.log(`Pass Rate: ${((passed / results.length) * 100).toFixed(1)}%`);
console.log(`Average Response Time: ${avgTime}ms`);
if (failed > 0) {
console.log('');
console.log('Failed Tests:');
results.filter(r => r.status === 'FAIL').forEach(r => {
console.log(` - ${r.name}: ${r.error}`);
});
}
console.log('');
console.log(failed === 0 ? '✅ ALL TESTS PASSED' : `❌ ${failed} TESTS FAILED`);
}
runTests().catch(console.error);