Skip to main content
Glama

Chrome Debug MCP Server

by Rainmen-xia
debug-utils.js9.2 kB
#!/usr/bin/env node /** * 综合调试工具集 * 提供MCP浏览器服务器的各种调试功能 */ import { spawn } from 'child_process'; import { existsSync } from 'fs'; import { join, dirname } from 'path'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); console.log('🛠️ MCP浏览器服务器调试工具集'); console.log('=============================='); class DebugUtils { constructor() { this.buildPath = join(__dirname, '..', 'build'); } async checkEnvironment() { console.log('\n🔍 环境检查'); console.log('============'); // 检查Node.js版本 const nodeVersion = process.version; console.log(`✅ Node.js版本: ${nodeVersion}`); // 检查项目是否已编译 const indexPath = join(this.buildPath, 'index.js'); const hasBuilt = existsSync(indexPath); console.log(`${hasBuilt ? '✅' : '❌'} TypeScript编译: ${hasBuilt ? '已完成' : '需要运行 npm run build'}`); // 检查依赖 const nodeModulesPath = join(__dirname, '..', 'node_modules'); const hasDeps = existsSync(nodeModulesPath); console.log(`${hasDeps ? '✅' : '❌'} 依赖安装: ${hasDeps ? '已完成' : '需要运行 npm install'}`); // 检查Chrome端口 await this.checkChromePort(); return hasBuilt && hasDeps; } async checkChromePort() { try { const { default: axios } = await import('axios'); const response = await axios.get('http://localhost:9222/json/version', { timeout: 2000 }); console.log('✅ Chrome调试端口: 可访问'); console.log(` 版本: ${response.data.Browser}`); } catch (error) { console.log('❌ Chrome调试端口: 不可访问'); console.log(' 建议: 启动Chrome调试模式'); console.log(' 命令: ./start-chrome-debug.sh'); } } async runTool(toolName) { const toolPath = join(__dirname, `${toolName}.js`); if (!existsSync(toolPath)) { console.error(`❌ 找不到工具: ${toolName}`); return false; } console.log(`\n🚀 运行工具: ${toolName}`); console.log('============================'); return new Promise((resolve, reject) => { const child = spawn('node', [toolPath], { stdio: 'inherit', cwd: join(__dirname, '..') }); child.on('close', (code) => { console.log(`\n🏁 工具 ${toolName} 执行完成,退出代码: ${code}`); resolve(code === 0); }); child.on('error', (error) => { console.error(`❌ 工具执行失败: ${error.message}`); reject(error); }); }); } showUsage() { console.log('\n📖 使用说明'); console.log('============'); console.log(''); console.log('🔧 可用的调试工具:'); console.log(''); console.log(' npm run test-chrome - 测试Chrome连接和截图功能'); console.log(' npm run test - 测试完整MCP服务器功能'); console.log(' npm run test-base64 - 专门测试Base64编码问题'); console.log(' npm run debug - 启动调试模式(支持断点)'); console.log(' npm run debug-verbose - 启动详细日志模式'); console.log(''); console.log('📋 直接运行工具:'); console.log(''); console.log(' node debug/test-chrome-connection.js'); console.log(' node debug/test-mcp-server.js'); console.log(' node debug/test-base64.js'); console.log(' node debug/debug-utils.js --help'); console.log(''); console.log('🔍 调试步骤建议:'); console.log(''); console.log('1. 环境检查: node debug/debug-utils.js --check'); console.log('2. Chrome测试: npm run test-chrome'); console.log('3. Base64测试: npm run test-base64'); console.log('4. MCP服务器测试: npm run test'); console.log('5. 如有问题,使用: npm run debug-verbose'); console.log(''); console.log('🚨 常见问题排查:'); console.log(''); console.log('• Chrome连接失败:'); console.log(' - 确保Chrome以调试模式启动'); console.log(' - 检查端口9222是否被占用: lsof -i :9222'); console.log(' - 验证调试接口: curl http://localhost:9222/json/version'); console.log(''); console.log('• Base64验证错误:'); console.log(' - 运行专门的Base64测试: npm run test-base64'); console.log(' - 检查截图格式和质量设置'); console.log(' - 查看生成的测试文件'); console.log(''); console.log('• MCP通信失败:'); console.log(' - 检查JSON格式是否正确'); console.log(' - 确认stdio通信正常'); console.log(' - 使用详细日志模式排查'); console.log(''); console.log('📞 如需更多帮助:'); console.log(' 查看 README.md 和 ARCHITECTURE.md'); console.log(''); } async interactiveMode() { const readline = await import('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); console.log('\n🔄 交互调试模式'); console.log('================'); console.log('可用命令:'); console.log(' 1. check - 环境检查'); console.log(' 2. chrome - Chrome连接测试'); console.log(' 3. base64 - Base64编码测试'); console.log(' 4. mcp - MCP服务器测试'); console.log(' 5. help - 显示帮助'); console.log(' 6. exit - 退出'); console.log(''); const askCommand = () => { rl.question('请选择命令 (1-6): ', async (answer) => { switch (answer.trim()) { case '1': case 'check': await this.checkEnvironment(); askCommand(); break; case '2': case 'chrome': await this.runTool('test-chrome-connection'); askCommand(); break; case '3': case 'base64': await this.runTool('test-base64'); askCommand(); break; case '4': case 'mcp': await this.runTool('test-mcp-server'); askCommand(); break; case '5': case 'help': this.showUsage(); askCommand(); break; case '6': case 'exit': console.log('👋 再见!'); rl.close(); break; default: console.log('❌ 无效命令,请重新选择'); askCommand(); break; } }); }; askCommand(); } } // 命令行参数处理 async function main() { const debugUtils = new DebugUtils(); const args = process.argv.slice(2); if (args.length === 0) { await debugUtils.interactiveMode(); return; } const command = args[0]; switch (command) { case '--check': case '-c': await debugUtils.checkEnvironment(); break; case '--chrome': await debugUtils.runTool('test-chrome-connection'); break; case '--base64': await debugUtils.runTool('test-base64'); break; case '--mcp': await debugUtils.runTool('test-mcp-server'); break; case '--help': case '-h': debugUtils.showUsage(); break; case '--interactive': case '-i': await debugUtils.interactiveMode(); break; default: console.error(`❌ 未知命令: ${command}`); debugUtils.showUsage(); process.exit(1); } } // 处理未捕获的异常 process.on('uncaughtException', (error) => { console.error('💥 未捕获的异常:', error.message); console.error(error.stack); process.exit(1); }); process.on('unhandledRejection', (reason, promise) => { console.error('💥 未处理的Promise拒绝:', reason); process.exit(1); }); main().catch(error => { console.error('💥 执行失败:', error.message); process.exit(1); });

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Rainmen-xia/chrome-debug-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server