/// import { Client } from '@modelcontextprotocol/sdk/client/index.js'; import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js'; import path from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; import { z } from 'zod'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const serverModulePath = path.join(__dirname, '../dist/index.js'); console.log('🚬 Running Smoke Test (Mock Mode)...'); console.log(`🔌 Server Module: ${serverModulePath}`); const ManageToolsStatusSchema = z.object({ success: z.literal(true), totalTools: z.literal(23) }); const TextContentItemsSchema = z.array(z.object({ type: z.literal('text'), text: z.string() })).nonempty(); class SmokeTestError extends Error { constructor(message: string) { super(message); this.name = 'SmokeTestError'; } } function getFirstTextContent(content: unknown): string { const parsed = TextContentItemsSchema.safeParse(content); if (!parsed.success) { throw new SmokeTestError('manage_tools did not return text content'); } return parsed.data[0].text; } async function runSmokeTest(): Promise { process.env.MOCK_UNREAL_CONNECTION = 'true'; process.env.NODE_ENV = 'test'; const client = new Client( { name: 'smoke-test', version: '1.0.0' }, { capabilities: {} } ); const { createServer } = await import(pathToFileURL(serverModulePath).href); const { server, bridge, automationBridge, metricsServer } = createServer(); const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); try { console.log('Sending initialize...'); await server.connect(serverTransport); await client.connect(clientTransport, { timeout: 15000 }); console.log('✅ Initialize success'); const toolsResult = await client.listTools(undefined, { timeout: 15000 }); console.log(`✅ Tools check success: Found ${toolsResult.tools.length} tools`); const statusResult = await client.callTool({ name: 'manage_tools', arguments: { params: { action: 'get_status' } } }, undefined, { timeout: 15000 }); const payload = ManageToolsStatusSchema.parse(JSON.parse(getFirstTextContent(statusResult.content))); console.log(`✅ manage_tools params check success: ${payload.totalTools} tools`); console.log('🎉 Smoke Test PASSED'); } finally { await clientTransport.close(); automationBridge.stop(); bridge.dispose(); metricsServer?.close(); } } runSmokeTest().catch((error: unknown) => { const message = error instanceof Error ? error.message : String(error); console.error(`❌ ${message}`); process.exit(1); });