#!/usr/bin/env node
/**
* Simple test script for MCP Server
* Tests basic functionality without requiring a full MCP client
*/
import { spawn } from "child_process";
import { readFileSync } from "fs";
import { join } from "path";
const SERVER_PATH = join(process.cwd(), "dist", "index.js");
interface TestCase {
name: string;
request: any;
validate?: (response: any) => boolean;
}
const tests: TestCase[] = [
{
name: "List Tools",
request: {
jsonrpc: "2.0",
id: 1,
method: "tools/list",
params: {},
},
validate: (response) => {
return (
response.result &&
Array.isArray(response.result.tools) &&
response.result.tools.length > 0
);
},
},
{
name: "Get Production Orders",
request: {
jsonrpc: "2.0",
id: 2,
method: "tools/call",
params: {
name: "get_production_orders",
arguments: {},
},
},
validate: (response) => {
return (
response.result &&
response.result.content &&
Array.isArray(response.result.content)
);
},
},
{
name: "Get Equipment",
request: {
jsonrpc: "2.0",
id: 3,
method: "tools/call",
params: {
name: "get_equipment",
arguments: { status: "running" },
},
},
validate: (response) => {
return (
response.result &&
response.result.content &&
Array.isArray(response.result.content)
);
},
},
{
name: "Get Maintenance Tasks",
request: {
jsonrpc: "2.0",
id: 4,
method: "tools/call",
params: {
name: "get_maintenance_tasks",
arguments: { priority: "critical" },
},
},
validate: (response) => {
return (
response.result &&
response.result.content &&
Array.isArray(response.result.content)
);
},
},
{
name: "Get Sensors",
request: {
jsonrpc: "2.0",
id: 5,
method: "tools/call",
params: {
name: "get_sensors",
arguments: { type: "temperature" },
},
},
validate: (response) => {
return (
response.result &&
response.result.content &&
Array.isArray(response.result.content)
);
},
},
{
name: "List Resources",
request: {
jsonrpc: "2.0",
id: 6,
method: "resources/list",
params: {},
},
validate: (response) => {
return (
response.result &&
Array.isArray(response.result.resources) &&
response.result.resources.length > 0
);
},
},
{
name: "Read Resource",
request: {
jsonrpc: "2.0",
id: 7,
method: "resources/read",
params: {
uri: "mes://production-orders",
},
},
validate: (response) => {
return (
response.result &&
response.result.contents &&
Array.isArray(response.result.contents)
);
},
},
];
function sendRequest(server: any, request: any): Promise<any> {
return new Promise((resolve, reject) => {
let output = "";
const timeout = setTimeout(() => {
server.kill();
reject(new Error(`Timeout waiting for response to: ${request.method}`));
}, 10000);
server.stdout.on("data", (data: Buffer) => {
output += data.toString();
// Try to parse complete JSON responses
const lines = output.split("\n").filter((line) => line.trim());
for (const line of lines) {
try {
const response = JSON.parse(line);
if (response.id === request.id) {
clearTimeout(timeout);
resolve(response);
return;
}
} catch (e) {
// Not JSON, continue
}
}
});
server.stderr.on("data", (data: Buffer) => {
// Log stderr for debugging
process.stderr.write(data);
});
server.on("error", (error: Error) => {
clearTimeout(timeout);
reject(error);
});
server.on("exit", (code: number) => {
clearTimeout(timeout);
if (code !== 0 && code !== null) {
reject(new Error(`Server exited with code ${code}`));
}
});
// Send request
server.stdin.write(JSON.stringify(request) + "\n");
});
}
async function runTests() {
console.log("๐งช Starting MCP Server Tests\n");
console.log(`๐ Server path: ${SERVER_PATH}\n`);
// Check if server file exists
try {
readFileSync(SERVER_PATH);
} catch (error) {
console.error("โ Server file not found. Please run 'npm run build' first.");
process.exit(1);
}
let passed = 0;
let failed = 0;
for (const test of tests) {
console.log(`Testing: ${test.name}...`);
const server = spawn("node", [SERVER_PATH], {
stdio: ["pipe", "pipe", "pipe"],
});
try {
const response = await sendRequest(server, test.request);
if (test.validate) {
if (test.validate(response)) {
console.log(` โ
PASSED`);
passed++;
} else {
console.log(` โ FAILED - Validation failed`);
console.log(` Response:`, JSON.stringify(response, null, 2));
failed++;
}
} else {
console.log(` โ
PASSED (no validation)`);
passed++;
}
server.kill();
await new Promise((resolve) => setTimeout(resolve, 200));
} catch (error) {
console.log(` โ FAILED - ${error instanceof Error ? error.message : String(error)}`);
failed++;
try {
server.kill();
} catch (e) {
// Ignore
}
await new Promise((resolve) => setTimeout(resolve, 200));
}
}
console.log(`\n๐ Results: ${passed} passed, ${failed} failed`);
if (failed > 0) {
process.exit(1);
}
}
runTests().catch(console.error);