#!/usr/bin/env node
// Simple test script to verify MCP server functionality
import { spawn } from 'child_process';
import { createInterface } from 'readline';
console.log('Starting MCP Server Test...\n');
// Start the MCP server
const server = spawn('node', ['dist/index.js'], {
stdio: ['pipe', 'pipe', 'inherit']
});
let messageId = 1;
function sendMessage(message) {
const jsonMessage = JSON.stringify(message);
console.log(`Sending: ${jsonMessage}`);
server.stdin.write(jsonMessage + '\n');
}
function getNextMessageId() {
return messageId++;
}
// Test 1: Initialize connection
console.log('Test 1: Initialize connection');
sendMessage({
jsonrpc: "2.0",
id: getNextMessageId(),
method: "initialize",
params: {
protocolVersion: "2024-11-05",
capabilities: {},
clientInfo: {
name: "test-client",
version: "1.0.0"
}
}
});
// Test 2: List tools
setTimeout(() => {
console.log('\nTest 2: List available tools');
sendMessage({
jsonrpc: "2.0",
id: getNextMessageId(),
method: "tools/list",
params: {}
});
}, 1000);
// Test 3: Generate random number
setTimeout(() => {
console.log('\nTest 3: Generate random number (1-100)');
sendMessage({
jsonrpc: "2.0",
id: getNextMessageId(),
method: "tools/call",
params: {
name: "generate_random_number",
arguments: {
min: 1,
max: 100
}
}
});
}, 2000);
// Test 4: Generate random string
setTimeout(() => {
console.log('\nTest 4: Generate random string (length 10)');
sendMessage({
jsonrpc: "2.0",
id: getNextMessageId(),
method: "tools/call",
params: {
name: "generate_random_string",
arguments: {
length: 10
}
}
});
}, 3000);
// Test 5: Error case - invalid range
setTimeout(() => {
console.log('\nTest 5: Error case - invalid range (min > max)');
sendMessage({
jsonrpc: "2.0",
id: getNextMessageId(),
method: "tools/call",
params: {
name: "generate_random_number",
arguments: {
min: 100,
max: 1
}
}
});
}, 4000);
// Test 6: Error case - invalid string length
setTimeout(() => {
console.log('\nTest 6: Error case - invalid string length (0)');
sendMessage({
jsonrpc: "2.0",
id: getNextMessageId(),
method: "tools/call",
params: {
name: "generate_random_string",
arguments: {
length: 0
}
}
});
}, 5000);
// Handle server responses
const rl = createInterface({
input: server.stdout,
crlfDelay: Infinity
});
rl.on('line', (line) => {
if (line.trim()) {
try {
const response = JSON.parse(line);
console.log(`Response: ${JSON.stringify(response, null, 2)}\n`);
} catch (e) {
console.log(`Raw response: ${line}\n`);
}
}
});
// Clean up after tests
setTimeout(() => {
console.log('Tests completed. Shutting down server...');
server.kill();
process.exit(0);
}, 7000);
server.on('error', (error) => {
console.error('Server error:', error);
process.exit(1);
});
process.on('SIGINT', () => {
console.log('\nShutting down...');
server.kill();
process.exit(0);
});