#!/usr/bin/env npx tsx import { MCPService } from '../src/main/services/mcp-service'; import type { MCPServerConfig } from '../src/main/services/mcp-service'; /** * Test script to verify MCP server configuration fixes */ async function testMCPServerFix() { console.log('๐Ÿ”ง Testing MCP Server Configuration Fixes\n'); const mcpService = MCPService.getInstance(); try { console.log('๐Ÿ“ฆ Loading MCP servers...'); const servers = await mcpService.loadServers(); console.log(`โœ… Loaded ${servers.length} servers\n`); const customServers = servers.filter(s => s.type === 'custom'); console.log(`๐Ÿ” Found ${customServers.length} custom servers:\n`); for (const server of customServers) { console.log(`๐Ÿ“Œ Server: ${server.name} (${server.id})`); console.log(` Status: ${server.status}`); console.log(` Enabled: ${server.enabled}`); try { const spawnOptions = (mcpService as any).buildSpawnOptions(server); console.log(` โœ… Spawn Options Built Successfully:`); console.log(` Command: ${spawnOptions.command}`); console.log(` Args: ${JSON.stringify(spawnOptions.args)}`); const displayCommand = server.config.type === 'custom' ? `${server.config.command}${server.config.args?.length ? ' ' + server.config.args.join(' ') : ''}` : 'N/A'; console.log(` ๐Ÿ“‹ UI Display: ${displayCommand}`); } catch (error) { console.log(` โŒ Error building spawn options: ${error instanceof Error ? error.message : error}`); } if (server.tools && server.tools.length > 0) { console.log(` ๐Ÿ”ง Tools: ${server.tools.length} available`); server.tools.slice(0, 3).forEach(tool => { console.log(` - ${tool.name}`); }); if (server.tools.length > 3) { console.log(` ... and ${server.tools.length - 3} more`); } } else { console.log(` โš ๏ธ Tools: None loaded (will show "Tools loading..." in UI)`); } if (server.errorMessage) { console.log(` โŒ Error: ${server.errorMessage}`); } console.log(''); } console.log('๐Ÿงช Testing specific edge cases:\n'); const testConfigs: MCPServerConfig[] = [ { id: 'test-1', name: 'Test NPX Command', type: 'custom', status: 'disconnected', enabled: true, config: { type: 'custom', command: 'npx', args: ['-y', 'wikipedia-mcp'], env: {} }, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() }, { id: 'test-2', name: 'Test Package Name', type: 'custom', status: 'disconnected', enabled: true, config: { type: 'custom', command: '@modelcontextprotocol/server-filesystem', args: ['/path/to/dir'], env: {} }, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() }, { id: 'test-3', name: 'Test Executable Path', type: 'custom', status: 'disconnected', enabled: true, config: { type: 'custom', command: '/usr/local/bin/my-mcp-server', args: ['--port', '3000'], env: {} }, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() } ]; for (const testConfig of testConfigs) { console.log(`๐Ÿ“ Test Case: ${testConfig.name}`); console.log(` Config: command="${testConfig.config.command}" args=${JSON.stringify((testConfig.config as any).args)}`); try { const spawnOptions = (mcpService as any).buildSpawnOptions(testConfig); console.log(` โœ… Result: ${spawnOptions.command} ${spawnOptions.args.join(' ')}`); } catch (error) { console.log(` โŒ Failed: ${error instanceof Error ? error.message : error}`); } console.log(''); } console.log('โœ… Test completed successfully!'); } catch (error) { console.error('โŒ Test failed:', error); process.exit(1); } } testMCPServerFix().catch(console.error);