#!/usr/bin/env node
/**
* Comprehensive test of all MCP server tools
*/
import { spawn } from 'child_process';
import { config } from 'dotenv';
config();
const server = spawn('node', ['dist/index.js'], {
env: { ...process.env },
stdio: ['pipe', 'pipe', 'pipe']
});
const tests = [
{
name: '1. List Models',
request: {
jsonrpc: '2.0',
id: 1,
method: 'tools/call',
params: { name: 'saptiva_list_models', arguments: {} }
}
},
{
name: '2. Chat (Saptiva Turbo)',
request: {
jsonrpc: '2.0',
id: 2,
method: 'tools/call',
params: {
name: 'saptiva_chat',
arguments: {
model: 'Saptiva Turbo',
messages: [{ role: 'user', content: 'What is 2+2? Answer in one word.' }],
max_tokens: 50
}
}
}
},
{
name: '3. Reasoning (with Cortex fallback to Ops)',
request: {
jsonrpc: '2.0',
id: 3,
method: 'tools/call',
params: {
name: 'saptiva_reason',
arguments: {
question: 'If I have 5 apples and eat 2, how many are left?',
max_tokens: 300
}
}
}
},
{
name: '4. Embedding',
request: {
jsonrpc: '2.0',
id: 4,
method: 'tools/call',
params: {
name: 'saptiva_embed',
arguments: { text: 'Hello world' }
}
}
},
{
name: '5. Batch Embed',
request: {
jsonrpc: '2.0',
id: 5,
method: 'tools/call',
params: {
name: 'saptiva_batch_embed',
arguments: {
texts: ['Hello', 'World', 'Test']
}
}
}
},
{
name: '6. Help (quick_start)',
request: {
jsonrpc: '2.0',
id: 6,
method: 'tools/call',
params: {
name: 'saptiva_help',
arguments: { topic: 'quick_start' }
}
}
}
];
let currentTest = 0;
let buffer = '';
let passed = 0;
let failed = 0;
function sendNextTest() {
if (currentTest >= tests.length) {
console.log('\n' + '='.repeat(60));
console.log(`FINAL RESULTS: ${passed} passed, ${failed} failed out of ${tests.length} tests`);
console.log('='.repeat(60));
server.kill();
process.exit(failed > 0 ? 1 : 0);
return;
}
const test = tests[currentTest];
console.log(`\n${'─'.repeat(60)}`);
console.log(`${test.name}`);
console.log('─'.repeat(60));
buffer = '';
server.stdin.write(JSON.stringify(test.request) + '\n');
}
server.stdout.on('data', (data) => {
buffer += data.toString();
try {
const response = JSON.parse(buffer);
if (response.error) {
console.log('❌ FAILED:', response.error.message);
failed++;
} else if (response.result) {
const content = response.result.content?.[0]?.text;
if (response.result.isError) {
console.log('❌ FAILED:', content?.substring(0, 200));
failed++;
} else {
console.log('✅ PASSED');
// Pretty print response (truncated)
if (content) {
try {
const parsed = JSON.parse(content);
const str = JSON.stringify(parsed, null, 2);
console.log('Response:', str.substring(0, 300) + (str.length > 300 ? '...' : ''));
} catch {
console.log('Response:', content.substring(0, 300) + (content.length > 300 ? '...' : ''));
}
}
passed++;
}
}
currentTest++;
setTimeout(sendNextTest, 500);
} catch {
// Incomplete JSON
}
});
server.stderr.on('data', (data) => {
const msg = data.toString().trim();
if (msg && !msg.includes('running on stdio') && !msg.includes('injecting env')) {
console.error('Server:', msg);
}
});
server.on('error', (err) => {
console.error('Server error:', err);
process.exit(1);
});
console.log('='.repeat(60));
console.log('MCP-Saptiva Comprehensive Test Suite');
console.log('='.repeat(60));
setTimeout(sendNextTest, 1000);
setTimeout(() => {
console.log('\n⏰ Timeout reached');
server.kill();
process.exit(1);
}, 180000);